Reputation: 63
I am trying to run a simple test compute shader.
But when i map the buffer the shader modifies i get back all 0's. Instead of the expected outcome of numbers[index] = numbers[index] + 2u
it also does not read back the original values of the buffer as that is filled with 3's.
here are some code samples related to the mapping of the buffer:
fn setup_buffer(mut commands: Commands, render_device: Res<RenderDevice>) {
let storage_buffer = render_device.create_buffer_with_data(&wgpu::util::BufferInitDescriptor {
label: None,
contents: &[3; (RESHIGHT * RESWIDTH) as usize],
usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_SRC,
});
commands.insert_resource(RayTracerBuffer {
buffer: storage_buffer,
});
}
fn read_buffer(
raytracer_buffer: Res<RayTracerBuffer>,
render_device: Res<RenderDevice>,
sender_receiver: Res<SenderReceiver>,
) {
let storage_buffer = &raytracer_buffer.buffer;
let size = storage_buffer.size();
let staging_buffer = render_device.create_buffer(&wgpu::BufferDescriptor {
label: None,
size: size,
usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST,
mapped_at_creation: false,
});
render_device
.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None })
.copy_buffer_to_buffer(storage_buffer, 0, &staging_buffer, 0, size);
let buffer_slice = staging_buffer.slice(..);
let sender = sender_receiver.sender.clone();
buffer_slice.map_async(wgpu::MapMode::Read, move |v| sender.send(v).unwrap());
//thread::spawn(move || device.poll(wgpu::Maintain::Wait));
render_device.poll(wgpu::Maintain::Wait);
let receiver = sender_receiver.receiver.clone();
if let Ok(Ok(())) = receiver.try_recv() {
let data = buffer_slice.get_mapped_range();
let result = data.to_vec();
info!("TEST: {:?}", result);
drop(data);
staging_buffer.unmap();
}
}
to recap, somewhere in the proces of copying / mapping the buffer something goes wrong so that there are only 0's read instead of the expected numbers[index] = numbers[index] + 2u
Upvotes: 0
Views: 59
Reputation: 63
i have found the issue
i had to write render_queue.submit([encoder.finish()]);
after i copied the buffer to the staging buffer
Upvotes: 0