Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_anti_alias/src/dlss/node.rs
6596 views
1
use super::{
2
prepare::DlssRenderContext, Dlss, DlssFeature, DlssRayReconstructionFeature,
3
DlssSuperResolutionFeature, ViewDlssRayReconstructionTextures,
4
};
5
use bevy_camera::MainPassResolutionOverride;
6
use bevy_core_pipeline::prepass::ViewPrepassTextures;
7
use bevy_ecs::{query::QueryItem, world::World};
8
use bevy_render::{
9
camera::TemporalJitter,
10
diagnostic::RecordDiagnostics,
11
render_graph::{NodeRunError, RenderGraphContext, ViewNode},
12
renderer::{RenderAdapter, RenderContext},
13
view::ViewTarget,
14
};
15
use dlss_wgpu::{
16
ray_reconstruction::{
17
DlssRayReconstructionRenderParameters, DlssRayReconstructionSpecularGuide,
18
},
19
super_resolution::{DlssSuperResolutionExposure, DlssSuperResolutionRenderParameters},
20
};
21
use std::marker::PhantomData;
22
23
#[derive(Default)]
24
pub struct DlssNode<F: DlssFeature>(PhantomData<F>);
25
26
impl ViewNode for DlssNode<DlssSuperResolutionFeature> {
27
type ViewQuery = (
28
&'static Dlss<DlssSuperResolutionFeature>,
29
&'static DlssRenderContext<DlssSuperResolutionFeature>,
30
&'static MainPassResolutionOverride,
31
&'static TemporalJitter,
32
&'static ViewTarget,
33
&'static ViewPrepassTextures,
34
);
35
36
fn run(
37
&self,
38
_graph: &mut RenderGraphContext,
39
render_context: &mut RenderContext,
40
(
41
dlss,
42
dlss_context,
43
resolution_override,
44
temporal_jitter,
45
view_target,
46
prepass_textures,
47
): QueryItem<Self::ViewQuery>,
48
world: &World,
49
) -> Result<(), NodeRunError> {
50
let adapter = world.resource::<RenderAdapter>();
51
let (Some(prepass_depth_texture), Some(prepass_motion_vectors_texture)) =
52
(&prepass_textures.depth, &prepass_textures.motion_vectors)
53
else {
54
return Ok(());
55
};
56
57
let view_target = view_target.post_process_write();
58
59
let render_resolution = resolution_override.0;
60
let render_parameters = DlssSuperResolutionRenderParameters {
61
color: &view_target.source,
62
depth: &prepass_depth_texture.texture.default_view,
63
motion_vectors: &prepass_motion_vectors_texture.texture.default_view,
64
exposure: DlssSuperResolutionExposure::Automatic, // TODO
65
bias: None, // TODO
66
dlss_output: &view_target.destination,
67
reset: dlss.reset,
68
jitter_offset: -temporal_jitter.offset,
69
partial_texture_size: Some(render_resolution),
70
motion_vector_scale: Some(-render_resolution.as_vec2()),
71
};
72
73
let diagnostics = render_context.diagnostic_recorder();
74
let command_encoder = render_context.command_encoder();
75
let mut dlss_context = dlss_context.context.lock().unwrap();
76
77
command_encoder.push_debug_group("dlss_super_resolution");
78
let time_span = diagnostics.time_span(command_encoder, "dlss_super_resolution");
79
80
dlss_context
81
.render(render_parameters, command_encoder, &adapter)
82
.expect("Failed to render DLSS Super Resolution");
83
84
time_span.end(command_encoder);
85
command_encoder.pop_debug_group();
86
87
Ok(())
88
}
89
}
90
91
impl ViewNode for DlssNode<DlssRayReconstructionFeature> {
92
type ViewQuery = (
93
&'static Dlss<DlssRayReconstructionFeature>,
94
&'static DlssRenderContext<DlssRayReconstructionFeature>,
95
&'static MainPassResolutionOverride,
96
&'static TemporalJitter,
97
&'static ViewTarget,
98
&'static ViewPrepassTextures,
99
&'static ViewDlssRayReconstructionTextures,
100
);
101
102
fn run(
103
&self,
104
_graph: &mut RenderGraphContext,
105
render_context: &mut RenderContext,
106
(
107
dlss,
108
dlss_context,
109
resolution_override,
110
temporal_jitter,
111
view_target,
112
prepass_textures,
113
ray_reconstruction_textures,
114
): QueryItem<Self::ViewQuery>,
115
world: &World,
116
) -> Result<(), NodeRunError> {
117
let adapter = world.resource::<RenderAdapter>();
118
let (Some(prepass_depth_texture), Some(prepass_motion_vectors_texture)) =
119
(&prepass_textures.depth, &prepass_textures.motion_vectors)
120
else {
121
return Ok(());
122
};
123
124
let view_target = view_target.post_process_write();
125
126
let render_resolution = resolution_override.0;
127
let render_parameters = DlssRayReconstructionRenderParameters {
128
diffuse_albedo: &ray_reconstruction_textures.diffuse_albedo.default_view,
129
specular_albedo: &ray_reconstruction_textures.specular_albedo.default_view,
130
normals: &ray_reconstruction_textures.normal_roughness.default_view,
131
roughness: None,
132
color: &view_target.source,
133
depth: &prepass_depth_texture.texture.default_view,
134
motion_vectors: &prepass_motion_vectors_texture.texture.default_view,
135
specular_guide: DlssRayReconstructionSpecularGuide::SpecularMotionVectors(
136
&ray_reconstruction_textures
137
.specular_motion_vectors
138
.default_view,
139
),
140
screen_space_subsurface_scattering_guide: None, // TODO
141
bias: None, // TODO
142
dlss_output: &view_target.destination,
143
reset: dlss.reset,
144
jitter_offset: -temporal_jitter.offset,
145
partial_texture_size: Some(render_resolution),
146
motion_vector_scale: Some(-render_resolution.as_vec2()),
147
};
148
149
let diagnostics = render_context.diagnostic_recorder();
150
let command_encoder = render_context.command_encoder();
151
let mut dlss_context = dlss_context.context.lock().unwrap();
152
153
command_encoder.push_debug_group("dlss_ray_reconstruction");
154
let time_span = diagnostics.time_span(command_encoder, "dlss_ray_reconstruction");
155
156
dlss_context
157
.render(render_parameters, command_encoder, &adapter)
158
.expect("Failed to render DLSS Ray Reconstruction");
159
160
time_span.end(command_encoder);
161
command_encoder.pop_debug_group();
162
163
Ok(())
164
}
165
}
166
167