aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorIstvan Miklos <istvan.miklos@h-lab.eu>2020-02-03 15:42:13 +0100
committerIstvan Miklos <istvan.miklos@h-lab.eu>2020-02-11 10:15:03 +0100
commit9031369c19f3274a1dee4e15e67c0c539d8aa976 (patch)
tree4ba7e1beb281d179f42bf575bacc2c58a4e8d574 /components/script/dom
parenta8621c4ed9d87f6d168fd9b70e0cf501a4033632 (diff)
downloadservo-9031369c19f3274a1dee4e15e67c0c539d8aa976.tar.gz
servo-9031369c19f3274a1dee4e15e67c0c539d8aa976.zip
Initial implementation of GPUComputePipeline
Added WebIDL bindings for `GPUComputePipeline`. Implemented the `createComputePipeline` function of `GPUDevice`.
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/bindings/trace.rs5
-rw-r--r--components/script/dom/globalscope.rs9
-rw-r--r--components/script/dom/gpucomputepipeline.rs55
-rw-r--r--components/script/dom/gpudevice.rs30
-rw-r--r--components/script/dom/gpupipelinelayout.rs6
-rw-r--r--components/script/dom/gpushadermodule.rs6
-rw-r--r--components/script/dom/identityhub.rs14
-rw-r--r--components/script/dom/mod.rs1
-rw-r--r--components/script/dom/webidls/GPUComputePipeline.webidl22
-rw-r--r--components/script/dom/webidls/GPUDevice.webidl4
10 files changed, 144 insertions, 8 deletions
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs
index e58d9d8968f..0ca2f5b2aeb 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -152,8 +152,8 @@ use tendril::{StrTendril, TendrilSink};
use time::{Duration, Timespec, Tm};
use uuid::Uuid;
use webgpu::{
- WebGPU, WebGPUAdapter, WebGPUBindGroup, WebGPUBindGroupLayout, WebGPUBuffer, WebGPUDevice,
- WebGPUPipelineLayout, WebGPUShaderModule,
+ WebGPU, WebGPUAdapter, WebGPUBindGroup, WebGPUBindGroupLayout, WebGPUBuffer,
+ WebGPUComputePipeline, WebGPUDevice, WebGPUPipelineLayout, WebGPUShaderModule,
};
use webrender_api::{DocumentId, ImageKey};
use webvr_traits::{WebVRGamepadData, WebVRGamepadHand, WebVRGamepadState};
@@ -535,6 +535,7 @@ unsafe_no_jsmanaged_fields!(WebGPUDevice);
unsafe_no_jsmanaged_fields!(WebGPUBuffer);
unsafe_no_jsmanaged_fields!(WebGPUBindGroup);
unsafe_no_jsmanaged_fields!(WebGPUBindGroupLayout);
+unsafe_no_jsmanaged_fields!(WebGPUComputePipeline);
unsafe_no_jsmanaged_fields!(WebGPUPipelineLayout);
unsafe_no_jsmanaged_fields!(WebGPUShaderModule);
unsafe_no_jsmanaged_fields!(GPUBufferState);
diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs
index 0656a982cc9..378397ac2de 100644
--- a/components/script/dom/globalscope.rs
+++ b/components/script/dom/globalscope.rs
@@ -99,8 +99,8 @@ use time::{get_time, Timespec};
use uuid::Uuid;
use webgpu::wgpu::{
id::{
- AdapterId, BindGroupId, BindGroupLayoutId, BufferId, DeviceId, PipelineLayoutId,
- ShaderModuleId,
+ AdapterId, BindGroupId, BindGroupLayoutId, BufferId, ComputePipelineId, DeviceId,
+ PipelineLayoutId, ShaderModuleId,
},
Backend,
};
@@ -2137,6 +2137,11 @@ impl GlobalScope {
.borrow_mut()
.create_shader_module_id(backend)
}
+ pub fn wgpu_create_compute_pipeline_id(&self, backend: Backend) -> ComputePipelineId {
+ self.gpu_id_hub
+ .borrow_mut()
+ .create_compute_pipeline_id(backend)
+ }
}
fn timestamp_in_ms(time: Timespec) -> u64 {
diff --git a/components/script/dom/gpucomputepipeline.rs b/components/script/dom/gpucomputepipeline.rs
new file mode 100644
index 00000000000..32c0338a7e9
--- /dev/null
+++ b/components/script/dom/gpucomputepipeline.rs
@@ -0,0 +1,55 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+use crate::dom::bindings::cell::DomRefCell;
+use crate::dom::bindings::codegen::Bindings::GPUComputePipelineBinding::{
+ GPUComputePipelineBinding, GPUComputePipelineMethods,
+};
+use crate::dom::bindings::reflector::reflect_dom_object;
+use crate::dom::bindings::reflector::Reflector;
+use crate::dom::bindings::root::DomRoot;
+use crate::dom::bindings::str::DOMString;
+use crate::dom::globalscope::GlobalScope;
+use dom_struct::dom_struct;
+use webgpu::WebGPUComputePipeline;
+
+#[dom_struct]
+pub struct GPUComputePipeline {
+ reflector_: Reflector,
+ label: DomRefCell<Option<DOMString>>,
+ compute_pipeline: WebGPUComputePipeline,
+}
+
+impl GPUComputePipeline {
+ fn new_inherited(compute_pipeline: WebGPUComputePipeline) -> GPUComputePipeline {
+ Self {
+ reflector_: Reflector::new(),
+ label: DomRefCell::new(None),
+ compute_pipeline,
+ }
+ }
+
+ pub fn new(
+ global: &GlobalScope,
+ compute_pipeline: WebGPUComputePipeline,
+ ) -> DomRoot<GPUComputePipeline> {
+ reflect_dom_object(
+ Box::new(GPUComputePipeline::new_inherited(compute_pipeline)),
+ global,
+ GPUComputePipelineBinding::Wrap,
+ )
+ }
+}
+
+impl GPUComputePipelineMethods for GPUComputePipeline {
+ /// https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label
+ fn GetLabel(&self) -> Option<DOMString> {
+ self.label.borrow().clone()
+ }
+
+ /// https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label
+ fn SetLabel(&self, value: Option<DOMString>) {
+ *self.label.borrow_mut() = value;
+ }
+}
diff --git a/components/script/dom/gpudevice.rs b/components/script/dom/gpudevice.rs
index 428552173a3..66c5981b0f7 100644
--- a/components/script/dom/gpudevice.rs
+++ b/components/script/dom/gpudevice.rs
@@ -11,6 +11,7 @@ use crate::dom::bindings::codegen::Bindings::GPUBindGroupLayoutBinding::{
GPUBindGroupLayoutBindings, GPUBindGroupLayoutDescriptor, GPUBindingType,
};
use crate::dom::bindings::codegen::Bindings::GPUBufferBinding::GPUBufferDescriptor;
+use crate::dom::bindings::codegen::Bindings::GPUComputePipelineBinding::GPUComputePipelineDescriptor;
use crate::dom::bindings::codegen::Bindings::GPUDeviceBinding::{self, GPUDeviceMethods};
use crate::dom::bindings::codegen::Bindings::GPUPipelineLayoutBinding::GPUPipelineLayoutDescriptor;
use crate::dom::bindings::codegen::Bindings::GPUShaderModuleBinding::GPUShaderModuleDescriptor;
@@ -25,6 +26,7 @@ use crate::dom::gpuadapter::GPUAdapter;
use crate::dom::gpubindgroup::GPUBindGroup;
use crate::dom::gpubindgrouplayout::GPUBindGroupLayout;
use crate::dom::gpubuffer::{GPUBuffer, GPUBufferState};
+use crate::dom::gpucomputepipeline::GPUComputePipeline;
use crate::dom::gpupipelinelayout::GPUPipelineLayout;
use crate::dom::gpushadermodule::GPUShaderModule;
use crate::script_runtime::JSContext as SafeJSContext;
@@ -559,4 +561,32 @@ impl GPUDeviceMethods for GPUDevice {
let shader_module = receiver.recv().unwrap();
GPUShaderModule::new(&self.global(), shader_module)
}
+
+ /// https://gpuweb.github.io/gpuweb/#dom-gpudevice-createcomputepipeline
+ fn CreateComputePipeline(
+ &self,
+ descriptor: &GPUComputePipelineDescriptor,
+ ) -> DomRoot<GPUComputePipeline> {
+ let pipeline = descriptor.parent.layout.id();
+ let program = descriptor.computeStage.module.id();
+ let entry_point = descriptor.computeStage.entryPoint.to_string();
+ let id = self
+ .global()
+ .wgpu_create_compute_pipeline_id(self.device.0.backend());
+ let (sender, receiver) = ipc::channel().unwrap();
+ self.channel
+ .0
+ .send(WebGPURequest::CreateComputePipeline(
+ sender,
+ self.device,
+ id,
+ pipeline.0,
+ program.0,
+ entry_point,
+ ))
+ .expect("Failed to create WebGPU ComputePipeline");
+
+ let compute_pipeline = receiver.recv().unwrap();
+ GPUComputePipeline::new(&self.global(), compute_pipeline)
+ }
}
diff --git a/components/script/dom/gpupipelinelayout.rs b/components/script/dom/gpupipelinelayout.rs
index a52bbedb7b5..40f5fd9324d 100644
--- a/components/script/dom/gpupipelinelayout.rs
+++ b/components/script/dom/gpupipelinelayout.rs
@@ -56,6 +56,12 @@ impl GPUPipelineLayout {
}
}
+impl GPUPipelineLayout {
+ pub fn id(&self) -> WebGPUPipelineLayout {
+ self.pipeline_layout
+ }
+}
+
impl GPUPipelineLayoutMethods for GPUPipelineLayout {
/// https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label
fn GetLabel(&self) -> Option<DOMString> {
diff --git a/components/script/dom/gpushadermodule.rs b/components/script/dom/gpushadermodule.rs
index 215a0efc100..241f0650245 100644
--- a/components/script/dom/gpushadermodule.rs
+++ b/components/script/dom/gpushadermodule.rs
@@ -41,6 +41,12 @@ impl GPUShaderModule {
}
}
+impl GPUShaderModule {
+ pub fn id(&self) -> WebGPUShaderModule {
+ self.shader_module
+ }
+}
+
impl GPUShaderModuleMethods for GPUShaderModule {
/// https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label
fn GetLabel(&self) -> Option<DOMString> {
diff --git a/components/script/dom/identityhub.rs b/components/script/dom/identityhub.rs
index c260cfc5b2e..838cb6b908b 100644
--- a/components/script/dom/identityhub.rs
+++ b/components/script/dom/identityhub.rs
@@ -6,8 +6,8 @@ use smallvec::SmallVec;
use webgpu::wgpu::{
hub::IdentityManager,
id::{
- AdapterId, BindGroupId, BindGroupLayoutId, BufferId, DeviceId, PipelineLayoutId,
- ShaderModuleId,
+ AdapterId, BindGroupId, BindGroupLayoutId, BufferId, ComputePipelineId, DeviceId,
+ PipelineLayoutId, ShaderModuleId,
},
Backend,
};
@@ -19,6 +19,7 @@ pub struct IdentityHub {
buffers: IdentityManager,
bind_groups: IdentityManager,
bind_group_layouts: IdentityManager,
+ compute_pipelines: IdentityManager,
pipeline_layouts: IdentityManager,
shader_modules: IdentityManager,
backend: Backend,
@@ -32,6 +33,7 @@ impl IdentityHub {
buffers: IdentityManager::default(),
bind_groups: IdentityManager::default(),
bind_group_layouts: IdentityManager::default(),
+ compute_pipelines: IdentityManager::default(),
pipeline_layouts: IdentityManager::default(),
shader_modules: IdentityManager::default(),
backend,
@@ -58,6 +60,10 @@ impl IdentityHub {
self.bind_group_layouts.alloc(self.backend)
}
+ fn create_compute_pipeline_id(&mut self) -> ComputePipelineId {
+ self.compute_pipelines.alloc(self.backend)
+ }
+
fn create_pipeline_layout_id(&mut self) -> PipelineLayoutId {
self.pipeline_layouts.alloc(self.backend)
}
@@ -149,6 +155,10 @@ impl Identities {
self.select(backend).create_bind_group_layout_id()
}
+ pub fn create_compute_pipeline_id(&mut self, backend: Backend) -> ComputePipelineId {
+ self.select(backend).create_compute_pipeline_id()
+ }
+
pub fn create_pipeline_layout_id(&mut self, backend: Backend) -> PipelineLayoutId {
self.select(backend).create_pipeline_layout_id()
}
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs
index 59a60040ab3..1b15aee2c9e 100644
--- a/components/script/dom/mod.rs
+++ b/components/script/dom/mod.rs
@@ -322,6 +322,7 @@ pub mod gpubindgroup;
pub mod gpubindgrouplayout;
pub mod gpubuffer;
pub mod gpubufferusage;
+pub mod gpucomputepipeline;
pub mod gpudevice;
pub mod gpupipelinelayout;
pub mod gpushadermodule;
diff --git a/components/script/dom/webidls/GPUComputePipeline.webidl b/components/script/dom/webidls/GPUComputePipeline.webidl
new file mode 100644
index 00000000000..671c36ad351
--- /dev/null
+++ b/components/script/dom/webidls/GPUComputePipeline.webidl
@@ -0,0 +1,22 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+// https://gpuweb.github.io/gpuweb/#gpucomputepipeline
+[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom.webgpu.enabled"]
+interface GPUComputePipeline {
+};
+GPUComputePipeline includes GPUObjectBase;
+
+dictionary GPUPipelineDescriptorBase : GPUObjectDescriptorBase {
+ required GPUPipelineLayout layout;
+};
+
+dictionary GPUProgrammableStageDescriptor {
+ required GPUShaderModule module;
+ required DOMString entryPoint;
+};
+
+dictionary GPUComputePipelineDescriptor : GPUPipelineDescriptorBase {
+ required GPUProgrammableStageDescriptor computeStage;
+};
diff --git a/components/script/dom/webidls/GPUDevice.webidl b/components/script/dom/webidls/GPUDevice.webidl
index 0c83a1ca5cc..ec1568e5b87 100644
--- a/components/script/dom/webidls/GPUDevice.webidl
+++ b/components/script/dom/webidls/GPUDevice.webidl
@@ -20,8 +20,8 @@ interface GPUDevice : EventTarget {
GPUBindGroup createBindGroup(GPUBindGroupDescriptor descriptor);
GPUShaderModule createShaderModule(GPUShaderModuleDescriptor descriptor);
- /*GPUComputePipeline createComputePipeline(GPUComputePipelineDescriptor descriptor);
- GPURenderPipeline createRenderPipeline(GPURenderPipelineDescriptor descriptor);
+ GPUComputePipeline createComputePipeline(GPUComputePipelineDescriptor descriptor);
+ /*GPURenderPipeline createRenderPipeline(GPURenderPipelineDescriptor descriptor);
GPUCommandEncoder createCommandEncoder(optional GPUCommandEncoderDescriptor descriptor = {});
GPURenderBundleEncoder createRenderBundleEncoder(GPURenderBundleEncoderDescriptor descriptor);