script_webgpu/
gpuadapterinfo.rs1use 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 fn Vendor(&self) -> DOMString {
109 self.vendor.clone().root()
110 }
111
112 fn Architecture(&self) -> DOMString {
114 self.architecture.clone().root()
115 }
116
117 fn Device(&self) -> DOMString {
119 self.device.clone().root()
120 }
121
122 fn Description(&self) -> DOMString {
124 self.description.clone().root()
125 }
126
127 fn SubgroupMinSize(&self) -> u32 {
129 self.subgroup_min_size
130 }
131
132 fn SubgroupMaxSize(&self) -> u32 {
134 self.subgroup_max_size
135 }
136
137 fn IsFallbackAdapter(&self) -> bool {
139 self.is_fallback_adapter
140 }
141}