Skip to main content

script_webgpu/
wgsllanguagefeatures.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5// check-tidy: no specs after this line
6
7use std::marker::PhantomData;
8
9use dom_struct::dom_struct;
10use indexmap::IndexSet;
11use js::context::JSContext;
12use js::gc::HandleObject;
13use jstraceable_derive::JSTraceable;
14use malloc_size_of_derive::MallocSizeOf;
15use script_bindings::DomTypes;
16use script_bindings::cell::DomRefCell;
17use script_bindings::codegen::GenericBindings::WebGPUBinding::{
18    WGSLLanguageFeaturesMethods, WGSLLanguageFeaturesWrap,
19};
20use script_bindings::like::Setlike;
21use script_bindings::reflector::{Reflector, reflect_dom_object_with_proto_and_wrap};
22use wgpu_core::naga::front::wgsl::ImplementedLanguageExtension;
23
24use crate::dom::bindings::root::DomRoot;
25use crate::dom::bindings::str::DOMString;
26
27#[dom_struct]
28pub struct WGSLLanguageFeatures<D: DomTypes> {
29    reflector: Reflector,
30    // internal storage for features
31    #[custom_trace]
32    internal: DomRefCell<IndexSet<DOMString>>,
33    #[no_trace = "PhantomData does not exist"]
34    phantom: PhantomData<D>,
35}
36
37impl<D> WGSLLanguageFeatures<D>
38where
39    D: DomTypes<WGSLLanguageFeatures = WGSLLanguageFeatures<D>>,
40{
41    pub fn new(
42        cx: &mut JSContext,
43        global: &D::GlobalScope,
44        proto: Option<HandleObject>,
45    ) -> DomRoot<Self> {
46        let set = ImplementedLanguageExtension::all()
47            .iter()
48            .map(|le| le.to_ident().into())
49            .collect();
50        reflect_dom_object_with_proto_and_wrap::<D, _, _>(
51            Box::new(Self {
52                reflector: Reflector::new(),
53                internal: DomRefCell::new(set),
54                phantom: PhantomData,
55            }),
56            global,
57            proto,
58            cx,
59            WGSLLanguageFeaturesWrap::<D>,
60        )
61    }
62}
63
64impl<D: DomTypes> WGSLLanguageFeaturesMethods<D> for WGSLLanguageFeatures<D> {
65    fn Size(&self) -> u32 {
66        self.internal.borrow().len() as u32
67    }
68}
69
70impl<D: DomTypes> Setlike for WGSLLanguageFeatures<D> {
71    type Key = DOMString;
72
73    #[inline(always)]
74    fn get_index(&self, cx: &mut JSContext, index: u32) -> Option<Self::Key> {
75        self.internal.get_index(cx, index)
76    }
77    #[inline(always)]
78    fn size(&self, cx: &mut JSContext) -> u32 {
79        self.internal.size(cx)
80    }
81    #[inline(always)]
82    fn add(&self, _cx: &mut JSContext, _key: Self::Key) {
83        unreachable!("readonly");
84    }
85    #[inline(always)]
86    fn has(&self, cx: &mut JSContext, key: Self::Key) -> bool {
87        self.internal.has(cx, key)
88    }
89    #[inline(always)]
90    fn clear(&self, _cx: &mut JSContext) {
91        unreachable!("readonly");
92    }
93    #[inline(always)]
94    fn delete(&self, _cx: &mut JSContext, _key: Self::Key) -> bool {
95        unreachable!("readonly");
96    }
97}