From 97766ab3002ba108faf0a98b9eaea3393b14a887 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Mon, 2 Dec 2019 17:23:04 -0500 Subject: [PATCH] Get buffer sub data in wgpu-remote --- wgpu-core/src/device.rs | 35 +++++++++++++++++++++++++++++++++++ wgpu-remote/src/server.rs | 15 +++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/wgpu-core/src/device.rs b/wgpu-core/src/device.rs index 017615204a..2169ffe037 100644 --- a/wgpu-core/src/device.rs +++ b/wgpu-core/src/device.rs @@ -902,6 +902,41 @@ impl> Global { unmap_buffer(&device.raw, buffer); } + pub fn device_get_buffer_sub_data( + &self, + device_id: DeviceId, + buffer_id: BufferId, + offset: BufferAddress, + data: &mut [u8], + ) { + let hub = B::hub(self); + let mut token = Token::root(); + + let (device_guard, mut token) = hub.devices.read(&mut token); + let (mut buffer_guard, _) = hub.buffers.write(&mut token); + let device = &device_guard[device_id]; + let mut buffer = &mut buffer_guard[buffer_id]; + assert!(buffer.usage.contains(resource::BufferUsage::MAP_READ)); + //assert!(buffer isn't used by the GPU); + + match map_buffer( + &device.raw, + &mut buffer, + offset .. offset + data.len() as BufferAddress, + HostMap::Read, + ) { + Ok(ptr) => unsafe { + ptr::copy_nonoverlapping(ptr, data.as_mut_ptr(), data.len()); + }, + Err(e) => { + log::error!("failed to map a buffer: {:?}", e); + return; + } + } + + unmap_buffer(&device.raw, buffer); + } + pub fn buffer_destroy(&self, buffer_id: BufferId) { let hub = B::hub(self); let mut token = Token::root(); diff --git a/wgpu-remote/src/server.rs b/wgpu-remote/src/server.rs index 572b3e9352..f8b7e8c545 100644 --- a/wgpu-remote/src/server.rs +++ b/wgpu-remote/src/server.rs @@ -79,3 +79,18 @@ pub extern "C" fn wgpu_server_device_set_buffer_sub_data( }; gfx_select!(self_id => global.device_set_buffer_sub_data(self_id, buffer_id, offset, slice)); } + +#[no_mangle] +pub extern "C" fn wgpu_server_device_get_buffer_sub_data( + global: &Global<()>, + self_id: id::DeviceId, + buffer_id: id::BufferId, + offset: core::BufferAddress, + data: *mut u8, + size: core::BufferAddress, +) { + let slice = unsafe { + slice::from_raw_parts_mut(data, size as usize) + }; + gfx_select!(self_id => global.device_get_buffer_sub_data(self_id, buffer_id, offset, slice)); +}