Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 在Vulkan计算管道中使用输入和输出缓冲区_Rust_Glsl_Vulkan - Fatal编程技术网

Rust 在Vulkan计算管道中使用输入和输出缓冲区

Rust 在Vulkan计算管道中使用输入和输出缓冲区,rust,glsl,vulkan,Rust,Glsl,Vulkan,我是Vulkan和图形编程新手。我正在使用vulkano Rust库v0.17 我想用一个计算管道在一大组圆上计算一些东西。圆被描述为输入元组x,y。目前有2048个。我将对它们进行计算,并根据结果输出2048个布尔值 我使用一个缓冲区来输入圆,另一个缓冲区来输出布尔值 首先我只想让输出都是真的 设iter中的数据=0..2048.map | i | i,i; 让数据\u进入\u缓冲区= CpuAccessibleBuffer::from_iterdevice.clone,BufferUsage

我是Vulkan和图形编程新手。我正在使用vulkano Rust库v0.17

我想用一个计算管道在一大组圆上计算一些东西。圆被描述为输入元组x,y。目前有2048个。我将对它们进行计算,并根据结果输出2048个布尔值

我使用一个缓冲区来输入圆,另一个缓冲区来输出布尔值

首先我只想让输出都是真的

设iter中的数据=0..2048.map | i | i,i; 让数据\u进入\u缓冲区= CpuAccessibleBuffer::from_iterdevice.clone,BufferUsage::all,false,iter中的数据 .创建缓冲区失败; 让数据_out_iter=0..2048.map | | false; 让数据从缓冲区中溢出= CpuAccessibleBuffer::from_iterdevice.clone,BufferUsage::all,false,data_out_iter .创建缓冲区失败; 让compute_pipeline=Arc::new{ mod cs{ vulkano_着色器::着色器{ 泰:计算机, src: 版本450 布局本地大小x=1024,本地大小y=1,本地大小z=1英寸; layoutset=0,binding=0缓冲区数据输入{ uvec2数据[]; }布弗因; layoutset=0,binding=1缓冲区数据输出{ 布尔数据[]; }buf_out; 真空总管{ uint idx=gl_globalinovationid.x; buf_out.data[idx]=true/*buf_in.data[idx].x+buf_in.data[idx].y<2048*/; } } } let shader=cs::shader::loaddevice.clone.expected无法创建着色器模块; ComputePipeline::newdevice.clone和shader.main\u入口点& .创建计算管道失败 }; 让layout=compute\u pipeline.layout.descriptor\u set\u layout0.unwrap; 设为set=Arc::new PersistentDescriptorSet::StartayOut.clone .在\u buffer.clone中添加\u bufferdata\u 打开…的包装 .添加\u bufferdata\u out\u buffer.clone 打开…的包装 建筑 打开…的包装 ; 让命令\u缓冲区= AutoCommandBufferBuilder::primary\u one\u time\u submitdevice.clone,queue.family 打开…的包装 .dispatch[2,1,1],compute_pipeline.clone,set.clone, 打开…的包装 建筑 打开…的包装 让future=sync::nowdevice.clone 。然后\u executequeue.clone,命令\u缓冲区 打开…的包装 .然后发出信号,围栏,齐平 打开…的包装 future.waitNone.unwrap; 让content=data\u out\u buffer.read.unwrap; 对于n,content.iter.enumerate中的val{ println!{}{:?},n,val; } 但我得到的结果是:

0 true
1 false
2 false
3 false
4 true
5 false
6 false
7 false
8 true
9 false
...
2047 false

存储缓冲区的默认布局要求阵列的每个元素从16字节边界开始。因此,您将看到:buf_out.data[i]从输出缓冲区中的字节16*i开始写入

您可以在主机代码中匹配它,也可以在DataOut的布局中添加std430修饰符。注意:同样的问题也会影响DataIn