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