vello/piet-gpu-hal/examples/collatz.rs
Raph Levien 301abf4db7 Minor cleanups
Mostly cleaning up some comments. Also adds host barrier and a command
to copy a buffer to an image (in preparation for images, see #38).
2020-11-17 14:18:30 -08:00

42 lines
1.7 KiB
Rust

use piet_gpu_hal::vulkan::VkInstance;
use piet_gpu_hal::{CmdBuf, Device, MemFlags};
fn main() {
let (instance, _) = VkInstance::new(None).unwrap();
unsafe {
let device = instance.device(None).unwrap();
let fence = device.create_fence(false).unwrap();
let mem_flags = MemFlags::host_coherent();
let src = (0..256).map(|x| x + 1).collect::<Vec<u32>>();
let buffer = device
.create_buffer(std::mem::size_of_val(&src[..]) as u64, mem_flags)
.unwrap();
device.write_buffer(&buffer, &src).unwrap();
let code = include_bytes!("./shader/collatz.spv");
let pipeline = device.create_simple_compute_pipeline(code, 1, 0).unwrap();
let descriptor_set = device
.create_descriptor_set(&pipeline, &[&buffer], &[])
.unwrap();
let query_pool = device.create_query_pool(2).unwrap();
let mut cmd_buf = device.create_cmd_buf().unwrap();
cmd_buf.begin();
cmd_buf.reset_query_pool(&query_pool);
cmd_buf.write_timestamp(&query_pool, 0);
cmd_buf.dispatch(&pipeline, &descriptor_set, (256, 1, 1));
cmd_buf.write_timestamp(&query_pool, 1);
cmd_buf.host_barrier();
cmd_buf.finish();
device
.run_cmd_buf(&cmd_buf, &[], &[], Some(&fence))
.unwrap();
device.wait_and_reset(&[fence]).unwrap();
let timestamps = device.reap_query_pool(&query_pool);
let mut dst: Vec<u32> = Default::default();
device.read_buffer(&buffer, &mut dst).unwrap();
for (i, val) in dst.iter().enumerate().take(16) {
println!("{}: {}", i, val);
}
println!("{:?}", timestamps);
}
}