Path: blob/main/crates/bevy_anti_alias/src/dlss/node.rs
6596 views
use super::{1prepare::DlssRenderContext, Dlss, DlssFeature, DlssRayReconstructionFeature,2DlssSuperResolutionFeature, ViewDlssRayReconstructionTextures,3};4use bevy_camera::MainPassResolutionOverride;5use bevy_core_pipeline::prepass::ViewPrepassTextures;6use bevy_ecs::{query::QueryItem, world::World};7use bevy_render::{8camera::TemporalJitter,9diagnostic::RecordDiagnostics,10render_graph::{NodeRunError, RenderGraphContext, ViewNode},11renderer::{RenderAdapter, RenderContext},12view::ViewTarget,13};14use dlss_wgpu::{15ray_reconstruction::{16DlssRayReconstructionRenderParameters, DlssRayReconstructionSpecularGuide,17},18super_resolution::{DlssSuperResolutionExposure, DlssSuperResolutionRenderParameters},19};20use std::marker::PhantomData;2122#[derive(Default)]23pub struct DlssNode<F: DlssFeature>(PhantomData<F>);2425impl ViewNode for DlssNode<DlssSuperResolutionFeature> {26type ViewQuery = (27&'static Dlss<DlssSuperResolutionFeature>,28&'static DlssRenderContext<DlssSuperResolutionFeature>,29&'static MainPassResolutionOverride,30&'static TemporalJitter,31&'static ViewTarget,32&'static ViewPrepassTextures,33);3435fn run(36&self,37_graph: &mut RenderGraphContext,38render_context: &mut RenderContext,39(40dlss,41dlss_context,42resolution_override,43temporal_jitter,44view_target,45prepass_textures,46): QueryItem<Self::ViewQuery>,47world: &World,48) -> Result<(), NodeRunError> {49let adapter = world.resource::<RenderAdapter>();50let (Some(prepass_depth_texture), Some(prepass_motion_vectors_texture)) =51(&prepass_textures.depth, &prepass_textures.motion_vectors)52else {53return Ok(());54};5556let view_target = view_target.post_process_write();5758let render_resolution = resolution_override.0;59let render_parameters = DlssSuperResolutionRenderParameters {60color: &view_target.source,61depth: &prepass_depth_texture.texture.default_view,62motion_vectors: &prepass_motion_vectors_texture.texture.default_view,63exposure: DlssSuperResolutionExposure::Automatic, // TODO64bias: None, // TODO65dlss_output: &view_target.destination,66reset: dlss.reset,67jitter_offset: -temporal_jitter.offset,68partial_texture_size: Some(render_resolution),69motion_vector_scale: Some(-render_resolution.as_vec2()),70};7172let diagnostics = render_context.diagnostic_recorder();73let command_encoder = render_context.command_encoder();74let mut dlss_context = dlss_context.context.lock().unwrap();7576command_encoder.push_debug_group("dlss_super_resolution");77let time_span = diagnostics.time_span(command_encoder, "dlss_super_resolution");7879dlss_context80.render(render_parameters, command_encoder, &adapter)81.expect("Failed to render DLSS Super Resolution");8283time_span.end(command_encoder);84command_encoder.pop_debug_group();8586Ok(())87}88}8990impl ViewNode for DlssNode<DlssRayReconstructionFeature> {91type ViewQuery = (92&'static Dlss<DlssRayReconstructionFeature>,93&'static DlssRenderContext<DlssRayReconstructionFeature>,94&'static MainPassResolutionOverride,95&'static TemporalJitter,96&'static ViewTarget,97&'static ViewPrepassTextures,98&'static ViewDlssRayReconstructionTextures,99);100101fn run(102&self,103_graph: &mut RenderGraphContext,104render_context: &mut RenderContext,105(106dlss,107dlss_context,108resolution_override,109temporal_jitter,110view_target,111prepass_textures,112ray_reconstruction_textures,113): QueryItem<Self::ViewQuery>,114world: &World,115) -> Result<(), NodeRunError> {116let adapter = world.resource::<RenderAdapter>();117let (Some(prepass_depth_texture), Some(prepass_motion_vectors_texture)) =118(&prepass_textures.depth, &prepass_textures.motion_vectors)119else {120return Ok(());121};122123let view_target = view_target.post_process_write();124125let render_resolution = resolution_override.0;126let render_parameters = DlssRayReconstructionRenderParameters {127diffuse_albedo: &ray_reconstruction_textures.diffuse_albedo.default_view,128specular_albedo: &ray_reconstruction_textures.specular_albedo.default_view,129normals: &ray_reconstruction_textures.normal_roughness.default_view,130roughness: None,131color: &view_target.source,132depth: &prepass_depth_texture.texture.default_view,133motion_vectors: &prepass_motion_vectors_texture.texture.default_view,134specular_guide: DlssRayReconstructionSpecularGuide::SpecularMotionVectors(135&ray_reconstruction_textures136.specular_motion_vectors137.default_view,138),139screen_space_subsurface_scattering_guide: None, // TODO140bias: None, // TODO141dlss_output: &view_target.destination,142reset: dlss.reset,143jitter_offset: -temporal_jitter.offset,144partial_texture_size: Some(render_resolution),145motion_vector_scale: Some(-render_resolution.as_vec2()),146};147148let diagnostics = render_context.diagnostic_recorder();149let command_encoder = render_context.command_encoder();150let mut dlss_context = dlss_context.context.lock().unwrap();151152command_encoder.push_debug_group("dlss_ray_reconstruction");153let time_span = diagnostics.time_span(command_encoder, "dlss_ray_reconstruction");154155dlss_context156.render(render_parameters, command_encoder, &adapter)157.expect("Failed to render DLSS Ray Reconstruction");158159time_span.end(command_encoder);160command_encoder.pop_debug_group();161162Ok(())163}164}165166167