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#[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    /// <https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label>
74    fn Label(&self) -> USVString {
75        self.label.borrow().clone()
76    }
77
78    /// <https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label>
79    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}