NewUser69420
NewUser69420

Reputation: 63

mapping and reading buffer does not give expected outcome

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

Answers (1)

NewUser69420
NewUser69420

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

Related Questions