03_command_buffer_blit/
03_command_buffer_blit.rs1use apple_metal::{resource_options, MetalDevice};
2
3fn main() {
4 let dev = MetalDevice::system_default().expect("no Metal");
5 let queue = dev.new_command_queue().expect("queue");
6 let src = dev
7 .new_buffer(64, resource_options::STORAGE_MODE_SHARED)
8 .expect("src");
9 let dst = dev
10 .new_buffer(64, resource_options::STORAGE_MODE_SHARED)
11 .expect("dst");
12 unsafe {
13 src.write_bytes(0, b"hello GPU blit from apple-metal-rs!!!!!")
14 .expect("write source buffer");
15 }
16
17 let cb = queue.new_command_buffer().expect("cb");
18 cb.blit_copy_buffer(&src, 0, &dst, 0, 64)
19 .expect("encode blit copy");
20 cb.commit().expect("commit blit");
21 cb.wait_until_completed().expect("complete blit");
22
23 let bytes = {
24 let mapping = unsafe { dst.map_read().expect("map destination") };
25 let bytes = mapping[..40].to_vec();
26 drop(mapping);
27 bytes
28 };
29 let s = String::from_utf8_lossy(&bytes);
30 println!("GPU blit result: {s:?}");
31 assert!(s.starts_with("hello GPU blit"));
32}