diff options
author | Istvan Miklos <istvan.miklos@h-lab.eu> | 2020-02-11 22:35:11 +0100 |
---|---|---|
committer | Istvan Miklos <istvan.miklos@h-lab.eu> | 2020-02-25 10:18:36 +0100 |
commit | 2df4d9fce419505cf7c5305321d4135559534997 (patch) | |
tree | 2f3892b9c38c7a393f875170bfc8ed7e374aece4 /components/script/dom/gpudevice.rs | |
parent | 92f5b36f49671756e02a33ec70006d5b374a4388 (diff) | |
download | servo-2df4d9fce419505cf7c5305321d4135559534997.tar.gz servo-2df4d9fce419505cf7c5305321d4135559534997.zip |
Implement mapReadAsync function of GPUBuffer
Implemented the `mapReadAsync` and fixed the `unmap` functions of `GPUBuffer`.
Added `mapped` internal slot for tracking the ArrayBuffer/Promise.
Added more states to the `GPUBufferState` enum.
Diffstat (limited to 'components/script/dom/gpudevice.rs')
-rw-r--r-- | components/script/dom/gpudevice.rs | 63 |
1 files changed, 27 insertions, 36 deletions
diff --git a/components/script/dom/gpudevice.rs b/components/script/dom/gpudevice.rs index 1d17961f87c..40e97d34d28 100644 --- a/components/script/dom/gpudevice.rs +++ b/components/script/dom/gpudevice.rs @@ -46,7 +46,7 @@ use webgpu::wgpu::binding_model::{ ShaderStage, }; use webgpu::wgpu::resource::{BufferDescriptor, BufferUsage}; -use webgpu::{WebGPU, WebGPUBuffer, WebGPUDevice, WebGPUQueue, WebGPURequest}; +use webgpu::{WebGPU, WebGPUDevice, WebGPUQueue, WebGPURequest}; #[dom_struct] pub struct GPUDevice { @@ -106,38 +106,6 @@ impl GPUDevice { } impl GPUDevice { - unsafe fn resolve_create_buffer_mapped( - &self, - cx: SafeJSContext, - gpu_buffer: WebGPUBuffer, - array_buffer: Vec<u8>, - descriptor: BufferDescriptor, - valid: bool, - ) -> Vec<JSVal> { - rooted!(in(*cx) let mut js_array_buffer = ptr::null_mut::<JSObject>()); - let mut out = Vec::new(); - assert!(ArrayBuffer::create( - *cx, - CreateWith::Slice(array_buffer.as_slice()), - js_array_buffer.handle_mut(), - ) - .is_ok()); - - let buff = GPUBuffer::new( - &self.global(), - self.channel.clone(), - gpu_buffer, - self.device, - GPUBufferState::Mapped, - descriptor.size, - descriptor.usage.bits(), - valid, - ); - out.push(ObjectValue(buff.reflector().get_jsobject().get())); - out.push(ObjectValue(js_array_buffer.get())); - out - } - fn validate_buffer_descriptor( &self, descriptor: &GPUBufferDescriptor, @@ -223,6 +191,7 @@ impl GPUDeviceMethods for GPUDevice { descriptor.size, descriptor.usage, valid, + RootedTraceableBox::new(Heap::default()), ) } @@ -245,11 +214,33 @@ impl GPUDeviceMethods for GPUDevice { )) .expect("Failed to create WebGPU buffer"); - let (buffer, array_buffer) = receiver.recv().unwrap(); - + rooted!(in(*cx) let mut js_array_buffer = ptr::null_mut::<JSObject>()); unsafe { - self.resolve_create_buffer_mapped(cx, buffer, array_buffer, wgpu_descriptor, valid) + assert!(ArrayBuffer::create( + *cx, + CreateWith::Length(descriptor.size as u32), + js_array_buffer.handle_mut(), + ) + .is_ok()); } + + let buffer = receiver.recv().unwrap(); + let buff = GPUBuffer::new( + &self.global(), + self.channel.clone(), + buffer, + self.device, + GPUBufferState::MappedForWriting, + wgpu_descriptor.size, + wgpu_descriptor.usage.bits(), + valid, + RootedTraceableBox::from_box(Heap::boxed(js_array_buffer.get())), + ); + + vec![ + ObjectValue(buff.reflector().get_jsobject().get()), + ObjectValue(js_array_buffer.get()), + ] } /// https://gpuweb.github.io/gpuweb/#GPUDevice-createBindGroupLayout |