From cff10176a7a1cc447b22a8422685228fbbd9db14 Mon Sep 17 00:00:00 2001 From: Robert Swain Date: Sat, 21 Aug 2021 12:44:28 +0200 Subject: [PATCH] Fix MSAA after core pipeline plugin was extracted from bevy render2 --- pipelined/bevy_core_pipeline/src/lib.rs | 186 +++++++++++++--------- pipelined/bevy_render2/src/view/window.rs | 41 +---- 2 files changed, 115 insertions(+), 112 deletions(-) diff --git a/pipelined/bevy_core_pipeline/src/lib.rs b/pipelined/bevy_core_pipeline/src/lib.rs index ab250cdd852da..5f427d01eef81 100644 --- a/pipelined/bevy_core_pipeline/src/lib.rs +++ b/pipelined/bevy_core_pipeline/src/lib.rs @@ -14,12 +14,12 @@ use bevy_render2::{ render_graph::{EmptyNode, RenderGraph, RenderGraphError, SlotInfo, SlotType}, render_phase::{sort_phase_system, RenderPhase}, render_resource::{ - Extent3d, Msaa, Texture, TextureDescriptor, TextureDimension, TextureFormat, TextureUsage, - TextureView, + Extent3d, Msaa, Texture, TextureAspect, TextureDescriptor, TextureDimension, TextureFormat, + TextureUsage, TextureView, TextureViewDescriptor, TextureViewDimension, }, renderer::RenderDevice, - texture::TextureCache, - view::{ExtractedView, ViewPlugin}, + texture::{BevyDefault, TextureCache}, + view::{ExtractedMsaa, ExtractedView, ExtractedWindows, ViewPlugin}, RenderStage, RenderWorld, }; @@ -81,6 +81,7 @@ impl Plugin for CorePipelinePlugin { render_app .add_system_to_stage(RenderStage::Extract, extract_clear_color) .add_system_to_stage(RenderStage::Extract, extract_core_pipeline_camera_phases) + .add_system_to_stage(RenderStage::Prepare, prepare_windows_msaa) .add_system_to_stage(RenderStage::Prepare, prepare_core_views_system) .add_system_to_stage( RenderStage::PhaseSort, @@ -157,6 +158,115 @@ impl Plugin for CorePipelinePlugin { } } +pub struct Transparent3dPhase; +pub struct Transparent2dPhase; + +pub struct ViewDepthTexture { + pub texture: Texture, + pub view: TextureView, +} + +pub fn extract_clear_color(clear_color: Res, mut render_world: ResMut) { + // If the clear color has changed + if clear_color.is_changed() { + // Update the clear color resource in the render world + render_world.insert_resource(clear_color.clone()) + } +} + +pub fn extract_core_pipeline_camera_phases( + mut commands: Commands, + active_cameras: Res, +) { + if let Some(camera_2d) = active_cameras.get(CameraPlugin::CAMERA_2D) { + if let Some(entity) = camera_2d.entity { + commands + .get_or_spawn(entity) + .insert(RenderPhase::::default()); + } + } + if let Some(camera_3d) = active_cameras.get(CameraPlugin::CAMERA_3D) { + if let Some(entity) = camera_3d.entity { + commands + .get_or_spawn(entity) + .insert(RenderPhase::::default()); + } + } +} + +pub fn prepare_core_views_system( + mut commands: Commands, + mut texture_cache: ResMut, + msaa: Res, + render_device: Res, + views: Query<(Entity, &ExtractedView), With>>, +) { + for (entity, view) in views.iter() { + let cached_texture = texture_cache.get( + &render_device, + TextureDescriptor { + label: None, + size: Extent3d { + depth_or_array_layers: 1, + width: view.width as u32, + height: view.height as u32, + }, + mip_level_count: 1, + sample_count: msaa.samples, + dimension: TextureDimension::D2, + format: TextureFormat::Depth32Float, /* PERF: vulkan docs recommend using 24 + * bit depth for better performance */ + usage: TextureUsage::RENDER_ATTACHMENT, + }, + ); + commands.entity(entity).insert(ViewDepthTexture { + texture: cached_texture.texture, + view: cached_texture.default_view, + }); + } +} + +pub fn prepare_windows_msaa( + msaa: Res, + mut windows: ResMut, + render_device: Res, + mut render_graph: ResMut, +) { + for window in windows.windows.values_mut() { + if msaa.is_added() || msaa.is_changed() { + if msaa.samples > 1 { + let texture = render_device.create_texture(&TextureDescriptor { + label: Some("sampled_color_attachment_texture"), + size: Extent3d { + width: window.physical_width, + height: window.physical_height, + depth_or_array_layers: 1, + }, + mip_level_count: 1, + sample_count: msaa.samples, + dimension: TextureDimension::D2, + format: TextureFormat::bevy_default(), + usage: TextureUsage::RENDER_ATTACHMENT, + }); + let texture_view = texture.create_view(&TextureViewDescriptor { + label: Some("sampled_color_attachment"), + format: None, + dimension: Some(TextureViewDimension::D2), + aspect: TextureAspect::All, + base_mip_level: 0, + mip_level_count: None, + base_array_layer: 0, + array_layer_count: None, + }); + window.sampled_color_attachment_texture = Some(texture); + window.sampled_color_attachment = Some(texture_view); + } + + configure_graph_msaa(msaa.samples, &mut *render_graph); + } + } +} + pub fn configure_graph_msaa(msaa_samples: u32, render_graph: &mut RenderGraph) { if msaa_samples > 1 { // Scope to drop the mutable borrow @@ -348,71 +458,3 @@ pub fn configure_graph_msaa(msaa_samples: u32, render_graph: &mut RenderGraph) { } } } - -pub struct Transparent3dPhase; -pub struct Transparent2dPhase; - -pub struct ViewDepthTexture { - pub texture: Texture, - pub view: TextureView, -} - -pub fn extract_clear_color(clear_color: Res, mut render_world: ResMut) { - // If the clear color has changed - if clear_color.is_changed() { - // Update the clear color resource in the render world - render_world.insert_resource(clear_color.clone()) - } -} - -pub fn extract_core_pipeline_camera_phases( - mut commands: Commands, - active_cameras: Res, -) { - if let Some(camera_2d) = active_cameras.get(CameraPlugin::CAMERA_2D) { - if let Some(entity) = camera_2d.entity { - commands - .get_or_spawn(entity) - .insert(RenderPhase::::default()); - } - } - if let Some(camera_3d) = active_cameras.get(CameraPlugin::CAMERA_3D) { - if let Some(entity) = camera_3d.entity { - commands - .get_or_spawn(entity) - .insert(RenderPhase::::default()); - } - } -} - -pub fn prepare_core_views_system( - mut commands: Commands, - mut texture_cache: ResMut, - msaa: Res, - render_device: Res, - views: Query<(Entity, &ExtractedView), With>>, -) { - for (entity, view) in views.iter() { - let cached_texture = texture_cache.get( - &render_device, - TextureDescriptor { - label: None, - size: Extent3d { - depth_or_array_layers: 1, - width: view.width as u32, - height: view.height as u32, - }, - mip_level_count: 1, - sample_count: msaa.samples, - dimension: TextureDimension::D2, - format: TextureFormat::Depth32Float, /* PERF: vulkan docs recommend using 24 - * bit depth for better performance */ - usage: TextureUsage::RENDER_ATTACHMENT, - }, - ); - commands.entity(entity).insert(ViewDepthTexture { - texture: cached_texture.texture, - view: cached_texture.default_view, - }); - } -} diff --git a/pipelined/bevy_render2/src/view/window.rs b/pipelined/bevy_render2/src/view/window.rs index 217e85dcf210f..1b1444eace989 100644 --- a/pipelined/bevy_render2/src/view/window.rs +++ b/pipelined/bevy_render2/src/view/window.rs @@ -1,6 +1,4 @@ use crate::{ - core_pipeline::configure_graph_msaa, - render_graph::RenderGraph, render_resource::{Msaa, Texture, TextureView}, renderer::{RenderDevice, RenderInstance}, texture::BevyDefault, @@ -11,10 +9,7 @@ use bevy_ecs::prelude::*; use bevy_utils::HashMap; use bevy_window::{RawWindowHandleWrapper, WindowId, Windows}; use std::ops::{Deref, DerefMut}; -use wgpu::{ - Extent3d, TextureAspect, TextureDescriptor, TextureDimension, TextureFormat, TextureUsage, - TextureViewDescriptor, TextureViewDimension, -}; +use wgpu::TextureFormat; // Token to ensure a system runs on the main thread. #[derive(Default)] @@ -104,10 +99,8 @@ pub fn prepare_windows( _marker: NonSend, mut windows: ResMut, mut window_surfaces: ResMut, - msaa: Res, render_device: Res, render_instance: Res, - mut render_graph: ResMut, ) { let window_surfaces = window_surfaces.deref_mut(); for window in windows.windows.values_mut() { @@ -153,37 +146,5 @@ pub fn prepare_windows( }; window.swap_chain_frame = Some(TextureView::from(frame)); - - if msaa.is_added() || msaa.is_changed() { - if msaa.samples > 1 { - let texture = render_device.create_texture(&TextureDescriptor { - label: Some("sampled_color_attachment_texture"), - size: Extent3d { - width: window.physical_width, - height: window.physical_height, - depth_or_array_layers: 1, - }, - mip_level_count: 1, - sample_count: msaa.samples, - dimension: TextureDimension::D2, - format: TextureFormat::bevy_default(), - usage: TextureUsage::RENDER_ATTACHMENT, - }); - let texture_view = texture.create_view(&TextureViewDescriptor { - label: Some("sampled_color_attachment"), - format: None, - dimension: Some(TextureViewDimension::D2), - aspect: TextureAspect::All, - base_mip_level: 0, - mip_level_count: None, - base_array_layer: 0, - array_layer_count: None, - }); - window.sampled_color_attachment_texture = Some(texture); - window.sampled_color_attachment = Some(texture_view); - } - - configure_graph_msaa(msaa.samples, &mut *render_graph); - } } }