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;
26use crate::traits::Equivalence;
27
28#[dom_struct]
29pub struct WGSLLanguageFeatures<D: DomTypes> {
30    reflector: Reflector,
31    // internal storage for features
32    #[custom_trace]
33    internal: DomRefCell<IndexSet<DOMString>>,
34    #[no_trace = "PhantomData does not exist"]
35    phantom: PhantomData<D>,
36}
37
38impl<D: Equivalence> WGSLLanguageFeatures<D> {
39    pub fn new(
40        cx: &mut JSContext,
41        global: &D::GlobalScope,
42        proto: Option<HandleObject>,
43    ) -> DomRoot<Self> {
44        let set = ImplementedLanguageExtension::all()
45            .iter()
46            .map(|le| le.to_ident().into())
47            .collect();
48        reflect_dom_object_with_proto_and_wrap::<D, _, _>(
49            Box::new(Self {
50                reflector: Reflector::new(),
51                internal: DomRefCell::new(set),
52                phantom: PhantomData,
53            }),
54            global,
55            proto,
56            cx,
57            WGSLLanguageFeaturesWrap::<D>,
58        )
59    }
60}
61
62impl<D: DomTypes> WGSLLanguageFeaturesMethods<D> for WGSLLanguageFeatures<D> {
63    fn Size(&self) -> u32 {
64        self.internal.borrow().len() as u32
65    }
66}
67
68impl<D: DomTypes> Setlike for WGSLLanguageFeatures<D> {
69    type Key = DOMString;
70
71    #[inline(always)]
72    fn get_index(&self, cx: &mut JSContext, index: u32) -> Option<Self::Key> {
73        self.internal.get_index(cx, index)
74    }
75    #[inline(always)]
76    fn size(&self, cx: &mut JSContext) -> u32 {
77        self.internal.size(cx)
78    }
79    #[inline(always)]
80    fn add(&self, _cx: &mut JSContext, _key: Self::Key) {
81        unreachable!("readonly");
82    }
83    #[inline(always)]
84    fn has(&self, cx: &mut JSContext, key: Self::Key) -> bool {
85        self.internal.has(cx, key)
86    }
87    #[inline(always)]
88    fn clear(&self, _cx: &mut JSContext) {
89        unreachable!("readonly");
90    }
91    #[inline(always)]
92    fn delete(&self, _cx: &mut JSContext, _key: Self::Key) -> bool {
93        unreachable!("readonly");
94    }
95}