Ensure proper unmap of buffer

This commit is contained in:
Kunal Mohan 2020-06-27 12:03:59 +05:30
parent ef3b141406
commit b484836dbc
2 changed files with 24 additions and 27 deletions

View file

@ -146,17 +146,17 @@ impl GPUBufferMethods for GPUBuffer {
match ArrayBuffer::from(self.mapping.get()) { match ArrayBuffer::from(self.mapping.get()) {
Ok(array_buffer) => { Ok(array_buffer) => {
// Step 3.2 // Step 3.2
if Some(GPUMapModeConstants::READ) != self.map_mode.get() {
self.channel self.channel
.0 .0
.send(WebGPURequest::UnmapBuffer { .send(WebGPURequest::UnmapBuffer {
device_id: self.device.0,
buffer_id: self.id().0, buffer_id: self.id().0,
array_buffer: array_buffer.to_vec(), array_buffer: array_buffer.to_vec(),
mapped_at_creation: self.map_mode.get() == None, is_map_read: self.map_mode.get() == Some(GPUMapModeConstants::READ),
offset: self.mapping_range.borrow().start,
size: self.mapping_range.borrow().end -
self.mapping_range.borrow().start,
}) })
.unwrap(); .unwrap();
}
// Step 3.3 // Step 3.3
unsafe { unsafe {
DetachArrayBuffer(*cx, self.mapping.handle()); DetachArrayBuffer(*cx, self.mapping.handle());

View file

@ -198,10 +198,11 @@ pub enum WebGPURequest {
image_key: webrender_api::ImageKey, image_key: webrender_api::ImageKey,
}, },
UnmapBuffer { UnmapBuffer {
device_id: id::DeviceId,
buffer_id: id::BufferId, buffer_id: id::BufferId,
array_buffer: Vec<u8>, array_buffer: Vec<u8>,
mapped_at_creation: bool, is_map_read: bool,
offset: u64,
size: u64,
}, },
} }
@ -931,27 +932,23 @@ impl<'a> WGPU<'a> {
gfx_select!(buffer_id => global.buffer_unmap(buffer_id)); gfx_select!(buffer_id => global.buffer_unmap(buffer_id));
}, },
WebGPURequest::UnmapBuffer { WebGPURequest::UnmapBuffer {
device_id,
buffer_id, buffer_id,
array_buffer, array_buffer,
mapped_at_creation, is_map_read,
offset,
size,
} => { } => {
let global = &self.global; let global = &self.global;
if mapped_at_creation { if !is_map_read {
gfx_select!(device_id => global.queue_write_buffer( let map_ptr = gfx_select!(buffer_id => global.buffer_get_mapped_range(
device_id,
buffer_id, buffer_id,
0, offset,
array_buffer.as_slice() wgt::BufferSize::new(size)
));
} else {
gfx_select!(buffer_id => global.device_set_buffer_sub_data(
device_id,
buffer_id,
0,
array_buffer.as_slice()
)); ));
unsafe { slice::from_raw_parts_mut(map_ptr, size as usize) }
.copy_from_slice(&array_buffer);
} }
gfx_select!(buffer_id => global.buffer_unmap(buffer_id));
}, },
} }
} }