finish wiring up new renderer / render_graph

This commit is contained in:
Carter Anderson 2020-01-19 23:03:08 -08:00
parent e4d42c29a9
commit 54005fcdd0
5 changed files with 70 additions and 46 deletions

View File

@ -13,6 +13,7 @@ pub struct App {
pub world: World, pub world: World,
pub legacy_render_graph: Option<render::RenderGraph>, pub legacy_render_graph: Option<render::RenderGraph>,
pub renderer: Option<Box<dyn Renderer>>, pub renderer: Option<Box<dyn Renderer>>,
pub render_graph: RenderGraph,
pub schedule: Schedule, pub schedule: Schedule,
} }
@ -23,13 +24,15 @@ impl App {
schedule: Schedule, schedule: Schedule,
legacy_render_graph: Option<render::RenderGraph>, legacy_render_graph: Option<render::RenderGraph>,
renderer: Option<Box<dyn Renderer>>, renderer: Option<Box<dyn Renderer>>,
render_graph: RenderGraph,
) -> App { ) -> App {
App { App {
universe, universe,
world, world,
schedule: schedule, schedule,
legacy_render_graph: legacy_render_graph, legacy_render_graph,
renderer: renderer, renderer,
render_graph,
} }
} }
@ -49,9 +52,7 @@ impl App {
} }
if let Some(ref mut renderer) = self.renderer { if let Some(ref mut renderer) = self.renderer {
if let Some(render_graph) = self.world.resources.get::<RenderGraph>() { renderer.process_render_graph(&self.render_graph, &mut self.world);
renderer.process_render_graph(&render_graph, &mut self.world);
}
} }
if let Some(mut time) = self.world.resources.get_mut::<Time>() { if let Some(mut time) = self.world.resources.get_mut::<Time>() {
@ -77,6 +78,10 @@ impl App {
render_graph.initialize(&mut self.world); render_graph.initialize(&mut self.world);
} }
if let Some(ref mut renderer) = self.renderer {
renderer.initialize(&mut self.world);
}
log::info!("Entering render loop..."); log::info!("Entering render loop...");
event_loop.run(move |event, _, control_flow| { event_loop.run(move |event, _, control_flow| {
*control_flow = if cfg!(feature = "metal-auto-capture") { *control_flow = if cfg!(feature = "metal-auto-capture") {

View File

@ -18,6 +18,7 @@ pub struct AppBuilder {
pub universe: Universe, pub universe: Universe,
pub legacy_render_graph: Option<RenderGraph>, pub legacy_render_graph: Option<RenderGraph>,
pub renderer: Option<Box<dyn render_graph_2::Renderer>>, pub renderer: Option<Box<dyn render_graph_2::Renderer>>,
pub render_graph: render_graph_2::RenderGraph,
pub system_stages: HashMap<String, Vec<Box<dyn Schedulable>>>, pub system_stages: HashMap<String, Vec<Box<dyn Schedulable>>>,
pub runnable_stages: HashMap<String, Vec<Box<dyn Runnable>>>, pub runnable_stages: HashMap<String, Vec<Box<dyn Runnable>>>,
pub stage_order: Vec<String>, pub stage_order: Vec<String>,
@ -30,6 +31,7 @@ impl AppBuilder {
AppBuilder { AppBuilder {
universe, universe,
world, world,
render_graph: render_graph_2::RenderGraph::default(),
legacy_render_graph: None, legacy_render_graph: None,
renderer: None, renderer: None,
system_stages: HashMap::new(), system_stages: HashMap::new(),
@ -64,6 +66,7 @@ impl AppBuilder {
schedule_builder.build(), schedule_builder.build(),
self.legacy_render_graph, self.legacy_render_graph,
self.renderer, self.renderer,
self.render_graph,
) )
} }
@ -156,7 +159,6 @@ impl AppBuilder {
resources.insert(Time::new()); resources.insert(Time::new());
resources.insert(AssetStorage::<Mesh>::new()); resources.insert(AssetStorage::<Mesh>::new());
resources.insert(AssetStorage::<Texture>::new()); resources.insert(AssetStorage::<Texture>::new());
resources.insert(render_graph_2::RenderGraph::default());
self self
} }
@ -169,10 +171,10 @@ impl AppBuilder {
self self
} }
// pub fn add_wgpu_renderer(mut self) -> Self { pub fn add_wgpu_renderer(mut self) -> Self {
// self.renderer = Some(render_graph_2::WgpuRenderer); self.renderer = Some(Box::new(render_graph_2::WgpuRenderer::new()));
// self self
// } }
pub fn add_defaults_legacy(self) -> Self { pub fn add_defaults_legacy(self) -> Self {
self self
@ -186,5 +188,6 @@ impl AppBuilder {
self self
.add_default_resources() .add_default_resources()
.add_default_systems() .add_default_systems()
.add_wgpu_renderer()
} }
} }

View File

@ -4,14 +4,12 @@ mod renderer;
mod shader; mod shader;
mod render_graph; mod render_graph;
mod example; mod example;
mod render_system;
pub use pipeline::*; pub use pipeline::*;
pub use pass::*; pub use pass::*;
pub use renderer::*; pub use renderer::*;
pub use shader::*; pub use shader::*;
pub use render_graph::*; pub use render_graph::*;
pub use render_system::*;
// a named graphics resource provided by a resource provider // a named graphics resource provided by a resource provider
pub struct Resource { pub struct Resource {

View File

@ -1,19 +0,0 @@
use crate::prelude::*;
use crate::render::render_graph_2::{RenderGraph, WgpuRenderer, Renderer};
use winit::window::Window;
pub fn build_wgpu_render_system(world: &mut World) -> Box<dyn Schedulable> {
let window = world.resources.get::<Window>();
let renderer = WgpuRenderer {
};
SystemBuilder::new("wgpu_render_system")
.read_resource::<RenderGraph>()
.with_query(<(Write<Node>,)>::query().filter(!component::<Parent>()))
.write_component::<Node>()
.read_component::<Children>()
.build(move |_, world, render_graph, node_query| {
renderer.process_render_graph(*render_graph);
})
}

View File

@ -2,11 +2,11 @@ use crate::{
asset::{AssetStorage, Handle, Mesh}, asset::{AssetStorage, Handle, Mesh},
legion::prelude::*, legion::prelude::*,
render::{ render::{
render_graph_2::{PipelineDescriptor, PassDescriptor, RenderGraph, ShaderMaterials}, render_graph_2::{PassDescriptor, PipelineDescriptor, RenderGraph, ShaderMaterials},
Instanced, Instanced,
}, },
}; };
use std::collections::HashMap; use std::{collections::HashMap, ops::Deref};
use zerocopy::AsBytes; use zerocopy::AsBytes;
// A set of draw calls. ex: get + draw meshes, get + draw instanced meshes, draw ui meshes, etc // A set of draw calls. ex: get + draw meshes, get + draw instanced meshes, draw ui meshes, etc
@ -14,13 +14,9 @@ use zerocopy::AsBytes;
// trait DrawTarget { // trait DrawTarget {
// fn draw(device: &wgpu::Device); // fn draw(device: &wgpu::Device);
// } // }
pub type DrawTarget = pub type DrawTarget = fn(world: &World, render_pass: &mut dyn RenderPass);
fn(world: &World, render_pass: &mut dyn RenderPass);
pub fn mesh_draw_target( pub fn mesh_draw_target(world: &World, render_pass: &mut dyn RenderPass) {
world: &World,
render_pass: &mut dyn RenderPass,
) {
let mut mesh_storage = world.resources.get_mut::<AssetStorage<Mesh>>().unwrap(); let mut mesh_storage = world.resources.get_mut::<AssetStorage<Mesh>>().unwrap();
let mut last_mesh_id = None; let mut last_mesh_id = None;
let mesh_query = let mesh_query =
@ -51,6 +47,7 @@ pub fn mesh_draw_target(
} }
pub trait Renderer { pub trait Renderer {
fn initialize(&mut self, world: &mut World);
fn resize(&mut self, world: &mut World, width: u32, height: u32); fn resize(&mut self, world: &mut World, width: u32, height: u32);
fn process_render_graph(&mut self, render_graph: &RenderGraph, world: &mut World); fn process_render_graph(&mut self, render_graph: &RenderGraph, world: &mut World);
fn load_mesh(&mut self, asset_id: usize, mesh: &Mesh); fn load_mesh(&mut self, asset_id: usize, mesh: &Mesh);
@ -58,7 +55,7 @@ pub trait Renderer {
pub struct WgpuRenderer { pub struct WgpuRenderer {
pub device: wgpu::Device, pub device: wgpu::Device,
pub surface: wgpu::Surface, pub surface: Option<wgpu::Surface>,
pub swap_chain_descriptor: wgpu::SwapChainDescriptor, pub swap_chain_descriptor: wgpu::SwapChainDescriptor,
pub render_pipelines: HashMap<String, wgpu::RenderPipeline>, pub render_pipelines: HashMap<String, wgpu::RenderPipeline>,
pub buffers: HashMap<String, wgpu::Buffer>, pub buffers: HashMap<String, wgpu::Buffer>,
@ -66,10 +63,38 @@ pub struct WgpuRenderer {
impl WgpuRenderer { impl WgpuRenderer {
pub fn new() -> Self { pub fn new() -> Self {
WgpuRenderer { let adapter = wgpu::Adapter::request(
&wgpu::RequestAdapterOptions {
power_preference: wgpu::PowerPreference::Default,
},
wgpu::BackendBit::PRIMARY,
)
.unwrap();
let (device, queue) = adapter.request_device(&wgpu::DeviceDescriptor {
extensions: wgpu::Extensions {
anisotropic_filtering: false,
},
limits: wgpu::Limits::default(),
});
let swap_chain_descriptor = wgpu::SwapChainDescriptor {
usage: wgpu::TextureUsage::OUTPUT_ATTACHMENT,
format: wgpu::TextureFormat::Bgra8UnormSrgb,
width: 0,
height: 0,
present_mode: wgpu::PresentMode::Vsync,
};
WgpuRenderer {
device,
surface: None,
swap_chain_descriptor,
render_pipelines: HashMap::new(),
buffers: HashMap::new(),
} }
} }
pub fn create_render_pipeline( pub fn create_render_pipeline(
pipeline_descriptor: &PipelineDescriptor, pipeline_descriptor: &PipelineDescriptor,
device: &wgpu::Device, device: &wgpu::Device,
@ -131,10 +156,22 @@ impl WgpuRenderer {
} }
impl Renderer for WgpuRenderer { impl Renderer for WgpuRenderer {
fn initialize(&mut self, world: &mut World) {
let (surface, window_size) = {
let window = world.resources.get::<winit::window::Window>().unwrap();
let surface = wgpu::Surface::create(window.deref());
let window_size = window.inner_size();
(surface, window_size)
};
self.surface = Some(surface);
self.resize(world, window_size.width, window_size.height);
}
fn resize(&mut self, world: &mut World, width: u32, height: u32) { fn resize(&mut self, world: &mut World, width: u32, height: u32) {
let swap_chain = self let swap_chain = self
.device .device
.create_swap_chain(&self.surface, &self.swap_chain_descriptor); .create_swap_chain(self.surface.as_ref().unwrap(), &self.swap_chain_descriptor);
self.swap_chain_descriptor.width = width; self.swap_chain_descriptor.width = width;
self.swap_chain_descriptor.height = height; self.swap_chain_descriptor.height = height;
@ -168,7 +205,7 @@ impl Renderer for WgpuRenderer {
self.render_pipelines self.render_pipelines
.insert(pass_pipeline.to_string(), render_pipeline); .insert(pass_pipeline.to_string(), render_pipeline);
} }
let mut render_pass = WgpuRenderPass { let mut render_pass = WgpuRenderPass {
render_pass: &mut render_pass, render_pass: &mut render_pass,
renderer: &self, renderer: &self,
@ -220,4 +257,4 @@ impl<'a, 'b, 'c> RenderPass for WgpuRenderPass<'a, 'b, 'c> {
// fn get_buffer(name: &str) -> Option<Buffer>; // fn get_buffer(name: &str) -> Option<Buffer>;
// fn get_texture(name: &str) -> Option<Texture>; // fn get_texture(name: &str) -> Option<Texture>;
// fn get_sampler(name: &str) -> Option<Sampler>; // fn get_sampler(name: &str) -> Option<Sampler>;
// } // }