diff --git a/render/wgpu/src/backend.rs b/render/wgpu/src/backend.rs index b0822e2cb..9a809c1f9 100644 --- a/render/wgpu/src/backend.rs +++ b/render/wgpu/src/backend.rs @@ -35,9 +35,6 @@ pub struct WgpuRenderBackend { copy_srgb_bind_group: Option<(wgpu::BindGroup, wgpu::Buffer, wgpu::BindGroup)>, meshes: Vec, shape_tessellator: ShapeTessellator, - quad_vbo: wgpu::Buffer, - quad_ibo: wgpu::Buffer, - quad_tex_transforms: wgpu::Buffer, bitmap_registry: FnvHashMap, next_bitmap_handle: BitmapHandle, // This is currently unused - we just store it to report in @@ -178,8 +175,6 @@ impl WgpuRenderBackend { }); let depth_texture_view = depth_texture.create_view(&Default::default()); - let (quad_vbo, quad_ibo, quad_tex_transforms) = create_quad_buffers(&descriptors.device); - let (copy_srgb_view, copy_srgb_bind_group) = if descriptors.frame_buffer_format != descriptors.surface_format { @@ -203,7 +198,7 @@ impl WgpuRenderBackend { wgpu::BindGroupEntry { binding: 0, resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding { - buffer: &quad_tex_transforms, + buffer: &descriptors.quad.texture_transforms, offset: 0, size: wgpu::BufferSize::new( std::mem::size_of::() as u64, @@ -282,9 +277,6 @@ impl WgpuRenderBackend { meshes: Vec::new(), shape_tessellator: ShapeTessellator::new(), - quad_vbo, - quad_ibo, - quad_tex_transforms, bitmap_registry: Default::default(), next_bitmap_handle: BitmapHandle(0), viewport_scale_factor: 1.0, @@ -662,7 +654,7 @@ impl RenderBackend for WgpuRenderBackend { wgpu::BindGroupEntry { binding: 0, resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding { - buffer: &self.quad_tex_transforms, + buffer: &self.descriptors.quad.texture_transforms, offset: 0, size: wgpu::BufferSize::new( std::mem::size_of::() as u64, @@ -849,8 +841,8 @@ impl RenderBackend for WgpuRenderBackend { &mut frame, &self.meshes, &self.bitmap_registry, - self.quad_vbo.slice(..), - self.quad_ibo.slice(..), + self.descriptors.quad.vertices.slice(..), + self.descriptors.quad.indices.slice(..), )); frame.finish(); @@ -892,7 +884,11 @@ impl RenderBackend for WgpuRenderBackend { ); srgb_frame.prep_srgb_copy(copy_srgb_bind_group); - srgb_frame.draw(self.quad_vbo.slice(..), self.quad_ibo.slice(..), 6); + srgb_frame.draw( + self.descriptors.quad.vertices.slice(..), + self.descriptors.quad.indices.slice(..), + 6, + ); drop(srgb_frame); Some(copy_encoder.finish()) @@ -980,7 +976,7 @@ impl RenderBackend for WgpuRenderBackend { wgpu::BindGroupEntry { binding: 0, resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding { - buffer: &self.quad_tex_transforms, + buffer: &self.descriptors.quad.texture_transforms, offset: 0, size: wgpu::BufferSize::new( std::mem::size_of::() as u64 @@ -1199,8 +1195,8 @@ impl RenderBackend for WgpuRenderBackend { &mut frame, &self.meshes, &self.bitmap_registry, - self.quad_vbo.slice(..), - self.quad_ibo.slice(..), + self.descriptors.quad.vertices.slice(..), + self.descriptors.quad.indices.slice(..), )); frame.finish(); @@ -1234,58 +1230,6 @@ impl RenderBackend for WgpuRenderBackend { } } -fn create_quad_buffers(device: &wgpu::Device) -> (wgpu::Buffer, wgpu::Buffer, wgpu::Buffer) { - let vertices = [ - Vertex { - position: [0.0, 0.0], - color: [1.0, 1.0, 1.0, 1.0], - }, - Vertex { - position: [1.0, 0.0], - color: [1.0, 1.0, 1.0, 1.0], - }, - Vertex { - position: [1.0, 1.0], - color: [1.0, 1.0, 1.0, 1.0], - }, - Vertex { - position: [0.0, 1.0], - color: [1.0, 1.0, 1.0, 1.0], - }, - ]; - let indices: [u32; 6] = [0, 1, 2, 0, 2, 3]; - - let vbo = create_buffer_with_data( - device, - bytemuck::cast_slice(&vertices), - wgpu::BufferUsages::VERTEX, - create_debug_label!("Quad vbo"), - ); - - let ibo = create_buffer_with_data( - device, - bytemuck::cast_slice(&indices), - wgpu::BufferUsages::INDEX, - create_debug_label!("Quad ibo"), - ); - - let tex_transforms = create_buffer_with_data( - device, - bytemuck::cast_slice(&[TextureTransforms { - u_matrix: [ - [1.0, 0.0, 0.0, 0.0], - [0.0, 1.0, 0.0, 0.0], - [0.0, 0.0, 1.0, 0.0], - [0.0, 0.0, 0.0, 1.0], - ], - }]), - wgpu::BufferUsages::UNIFORM, - create_debug_label!("Quad tex transforms"), - ); - - (vbo, ibo, tex_transforms) -} - fn create_depth_texture_view( descriptors: &Descriptors, target_data: &DescriptorsTargetData, diff --git a/render/wgpu/src/descriptors.rs b/render/wgpu/src/descriptors.rs index 66dfb8cd1..59459b0d0 100644 --- a/render/wgpu/src/descriptors.rs +++ b/render/wgpu/src/descriptors.rs @@ -1,6 +1,6 @@ use crate::layouts::BindLayouts; use crate::shaders::Shaders; -use crate::{BitmapSamplers, Pipelines}; +use crate::{create_buffer_with_data, BitmapSamplers, Pipelines, TextureTransforms, Vertex}; /// Contains data specific to a `RenderTarget`. /// We cannot re-use this data in `with_offscreen_backend` @@ -70,6 +70,7 @@ pub struct Descriptors { pub onscreen: DescriptorsTargetData, pub offscreen: DescriptorsTargetData, pub bind_layouts: BindLayouts, + pub quad: Quad, } impl Descriptors { @@ -84,6 +85,7 @@ impl Descriptors { let bind_layouts = BindLayouts::new(&device); let bitmap_samplers = BitmapSamplers::new(&device, &bind_layouts); let shaders = Shaders::new(&device); + let quad = Quad::new(&device); // We want to render directly onto a linear render target to avoid any gamma correction. // If our surface is sRGB, render to a linear texture and than copy over to the surface. @@ -137,6 +139,71 @@ impl Descriptors { onscreen, offscreen, bind_layouts, + quad, + } + } +} + +pub struct Quad { + pub vertices: wgpu::Buffer, + pub indices: wgpu::Buffer, + pub texture_transforms: wgpu::Buffer, +} + +impl Quad { + pub fn new(device: &wgpu::Device) -> Self { + let vertices = [ + Vertex { + position: [0.0, 0.0], + color: [1.0, 1.0, 1.0, 1.0], + }, + Vertex { + position: [1.0, 0.0], + color: [1.0, 1.0, 1.0, 1.0], + }, + Vertex { + position: [1.0, 1.0], + color: [1.0, 1.0, 1.0, 1.0], + }, + Vertex { + position: [0.0, 1.0], + color: [1.0, 1.0, 1.0, 1.0], + }, + ]; + let indices: [u32; 6] = [0, 1, 2, 0, 2, 3]; + + let vbo = create_buffer_with_data( + device, + bytemuck::cast_slice(&vertices), + wgpu::BufferUsages::VERTEX, + create_debug_label!("Quad vbo"), + ); + + let ibo = create_buffer_with_data( + device, + bytemuck::cast_slice(&indices), + wgpu::BufferUsages::INDEX, + create_debug_label!("Quad ibo"), + ); + + let tex_transforms = create_buffer_with_data( + device, + bytemuck::cast_slice(&[TextureTransforms { + u_matrix: [ + [1.0, 0.0, 0.0, 0.0], + [0.0, 1.0, 0.0, 0.0], + [0.0, 0.0, 1.0, 0.0], + [0.0, 0.0, 0.0, 1.0], + ], + }]), + wgpu::BufferUsages::UNIFORM, + create_debug_label!("Quad tex transforms"), + ); + + Self { + vertices: vbo, + indices: ibo, + texture_transforms: tex_transforms, } } }