aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/gpudevice.rs
diff options
context:
space:
mode:
authorIstvan Miklos <istvan.miklos@h-lab.eu>2020-02-11 22:35:11 +0100
committerIstvan Miklos <istvan.miklos@h-lab.eu>2020-02-25 10:18:36 +0100
commit2df4d9fce419505cf7c5305321d4135559534997 (patch)
tree2f3892b9c38c7a393f875170bfc8ed7e374aece4 /components/script/dom/gpudevice.rs
parent92f5b36f49671756e02a33ec70006d5b374a4388 (diff)
downloadservo-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.rs63
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