From b7d2f068ec053cf64f6c150bac60f2dd8646dbe6 Mon Sep 17 00:00:00 2001 From: Carter Anderson Date: Thu, 23 Apr 2020 21:06:40 -0700 Subject: [PATCH] RenderGraph2: compile pipelines and setup draw targets in pass node --- .../src/render_graph_2/nodes/pass_node.rs | 66 +++++++++++++++---- bevy_render/src/renderer_2/render_context.rs | 2 +- .../src/renderer_2/wgpu_render_context.rs | 2 +- bevy_wgpu/src/wgpu_renderer.rs | 4 +- 4 files changed, 58 insertions(+), 16 deletions(-) diff --git a/bevy_render/src/render_graph_2/nodes/pass_node.rs b/bevy_render/src/render_graph_2/nodes/pass_node.rs index b79741e39b..d816eaa878 100644 --- a/bevy_render/src/render_graph_2/nodes/pass_node.rs +++ b/bevy_render/src/render_graph_2/nodes/pass_node.rs @@ -1,9 +1,11 @@ use crate::{ - pass::{TextureAttachment, PassDescriptor}, + draw_target::DrawTarget, + pass::{PassDescriptor, TextureAttachment}, pipeline::{PipelineCompiler, PipelineDescriptor}, - render_graph_2::{Node, ResourceSlots, ResourceSlotInfo}, + render_graph_2::{Node, ResourceSlotInfo, ResourceSlots}, render_resource::{RenderResourceAssignments, ResourceInfo}, - renderer_2::RenderContext, draw_target::DrawTarget, + renderer_2::RenderContext, + shader::Shader, }; use bevy_asset::{AssetStorage, Handle}; use legion::prelude::*; @@ -22,7 +24,10 @@ impl PassNode { let mut color_attachment_input_indices = Vec::new(); for color_attachment in descriptor.color_attachments.iter() { if let TextureAttachment::Input(ref name) = color_attachment.attachment { - inputs.push(ResourceSlotInfo::new(name.to_string(), ResourceInfo::Texture)); + inputs.push(ResourceSlotInfo::new( + name.to_string(), + ResourceInfo::Texture, + )); color_attachment_input_indices.push(Some(inputs.len() - 1)); } else { color_attachment_input_indices.push(None); @@ -30,9 +35,12 @@ impl PassNode { } let mut depth_stencil_attachment_input_index = None; - if let Some(ref depth_stencil_attachment)= descriptor.depth_stencil_attachment { + if let Some(ref depth_stencil_attachment) = descriptor.depth_stencil_attachment { if let TextureAttachment::Input(ref name) = depth_stencil_attachment.attachment { - inputs.push(ResourceSlotInfo::new(name.to_string(), ResourceInfo::Texture)); + inputs.push(ResourceSlotInfo::new( + name.to_string(), + ResourceInfo::Texture, + )); depth_stencil_attachment_input_index = Some(inputs.len() - 1); } } @@ -46,7 +54,11 @@ impl PassNode { } } - pub fn add_pipeline(&mut self, pipeline_handle: Handle, draw_targets: Vec>) { + pub fn add_pipeline( + &mut self, + pipeline_handle: Handle, + draw_targets: Vec>, + ) { self.pipelines.push((pipeline_handle, draw_targets)); } } @@ -70,13 +82,43 @@ impl Node for PassNode { for (i, color_attachment) in self.descriptor.color_attachments.iter_mut().enumerate() { if let Some(input_index) = self.color_attachment_input_indices[i] { - color_attachment.attachment = TextureAttachment::RenderResource(input.get(input_index).unwrap()); + color_attachment.attachment = + TextureAttachment::RenderResource(input.get(input_index).unwrap()); } - } if let Some(input_index) = self.depth_stencil_attachment_input_index { - self.descriptor.depth_stencil_attachment.as_mut().unwrap().attachment = TextureAttachment::RenderResource(input.get(input_index).unwrap()); + self.descriptor + .depth_stencil_attachment + .as_mut() + .unwrap() + .attachment = TextureAttachment::RenderResource(input.get(input_index).unwrap()); + } + + let shader_storage = resources.get::>().unwrap(); + for (pipeline_handle, draw_targets) in self.pipelines.iter_mut() { + if let Some(compiled_pipelines_iter) = + pipeline_compiler.iter_compiled_pipelines(*pipeline_handle) + { + for compiled_pipeline_handle in compiled_pipelines_iter { + let compiled_pipeline_descriptor = + pipeline_storage.get(compiled_pipeline_handle).unwrap(); + render_context.create_render_pipeline( + *compiled_pipeline_handle, + &compiled_pipeline_descriptor, + &shader_storage, + ); + for draw_target in draw_targets.iter_mut() { + draw_target.setup( + world, + resources, + render_context, + *compiled_pipeline_handle, + compiled_pipeline_descriptor, + ); + } + } + } } render_context.begin_pass( @@ -88,7 +130,7 @@ impl Node for PassNode { pipeline_compiler.iter_compiled_pipelines(*pipeline_handle) { for compiled_pipeline_handle in compiled_pipelines_iter { - let pipeline_descriptor = + let compiled_pipeline_descriptor = pipeline_storage.get(compiled_pipeline_handle).unwrap(); render_pass.set_pipeline(*compiled_pipeline_handle); for draw_target in draw_targets.iter() { @@ -97,7 +139,7 @@ impl Node for PassNode { resources, render_pass, *compiled_pipeline_handle, - pipeline_descriptor, + compiled_pipeline_descriptor, ); } } diff --git a/bevy_render/src/renderer_2/render_context.rs b/bevy_render/src/renderer_2/render_context.rs index b0ab1af2a6..a6055b62e4 100644 --- a/bevy_render/src/renderer_2/render_context.rs +++ b/bevy_render/src/renderer_2/render_context.rs @@ -33,7 +33,7 @@ pub trait RenderContext { fn create_render_pipeline( &mut self, pipeline_handle: Handle, - pipeline_descriptor: &mut PipelineDescriptor, + pipeline_descriptor: &PipelineDescriptor, shader_storage: &AssetStorage, ); fn setup_bind_groups( diff --git a/bevy_wgpu/src/renderer_2/wgpu_render_context.rs b/bevy_wgpu/src/renderer_2/wgpu_render_context.rs index 30e9b3562b..8a30d53a09 100644 --- a/bevy_wgpu/src/renderer_2/wgpu_render_context.rs +++ b/bevy_wgpu/src/renderer_2/wgpu_render_context.rs @@ -248,7 +248,7 @@ impl RenderContext for WgpuRenderContext { fn create_render_pipeline( &mut self, pipeline_handle: Handle, - pipeline_descriptor: &mut PipelineDescriptor, + pipeline_descriptor: &PipelineDescriptor, shader_storage: &AssetStorage, ) { if let Some(_) = self diff --git a/bevy_wgpu/src/wgpu_renderer.rs b/bevy_wgpu/src/wgpu_renderer.rs index 96c33dcfd1..55c5ce5720 100644 --- a/bevy_wgpu/src/wgpu_renderer.rs +++ b/bevy_wgpu/src/wgpu_renderer.rs @@ -267,8 +267,8 @@ impl WgpuRenderer { } // setup draw targets - let mut render_graph = resources.get_mut::().unwrap(); - render_graph.setup_pipeline_draw_targets(world, resources, &mut render_context); + // let mut render_graph = resources.get_mut::().unwrap(); + // render_graph.setup_pipeline_draw_targets(world, resources, &mut render_context); let command_buffer = render_context.finish(); if let Some(command_buffer) = command_buffer {