diff options
Diffstat (limited to 'components/script/dom/gpurenderpassencoder.rs')
-rw-r--r-- | components/script/dom/gpurenderpassencoder.rs | 178 |
1 files changed, 76 insertions, 102 deletions
diff --git a/components/script/dom/gpurenderpassencoder.rs b/components/script/dom/gpurenderpassencoder.rs index a2d223b6f5d..cf25734eeda 100644 --- a/components/script/dom/gpurenderpassencoder.rs +++ b/components/script/dom/gpurenderpassencoder.rs @@ -2,8 +2,6 @@ * 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/. */ -#![allow(unsafe_code)] - use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::GPUCommandEncoderBinding::GPUColor; use crate::dom::bindings::codegen::Bindings::GPURenderPassEncoderBinding::GPURenderPassEncoderMethods; @@ -18,8 +16,7 @@ use crate::dom::gpucommandencoder::{GPUCommandEncoder, GPUCommandEncoderState}; use crate::dom::gpurenderpipeline::GPURenderPipeline; use dom_struct::dom_struct; use webgpu::{ - wgpu::command::{render_ffi as wgpu_render, RawPass}, - wgpu::id, + wgpu::command::{render_ffi as wgpu_render, RenderPass}, wgt, WebGPU, WebGPURequest, }; @@ -30,21 +27,17 @@ pub struct GPURenderPassEncoder { channel: WebGPU, label: DomRefCell<Option<DOMString>>, #[ignore_malloc_size_of = "defined in wgpu-core"] - raw_pass: DomRefCell<Option<RawPass<id::CommandEncoderId>>>, + render_pass: DomRefCell<Option<RenderPass>>, command_encoder: Dom<GPUCommandEncoder>, } impl GPURenderPassEncoder { - fn new_inherited( - channel: WebGPU, - raw_pass: RawPass<id::CommandEncoderId>, - parent: &GPUCommandEncoder, - ) -> Self { + fn new_inherited(channel: WebGPU, render_pass: RenderPass, parent: &GPUCommandEncoder) -> Self { Self { channel, reflector_: Reflector::new(), label: DomRefCell::new(None), - raw_pass: DomRefCell::new(Some(raw_pass)), + render_pass: DomRefCell::new(Some(render_pass)), command_encoder: Dom::from_ref(parent), } } @@ -52,12 +45,14 @@ impl GPURenderPassEncoder { pub fn new( global: &GlobalScope, channel: WebGPU, - raw_pass: RawPass<id::CommandEncoderId>, + render_pass: RenderPass, parent: &GPUCommandEncoder, ) -> DomRoot<Self> { reflect_dom_object( Box::new(GPURenderPassEncoder::new_inherited( - channel, raw_pass, parent, + channel, + render_pass, + parent, )), global, ) @@ -76,11 +71,12 @@ impl GPURenderPassEncoderMethods for GPURenderPassEncoder { } /// https://gpuweb.github.io/gpuweb/#dom-gpuprogrammablepassencoder-setbindgroup + #[allow(unsafe_code)] fn SetBindGroup(&self, index: u32, bind_group: &GPUBindGroup, dynamic_offsets: Vec<u32>) { - if let Some(raw_pass) = self.raw_pass.borrow_mut().as_mut() { + if let Some(render_pass) = self.render_pass.borrow_mut().as_mut() { unsafe { wgpu_render::wgpu_render_pass_set_bind_group( - raw_pass, + render_pass, index, bind_group.id().0, dynamic_offsets.as_ptr(), @@ -100,24 +96,23 @@ impl GPURenderPassEncoderMethods for GPURenderPassEncoder { min_depth: Finite<f32>, max_depth: Finite<f32>, ) { - if let Some(raw_pass) = self.raw_pass.borrow_mut().as_mut() { - unsafe { - wgpu_render::wgpu_render_pass_set_viewport( - raw_pass, *x, *y, *width, *height, *min_depth, *max_depth, - ) - }; + if let Some(render_pass) = self.render_pass.borrow_mut().as_mut() { + wgpu_render::wgpu_render_pass_set_viewport( + render_pass, + *x, + *y, + *width, + *height, + *min_depth, + *max_depth, + ); } } /// https://gpuweb.github.io/gpuweb/#dom-gpurenderpassencoder-setscissorrect fn SetScissorRect(&self, x: u32, y: u32, width: u32, height: u32) { - if width <= 0 || height <= 0 { - return warn!("Cannot set scissor rect- width and height must greater than 0"); - } - if let Some(raw_pass) = self.raw_pass.borrow_mut().as_mut() { - unsafe { - wgpu_render::wgpu_render_pass_set_scissor_rect(raw_pass, x, y, width, height) - }; + if let Some(render_pass) = self.render_pass.borrow_mut().as_mut() { + wgpu_render::wgpu_render_pass_set_scissor_rect(render_pass, x, y, width, height); } } @@ -137,28 +132,26 @@ impl GPURenderPassEncoderMethods for GPURenderPassEncoder { a: *s[3], }, }; - if let Some(raw_pass) = self.raw_pass.borrow_mut().as_mut() { - unsafe { wgpu_render::wgpu_render_pass_set_blend_color(raw_pass, &colors) }; + if let Some(render_pass) = self.render_pass.borrow_mut().as_mut() { + wgpu_render::wgpu_render_pass_set_blend_color(render_pass, &colors); } } /// https://gpuweb.github.io/gpuweb/#dom-gpurenderpassencoder-setstencilreference fn SetStencilReference(&self, reference: u32) { - if let Some(raw_pass) = self.raw_pass.borrow_mut().as_mut() { - unsafe { wgpu_render::wgpu_render_pass_set_stencil_reference(raw_pass, reference) }; + if let Some(render_pass) = self.render_pass.borrow_mut().as_mut() { + wgpu_render::wgpu_render_pass_set_stencil_reference(render_pass, reference); } } /// https://gpuweb.github.io/gpuweb/#dom-gpurenderpassencoder-endpass fn EndPass(&self) { - if let Some(raw_pass) = self.raw_pass.borrow_mut().take() { - let (pass_data, command_encoder_id) = unsafe { raw_pass.finish_render() }; - + if let Some(render_pass) = self.render_pass.borrow_mut().take() { self.channel .0 .send(WebGPURequest::RunRenderPass { - command_encoder_id, - pass_data, + command_encoder_id: self.command_encoder.id().0, + render_pass, }) .unwrap(); @@ -171,59 +164,46 @@ impl GPURenderPassEncoderMethods for GPURenderPassEncoder { /// https://gpuweb.github.io/gpuweb/#dom-gpurenderencoderbase-setpipeline fn SetPipeline(&self, pipeline: &GPURenderPipeline) { - if let Some(raw_pass) = self.raw_pass.borrow_mut().as_mut() { - unsafe { wgpu_render::wgpu_render_pass_set_pipeline(raw_pass, pipeline.id().0) }; + if let Some(render_pass) = self.render_pass.borrow_mut().as_mut() { + wgpu_render::wgpu_render_pass_set_pipeline(render_pass, pipeline.id().0); } } /// https://gpuweb.github.io/gpuweb/#dom-gpurenderencoderbase-setindexbuffer fn SetIndexBuffer(&self, buffer: &GPUBuffer, offset: u64, size: u64) { - let s = if size == 0 { - wgt::BufferSize::WHOLE - } else { - wgt::BufferSize(size) - }; - - if let Some(raw_pass) = self.raw_pass.borrow_mut().as_mut() { - unsafe { - wgpu_render::wgpu_render_pass_set_index_buffer(raw_pass, buffer.id().0, offset, s) - }; + if let Some(render_pass) = self.render_pass.borrow_mut().as_mut() { + wgpu_render::wgpu_render_pass_set_index_buffer( + render_pass, + buffer.id().0, + offset, + wgt::BufferSize::new(size), + ); } } /// https://gpuweb.github.io/gpuweb/#dom-gpurenderencoderbase-setvertexbuffer fn SetVertexBuffer(&self, slot: u32, buffer: &GPUBuffer, offset: u64, size: u64) { - let s = if size == 0 { - wgt::BufferSize::WHOLE - } else { - wgt::BufferSize(size) - }; - - if let Some(raw_pass) = self.raw_pass.borrow_mut().as_mut() { - unsafe { - wgpu_render::wgpu_render_pass_set_vertex_buffer( - raw_pass, - slot, - buffer.id().0, - offset, - s, - ) - }; + if let Some(render_pass) = self.render_pass.borrow_mut().as_mut() { + wgpu_render::wgpu_render_pass_set_vertex_buffer( + render_pass, + slot, + buffer.id().0, + offset, + wgt::BufferSize::new(size), + ); } } /// https://gpuweb.github.io/gpuweb/#dom-gpurenderencoderbase-draw fn Draw(&self, vertex_count: u32, instance_count: u32, first_vertex: u32, first_instance: u32) { - if let Some(raw_pass) = self.raw_pass.borrow_mut().as_mut() { - unsafe { - wgpu_render::wgpu_render_pass_draw( - raw_pass, - vertex_count, - instance_count, - first_vertex, - first_instance, - ) - }; + if let Some(render_pass) = self.render_pass.borrow_mut().as_mut() { + wgpu_render::wgpu_render_pass_draw( + render_pass, + vertex_count, + instance_count, + first_vertex, + first_instance, + ); } } @@ -236,43 +216,37 @@ impl GPURenderPassEncoderMethods for GPURenderPassEncoder { base_vertex: i32, first_instance: u32, ) { - if let Some(raw_pass) = self.raw_pass.borrow_mut().as_mut() { - unsafe { - wgpu_render::wgpu_render_pass_draw_indexed( - raw_pass, - index_count, - instance_count, - first_index, - base_vertex, - first_instance, - ) - }; + if let Some(render_pass) = self.render_pass.borrow_mut().as_mut() { + wgpu_render::wgpu_render_pass_draw_indexed( + render_pass, + index_count, + instance_count, + first_index, + base_vertex, + first_instance, + ); } } /// https://gpuweb.github.io/gpuweb/#dom-gpurenderencoderbase-drawindirect fn DrawIndirect(&self, indirect_buffer: &GPUBuffer, indirect_offset: u64) { - if let Some(raw_pass) = self.raw_pass.borrow_mut().as_mut() { - unsafe { - wgpu_render::wgpu_render_pass_draw_indirect( - raw_pass, - indirect_buffer.id().0, - indirect_offset, - ) - }; + if let Some(render_pass) = self.render_pass.borrow_mut().as_mut() { + wgpu_render::wgpu_render_pass_draw_indirect( + render_pass, + indirect_buffer.id().0, + indirect_offset, + ); } } /// https://gpuweb.github.io/gpuweb/#dom-gpurenderencoderbase-drawindexedindirect fn DrawIndexedIndirect(&self, indirect_buffer: &GPUBuffer, indirect_offset: u64) { - if let Some(raw_pass) = self.raw_pass.borrow_mut().as_mut() { - unsafe { - wgpu_render::wgpu_render_pass_draw_indexed_indirect( - raw_pass, - indirect_buffer.id().0, - indirect_offset, - ) - }; + if let Some(render_pass) = self.render_pass.borrow_mut().as_mut() { + wgpu_render::wgpu_render_pass_draw_indexed_indirect( + render_pass, + indirect_buffer.id().0, + indirect_offset, + ); } } } |