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}