finish wiring up new renderer / render_graph
This commit is contained in:
parent
e4d42c29a9
commit
54005fcdd0
@ -13,6 +13,7 @@ pub struct App {
|
||||
pub world: World,
|
||||
pub legacy_render_graph: Option<render::RenderGraph>,
|
||||
pub renderer: Option<Box<dyn Renderer>>,
|
||||
pub render_graph: RenderGraph,
|
||||
pub schedule: Schedule,
|
||||
}
|
||||
|
||||
@ -23,13 +24,15 @@ impl App {
|
||||
schedule: Schedule,
|
||||
legacy_render_graph: Option<render::RenderGraph>,
|
||||
renderer: Option<Box<dyn Renderer>>,
|
||||
render_graph: RenderGraph,
|
||||
) -> App {
|
||||
App {
|
||||
universe,
|
||||
world,
|
||||
schedule: schedule,
|
||||
legacy_render_graph: legacy_render_graph,
|
||||
renderer: renderer,
|
||||
schedule,
|
||||
legacy_render_graph,
|
||||
renderer,
|
||||
render_graph,
|
||||
}
|
||||
}
|
||||
|
||||
@ -49,9 +52,7 @@ impl App {
|
||||
}
|
||||
|
||||
if let Some(ref mut renderer) = self.renderer {
|
||||
if let Some(render_graph) = self.world.resources.get::<RenderGraph>() {
|
||||
renderer.process_render_graph(&render_graph, &mut self.world);
|
||||
}
|
||||
renderer.process_render_graph(&self.render_graph, &mut self.world);
|
||||
}
|
||||
|
||||
if let Some(mut time) = self.world.resources.get_mut::<Time>() {
|
||||
@ -77,6 +78,10 @@ impl App {
|
||||
render_graph.initialize(&mut self.world);
|
||||
}
|
||||
|
||||
if let Some(ref mut renderer) = self.renderer {
|
||||
renderer.initialize(&mut self.world);
|
||||
}
|
||||
|
||||
log::info!("Entering render loop...");
|
||||
event_loop.run(move |event, _, control_flow| {
|
||||
*control_flow = if cfg!(feature = "metal-auto-capture") {
|
||||
|
||||
@ -18,6 +18,7 @@ pub struct AppBuilder {
|
||||
pub universe: Universe,
|
||||
pub legacy_render_graph: Option<RenderGraph>,
|
||||
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 runnable_stages: HashMap<String, Vec<Box<dyn Runnable>>>,
|
||||
pub stage_order: Vec<String>,
|
||||
@ -30,6 +31,7 @@ impl AppBuilder {
|
||||
AppBuilder {
|
||||
universe,
|
||||
world,
|
||||
render_graph: render_graph_2::RenderGraph::default(),
|
||||
legacy_render_graph: None,
|
||||
renderer: None,
|
||||
system_stages: HashMap::new(),
|
||||
@ -64,6 +66,7 @@ impl AppBuilder {
|
||||
schedule_builder.build(),
|
||||
self.legacy_render_graph,
|
||||
self.renderer,
|
||||
self.render_graph,
|
||||
)
|
||||
}
|
||||
|
||||
@ -156,7 +159,6 @@ impl AppBuilder {
|
||||
resources.insert(Time::new());
|
||||
resources.insert(AssetStorage::<Mesh>::new());
|
||||
resources.insert(AssetStorage::<Texture>::new());
|
||||
resources.insert(render_graph_2::RenderGraph::default());
|
||||
self
|
||||
}
|
||||
|
||||
@ -169,10 +171,10 @@ impl AppBuilder {
|
||||
self
|
||||
}
|
||||
|
||||
// pub fn add_wgpu_renderer(mut self) -> Self {
|
||||
// self.renderer = Some(render_graph_2::WgpuRenderer);
|
||||
// self
|
||||
// }
|
||||
pub fn add_wgpu_renderer(mut self) -> Self {
|
||||
self.renderer = Some(Box::new(render_graph_2::WgpuRenderer::new()));
|
||||
self
|
||||
}
|
||||
|
||||
pub fn add_defaults_legacy(self) -> Self {
|
||||
self
|
||||
@ -186,5 +188,6 @@ impl AppBuilder {
|
||||
self
|
||||
.add_default_resources()
|
||||
.add_default_systems()
|
||||
.add_wgpu_renderer()
|
||||
}
|
||||
}
|
||||
@ -4,14 +4,12 @@ mod renderer;
|
||||
mod shader;
|
||||
mod render_graph;
|
||||
mod example;
|
||||
mod render_system;
|
||||
|
||||
pub use pipeline::*;
|
||||
pub use pass::*;
|
||||
pub use renderer::*;
|
||||
pub use shader::*;
|
||||
pub use render_graph::*;
|
||||
pub use render_system::*;
|
||||
|
||||
// a named graphics resource provided by a resource provider
|
||||
pub struct Resource {
|
||||
|
||||
@ -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);
|
||||
})
|
||||
}
|
||||
@ -2,11 +2,11 @@ use crate::{
|
||||
asset::{AssetStorage, Handle, Mesh},
|
||||
legion::prelude::*,
|
||||
render::{
|
||||
render_graph_2::{PipelineDescriptor, PassDescriptor, RenderGraph, ShaderMaterials},
|
||||
render_graph_2::{PassDescriptor, PipelineDescriptor, RenderGraph, ShaderMaterials},
|
||||
Instanced,
|
||||
},
|
||||
};
|
||||
use std::collections::HashMap;
|
||||
use std::{collections::HashMap, ops::Deref};
|
||||
use zerocopy::AsBytes;
|
||||
|
||||
// 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 {
|
||||
// fn draw(device: &wgpu::Device);
|
||||
// }
|
||||
pub type DrawTarget =
|
||||
fn(world: &World, render_pass: &mut dyn RenderPass);
|
||||
pub type DrawTarget = fn(world: &World, render_pass: &mut dyn RenderPass);
|
||||
|
||||
pub fn mesh_draw_target(
|
||||
world: &World,
|
||||
render_pass: &mut dyn RenderPass,
|
||||
) {
|
||||
pub fn mesh_draw_target(world: &World, render_pass: &mut dyn RenderPass) {
|
||||
let mut mesh_storage = world.resources.get_mut::<AssetStorage<Mesh>>().unwrap();
|
||||
let mut last_mesh_id = None;
|
||||
let mesh_query =
|
||||
@ -51,6 +47,7 @@ pub fn mesh_draw_target(
|
||||
}
|
||||
|
||||
pub trait Renderer {
|
||||
fn initialize(&mut self, world: &mut World);
|
||||
fn resize(&mut self, world: &mut World, width: u32, height: u32);
|
||||
fn process_render_graph(&mut self, render_graph: &RenderGraph, world: &mut World);
|
||||
fn load_mesh(&mut self, asset_id: usize, mesh: &Mesh);
|
||||
@ -58,7 +55,7 @@ pub trait Renderer {
|
||||
|
||||
pub struct WgpuRenderer {
|
||||
pub device: wgpu::Device,
|
||||
pub surface: wgpu::Surface,
|
||||
pub surface: Option<wgpu::Surface>,
|
||||
pub swap_chain_descriptor: wgpu::SwapChainDescriptor,
|
||||
pub render_pipelines: HashMap<String, wgpu::RenderPipeline>,
|
||||
pub buffers: HashMap<String, wgpu::Buffer>,
|
||||
@ -66,10 +63,38 @@ pub struct WgpuRenderer {
|
||||
|
||||
impl WgpuRenderer {
|
||||
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(
|
||||
pipeline_descriptor: &PipelineDescriptor,
|
||||
device: &wgpu::Device,
|
||||
@ -131,10 +156,22 @@ impl 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) {
|
||||
let swap_chain = self
|
||||
.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.height = height;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user