Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_anti_alias/src/dlss/prepare.rs
6596 views
1
use super::{Dlss, DlssFeature, DlssSdk};
2
use bevy_camera::{Camera3d, CameraMainTextureUsages, MainPassResolutionOverride};
3
use bevy_core_pipeline::prepass::{DepthPrepass, MotionVectorPrepass};
4
use bevy_diagnostic::FrameCount;
5
use bevy_ecs::{
6
component::Component,
7
entity::Entity,
8
query::With,
9
system::{Commands, Query, Res},
10
};
11
use bevy_math::Vec4Swizzles;
12
use bevy_render::{
13
camera::{MipBias, TemporalJitter},
14
render_resource::TextureUsages,
15
renderer::{RenderDevice, RenderQueue},
16
view::ExtractedView,
17
};
18
use dlss_wgpu::{DlssFeatureFlags, DlssPerfQualityMode};
19
use std::sync::{Arc, Mutex};
20
21
#[derive(Component)]
22
pub struct DlssRenderContext<F: DlssFeature> {
23
pub context: Mutex<F::Context>,
24
pub perf_quality_mode: DlssPerfQualityMode,
25
pub feature_flags: DlssFeatureFlags,
26
}
27
28
pub fn prepare_dlss<F: DlssFeature>(
29
mut query: Query<
30
(
31
Entity,
32
&ExtractedView,
33
&Dlss<F>,
34
&mut Camera3d,
35
&mut CameraMainTextureUsages,
36
&mut TemporalJitter,
37
&mut MipBias,
38
Option<&mut DlssRenderContext<F>>,
39
),
40
(
41
With<Camera3d>,
42
With<TemporalJitter>,
43
With<DepthPrepass>,
44
With<MotionVectorPrepass>,
45
),
46
>,
47
dlss_sdk: Res<DlssSdk>,
48
render_device: Res<RenderDevice>,
49
render_queue: Res<RenderQueue>,
50
frame_count: Res<FrameCount>,
51
mut commands: Commands,
52
) {
53
for (
54
entity,
55
view,
56
dlss,
57
mut camera_3d,
58
mut camera_main_texture_usages,
59
mut temporal_jitter,
60
mut mip_bias,
61
mut dlss_context,
62
) in &mut query
63
{
64
camera_main_texture_usages.0 |= TextureUsages::STORAGE_BINDING;
65
66
let mut depth_texture_usages = TextureUsages::from(camera_3d.depth_texture_usages);
67
depth_texture_usages |= TextureUsages::TEXTURE_BINDING;
68
camera_3d.depth_texture_usages = depth_texture_usages.into();
69
70
let upscaled_resolution = view.viewport.zw();
71
72
let dlss_feature_flags = DlssFeatureFlags::LowResolutionMotionVectors
73
| DlssFeatureFlags::InvertedDepth
74
| DlssFeatureFlags::HighDynamicRange
75
| DlssFeatureFlags::AutoExposure; // TODO
76
77
match dlss_context.as_deref_mut() {
78
Some(dlss_context)
79
if upscaled_resolution
80
== F::upscaled_resolution(&dlss_context.context.lock().unwrap())
81
&& dlss.perf_quality_mode == dlss_context.perf_quality_mode
82
&& dlss_feature_flags == dlss_context.feature_flags =>
83
{
84
let dlss_context = dlss_context.context.lock().unwrap();
85
let render_resolution = F::render_resolution(&dlss_context);
86
temporal_jitter.offset =
87
F::suggested_jitter(&dlss_context, frame_count.0, render_resolution);
88
}
89
_ => {
90
let dlss_context = F::new_context(
91
upscaled_resolution,
92
dlss.perf_quality_mode,
93
dlss_feature_flags,
94
Arc::clone(&dlss_sdk.0),
95
&render_device,
96
&render_queue,
97
)
98
.expect("Failed to create DlssRenderContext");
99
100
let render_resolution = F::render_resolution(&dlss_context);
101
temporal_jitter.offset =
102
F::suggested_jitter(&dlss_context, frame_count.0, render_resolution);
103
mip_bias.0 = F::suggested_mip_bias(&dlss_context, render_resolution);
104
105
commands.entity(entity).insert((
106
DlssRenderContext::<F> {
107
context: Mutex::new(dlss_context),
108
perf_quality_mode: dlss.perf_quality_mode,
109
feature_flags: dlss_feature_flags,
110
},
111
MainPassResolutionOverride(render_resolution),
112
));
113
}
114
}
115
}
116
}
117
118