Skip to main content

pebble/wgpu/
compute_pass.rs

1use crate::wgpu::{buffers::BindGroup, compute::ComputePipeline};
2
3/// A compute pass, opaque — the value [`CommandEncoder::compute_pass`]/
4/// [`WGPUFrame::compute_pass`](super::backend::WGPUFrame::compute_pass)
5/// hand back. There's no way to reach the underlying `wgpu::ComputePass`
6/// from outside this crate.
7pub struct ComputePass<'a> {
8    raw: wgpu::ComputePass<'a>,
9}
10
11impl<'a> ComputePass<'a> {
12    pub(crate) fn new(raw: wgpu::ComputePass<'a>) -> Self {
13        Self { raw }
14    }
15
16    pub fn set_pipeline(&mut self, pipeline: &ComputePipeline) {
17        self.raw.set_pipeline(pipeline.raw());
18    }
19
20    /// `offsets` is the dynamic-offset slice for any dynamic-offset entries
21    /// in this bind group's layout, in the order they appear — empty if
22    /// none. See [`RenderPass::set_bind_group`](super::render_pass::RenderPass::set_bind_group).
23    pub fn set_bind_group(&mut self, index: u32, bind_group: &BindGroup, offsets: &[u32]) {
24        self.raw.set_bind_group(index, Some(bind_group.raw()), offsets);
25    }
26
27    pub fn dispatch_workgroups(&mut self, x: u32, y: u32, z: u32) {
28        self.raw.dispatch_workgroups(x, y, z);
29    }
30}
31
32/// A command encoder, opaque — built only via
33/// [`WGPUBackend::create_command_encoder`](super::backend::WGPUBackend::create_command_encoder).
34/// Its only job is starting a [`ComputePass`]; submit it when done via
35/// [`WGPUBackend::submit`](super::backend::WGPUBackend::submit). Render
36/// passes don't need this — [`ActiveFrame::begin_pass`](crate::rendering::active_frame::ActiveFrame::begin_pass)
37/// manages its own frame-tied encoder internally.
38pub struct CommandEncoder {
39    raw: wgpu::CommandEncoder,
40}
41
42impl CommandEncoder {
43    pub(crate) fn new(raw: wgpu::CommandEncoder) -> Self {
44        Self { raw }
45    }
46
47    pub fn compute_pass(&mut self, label: Option<&str>) -> ComputePass<'_> {
48        let raw = self.raw.begin_compute_pass(&wgpu::ComputePassDescriptor {
49            label,
50            timestamp_writes: None,
51        });
52        ComputePass::new(raw)
53    }
54
55    pub(crate) fn into_raw(self) -> wgpu::CommandEncoder {
56        self.raw
57    }
58}