Skip to main content

pebble/graphics/render/
render_pass.rs

1use crate::graphics::{pipeline::{buffers::{BindGroup, Buffer}, material::RenderPipeline}, types::IndexFormat};
2
3/// An in-progress render pass, from [`Frame::begin`](crate::graphics::render::frame::Frame::begin).
4/// Method names mirror `wgpu`'s own render pass API.
5pub struct RenderPass<'a> {
6    raw: wgpu::RenderPass<'a>,
7}
8
9impl<'a> RenderPass<'a> {
10    pub(crate) fn new(raw: wgpu::RenderPass<'a>) -> Self {
11        Self { raw }
12    }
13
14    pub fn set_pipeline(&mut self, pipeline: &RenderPipeline) {
15        self.raw.set_pipeline(pipeline.raw());
16    }
17
18    pub fn set_bind_group(&mut self, index: u32, bind_group: &BindGroup, offsets: &[u32]) {
19        self.raw.set_bind_group(index, Some(bind_group.raw()), offsets);
20    }
21
22    pub fn set_vertex_buffer(&mut self, slot: u32, buffer: &'a Buffer) {
23        self.raw.set_vertex_buffer(slot, buffer.raw().slice(..));
24    }
25
26    pub fn set_index_buffer(&mut self, buffer: &'a Buffer, format: IndexFormat) {
27        self.raw.set_index_buffer(buffer.raw().slice(..), format.into());
28    }
29
30    pub fn draw(&mut self, vertices: std::ops::Range<u32>, instances: std::ops::Range<u32>) {
31        self.raw.draw(vertices, instances);
32    }
33
34    pub fn draw_indexed(
35        &mut self,
36        indices: std::ops::Range<u32>,
37        base_vertex: i32,
38        instances: std::ops::Range<u32>,
39    ) {
40        self.raw.draw_indexed(indices, base_vertex, instances);
41    }
42
43    pub fn draw_indirect(&mut self, indirect_buffer: &'a Buffer, indirect_offset: u64) {
44        self.raw.draw_indirect(indirect_buffer.raw(), indirect_offset);
45    }
46
47    pub fn draw_indexed_indirect(&mut self, indirect_buffer: &'a Buffer, indirect_offset: u64) {
48        self.raw.draw_indexed_indirect(indirect_buffer.raw(), indirect_offset);
49    }
50}
51
52/// The exact byte layout `draw_indirect` expects in its indirect buffer —
53/// write this (via `bytemuck::bytes_of`/[`as_bytes`](Self::as_bytes)) to a
54/// buffer built with `INDIRECT` usage.
55#[repr(C)]
56#[derive(Copy, Clone, Debug, Default, bytemuck::Pod, bytemuck::Zeroable)]
57pub struct DrawIndirectArgs {
58    pub vertex_count: u32,
59    pub instance_count: u32,
60    pub first_vertex: u32,
61    pub first_instance: u32,
62}
63
64impl DrawIndirectArgs {
65    pub fn as_bytes(&self) -> &[u8] {
66        bytemuck::bytes_of(self)
67    }
68}
69
70/// The exact byte layout `draw_indexed_indirect` expects — same idea as
71/// [`DrawIndirectArgs`], for the indexed draw variant.
72#[repr(C)]
73#[derive(Copy, Clone, Debug, Default, bytemuck::Pod, bytemuck::Zeroable)]
74pub struct DrawIndexedIndirectArgs {
75    pub index_count: u32,
76    pub instance_count: u32,
77    pub first_index: u32,
78    pub base_vertex: i32,
79    pub first_instance: u32,
80}
81
82impl DrawIndexedIndirectArgs {
83    pub fn as_bytes(&self) -> &[u8] {
84        bytemuck::bytes_of(self)
85    }
86}