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#[derive(JSTraceable, MallocSizeOf)]
17struct DroppableGPURenderBundle {
18 #[no_trace]
19 channel: WebGPU,
20 #[no_trace]
21 render_bundle: WebGPURenderBundle,
22}
23
24impl Drop for DroppableGPURenderBundle {
25 fn drop(&mut self) {
26 if let Err(e) = self
27 .channel
28 .0
29 .send(WebGPURequest::DropRenderBundle(self.render_bundle.0))
30 {
31 warn!(
32 "Failed to send DropRenderBundle ({:?}) ({})",
33 self.render_bundle.0, e
34 );
35 }
36 }
37}
38
39#[dom_struct]
40pub(crate) struct GPURenderBundle {
41 reflector_: Reflector,
42 #[no_trace]
43 device: WebGPUDevice,
44 label: DomRefCell<USVString>,
45 droppable: DroppableGPURenderBundle,
46}
47
48impl GPURenderBundle {
49 fn new_inherited(
50 render_bundle: WebGPURenderBundle,
51 device: WebGPUDevice,
52 channel: WebGPU,
53 label: USVString,
54 ) -> Self {
55 Self {
56 reflector_: Reflector::new(),
57 device,
58 label: DomRefCell::new(label),
59 droppable: DroppableGPURenderBundle {
60 channel,
61 render_bundle,
62 },
63 }
64 }
65
66 pub(crate) fn new(
67 global: &GlobalScope,
68 render_bundle: WebGPURenderBundle,
69 device: WebGPUDevice,
70 channel: WebGPU,
71 label: USVString,
72 can_gc: CanGc,
73 ) -> DomRoot<Self> {
74 reflect_dom_object(
75 Box::new(GPURenderBundle::new_inherited(
76 render_bundle,
77 device,
78 channel,
79 label,
80 )),
81 global,
82 can_gc,
83 )
84 }
85}
86
87impl GPURenderBundle {
88 pub(crate) fn id(&self) -> WebGPURenderBundle {
89 self.droppable.render_bundle
90 }
91}
92
93impl GPURenderBundleMethods<crate::DomTypeHolder> for GPURenderBundle {
94 fn Label(&self) -> USVString {
96 self.label.borrow().clone()
97 }
98
99 fn SetLabel(&self, value: USVString) {
101 *self.label.borrow_mut() = value;
102 }
103}