Skip to main content

03_command_buffer_blit/
03_command_buffer_blit.rs

1use 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}