aboutsummaryrefslogtreecommitdiffstats
path: root/components/webgpu/lib.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-12-17 14:25:06 -0500
committerGitHub <noreply@github.com>2019-12-17 14:25:06 -0500
commitcea55e3892cf271b423806771c34b6ecad35ddde (patch)
tree397001fef52bd05786fc167be5a973e5e2b01273 /components/webgpu/lib.rs
parenta5844d5efd9135c0448ace252508bdce20e341c3 (diff)
parentebfcd0f27f654bcf14fef7dcb2fca3ad2c88f4bf (diff)
downloadservo-cea55e3892cf271b423806771c34b6ecad35ddde.tar.gz
servo-cea55e3892cf271b423806771c34b6ecad35ddde.zip
Auto merge of #25264 - szeged:wgpu_buffer, r=jdm
Initial implementation of GPUBuffer for WebGPU Added WebIDL bindings for `GPUBuffer`, `GPUBufferDescriptor`, `GPUBufferUsage`. Implemented the `createBuffer` and `createBufferMapped` functions of `GPUDevice`. --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes addresses a part of #24706 <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> cc @kvark @jdm @zakorgy <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/25264) <!-- Reviewable:end -->
Diffstat (limited to 'components/webgpu/lib.rs')
-rw-r--r--components/webgpu/lib.rs56
1 files changed, 56 insertions, 0 deletions
diff --git a/components/webgpu/lib.rs b/components/webgpu/lib.rs
index bfd68ccc611..156beeb040b 100644
--- a/components/webgpu/lib.rs
+++ b/components/webgpu/lib.rs
@@ -36,6 +36,20 @@ pub enum WebGPURequest {
wgpu::id::DeviceId,
),
Exit(IpcSender<()>),
+ CreateBuffer(
+ IpcSender<WebGPUBuffer>,
+ WebGPUDevice,
+ wgpu::id::BufferId,
+ wgpu::resource::BufferDescriptor,
+ ),
+ CreateBufferMapped(
+ IpcSender<(WebGPUBuffer, Vec<u8>)>,
+ WebGPUDevice,
+ wgpu::id::BufferId,
+ wgpu::resource::BufferDescriptor,
+ ),
+ UnmapBuffer(WebGPUBuffer),
+ DestroyBuffer(WebGPUBuffer),
}
#[derive(Clone, Debug, Deserialize, Serialize)]
@@ -152,6 +166,47 @@ impl WGPU {
)
}
},
+ WebGPURequest::CreateBuffer(sender, device, id, descriptor) => {
+ let global = &self.global;
+ let _output =
+ gfx_select!(id => global.device_create_buffer(device.0, &descriptor, id));
+ let buffer = WebGPUBuffer(id);
+ if let Err(e) = sender.send(buffer) {
+ warn!(
+ "Failed to send response to WebGPURequest::CreateBuffer ({})",
+ e
+ )
+ }
+ },
+ WebGPURequest::CreateBufferMapped(sender, device, id, descriptor) => {
+ let global = &self.global;
+ let mut arr_buff_ptr: *mut u8 = std::ptr::null_mut();
+ let buffer_size = descriptor.size as usize;
+
+ let _output = gfx_select!(id =>
+ global.device_create_buffer_mapped(device.0, &descriptor, &mut arr_buff_ptr, id));
+ let buffer = WebGPUBuffer(id);
+
+ let mut array_buffer = Vec::with_capacity(buffer_size);
+ unsafe {
+ array_buffer.set_len(buffer_size);
+ std::ptr::copy(arr_buff_ptr, array_buffer.as_mut_ptr(), buffer_size);
+ };
+ if let Err(e) = sender.send((buffer, array_buffer)) {
+ warn!(
+ "Failed to send response to WebGPURequest::CreateBufferMapped ({})",
+ e
+ )
+ }
+ },
+ WebGPURequest::UnmapBuffer(buffer) => {
+ let global = &self.global;
+ let _output = gfx_select!(buffer.0 => global.buffer_unmap(buffer.0));
+ },
+ WebGPURequest::DestroyBuffer(buffer) => {
+ let global = &self.global;
+ let _output = gfx_select!(buffer.0 => global.buffer_destroy(buffer.0));
+ },
WebGPURequest::Exit(sender) => {
self.deinit();
if let Err(e) = sender.send(()) {
@@ -181,3 +236,4 @@ macro_rules! webgpu_resource {
webgpu_resource!(WebGPUAdapter, wgpu::id::AdapterId);
webgpu_resource!(WebGPUDevice, wgpu::id::DeviceId);
+webgpu_resource!(WebGPUBuffer, wgpu::id::BufferId);