394: Get buffer sub data in wgpu-remote r=kvark a=kvark

Required for `mapReadAsync` implementation in Gecko.

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
This commit is contained in:
bors[bot]
2019-12-02 22:24:17 +00:00
committed by GitHub
2 changed files with 50 additions and 0 deletions

View File

@@ -902,6 +902,41 @@ impl<F: IdentityFilter<BufferId>> Global<F> {
unmap_buffer(&device.raw, buffer);
}
pub fn device_get_buffer_sub_data<B: GfxBackend>(
&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<B: GfxBackend>(&self, buffer_id: BufferId) {
let hub = B::hub(self);
let mut token = Token::root();

View File

@@ -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));
}