mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
Merge #394
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:
@@ -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();
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user