diff --git a/src/bin/minitracer/main.rs b/src/bin/minitracer/main.rs index e5d8aab..4b5c568 100644 --- a/src/bin/minitracer/main.rs +++ b/src/bin/minitracer/main.rs @@ -126,20 +126,7 @@ fn main() { let hdr = hdr.create_view(&wgpu::TextureViewDescriptor::default()); let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); { - let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { - label: None, - color_attachments: &[Some(wgpu::RenderPassColorAttachment { - view: &hdr, - resolve_target: None, - ops: wgpu::Operations { - load: wgpu::LoadOp::Clear(wgpu::Color::TRANSPARENT), - store: wgpu::StoreOp::Store, - }, - })], - depth_stencil_attachment: None, - occlusion_query_set: None, - timestamp_writes: None, - }); + let mut render_pass = tracer.prepare(&mut encoder, &hdr); for _ in 0..RAYS_PER_PIXEL { frame += 1; let time = frame as f32 / (60. * RAYS_PER_PIXEL as f32); @@ -172,30 +159,15 @@ fn main() { ); } } - { - let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { - label: None, - color_attachments: &[Some(wgpu::RenderPassColorAttachment { - view: &view, - resolve_target: None, - ops: wgpu::Operations { - load: wgpu::LoadOp::Clear(wgpu::Color::TRANSPARENT), - store: wgpu::StoreOp::Store, - }, - })], - depth_stencil_attachment: None, - occlusion_query_set: None, - timestamp_writes: None, - }); - presenter.render( - &device, - &mut render_pass, - &hdr, - present::Params { - divisor: RAYS_PER_PIXEL as f32, - }, - ); - } + presenter.render( + &device, + &mut encoder, + &hdr, + &view, + present::Params { + divisor: RAYS_PER_PIXEL as f32, + }, + ); queue.submit(std::iter::once(encoder.finish())); output.present(); } diff --git a/src/bin/minitracer/present.rs b/src/bin/minitracer/present.rs index 2cf8d84..06512d5 100644 --- a/src/bin/minitracer/present.rs +++ b/src/bin/minitracer/present.rs @@ -86,7 +86,7 @@ impl Presenter { } } - pub fn render( + fn render_internal( &self, device: &wgpu::Device, pass: &mut wgpu::RenderPass, @@ -121,4 +121,29 @@ impl Presenter { pass.set_bind_group(0, &bindings, &[]); pass.draw(0..4, 0..1); } + + pub fn render( + &self, + device: &wgpu::Device, + encoder: &mut wgpu::CommandEncoder, + source: &wgpu::TextureView, + target: &wgpu::TextureView, + params: Params, + ) { + let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label: None, + color_attachments: &[Some(wgpu::RenderPassColorAttachment { + view: target, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Clear(wgpu::Color::TRANSPARENT), + store: wgpu::StoreOp::Store, + }, + })], + depth_stencil_attachment: None, + occlusion_query_set: None, + timestamp_writes: None, + }); + self.render_internal(device, &mut render_pass, source, params); + } } diff --git a/src/bin/minitracer/trace.rs b/src/bin/minitracer/trace.rs index e95c7ed..e276e2e 100644 --- a/src/bin/minitracer/trace.rs +++ b/src/bin/minitracer/trace.rs @@ -233,6 +233,27 @@ impl Tracer { Self { view_buf, pipeline } } + pub fn prepare<'encoder>( + &self, + encoder: &'encoder mut wgpu::CommandEncoder, + target: &wgpu::TextureView, + ) -> wgpu::RenderPass<'encoder> { + encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label: None, + color_attachments: &[Some(wgpu::RenderPassColorAttachment { + view: &target, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Clear(wgpu::Color::TRANSPARENT), + store: wgpu::StoreOp::Store, + }, + })], + depth_stencil_attachment: None, + occlusion_query_set: None, + timestamp_writes: None, + }) + } + pub fn render( &self, pass: &mut wgpu::RenderPass,