diff options
Diffstat (limited to 'components/script/dom/gpubindgrouplayout.rs')
-rw-r--r-- | components/script/dom/gpubindgrouplayout.rs | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/components/script/dom/gpubindgrouplayout.rs b/components/script/dom/gpubindgrouplayout.rs index 2a4cb199d41..875eff8e3fc 100644 --- a/components/script/dom/gpubindgrouplayout.rs +++ b/components/script/dom/gpubindgrouplayout.rs @@ -2,15 +2,23 @@ * 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 dom_struct::dom_struct; +use webgpu::wgc::binding_model::BindGroupLayoutDescriptor; use webgpu::{WebGPU, WebGPUBindGroupLayout, WebGPURequest}; use crate::dom::bindings::cell::DomRefCell; -use crate::dom::bindings::codegen::Bindings::WebGPUBinding::GPUBindGroupLayoutMethods; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::codegen::Bindings::WebGPUBinding::{ + GPUBindGroupLayoutDescriptor, GPUBindGroupLayoutMethods, +}; +use crate::dom::bindings::error::Fallible; +use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::USVString; use crate::dom::globalscope::GlobalScope; +use crate::dom::gpuconvert::{convert_bind_group_layout_entry, convert_label}; +use crate::dom::gpudevice::GPUDevice; #[dom_struct] pub struct GPUBindGroupLayout { @@ -58,6 +66,52 @@ impl GPUBindGroupLayout { pub fn id(&self) -> WebGPUBindGroupLayout { self.bind_group_layout } + + /// <https://gpuweb.github.io/gpuweb/#GPUDevice-createBindGroupLayout> + pub fn create( + device: &GPUDevice, + descriptor: &GPUBindGroupLayoutDescriptor, + ) -> Fallible<DomRoot<GPUBindGroupLayout>> { + let entries = descriptor + .entries + .iter() + .map(|bgle| convert_bind_group_layout_entry(bgle, device)) + .collect::<Fallible<Result<Vec<_>, _>>>()?; + + let desc = match entries { + Ok(entries) => Some(BindGroupLayoutDescriptor { + label: convert_label(&descriptor.parent), + entries: Cow::Owned(entries), + }), + Err(error) => { + device.dispatch_error(error); + None + }, + }; + + let bind_group_layout_id = device + .global() + .wgpu_id_hub() + .create_bind_group_layout_id(device.id().0.backend()); + device + .channel() + .0 + .send(WebGPURequest::CreateBindGroupLayout { + device_id: device.id().0, + bind_group_layout_id, + descriptor: desc, + }) + .expect("Failed to create WebGPU BindGroupLayout"); + + let bgl = WebGPUBindGroupLayout(bind_group_layout_id); + + Ok(GPUBindGroupLayout::new( + &device.global(), + device.channel().clone(), + bgl, + descriptor.parent.label.clone(), + )) + } } impl Drop for GPUBindGroupLayout { |