easygpu/
frame.rs

1use wgpu::TextureView;
2
3use crate::buffers::UniformBuffer;
4use crate::renderer::{PassOp, RenderPassExt, RenderTarget};
5
6#[derive(Debug)]
7pub struct Frame {
8    pub encoder: wgpu::CommandEncoder,
9}
10
11impl Frame {
12    pub fn new(encoder: wgpu::CommandEncoder) -> Self {
13        Self { encoder }
14    }
15
16    pub fn pass<'a>(
17        &'a mut self,
18        op: PassOp,
19        view: &'a impl RenderTarget,
20        multisample_buffer: Option<&'a TextureView>,
21    ) -> wgpu::RenderPass<'a> {
22        let (pass_view, resolve_target) = match multisample_buffer {
23            Some(buffer) => (buffer, Some(view.color_target())),
24            None => (view.color_target(), None),
25        };
26        wgpu::RenderPass::begin(
27            &mut self.encoder,
28            pass_view,
29            resolve_target,
30            view.zdepth_target(),
31            op,
32        )
33    }
34
35    pub fn copy(&mut self, src: &UniformBuffer, dst: &UniformBuffer) {
36        self.encoder.copy_buffer_to_buffer(
37            &src.wgpu,
38            0,
39            &dst.wgpu,
40            0,
41            (src.size * src.count) as wgpu::BufferAddress,
42        );
43    }
44
45    pub fn encoder(&self) -> &wgpu::CommandEncoder {
46        &self.encoder
47    }
48
49    pub fn encoder_mut(&mut self) -> &mut wgpu::CommandEncoder {
50        &mut self.encoder
51    }
52}