diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2020-01-23 07:53:58 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-23 07:53:58 -0500 |
commit | 2b77a992dba0547180b9bfd89a015556f8a51ba5 (patch) | |
tree | 89fd481d7d8fb18037c839ee29891a58e2a65898 /components/script/dom/gpudevice.rs | |
parent | 24674687acaaca3a796f8cc61bc98c6e7d0097fb (diff) | |
parent | dbed5f136438325bba20e24f0bff3aee4e86e763 (diff) | |
download | servo-2b77a992dba0547180b9bfd89a015556f8a51ba5.tar.gz servo-2b77a992dba0547180b9bfd89a015556f8a51ba5.zip |
Auto merge of #25580 - szeged:wgpu_worker, r=jdm
Support worker for WebGPU
To create resource ids for the WebGPU we need to access the `IdentityHub`.
In order to access the `IdentityHub` from a `Window` or a `Worker` as well, I've moved the `IdentityHub` to the `GlobalScope` from the `Navigator`.
<!-- Please describe your changes on the following line: -->
---
<!-- 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 fix #25532
cc @kvark @jdm @zakorgy
Diffstat (limited to 'components/script/dom/gpudevice.rs')
-rw-r--r-- | components/script/dom/gpudevice.rs | 108 |
1 files changed, 47 insertions, 61 deletions
diff --git a/components/script/dom/gpudevice.rs b/components/script/dom/gpudevice.rs index 0ebefda60a0..de3efec8117 100644 --- a/components/script/dom/gpudevice.rs +++ b/components/script/dom/gpudevice.rs @@ -12,8 +12,6 @@ use crate::dom::bindings::codegen::Bindings::GPUBindGroupLayoutBinding::{ use crate::dom::bindings::codegen::Bindings::GPUBufferBinding::GPUBufferDescriptor; use crate::dom::bindings::codegen::Bindings::GPUDeviceBinding::{self, GPUDeviceMethods}; use crate::dom::bindings::codegen::Bindings::GPUPipelineLayoutBinding::GPUPipelineLayoutDescriptor; -use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowBinding::WindowMethods; -use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; @@ -23,12 +21,11 @@ use crate::dom::gpuadapter::GPUAdapter; use crate::dom::gpubindgrouplayout::GPUBindGroupLayout; use crate::dom::gpubuffer::{GPUBuffer, GPUBufferState}; use crate::dom::gpupipelinelayout::GPUPipelineLayout; -use crate::dom::window::Window; use crate::script_runtime::JSContext as SafeJSContext; use dom_struct::dom_struct; use ipc_channel::ipc; use js::jsapi::{Heap, JSObject}; -use js::jsval::{JSVal, ObjectValue, UndefinedValue}; +use js::jsval::{JSVal, ObjectValue}; use js::typedarray::{ArrayBuffer, CreateWith}; use std::collections::{HashMap, HashSet}; use std::ptr::{self, NonNull}; @@ -179,20 +176,16 @@ impl GPUDeviceMethods for GPUDevice { fn CreateBuffer(&self, descriptor: &GPUBufferDescriptor) -> DomRoot<GPUBuffer> { let (valid, wgpu_descriptor) = self.validate_buffer_descriptor(descriptor); let (sender, receiver) = ipc::channel().unwrap(); - if let Some(window) = self.global().downcast::<Window>() { - let id = window.Navigator().create_buffer_id(self.device.0.backend()); - self.channel - .0 - .send(WebGPURequest::CreateBuffer( - sender, - self.device, - id, - wgpu_descriptor, - )) - .expect("Failed to create WebGPU buffer"); - } else { - unimplemented!() - }; + let id = self.global().wgpu_create_buffer_id(self.device.0.backend()); + self.channel + .0 + .send(WebGPURequest::CreateBuffer( + sender, + self.device, + id, + wgpu_descriptor, + )) + .expect("Failed to create WebGPU buffer"); let buffer = receiver.recv().unwrap(); @@ -216,21 +209,16 @@ impl GPUDeviceMethods for GPUDevice { ) -> Vec<JSVal> { let (valid, wgpu_descriptor) = self.validate_buffer_descriptor(descriptor); let (sender, receiver) = ipc::channel().unwrap(); - rooted!(in(*cx) let js_val = UndefinedValue()); - if let Some(window) = self.global().downcast::<Window>() { - let id = window.Navigator().create_buffer_id(self.device.0.backend()); - self.channel - .0 - .send(WebGPURequest::CreateBufferMapped( - sender, - self.device, - id, - wgpu_descriptor.clone(), - )) - .expect("Failed to create WebGPU buffer"); - } else { - return vec![js_val.get()]; - }; + let id = self.global().wgpu_create_buffer_id(self.device.0.backend()); + self.channel + .0 + .send(WebGPURequest::CreateBufferMapped( + sender, + self.device, + id, + wgpu_descriptor.clone(), + )) + .expect("Failed to create WebGPU buffer"); let (buffer, array_buffer) = receiver.recv().unwrap(); @@ -381,20 +369,19 @@ impl GPUDeviceMethods for GPUDevice { max_dynamic_storage_buffers_per_pipeline_layout >= 0; let (sender, receiver) = ipc::channel().unwrap(); - if let Some(window) = self.global().downcast::<Window>() { - let id = window - .Navigator() - .create_bind_group_layout_id(self.device.0.backend()); - self.channel - .0 - .send(WebGPURequest::CreateBindGroupLayout( - sender, - self.device, - id, - bindings.clone(), - )) - .expect("Failed to create WebGPU BindGroupLayout"); - } + let id = self + .global() + .wgpu_create_bind_group_layout_id(self.device.0.backend()); + self.channel + .0 + .send(WebGPURequest::CreateBindGroupLayout( + sender, + self.device, + id, + bindings.clone(), + )) + .expect("Failed to create WebGPU BindGroupLayout"); + let bgl = receiver.recv().unwrap(); let binds = descriptor @@ -460,20 +447,19 @@ impl GPUDeviceMethods for GPUDevice { max_dynamic_storage_buffers_per_pipeline_layout >= 0; let (sender, receiver) = ipc::channel().unwrap(); - if let Some(window) = self.global().downcast::<Window>() { - let id = window - .Navigator() - .create_pipeline_layout_id(self.device.0.backend()); - self.channel - .0 - .send(WebGPURequest::CreatePipelineLayout( - sender, - self.device, - id, - bgl_ids, - )) - .expect("Failed to create WebGPU PipelineLayout"); - } + let id = self + .global() + .wgpu_create_pipeline_layout_id(self.device.0.backend()); + self.channel + .0 + .send(WebGPURequest::CreatePipelineLayout( + sender, + self.device, + id, + bgl_ids, + )) + .expect("Failed to create WebGPU PipelineLayout"); + let pipeline_layout = receiver.recv().unwrap(); GPUPipelineLayout::new(&self.global(), bind_group_layouts, pipeline_layout, valid) } |