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