Created
December 16, 2019 22:45
-
-
Save eisterman/6324929526b7095bc06c1b7694b2663a to your computer and use it in GitHub Desktop.
Ciao Doc!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use vulkano::instance::Instance; | |
use vulkano::instance::InstanceExtensions; | |
use vulkano::instance::PhysicalDevice; | |
use vulkano::device::Device; | |
use vulkano::device::DeviceExtensions; | |
use vulkano::device::Features; | |
use vulkano::buffer::BufferUsage; | |
use vulkano::buffer::CpuAccessibleBuffer; | |
use vulkano::command_buffer::AutoCommandBufferBuilder; | |
use vulkano::command_buffer::CommandBuffer; | |
use vulkano::sync::GpuFuture; | |
use std::sync::Arc; | |
use vulkano::pipeline::ComputePipeline; | |
use vulkano::descriptor::descriptor_set::PersistentDescriptorSet; | |
fn main() { | |
let instance = | |
Instance::new(None, &InstanceExtensions::none(), None).expect("failed to create instance"); | |
//println!("{}", PhysicalDevice::enumerate(&instance).len()); | |
let physical = PhysicalDevice::enumerate(&instance).next().expect("no device available"); | |
for family in physical.queue_families() { | |
println!("Found a queue family with {:?} queue(s)", family.queues_count()); | |
} | |
let queue_family = physical.queue_families() | |
.find(|&q| q.supports_compute()) | |
.expect("Couldn't find a compute queue family"); | |
let (device, mut queues) = { | |
Device::new(physical, &Features::none(), &DeviceExtensions{khr_storage_buffer_storage_class:true, ..DeviceExtensions::none()}, | |
[(queue_family, 0.5)].iter().cloned()).expect("failed to create device") | |
}; | |
let queue = queues.next().unwrap(); // Estraggo prima queue, su Intel l'unica. | |
let data_iter = 0 .. 65536; | |
let data_buffer = CpuAccessibleBuffer::from_iter(device.clone(), BufferUsage::all(), | |
data_iter).expect("failed to create buffer"); | |
mod cs { | |
vulkano_shaders::shader!{ | |
ty: "compute", | |
src: " | |
#version 450 | |
layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in; | |
layout(set = 0, binding = 0) buffer Data { | |
uint data[]; | |
} buf; | |
void main() { | |
uint idx = gl_GlobalInvocationID.x; | |
buf.data[idx] *= 12; | |
}" | |
} | |
} | |
let shader = cs::Shader::load(device.clone()) | |
.expect("failed to create shader module"); | |
let compute_pipeline = Arc::new(ComputePipeline::new(device.clone(), &shader.main_entry_point(), &()) | |
.expect("failed to create compute pipeline")); | |
let set = Arc::new(PersistentDescriptorSet::start(compute_pipeline.clone(), 0) | |
.add_buffer(data_buffer.clone()).unwrap() | |
.build().unwrap() | |
); | |
let command_buffer = AutoCommandBufferBuilder::new(device.clone(), queue.family()).unwrap() | |
.dispatch([1024, 1, 1], compute_pipeline.clone(), set.clone(), ()).unwrap() | |
.build().unwrap(); | |
let finished = command_buffer.execute(queue.clone()).unwrap(); | |
finished.then_signal_fence_and_flush().unwrap() | |
.wait(None).unwrap(); | |
let content = data_buffer.read().unwrap(); | |
for (n, val) in content.iter().enumerate() { | |
assert_eq!(*val, n as u32 * 12); | |
} | |
println!("Everything succeeded!"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment