diff options
author | Samson <16504129+sagudev@users.noreply.github.com> | 2024-08-27 09:54:55 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-27 07:54:55 +0000 |
commit | 7fce24f9d54a015db7ee813fc16c74d2feacbb12 (patch) | |
tree | e344ef00f1f1b99b59158b789c064fda52b495b6 /components/webgpu/wgpu_thread.rs | |
parent | bb5926b3291877fb47d44ea376881c2d52701bbf (diff) | |
download | servo-7fce24f9d54a015db7ee813fc16c74d2feacbb12.tar.gz servo-7fce24f9d54a015db7ee813fc16c74d2feacbb12.zip |
webgpu: Sync `GPUBuffer` (#33154)
* More helpers on `Promise`
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
* Sync `GPUBuffer`
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
* Set some good expectations
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
* Some bad expect
also on firefox
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
* Extract DataBlock, DataView impl from GPUBuffer
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
* Fix size check to work on 32bit platforms
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
---------
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
Diffstat (limited to 'components/webgpu/wgpu_thread.rs')
-rw-r--r-- | components/webgpu/wgpu_thread.rs | 51 |
1 files changed, 24 insertions, 27 deletions
diff --git a/components/webgpu/wgpu_thread.rs b/components/webgpu/wgpu_thread.rs index a577906bd4e..1283421ea9d 100644 --- a/components/webgpu/wgpu_thread.rs +++ b/components/webgpu/wgpu_thread.rs @@ -40,8 +40,8 @@ use crate::gpu_error::ErrorScope; use crate::poll_thread::Poller; use crate::render_commands::apply_render_command; use crate::{ - Adapter, ComputePassId, Error, Pipeline, PopError, PresentationData, RenderPassId, WebGPU, - WebGPUAdapter, WebGPUDevice, WebGPUMsg, WebGPUQueue, WebGPURequest, WebGPUResponse, + Adapter, ComputePassId, Error, Mapping, Pipeline, PopError, PresentationData, RenderPassId, + WebGPU, WebGPUAdapter, WebGPUDevice, WebGPUMsg, WebGPUQueue, WebGPURequest, WebGPUResponse, }; pub const PRESENTATION_BUFFER_COUNT: usize = 10; @@ -191,11 +191,11 @@ impl WGPU { let callback = BufferMapCallback::from_rust(Box::from( move |result: BufferAccessResult| { drop(token); - let response = result.map(|_| { + let response = result.and_then(|_| { let global = &glob; let (slice_pointer, range_size) = gfx_select!(buffer_id => - global.buffer_get_mapped_range(buffer_id, 0, None)) - .unwrap(); + global.buffer_get_mapped_range(buffer_id, offset, size)) + ?; // SAFETY: guarantee to be safe from wgpu let data = unsafe { slice::from_raw_parts( @@ -204,7 +204,11 @@ impl WGPU { ) }; - IpcSharedMemory::from_bytes(data) + Ok(Mapping { + data: IpcSharedMemory::from_bytes(data), + range: offset..offset + range_size, + mode: host_map, + }) }); if let Err(e) = resp_sender.send(WebGPUResponse::BufferMapAsync(response)) @@ -226,13 +230,6 @@ impl WGPU { operation )); self.poller.wake(); - if let Err(e) = &result { - if let Err(w) = - sender.send(WebGPUResponse::BufferMapAsync(Err(e.to_owned()))) - { - warn!("Failed to send BufferMapAsync Response ({:?})", w); - } - } // Per spec we also need to raise validation error here self.maybe_dispatch_wgpu_error(device_id, result.err()); }, @@ -1208,31 +1205,31 @@ impl WGPU { }, WebGPURequest::UnmapBuffer { buffer_id, - device_id, array_buffer, - is_map_read, + write_back, offset, size, } => { let global = &self.global; - if !is_map_read { - let (slice_pointer, range_size) = - gfx_select!(buffer_id => global.buffer_get_mapped_range( + if write_back { + if let Ok((slice_pointer, range_size)) = gfx_select!( + buffer_id => global.buffer_get_mapped_range( buffer_id, offset, Some(size) - )) - .unwrap(); - unsafe { - slice::from_raw_parts_mut( - slice_pointer.as_ptr(), - range_size as usize, ) + ) { + unsafe { + slice::from_raw_parts_mut( + slice_pointer.as_ptr(), + range_size as usize, + ) + } + .copy_from_slice(&array_buffer); } - .copy_from_slice(&array_buffer); } - let result = gfx_select!(buffer_id => global.buffer_unmap(buffer_id)); - self.maybe_dispatch_wgpu_error(device_id, result.err()); + // Ignore result because this operation always succeed from user perspective + let _result = gfx_select!(buffer_id => global.buffer_unmap(buffer_id)); }, WebGPURequest::WriteBuffer { device_id, |