render: Add Pipelines struct to group together wgpu pipelines

This commit is contained in:
Nathan Adams 2020-04-28 16:34:07 +02:00
parent dd1fa2700f
commit bdaf86dc3b
2 changed files with 103 additions and 103 deletions

View File

@ -12,7 +12,7 @@ use ruffle_core::shape_utils::{DrawCommand, DrawPath};
use std::convert::TryInto; use std::convert::TryInto;
use swf::{CharacterId, DefineBitsLossless, Glyph, Shape, Twips}; use swf::{CharacterId, DefineBitsLossless, Glyph, Shape, Twips};
use crate::pipelines::{create_bitmap_pipeline, create_color_pipeline, create_gradient_pipeline}; use crate::pipelines::Pipelines;
use bytemuck::{Pod, Zeroable}; use bytemuck::{Pod, Zeroable};
use futures::executor::block_on; use futures::executor::block_on;
use raw_window_handle::HasRawWindowHandle; use raw_window_handle::HasRawWindowHandle;
@ -30,12 +30,7 @@ pub struct WGPURenderBackend {
queue: wgpu::Queue, queue: wgpu::Queue,
swap_chain_desc: wgpu::SwapChainDescriptor, swap_chain_desc: wgpu::SwapChainDescriptor,
swap_chain: wgpu::SwapChain, swap_chain: wgpu::SwapChain,
color_bind_layout: wgpu::BindGroupLayout, pipelines: Pipelines,
color_pipeline: wgpu::RenderPipeline,
bitmap_bind_layout: wgpu::BindGroupLayout,
bitmap_pipeline: wgpu::RenderPipeline,
gradient_bind_layout: wgpu::BindGroupLayout,
gradient_pipeline: wgpu::RenderPipeline,
depth_texture_view: wgpu::TextureView, depth_texture_view: wgpu::TextureView,
current_frame: Option<(wgpu::SwapChainOutput, wgpu::CommandEncoder)>, current_frame: Option<(wgpu::SwapChainOutput, wgpu::CommandEncoder)>,
meshes: Vec<Mesh>, meshes: Vec<Mesh>,
@ -128,49 +123,7 @@ impl WGPURenderBackend {
}; };
let swap_chain = device.create_swap_chain(&window_surface, &swap_chain_desc); let swap_chain = device.create_swap_chain(&window_surface, &swap_chain_desc);
let color_vs_bytes = include_bytes!("../shaders/color.vert.spv"); let pipelines = Pipelines::new(&device)?;
let color_vs = device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(
&color_vs_bytes[..],
))?);
let color_fs_bytes = include_bytes!("../shaders/color.frag.spv");
let color_fs = device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(
&color_fs_bytes[..],
))?);
let texture_vs_bytes = include_bytes!("../shaders/texture.vert.spv");
let texture_vs = device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(
&texture_vs_bytes[..],
))?);
let gradient_fs_bytes = include_bytes!("../shaders/gradient.frag.spv");
let gradient_fs = device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(
&gradient_fs_bytes[..],
))?);
let bitmap_fs_bytes = include_bytes!("../shaders/bitmap.frag.spv");
let bitmap_fs = device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(
&bitmap_fs_bytes[..],
))?);
let depth_stencil_state = Some(wgpu::DepthStencilStateDescriptor {
format: wgpu::TextureFormat::Depth32Float,
depth_write_enabled: true,
depth_compare: wgpu::CompareFunction::Greater,
stencil_front: wgpu::StencilStateFaceDescriptor::IGNORE,
stencil_back: wgpu::StencilStateFaceDescriptor::IGNORE,
stencil_read_mask: 0,
stencil_write_mask: 0,
});
let (color_bind_layout, color_pipeline) =
create_color_pipeline(&device, &color_vs, &color_fs, depth_stencil_state.clone());
let (bitmap_bind_layout, bitmap_pipeline) = create_bitmap_pipeline(
&device,
&texture_vs,
&bitmap_fs,
depth_stencil_state.clone(),
);
let (gradient_bind_layout, gradient_pipeline) =
create_gradient_pipeline(&device, &texture_vs, &gradient_fs, depth_stencil_state);
let depth_label = create_debug_label!("Depth texture"); let depth_label = create_debug_label!("Depth texture");
let depth_texture = device.create_texture(&wgpu::TextureDescriptor { let depth_texture = device.create_texture(&wgpu::TextureDescriptor {
@ -196,12 +149,7 @@ impl WGPURenderBackend {
queue, queue,
swap_chain_desc, swap_chain_desc,
swap_chain, swap_chain,
color_bind_layout, pipelines,
color_pipeline,
bitmap_bind_layout,
bitmap_pipeline,
gradient_bind_layout,
gradient_pipeline,
depth_texture_view, depth_texture_view,
current_frame: None, current_frame: None,
meshes: Vec::new(), meshes: Vec::new(),
@ -248,9 +196,7 @@ impl WGPURenderBackend {
device: &wgpu::Device, device: &wgpu::Device,
transforms_ubo: &wgpu::Buffer, transforms_ubo: &wgpu::Buffer,
colors_ubo: &wgpu::Buffer, colors_ubo: &wgpu::Buffer,
color_bind_layout: &wgpu::BindGroupLayout, pipelines: &Pipelines,
bitmap_bind_layout: &wgpu::BindGroupLayout,
gradient_bind_layout: &wgpu::BindGroupLayout,
) { ) {
if lyon_mesh.vertices.is_empty() { if lyon_mesh.vertices.is_empty() {
return; return;
@ -279,9 +225,7 @@ impl WGPURenderBackend {
vbo, vbo,
ibo, ibo,
lyon_mesh.indices.len() as u32, lyon_mesh.indices.len() as u32,
color_bind_layout, pipelines,
bitmap_bind_layout,
gradient_bind_layout,
shape_id, shape_id,
draw_id, draw_id,
)); ));
@ -322,9 +266,7 @@ impl WGPURenderBackend {
&self.device, &self.device,
&transforms_ubo, &transforms_ubo,
&colors_ubo, &colors_ubo,
&self.color_bind_layout, &self.pipelines,
&self.bitmap_bind_layout,
&self.gradient_bind_layout,
); );
let mut buffers_builder = BuffersBuilder::new( let mut buffers_builder = BuffersBuilder::new(
@ -381,9 +323,7 @@ impl WGPURenderBackend {
&self.device, &self.device,
&transforms_ubo, &transforms_ubo,
&colors_ubo, &colors_ubo,
&self.color_bind_layout, &self.pipelines,
&self.bitmap_bind_layout,
&self.gradient_bind_layout,
); );
} }
FillStyle::RadialGradient(gradient) => { FillStyle::RadialGradient(gradient) => {
@ -395,9 +335,7 @@ impl WGPURenderBackend {
&self.device, &self.device,
&transforms_ubo, &transforms_ubo,
&colors_ubo, &colors_ubo,
&self.color_bind_layout, &self.pipelines,
&self.bitmap_bind_layout,
&self.gradient_bind_layout,
); );
let mut buffers_builder = BuffersBuilder::new( let mut buffers_builder = BuffersBuilder::new(
@ -454,9 +392,7 @@ impl WGPURenderBackend {
&self.device, &self.device,
&transforms_ubo, &transforms_ubo,
&colors_ubo, &colors_ubo,
&self.color_bind_layout, &self.pipelines,
&self.bitmap_bind_layout,
&self.gradient_bind_layout,
); );
} }
FillStyle::FocalGradient { FillStyle::FocalGradient {
@ -471,9 +407,7 @@ impl WGPURenderBackend {
&self.device, &self.device,
&transforms_ubo, &transforms_ubo,
&colors_ubo, &colors_ubo,
&self.color_bind_layout, &self.pipelines,
&self.bitmap_bind_layout,
&self.gradient_bind_layout,
); );
let mut buffers_builder = BuffersBuilder::new( let mut buffers_builder = BuffersBuilder::new(
@ -530,9 +464,7 @@ impl WGPURenderBackend {
&self.device, &self.device,
&transforms_ubo, &transforms_ubo,
&colors_ubo, &colors_ubo,
&self.color_bind_layout, &self.pipelines,
&self.bitmap_bind_layout,
&self.gradient_bind_layout,
); );
} }
FillStyle::Bitmap { FillStyle::Bitmap {
@ -549,9 +481,7 @@ impl WGPURenderBackend {
&self.device, &self.device,
&transforms_ubo, &transforms_ubo,
&colors_ubo, &colors_ubo,
&self.color_bind_layout, &self.pipelines,
&self.bitmap_bind_layout,
&self.gradient_bind_layout,
); );
let mut buffers_builder = BuffersBuilder::new( let mut buffers_builder = BuffersBuilder::new(
@ -597,9 +527,7 @@ impl WGPURenderBackend {
&self.device, &self.device,
&transforms_ubo, &transforms_ubo,
&colors_ubo, &colors_ubo,
&self.color_bind_layout, &self.pipelines,
&self.bitmap_bind_layout,
&self.gradient_bind_layout,
); );
} }
}, },
@ -668,9 +596,7 @@ impl WGPURenderBackend {
&self.device, &self.device,
&transforms_ubo, &transforms_ubo,
&colors_ubo, &colors_ubo,
&self.color_bind_layout, &self.pipelines,
&self.bitmap_bind_layout,
&self.gradient_bind_layout,
); );
self.meshes.push(Mesh { self.meshes.push(Mesh {
@ -1124,13 +1050,13 @@ impl RenderBackend for WGPURenderBackend {
for draw in &mesh.draws { for draw in &mesh.draws {
match &draw.draw_type { match &draw.draw_type {
DrawType::Color => { DrawType::Color => {
render_pass.set_pipeline(&self.color_pipeline); render_pass.set_pipeline(&self.pipelines.color.pipeline);
} }
DrawType::Gradient { .. } => { DrawType::Gradient { .. } => {
render_pass.set_pipeline(&self.gradient_pipeline); render_pass.set_pipeline(&self.pipelines.gradient.pipeline);
} }
DrawType::Bitmap { .. } => { DrawType::Bitmap { .. } => {
render_pass.set_pipeline(&self.bitmap_pipeline); render_pass.set_pipeline(&self.pipelines.bitmap.pipeline);
} }
} }
@ -1257,9 +1183,7 @@ impl IncompleteDrawType {
vertex_buffer: wgpu::Buffer, vertex_buffer: wgpu::Buffer,
index_buffer: wgpu::Buffer, index_buffer: wgpu::Buffer,
index_count: u32, index_count: u32,
color_bind_layout: &wgpu::BindGroupLayout, pipelines: &Pipelines,
bitmap_bind_layout: &wgpu::BindGroupLayout,
gradient_bind_layout: &wgpu::BindGroupLayout,
shape_id: CharacterId, shape_id: CharacterId,
draw_id: usize, draw_id: usize,
) -> Draw { ) -> Draw {
@ -1268,7 +1192,7 @@ impl IncompleteDrawType {
let bind_group_label = let bind_group_label =
create_debug_label!("Shape {} (color) draw {} bindgroup", shape_id, draw_id); create_debug_label!("Shape {} (color) draw {} bindgroup", shape_id, draw_id);
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
layout: color_bind_layout, layout: &pipelines.color.bind_layout,
bindings: &[ bindings: &[
wgpu::Binding { wgpu::Binding {
binding: 0, binding: 0,
@ -1325,7 +1249,7 @@ impl IncompleteDrawType {
let bind_group_label = let bind_group_label =
create_debug_label!("Shape {} (gradient) draw {} bindgroup", shape_id, draw_id); create_debug_label!("Shape {} (gradient) draw {} bindgroup", shape_id, draw_id);
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
layout: gradient_bind_layout, layout: &pipelines.gradient.bind_layout,
bindings: &[ bindings: &[
wgpu::Binding { wgpu::Binding {
binding: 0, binding: 0,
@ -1415,7 +1339,7 @@ impl IncompleteDrawType {
let bind_group_label = let bind_group_label =
create_debug_label!("Shape {} (bitmap) draw {} bindgroup", shape_id, draw_id); create_debug_label!("Shape {} (bitmap) draw {} bindgroup", shape_id, draw_id);
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
layout: bitmap_bind_layout, layout: &pipelines.bitmap.bind_layout,
bindings: &[ bindings: &[
wgpu::Binding { wgpu::Binding {
binding: 0, binding: 0,

View File

@ -1,7 +1,83 @@
use crate::GPUVertex; use crate::{Error, GPUVertex};
use wgpu::vertex_attr_array; use wgpu::vertex_attr_array;
pub fn create_pipeline_descriptor<'a>( #[derive(Debug)]
pub struct ShapePipeline {
pub pipeline: wgpu::RenderPipeline,
pub bind_layout: wgpu::BindGroupLayout,
}
#[derive(Debug)]
pub struct Pipelines {
pub color: ShapePipeline,
pub bitmap: ShapePipeline,
pub gradient: ShapePipeline,
}
impl Pipelines {
pub fn new(device: &wgpu::Device) -> Result<Self, Error> {
let depth_stencil_state = Some(wgpu::DepthStencilStateDescriptor {
format: wgpu::TextureFormat::Depth32Float,
depth_write_enabled: true,
depth_compare: wgpu::CompareFunction::Greater,
stencil_front: wgpu::StencilStateFaceDescriptor::IGNORE,
stencil_back: wgpu::StencilStateFaceDescriptor::IGNORE,
stencil_read_mask: 0,
stencil_write_mask: 0,
});
let color_vs_bytes = include_bytes!("../shaders/color.vert.spv");
let color_vs = device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(
&color_vs_bytes[..],
))?);
let color_fs_bytes = include_bytes!("../shaders/color.frag.spv");
let color_fs = device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(
&color_fs_bytes[..],
))?);
let texture_vs_bytes = include_bytes!("../shaders/texture.vert.spv");
let texture_vs = device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(
&texture_vs_bytes[..],
))?);
let gradient_fs_bytes = include_bytes!("../shaders/gradient.frag.spv");
let gradient_fs = device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(
&gradient_fs_bytes[..],
))?);
let bitmap_fs_bytes = include_bytes!("../shaders/bitmap.frag.spv");
let bitmap_fs = device.create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(
&bitmap_fs_bytes[..],
))?);
let (color_bind_layout, color_pipeline) =
create_color_pipeline(&device, &color_vs, &color_fs, depth_stencil_state.clone());
let (bitmap_bind_layout, bitmap_pipeline) = create_bitmap_pipeline(
&device,
&texture_vs,
&bitmap_fs,
depth_stencil_state.clone(),
);
let (gradient_bind_layout, gradient_pipeline) =
create_gradient_pipeline(&device, &texture_vs, &gradient_fs, depth_stencil_state);
Ok(Self {
color: ShapePipeline {
pipeline: color_pipeline,
bind_layout: color_bind_layout,
},
bitmap: ShapePipeline {
pipeline: bitmap_pipeline,
bind_layout: bitmap_bind_layout,
},
gradient: ShapePipeline {
pipeline: gradient_pipeline,
bind_layout: gradient_bind_layout,
},
})
}
}
fn create_pipeline_descriptor<'a>(
vertex_shader: &'a wgpu::ShaderModule, vertex_shader: &'a wgpu::ShaderModule,
fragment_shader: &'a wgpu::ShaderModule, fragment_shader: &'a wgpu::ShaderModule,
pipeline_layout: &'a wgpu::PipelineLayout, pipeline_layout: &'a wgpu::PipelineLayout,
@ -45,7 +121,7 @@ pub fn create_pipeline_descriptor<'a>(
} }
} }
pub fn create_color_pipeline( fn create_color_pipeline(
device: &wgpu::Device, device: &wgpu::Device,
vertex_shader: &wgpu::ShaderModule, vertex_shader: &wgpu::ShaderModule,
fragment_shader: &wgpu::ShaderModule, fragment_shader: &wgpu::ShaderModule,
@ -99,7 +175,7 @@ pub fn create_color_pipeline(
) )
} }
pub fn create_bitmap_pipeline( fn create_bitmap_pipeline(
device: &wgpu::Device, device: &wgpu::Device,
vertex_shader: &wgpu::ShaderModule, vertex_shader: &wgpu::ShaderModule,
fragment_shader: &wgpu::ShaderModule, fragment_shader: &wgpu::ShaderModule,
@ -172,7 +248,7 @@ pub fn create_bitmap_pipeline(
) )
} }
pub fn create_gradient_pipeline( fn create_gradient_pipeline(
device: &wgpu::Device, device: &wgpu::Device,
vertex_shader: &wgpu::ShaderModule, vertex_shader: &wgpu::ShaderModule,
fragment_shader: &wgpu::ShaderModule, fragment_shader: &wgpu::ShaderModule,