Skip to main content

script_webgpu/
gpuadapterinfo.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
5use std::marker::PhantomData;
6
7use dom_struct::dom_struct;
8use js::context::JSContext;
9use jstraceable_derive::JSTraceable;
10use malloc_size_of_derive::MallocSizeOf;
11use script_bindings::DomTypes;
12use script_bindings::codegen::GenericBindings::WebGPUBinding::{
13    GPUAdapterInfoMethods, GPUAdapterInfoWrap,
14};
15use script_bindings::domstring::TracedDOMString;
16use script_bindings::reflector::{Reflector, reflect_dom_object_with_wrap};
17
18use crate::dom::bindings::root::DomRoot;
19use crate::dom::bindings::str::DOMString;
20use crate::traits::Equivalence;
21
22#[dom_struct]
23pub struct GPUAdapterInfo<D: DomTypes> {
24    reflector_: Reflector,
25    vendor: TracedDOMString,
26    architecture: TracedDOMString,
27    device: TracedDOMString,
28    description: TracedDOMString,
29    subgroup_min_size: u32,
30    subgroup_max_size: u32,
31    is_fallback_adapter: bool,
32    #[no_trace = "Phantom data is not real"]
33    phantom: PhantomData<D>,
34}
35
36impl<D: Equivalence> GPUAdapterInfo<D> {
37    fn new_inherited(
38        vendor: DOMString,
39        architecture: DOMString,
40        device: DOMString,
41        description: DOMString,
42        subgroup_min_size: u32,
43        subgroup_max_size: u32,
44        is_fallback_adapter: bool,
45    ) -> Self {
46        Self {
47            reflector_: Reflector::new(),
48            vendor: vendor.traced(),
49            architecture: architecture.traced(),
50            device: device.traced(),
51            description: description.traced(),
52            subgroup_min_size,
53            subgroup_max_size,
54            is_fallback_adapter,
55            phantom: PhantomData,
56        }
57    }
58
59    #[expect(clippy::too_many_arguments)]
60    pub(crate) fn new(
61        cx: &mut JSContext,
62        global: &D::GlobalScope,
63        vendor: DOMString,
64        architecture: DOMString,
65        device: DOMString,
66        description: DOMString,
67        subgroup_min_size: u32,
68        subgroup_max_size: u32,
69        is_fallback_adapter: bool,
70    ) -> DomRoot<Self> {
71        reflect_dom_object_with_wrap::<D, _, _>(
72            cx,
73            Box::new(Self::new_inherited(
74                vendor,
75                architecture,
76                device,
77                description,
78                subgroup_min_size,
79                subgroup_max_size,
80                is_fallback_adapter,
81            )),
82            global,
83            GPUAdapterInfoWrap::<D>,
84        )
85    }
86
87    pub(crate) fn clone_from(
88        cx: &mut JSContext,
89        global: &D::GlobalScope,
90        info: &GPUAdapterInfo<D>,
91    ) -> DomRoot<Self> {
92        Self::new(
93            cx,
94            global,
95            info.vendor.clone().root(),
96            info.architecture.clone().root(),
97            info.device.clone().root(),
98            info.description.clone().root(),
99            info.subgroup_min_size,
100            info.subgroup_max_size,
101            info.is_fallback_adapter,
102        )
103    }
104}
105
106impl<D: DomTypes> GPUAdapterInfoMethods<D> for GPUAdapterInfo<D> {
107    /// <https://gpuweb.github.io/gpuweb/#dom-gpuadapterinfo-vendor>
108    fn Vendor(&self) -> DOMString {
109        self.vendor.clone().root()
110    }
111
112    /// <https://gpuweb.github.io/gpuweb/#dom-gpuadapterinfo-architecture>
113    fn Architecture(&self) -> DOMString {
114        self.architecture.clone().root()
115    }
116
117    /// <https://gpuweb.github.io/gpuweb/#dom-gpuadapterinfo-device>
118    fn Device(&self) -> DOMString {
119        self.device.clone().root()
120    }
121
122    /// <https://gpuweb.github.io/gpuweb/#dom-gpuadapterinfo-description>
123    fn Description(&self) -> DOMString {
124        self.description.clone().root()
125    }
126
127    /// <https://gpuweb.github.io/gpuweb/#dom-gpuadapterinfo-subgroupminsize>
128    fn SubgroupMinSize(&self) -> u32 {
129        self.subgroup_min_size
130    }
131
132    /// <https://gpuweb.github.io/gpuweb/#dom-gpuadapterinfo-subgroupmaxsize>
133    fn SubgroupMaxSize(&self) -> u32 {
134        self.subgroup_max_size
135    }
136
137    /// <https://gpuweb.github.io/gpuweb/#dom-gpuadapterinfo-isfallbackadapter>
138    fn IsFallbackAdapter(&self) -> bool {
139        self.is_fallback_adapter
140    }
141}