你好,我最近开始学习WGPU的计算着色器,我在弄清楚如何正确地将数据写入缓冲区方面没有什么困难.
我用下面的代码创建了一个映射到CPU的小缓冲区.
let array_buffer = device.create_buffer(&wgpu::BufferDescriptor{
label: Some("gpu_test"),
size: 4,
usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ,
mapped_at_creation: true,
});
我假设这为我提供了一个可在CPU上访问的缓冲区,现在我使用此行代码将其写入其中.
queue.write_buffer(&array_buffer, 0, &[1,2,3,4]);
之后,我从缓冲区中读出数据
let slice = array_buffer.slice(..).get_mapped_range();
println!("{:?}", slice.get(0..4));
我的输出现在是Some([0, 0, 0, 0])
,在阅读文档后,我认为这是正常行为,因为文档说"WRITE不是立即提交的,而是在内部排队,等待下一个submit()
调用开始时发生."
问题是,它并没有真正说明如何提交我试图参选的内容.
queue.write_buffer(&array_buffer, 0, &[1,2,3,4]);
queue.submit([]);
还有几个queue.submit();
的不同变体,但输出仍然是Some([0, 0, 0, 0])
,所以如果有人能指出我做得不正确的地方,我将非常感激.
复制的完整代码:
use wgpu;
use pollster;
fn main() {
let instance = wgpu::Instance::new(wgpu::InstanceDescriptor{
backends: wgpu::Backends::all(),
dx12_shader_compiler: Default::default(),
});
let adapter = pollster::block_on(instance.request_adapter(&Default::default())).unwrap();
// connect to gpu
let (device, queue) = pollster::block_on(adapter.request_device(&Default::default(), None)).unwrap();
let array_buffer = device.create_buffer(&wgpu::BufferDescriptor{
label: Some("gpu_test"),
size: 4,
usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ,
mapped_at_creation: true,
});
queue.write_buffer(&array_buffer, 0, &[1,2,3,4]);
queue.submit([]);
let slice = array_buffer.slice(..).get_mapped_range();
println!("{:?}", slice.get(0..4));
drop(slice);
array_buffer.unmap();
}