Path: blob/main/crates/bevy_anti_alias/src/dlss/prepare.rs
6596 views
use super::{Dlss, DlssFeature, DlssSdk};1use bevy_camera::{Camera3d, CameraMainTextureUsages, MainPassResolutionOverride};2use bevy_core_pipeline::prepass::{DepthPrepass, MotionVectorPrepass};3use bevy_diagnostic::FrameCount;4use bevy_ecs::{5component::Component,6entity::Entity,7query::With,8system::{Commands, Query, Res},9};10use bevy_math::Vec4Swizzles;11use bevy_render::{12camera::{MipBias, TemporalJitter},13render_resource::TextureUsages,14renderer::{RenderDevice, RenderQueue},15view::ExtractedView,16};17use dlss_wgpu::{DlssFeatureFlags, DlssPerfQualityMode};18use std::sync::{Arc, Mutex};1920#[derive(Component)]21pub struct DlssRenderContext<F: DlssFeature> {22pub context: Mutex<F::Context>,23pub perf_quality_mode: DlssPerfQualityMode,24pub feature_flags: DlssFeatureFlags,25}2627pub fn prepare_dlss<F: DlssFeature>(28mut query: Query<29(30Entity,31&ExtractedView,32&Dlss<F>,33&mut Camera3d,34&mut CameraMainTextureUsages,35&mut TemporalJitter,36&mut MipBias,37Option<&mut DlssRenderContext<F>>,38),39(40With<Camera3d>,41With<TemporalJitter>,42With<DepthPrepass>,43With<MotionVectorPrepass>,44),45>,46dlss_sdk: Res<DlssSdk>,47render_device: Res<RenderDevice>,48render_queue: Res<RenderQueue>,49frame_count: Res<FrameCount>,50mut commands: Commands,51) {52for (53entity,54view,55dlss,56mut camera_3d,57mut camera_main_texture_usages,58mut temporal_jitter,59mut mip_bias,60mut dlss_context,61) in &mut query62{63camera_main_texture_usages.0 |= TextureUsages::STORAGE_BINDING;6465let mut depth_texture_usages = TextureUsages::from(camera_3d.depth_texture_usages);66depth_texture_usages |= TextureUsages::TEXTURE_BINDING;67camera_3d.depth_texture_usages = depth_texture_usages.into();6869let upscaled_resolution = view.viewport.zw();7071let dlss_feature_flags = DlssFeatureFlags::LowResolutionMotionVectors72| DlssFeatureFlags::InvertedDepth73| DlssFeatureFlags::HighDynamicRange74| DlssFeatureFlags::AutoExposure; // TODO7576match dlss_context.as_deref_mut() {77Some(dlss_context)78if upscaled_resolution79== F::upscaled_resolution(&dlss_context.context.lock().unwrap())80&& dlss.perf_quality_mode == dlss_context.perf_quality_mode81&& dlss_feature_flags == dlss_context.feature_flags =>82{83let dlss_context = dlss_context.context.lock().unwrap();84let render_resolution = F::render_resolution(&dlss_context);85temporal_jitter.offset =86F::suggested_jitter(&dlss_context, frame_count.0, render_resolution);87}88_ => {89let dlss_context = F::new_context(90upscaled_resolution,91dlss.perf_quality_mode,92dlss_feature_flags,93Arc::clone(&dlss_sdk.0),94&render_device,95&render_queue,96)97.expect("Failed to create DlssRenderContext");9899let render_resolution = F::render_resolution(&dlss_context);100temporal_jitter.offset =101F::suggested_jitter(&dlss_context, frame_count.0, render_resolution);102mip_bias.0 = F::suggested_mip_bias(&dlss_context, render_resolution);103104commands.entity(entity).insert((105DlssRenderContext::<F> {106context: Mutex::new(dlss_context),107perf_quality_mode: dlss.perf_quality_mode,108feature_flags: dlss_feature_flags,109},110MainPassResolutionOverride(render_resolution),111));112}113}114}115}116117118