aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/gpucommandencoder.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/gpucommandencoder.rs')
-rw-r--r--components/script/dom/gpucommandencoder.rs153
1 files changed, 74 insertions, 79 deletions
diff --git a/components/script/dom/gpucommandencoder.rs b/components/script/dom/gpucommandencoder.rs
index f926853b794..9243176be11 100644
--- a/components/script/dom/gpucommandencoder.rs
+++ b/components/script/dom/gpucommandencoder.rs
@@ -2,13 +2,12 @@
* 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 std::borrow::Cow;
use std::cell::Cell;
use std::collections::HashSet;
use dom_struct::dom_struct;
use webgpu::wgc::command as wgpu_com;
-use webgpu::{self, wgt, WebGPU, WebGPUComputePass, WebGPURequest};
+use webgpu::{self, wgt, WebGPU, WebGPUComputePass, WebGPURenderPass, WebGPURequest};
use super::gpuconvert::convert_label;
use crate::dom::bindings::cell::DomRefCell;
@@ -134,89 +133,85 @@ impl GPUCommandEncoderMethods for GPUCommandEncoder {
&self,
descriptor: &GPURenderPassDescriptor,
) -> DomRoot<GPURenderPassEncoder> {
- let render_pass = if !self.valid.get() {
- None
- } else {
- let depth_stencil = descriptor.depthStencilAttachment.as_ref().map(|depth| {
- wgpu_com::RenderPassDepthStencilAttachment {
- depth: wgpu_com::PassChannel {
- load_op: convert_load_op(depth.depthLoadOp),
- store_op: convert_store_op(depth.depthStoreOp),
- clear_value: *depth.depthClearValue.unwrap_or_default(),
- read_only: depth.depthReadOnly,
- },
- stencil: wgpu_com::PassChannel {
- load_op: convert_load_op(depth.stencilLoadOp),
- store_op: convert_store_op(depth.stencilStoreOp),
- clear_value: depth.stencilClearValue,
- read_only: depth.stencilReadOnly,
+ let depth_stencil_attachment = descriptor.depthStencilAttachment.as_ref().map(|depth| {
+ wgpu_com::RenderPassDepthStencilAttachment {
+ depth: wgpu_com::PassChannel {
+ load_op: convert_load_op(depth.depthLoadOp),
+ store_op: convert_store_op(depth.depthStoreOp),
+ clear_value: *depth.depthClearValue.unwrap_or_default(),
+ read_only: depth.depthReadOnly,
+ },
+ stencil: wgpu_com::PassChannel {
+ load_op: convert_load_op(depth.stencilLoadOp),
+ store_op: convert_store_op(depth.stencilStoreOp),
+ clear_value: depth.stencilClearValue,
+ read_only: depth.stencilReadOnly,
+ },
+ view: depth.view.id().0,
+ }
+ });
+
+ let color_attachments = descriptor
+ .colorAttachments
+ .iter()
+ .map(|color| {
+ let channel = wgpu_com::PassChannel {
+ load_op: convert_load_op(Some(color.loadOp)),
+ store_op: convert_store_op(Some(color.storeOp)),
+ clear_value: if let Some(clear_val) = &color.clearValue {
+ match clear_val {
+ DoubleSequenceOrGPUColorDict::DoubleSequence(s) => {
+ let mut w = s.clone();
+ if w.len() < 3 {
+ w.resize(3, Finite::wrap(0.0f64));
+ }
+ w.resize(4, Finite::wrap(1.0f64));
+ wgt::Color {
+ r: *w[0],
+ g: *w[1],
+ b: *w[2],
+ a: *w[3],
+ }
+ },
+ DoubleSequenceOrGPUColorDict::GPUColorDict(d) => wgt::Color {
+ r: *d.r,
+ g: *d.g,
+ b: *d.b,
+ a: *d.a,
+ },
+ }
+ } else {
+ wgt::Color::TRANSPARENT
},
- view: depth.view.id().0,
- }
- });
+ read_only: false,
+ };
+ Some(wgpu_com::RenderPassColorAttachment {
+ resolve_target: color.resolveTarget.as_ref().map(|t| t.id().0),
+ channel,
+ view: color.view.id().0,
+ })
+ })
+ .collect::<Vec<_>>();
+ let render_pass_id = self
+ .global()
+ .wgpu_id_hub()
+ .create_render_pass_id(self.device.id().0.backend());
- let desc = wgpu_com::RenderPassDescriptor {
- color_attachments: Cow::Owned(
- descriptor
- .colorAttachments
- .iter()
- .map(|color| {
- let channel = wgpu_com::PassChannel {
- load_op: convert_load_op(Some(color.loadOp)),
- store_op: convert_store_op(Some(color.storeOp)),
- clear_value: if let Some(clear_val) = &color.clearValue {
- match clear_val {
- DoubleSequenceOrGPUColorDict::DoubleSequence(s) => {
- let mut w = s.clone();
- if w.len() < 3 {
- w.resize(3, Finite::wrap(0.0f64));
- }
- w.resize(4, Finite::wrap(1.0f64));
- wgt::Color {
- r: *w[0],
- g: *w[1],
- b: *w[2],
- a: *w[3],
- }
- },
- DoubleSequenceOrGPUColorDict::GPUColorDict(d) => {
- wgt::Color {
- r: *d.r,
- g: *d.g,
- b: *d.b,
- a: *d.a,
- }
- },
- }
- } else {
- wgt::Color::TRANSPARENT
- },
- read_only: false,
- };
- Some(wgpu_com::RenderPassColorAttachment {
- resolve_target: color.resolveTarget.as_ref().map(|t| t.id().0),
- channel,
- view: color.view.id().0,
- })
- })
- .collect::<Vec<_>>(),
- ),
- depth_stencil_attachment: depth_stencil.as_ref(),
- label: descriptor
- .parent
- .label
- .as_ref()
- .map(|l| Cow::Borrowed(&**l)),
- timestamp_writes: None,
- occlusion_query_set: None,
- };
- Some(wgpu_com::RenderPass::new(self.encoder.0, &desc))
- };
+ if let Err(e) = self.channel.0.send(WebGPURequest::BeginRenderPass {
+ command_encoder_id: self.id().0,
+ render_pass_id,
+ label: convert_label(&descriptor.parent),
+ depth_stencil_attachment,
+ color_attachments,
+ device_id: self.device.id().0,
+ }) {
+ warn!("Failed to send WebGPURequest::BeginRenderPass {e:?}");
+ }
GPURenderPassEncoder::new(
&self.global(),
self.channel.clone(),
- render_pass,
+ WebGPURenderPass(render_pass_id),
self,
descriptor.parent.label.clone().unwrap_or_default(),
)