wgpu: Move quad into its own structure under Descriptors
This commit is contained in:
parent
a8e8b01a6c
commit
03f7719c49
|
@ -35,9 +35,6 @@ pub struct WgpuRenderBackend<T: RenderTarget> {
|
||||||
copy_srgb_bind_group: Option<(wgpu::BindGroup, wgpu::Buffer, wgpu::BindGroup)>,
|
copy_srgb_bind_group: Option<(wgpu::BindGroup, wgpu::Buffer, wgpu::BindGroup)>,
|
||||||
meshes: Vec<Mesh>,
|
meshes: Vec<Mesh>,
|
||||||
shape_tessellator: ShapeTessellator,
|
shape_tessellator: ShapeTessellator,
|
||||||
quad_vbo: wgpu::Buffer,
|
|
||||||
quad_ibo: wgpu::Buffer,
|
|
||||||
quad_tex_transforms: wgpu::Buffer,
|
|
||||||
bitmap_registry: FnvHashMap<BitmapHandle, RegistryData>,
|
bitmap_registry: FnvHashMap<BitmapHandle, RegistryData>,
|
||||||
next_bitmap_handle: BitmapHandle,
|
next_bitmap_handle: BitmapHandle,
|
||||||
// This is currently unused - we just store it to report in
|
// This is currently unused - we just store it to report in
|
||||||
|
@ -178,8 +175,6 @@ impl<T: RenderTarget> WgpuRenderBackend<T> {
|
||||||
});
|
});
|
||||||
let depth_texture_view = depth_texture.create_view(&Default::default());
|
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
|
let (copy_srgb_view, copy_srgb_bind_group) = if descriptors.frame_buffer_format
|
||||||
!= descriptors.surface_format
|
!= descriptors.surface_format
|
||||||
{
|
{
|
||||||
|
@ -203,7 +198,7 @@ impl<T: RenderTarget> WgpuRenderBackend<T> {
|
||||||
wgpu::BindGroupEntry {
|
wgpu::BindGroupEntry {
|
||||||
binding: 0,
|
binding: 0,
|
||||||
resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding {
|
resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding {
|
||||||
buffer: &quad_tex_transforms,
|
buffer: &descriptors.quad.texture_transforms,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
size: wgpu::BufferSize::new(
|
size: wgpu::BufferSize::new(
|
||||||
std::mem::size_of::<TextureTransforms>() as u64,
|
std::mem::size_of::<TextureTransforms>() as u64,
|
||||||
|
@ -282,9 +277,6 @@ impl<T: RenderTarget> WgpuRenderBackend<T> {
|
||||||
meshes: Vec::new(),
|
meshes: Vec::new(),
|
||||||
shape_tessellator: ShapeTessellator::new(),
|
shape_tessellator: ShapeTessellator::new(),
|
||||||
|
|
||||||
quad_vbo,
|
|
||||||
quad_ibo,
|
|
||||||
quad_tex_transforms,
|
|
||||||
bitmap_registry: Default::default(),
|
bitmap_registry: Default::default(),
|
||||||
next_bitmap_handle: BitmapHandle(0),
|
next_bitmap_handle: BitmapHandle(0),
|
||||||
viewport_scale_factor: 1.0,
|
viewport_scale_factor: 1.0,
|
||||||
|
@ -662,7 +654,7 @@ impl<T: RenderTarget + 'static> RenderBackend for WgpuRenderBackend<T> {
|
||||||
wgpu::BindGroupEntry {
|
wgpu::BindGroupEntry {
|
||||||
binding: 0,
|
binding: 0,
|
||||||
resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding {
|
resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding {
|
||||||
buffer: &self.quad_tex_transforms,
|
buffer: &self.descriptors.quad.texture_transforms,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
size: wgpu::BufferSize::new(
|
size: wgpu::BufferSize::new(
|
||||||
std::mem::size_of::<TextureTransforms>() as u64,
|
std::mem::size_of::<TextureTransforms>() as u64,
|
||||||
|
@ -849,8 +841,8 @@ impl<T: RenderTarget + 'static> RenderBackend for WgpuRenderBackend<T> {
|
||||||
&mut frame,
|
&mut frame,
|
||||||
&self.meshes,
|
&self.meshes,
|
||||||
&self.bitmap_registry,
|
&self.bitmap_registry,
|
||||||
self.quad_vbo.slice(..),
|
self.descriptors.quad.vertices.slice(..),
|
||||||
self.quad_ibo.slice(..),
|
self.descriptors.quad.indices.slice(..),
|
||||||
));
|
));
|
||||||
frame.finish();
|
frame.finish();
|
||||||
|
|
||||||
|
@ -892,7 +884,11 @@ impl<T: RenderTarget + 'static> RenderBackend for WgpuRenderBackend<T> {
|
||||||
);
|
);
|
||||||
|
|
||||||
srgb_frame.prep_srgb_copy(copy_srgb_bind_group);
|
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);
|
drop(srgb_frame);
|
||||||
Some(copy_encoder.finish())
|
Some(copy_encoder.finish())
|
||||||
|
@ -980,7 +976,7 @@ impl<T: RenderTarget + 'static> RenderBackend for WgpuRenderBackend<T> {
|
||||||
wgpu::BindGroupEntry {
|
wgpu::BindGroupEntry {
|
||||||
binding: 0,
|
binding: 0,
|
||||||
resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding {
|
resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding {
|
||||||
buffer: &self.quad_tex_transforms,
|
buffer: &self.descriptors.quad.texture_transforms,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
size: wgpu::BufferSize::new(
|
size: wgpu::BufferSize::new(
|
||||||
std::mem::size_of::<TextureTransforms>() as u64
|
std::mem::size_of::<TextureTransforms>() as u64
|
||||||
|
@ -1199,8 +1195,8 @@ impl<T: RenderTarget + 'static> RenderBackend for WgpuRenderBackend<T> {
|
||||||
&mut frame,
|
&mut frame,
|
||||||
&self.meshes,
|
&self.meshes,
|
||||||
&self.bitmap_registry,
|
&self.bitmap_registry,
|
||||||
self.quad_vbo.slice(..),
|
self.descriptors.quad.vertices.slice(..),
|
||||||
self.quad_ibo.slice(..),
|
self.descriptors.quad.indices.slice(..),
|
||||||
));
|
));
|
||||||
frame.finish();
|
frame.finish();
|
||||||
|
|
||||||
|
@ -1234,58 +1230,6 @@ impl<T: RenderTarget + 'static> RenderBackend for WgpuRenderBackend<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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(
|
fn create_depth_texture_view(
|
||||||
descriptors: &Descriptors,
|
descriptors: &Descriptors,
|
||||||
target_data: &DescriptorsTargetData,
|
target_data: &DescriptorsTargetData,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::layouts::BindLayouts;
|
use crate::layouts::BindLayouts;
|
||||||
use crate::shaders::Shaders;
|
use crate::shaders::Shaders;
|
||||||
use crate::{BitmapSamplers, Pipelines};
|
use crate::{create_buffer_with_data, BitmapSamplers, Pipelines, TextureTransforms, Vertex};
|
||||||
|
|
||||||
/// Contains data specific to a `RenderTarget`.
|
/// Contains data specific to a `RenderTarget`.
|
||||||
/// We cannot re-use this data in `with_offscreen_backend`
|
/// We cannot re-use this data in `with_offscreen_backend`
|
||||||
|
@ -70,6 +70,7 @@ pub struct Descriptors {
|
||||||
pub onscreen: DescriptorsTargetData,
|
pub onscreen: DescriptorsTargetData,
|
||||||
pub offscreen: DescriptorsTargetData,
|
pub offscreen: DescriptorsTargetData,
|
||||||
pub bind_layouts: BindLayouts,
|
pub bind_layouts: BindLayouts,
|
||||||
|
pub quad: Quad,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Descriptors {
|
impl Descriptors {
|
||||||
|
@ -84,6 +85,7 @@ impl Descriptors {
|
||||||
let bind_layouts = BindLayouts::new(&device);
|
let bind_layouts = BindLayouts::new(&device);
|
||||||
let bitmap_samplers = BitmapSamplers::new(&device, &bind_layouts);
|
let bitmap_samplers = BitmapSamplers::new(&device, &bind_layouts);
|
||||||
let shaders = Shaders::new(&device);
|
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.
|
// 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.
|
// If our surface is sRGB, render to a linear texture and than copy over to the surface.
|
||||||
|
@ -137,6 +139,71 @@ impl Descriptors {
|
||||||
onscreen,
|
onscreen,
|
||||||
offscreen,
|
offscreen,
|
||||||
bind_layouts,
|
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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue