diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2019-12-17 14:25:06 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-12-17 14:25:06 -0500 |
commit | cea55e3892cf271b423806771c34b6ecad35ddde (patch) | |
tree | 397001fef52bd05786fc167be5a973e5e2b01273 /components/webgpu/lib.rs | |
parent | a5844d5efd9135c0448ace252508bdce20e341c3 (diff) | |
parent | ebfcd0f27f654bcf14fef7dcb2fca3ad2c88f4bf (diff) | |
download | servo-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.rs | 56 |
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); |