fn select_device() -> Option<Device> { let devices = Device::all(); for device in devices { if device.supports_dynamic_libraries() { return Some(device);
}
}
None
}
impl App { fn new(window: &winit::window::Window) -> Self { let device = select_device().expect("no device found that supports dynamic libraries"); let command_queue = device.new_command_queue();
let layer = MetalLayer::new();
layer.set_device(&device);
layer.set_pixel_format(MTLPixelFormat::BGRA8Unorm);
layer.set_presents_with_transaction(false);
layer.set_framebuffer_only(false); unsafe { iflet Ok(RawWindowHandle::AppKit(rw)) = window.window_handle().map(|wh| wh.as_raw()) { let view = rw.ns_view.as_ptr() as cocoa_id;
view.setWantsLayer(YES);
view.setLayer(mem::transmute(layer.as_ref()));
}
} let draw_size = window.inner_size();
layer.set_drawable_size(CGSize::new(draw_size.width as f64, draw_size.height as f64));
// compile dynamic lib shader let dylib_src_path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("examples/shader-dylib/test_dylib.metal"); let install_path =
std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("target/test_dylib.metallib");
let dylib_src = std::fs::read_to_string(dylib_src_path).expect("bad shit"); let opts = metal::CompileOptions::new();
opts.set_library_type(MTLLibraryType::Dynamic);
opts.set_install_name(install_path.to_str().unwrap());
let lib = device
.new_library_with_source(dylib_src.as_str(), &opts)
.unwrap();
// create dylib let dylib = device.new_dynamic_library(&lib).unwrap();
dylib.set_label("test_dylib");
// optional: serialize binary blob that can be loaded later let blob_url = String::from("file://") + install_path.to_str().unwrap(); let url = URL::new_with_string(&blob_url);
dylib.serialize_to_url(&url).unwrap();
// create shader that links with dylib let shader_src_path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("examples/shader-dylib/test_shader.metal");
let shader_src = std::fs::read_to_string(shader_src_path).expect("bad shit"); let opts = metal::CompileOptions::new(); // add dynamic library to link with let libraries = [dylib.as_ref()];
opts.set_libraries(&libraries);
// compile let shader_lib = device
.new_library_with_source(shader_src.as_str(), &opts)
.unwrap();
let func = shader_lib.get_function("test_kernel", None).unwrap();
// create pipeline state // linking occurs here let image_fill_cps = device
.new_compute_pipeline_state_with_function(&func)
.unwrap();
let w = self.image_fill_cps.thread_execution_width(); let h = self.image_fill_cps.max_total_threads_per_threadgroup() / w; let threads_per_threadgroup = MTLSize::new(w, h, 1); let threads_per_grid = MTLSize::new(self.width as _, self.height as _, 1);
let command_buffer = self.command_queue.new_command_buffer();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.