script/dom/webgpu/
gpurenderbundle.rs1use dom_struct::dom_struct;
6use webgpu_traits::{WebGPU, WebGPUDevice, WebGPURenderBundle, WebGPURequest};
7
8use crate::dom::bindings::cell::DomRefCell;
9use crate::dom::bindings::codegen::Bindings::WebGPUBinding::GPURenderBundleMethods;
10use crate::dom::bindings::reflector::{Reflector, reflect_dom_object};
11use crate::dom::bindings::root::DomRoot;
12use crate::dom::bindings::str::USVString;
13use crate::dom::globalscope::GlobalScope;
14use crate::script_runtime::CanGc;
15
16#[dom_struct]
17pub(crate) struct GPURenderBundle {
18 reflector_: Reflector,
19 #[ignore_malloc_size_of = "channels are hard"]
20 #[no_trace]
21 channel: WebGPU,
22 #[no_trace]
23 device: WebGPUDevice,
24 #[no_trace]
25 render_bundle: WebGPURenderBundle,
26 label: DomRefCell<USVString>,
27}
28
29impl GPURenderBundle {
30 fn new_inherited(
31 render_bundle: WebGPURenderBundle,
32 device: WebGPUDevice,
33 channel: WebGPU,
34 label: USVString,
35 ) -> Self {
36 Self {
37 reflector_: Reflector::new(),
38 render_bundle,
39 device,
40 channel,
41 label: DomRefCell::new(label),
42 }
43 }
44
45 pub(crate) fn new(
46 global: &GlobalScope,
47 render_bundle: WebGPURenderBundle,
48 device: WebGPUDevice,
49 channel: WebGPU,
50 label: USVString,
51 can_gc: CanGc,
52 ) -> DomRoot<Self> {
53 reflect_dom_object(
54 Box::new(GPURenderBundle::new_inherited(
55 render_bundle,
56 device,
57 channel,
58 label,
59 )),
60 global,
61 can_gc,
62 )
63 }
64}
65
66impl GPURenderBundle {
67 pub(crate) fn id(&self) -> WebGPURenderBundle {
68 self.render_bundle
69 }
70}
71
72impl GPURenderBundleMethods<crate::DomTypeHolder> for GPURenderBundle {
73 fn Label(&self) -> USVString {
75 self.label.borrow().clone()
76 }
77
78 fn SetLabel(&self, value: USVString) {
80 *self.label.borrow_mut() = value;
81 }
82}
83
84impl Drop for GPURenderBundle {
85 fn drop(&mut self) {
86 if let Err(e) = self
87 .channel
88 .0
89 .send(WebGPURequest::DropRenderBundle(self.render_bundle.0))
90 {
91 warn!(
92 "Failed to send DropRenderBundle ({:?}) ({})",
93 self.render_bundle.0, e
94 );
95 }
96 }
97}