From b484836dbc66424a6abda11693eb4e31929e0d40 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 27 Jun 2020 12:03:59 +0530 Subject: [PATCH] Ensure proper unmap of buffer --- components/script/dom/gpubuffer.rs | 22 +++++++++++----------- components/webgpu/lib.rs | 29 +++++++++++++---------------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/components/script/dom/gpubuffer.rs b/components/script/dom/gpubuffer.rs index 8b1b80e6365..07c1c525359 100644 --- a/components/script/dom/gpubuffer.rs +++ b/components/script/dom/gpubuffer.rs @@ -146,17 +146,17 @@ impl GPUBufferMethods for GPUBuffer { match ArrayBuffer::from(self.mapping.get()) { Ok(array_buffer) => { // Step 3.2 - if Some(GPUMapModeConstants::READ) != self.map_mode.get() { - self.channel - .0 - .send(WebGPURequest::UnmapBuffer { - device_id: self.device.0, - buffer_id: self.id().0, - array_buffer: array_buffer.to_vec(), - mapped_at_creation: self.map_mode.get() == None, - }) - .unwrap(); - } + self.channel + .0 + .send(WebGPURequest::UnmapBuffer { + buffer_id: self.id().0, + array_buffer: array_buffer.to_vec(), + 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(); // Step 3.3 unsafe { DetachArrayBuffer(*cx, self.mapping.handle()); diff --git a/components/webgpu/lib.rs b/components/webgpu/lib.rs index 6eeb0824286..71f5e633e6b 100644 --- a/components/webgpu/lib.rs +++ b/components/webgpu/lib.rs @@ -198,10 +198,11 @@ pub enum WebGPURequest { image_key: webrender_api::ImageKey, }, UnmapBuffer { - device_id: id::DeviceId, buffer_id: id::BufferId, array_buffer: Vec, - 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)); }, WebGPURequest::UnmapBuffer { - device_id, buffer_id, array_buffer, - mapped_at_creation, + is_map_read, + offset, + size, } => { let global = &self.global; - if mapped_at_creation { - gfx_select!(device_id => global.queue_write_buffer( - device_id, + if !is_map_read { + let map_ptr = gfx_select!(buffer_id => global.buffer_get_mapped_range( buffer_id, - 0, - array_buffer.as_slice() - )); - } else { - gfx_select!(buffer_id => global.device_set_buffer_sub_data( - device_id, - buffer_id, - 0, - array_buffer.as_slice() + offset, + wgt::BufferSize::new(size) )); + 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)); }, } }