script/dom/webgpu/
gpurenderbundle.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 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    /// <https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label>
95    fn Label(&self) -> USVString {
96        self.label.borrow().clone()
97    }
98
99    /// <https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label>
100    fn SetLabel(&self, value: USVString) {
101        *self.label.borrow_mut() = value;
102    }
103}