Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_solari/src/realtime/prepare.rs
6596 views
1
use super::SolariLighting;
2
#[cfg(all(feature = "dlss", not(feature = "force_disable_dlss")))]
3
use bevy_anti_alias::dlss::{
4
Dlss, DlssRayReconstructionFeature, ViewDlssRayReconstructionTextures,
5
};
6
use bevy_camera::MainPassResolutionOverride;
7
use bevy_core_pipeline::{core_3d::CORE_3D_DEPTH_FORMAT, deferred::DEFERRED_PREPASS_FORMAT};
8
#[cfg(all(feature = "dlss", not(feature = "force_disable_dlss")))]
9
use bevy_ecs::query::Has;
10
use bevy_ecs::{
11
component::Component,
12
entity::Entity,
13
query::With,
14
system::{Commands, Query, Res},
15
};
16
use bevy_image::ToExtents;
17
use bevy_math::UVec2;
18
#[cfg(all(feature = "dlss", not(feature = "force_disable_dlss")))]
19
use bevy_render::texture::CachedTexture;
20
use bevy_render::{
21
camera::ExtractedCamera,
22
render_resource::{
23
Buffer, BufferDescriptor, BufferUsages, Texture, TextureDescriptor, TextureDimension,
24
TextureFormat, TextureUsages, TextureView, TextureViewDescriptor,
25
},
26
renderer::RenderDevice,
27
};
28
29
/// Size of the `LightSample` shader struct in bytes.
30
const LIGHT_SAMPLE_STRUCT_SIZE: u64 = 8;
31
32
/// Size of the `ResolvedLightSamplePacked` shader struct in bytes.
33
const RESOLVED_LIGHT_SAMPLE_STRUCT_SIZE: u64 = 24;
34
35
/// Size of the GI `Reservoir` shader struct in bytes.
36
const GI_RESERVOIR_STRUCT_SIZE: u64 = 48;
37
38
pub const LIGHT_TILE_BLOCKS: u64 = 128;
39
pub const LIGHT_TILE_SAMPLES_PER_BLOCK: u64 = 1024;
40
41
/// Amount of entries in the world cache (must be a power of 2, and >= 2^10)
42
pub const WORLD_CACHE_SIZE: u64 = 2u64.pow(20);
43
44
/// Internal rendering resources used for Solari lighting.
45
#[derive(Component)]
46
pub struct SolariLightingResources {
47
pub light_tile_samples: Buffer,
48
pub light_tile_resolved_samples: Buffer,
49
pub di_reservoirs_a: (Texture, TextureView),
50
pub di_reservoirs_b: (Texture, TextureView),
51
pub gi_reservoirs_a: Buffer,
52
pub gi_reservoirs_b: Buffer,
53
pub previous_gbuffer: (Texture, TextureView),
54
pub previous_depth: (Texture, TextureView),
55
pub world_cache_checksums: Buffer,
56
pub world_cache_life: Buffer,
57
pub world_cache_radiance: Buffer,
58
pub world_cache_geometry_data: Buffer,
59
pub world_cache_active_cells_new_radiance: Buffer,
60
pub world_cache_a: Buffer,
61
pub world_cache_b: Buffer,
62
pub world_cache_active_cell_indices: Buffer,
63
pub world_cache_active_cells_count: Buffer,
64
pub world_cache_active_cells_dispatch: Buffer,
65
pub view_size: UVec2,
66
}
67
68
pub fn prepare_solari_lighting_resources(
69
#[cfg(any(not(feature = "dlss"), feature = "force_disable_dlss"))] query: Query<
70
(
71
Entity,
72
&ExtractedCamera,
73
Option<&SolariLightingResources>,
74
Option<&MainPassResolutionOverride>,
75
),
76
With<SolariLighting>,
77
>,
78
#[cfg(all(feature = "dlss", not(feature = "force_disable_dlss")))] query: Query<
79
(
80
Entity,
81
&ExtractedCamera,
82
Option<&SolariLightingResources>,
83
Option<&MainPassResolutionOverride>,
84
Has<Dlss<DlssRayReconstructionFeature>>,
85
),
86
With<SolariLighting>,
87
>,
88
render_device: Res<RenderDevice>,
89
mut commands: Commands,
90
) {
91
for query_item in &query {
92
#[cfg(any(not(feature = "dlss"), feature = "force_disable_dlss"))]
93
let (entity, camera, solari_lighting_resources, resolution_override) = query_item;
94
#[cfg(all(feature = "dlss", not(feature = "force_disable_dlss")))]
95
let (entity, camera, solari_lighting_resources, resolution_override, has_dlss_rr) =
96
query_item;
97
98
let Some(mut view_size) = camera.physical_viewport_size else {
99
continue;
100
};
101
if let Some(MainPassResolutionOverride(resolution_override)) = resolution_override {
102
view_size = *resolution_override;
103
}
104
105
if solari_lighting_resources.map(|r| r.view_size) == Some(view_size) {
106
continue;
107
}
108
109
let light_tile_samples = render_device.create_buffer(&BufferDescriptor {
110
label: Some("solari_lighting_light_tile_samples"),
111
size: LIGHT_TILE_BLOCKS * LIGHT_TILE_SAMPLES_PER_BLOCK * LIGHT_SAMPLE_STRUCT_SIZE,
112
usage: BufferUsages::STORAGE,
113
mapped_at_creation: false,
114
});
115
116
let light_tile_resolved_samples = render_device.create_buffer(&BufferDescriptor {
117
label: Some("solari_lighting_light_tile_resolved_samples"),
118
size: LIGHT_TILE_BLOCKS
119
* LIGHT_TILE_SAMPLES_PER_BLOCK
120
* RESOLVED_LIGHT_SAMPLE_STRUCT_SIZE,
121
usage: BufferUsages::STORAGE,
122
mapped_at_creation: false,
123
});
124
125
let di_reservoirs = |name| {
126
let tex = render_device.create_texture(&TextureDescriptor {
127
label: Some(name),
128
size: view_size.to_extents(),
129
mip_level_count: 1,
130
sample_count: 1,
131
dimension: TextureDimension::D2,
132
format: TextureFormat::Rgba32Uint,
133
usage: TextureUsages::STORAGE_BINDING,
134
view_formats: &[],
135
});
136
let view = tex.create_view(&TextureViewDescriptor::default());
137
(tex, view)
138
};
139
let di_reservoirs_a = di_reservoirs("solari_lighting_di_reservoirs_a");
140
let di_reservoirs_b = di_reservoirs("solari_lighting_di_reservoirs_b");
141
142
let gi_reservoirs = |name| {
143
render_device.create_buffer(&BufferDescriptor {
144
label: Some(name),
145
size: (view_size.x * view_size.y) as u64 * GI_RESERVOIR_STRUCT_SIZE,
146
usage: BufferUsages::STORAGE,
147
mapped_at_creation: false,
148
})
149
};
150
let gi_reservoirs_a = gi_reservoirs("solari_lighting_gi_reservoirs_a");
151
let gi_reservoirs_b = gi_reservoirs("solari_lighting_gi_reservoirs_b");
152
153
let previous_gbuffer = render_device.create_texture(&TextureDescriptor {
154
label: Some("solari_lighting_previous_gbuffer"),
155
size: view_size.to_extents(),
156
mip_level_count: 1,
157
sample_count: 1,
158
dimension: TextureDimension::D2,
159
format: DEFERRED_PREPASS_FORMAT,
160
usage: TextureUsages::TEXTURE_BINDING | TextureUsages::COPY_DST,
161
view_formats: &[],
162
});
163
let previous_gbuffer_view = previous_gbuffer.create_view(&TextureViewDescriptor::default());
164
165
let previous_depth = render_device.create_texture(&TextureDescriptor {
166
label: Some("solari_lighting_previous_depth"),
167
size: view_size.to_extents(),
168
mip_level_count: 1,
169
sample_count: 1,
170
dimension: TextureDimension::D2,
171
format: CORE_3D_DEPTH_FORMAT,
172
usage: TextureUsages::TEXTURE_BINDING | TextureUsages::COPY_DST,
173
view_formats: &[],
174
});
175
let previous_depth_view = previous_depth.create_view(&TextureViewDescriptor::default());
176
177
let world_cache_checksums = render_device.create_buffer(&BufferDescriptor {
178
label: Some("solari_lighting_world_cache_checksums"),
179
size: WORLD_CACHE_SIZE * size_of::<u32>() as u64,
180
usage: BufferUsages::STORAGE,
181
mapped_at_creation: false,
182
});
183
184
let world_cache_life = render_device.create_buffer(&BufferDescriptor {
185
label: Some("solari_lighting_world_cache_life"),
186
size: WORLD_CACHE_SIZE * size_of::<u32>() as u64,
187
usage: BufferUsages::STORAGE,
188
mapped_at_creation: false,
189
});
190
191
let world_cache_radiance = render_device.create_buffer(&BufferDescriptor {
192
label: Some("solari_lighting_world_cache_radiance"),
193
size: WORLD_CACHE_SIZE * size_of::<[f32; 4]>() as u64,
194
usage: BufferUsages::STORAGE,
195
mapped_at_creation: false,
196
});
197
198
let world_cache_geometry_data = render_device.create_buffer(&BufferDescriptor {
199
label: Some("solari_lighting_world_cache_geometry_data"),
200
size: WORLD_CACHE_SIZE * size_of::<[f32; 8]>() as u64,
201
usage: BufferUsages::STORAGE,
202
mapped_at_creation: false,
203
});
204
205
let world_cache_active_cells_new_radiance =
206
render_device.create_buffer(&BufferDescriptor {
207
label: Some("solari_lighting_world_cache_active_cells_new_irradiance"),
208
size: WORLD_CACHE_SIZE * size_of::<[f32; 4]>() as u64,
209
usage: BufferUsages::STORAGE,
210
mapped_at_creation: false,
211
});
212
213
let world_cache_a = render_device.create_buffer(&BufferDescriptor {
214
label: Some("solari_lighting_world_cache_a"),
215
size: WORLD_CACHE_SIZE * size_of::<u32>() as u64,
216
usage: BufferUsages::STORAGE,
217
mapped_at_creation: false,
218
});
219
let world_cache_b = render_device.create_buffer(&BufferDescriptor {
220
label: Some("solari_lighting_world_cache_b"),
221
size: 1024 * size_of::<u32>() as u64,
222
usage: BufferUsages::STORAGE,
223
mapped_at_creation: false,
224
});
225
226
let world_cache_active_cell_indices = render_device.create_buffer(&BufferDescriptor {
227
label: Some("solari_lighting_world_cache_active_cell_indices"),
228
size: WORLD_CACHE_SIZE * size_of::<u32>() as u64,
229
usage: BufferUsages::STORAGE,
230
mapped_at_creation: false,
231
});
232
233
let world_cache_active_cells_count = render_device.create_buffer(&BufferDescriptor {
234
label: Some("solari_lighting_world_cache_active_cells_count"),
235
size: size_of::<u32>() as u64,
236
usage: BufferUsages::STORAGE,
237
mapped_at_creation: false,
238
});
239
240
let world_cache_active_cells_dispatch = render_device.create_buffer(&BufferDescriptor {
241
label: Some("solari_lighting_world_cache_active_cells_dispatch"),
242
size: size_of::<[u32; 3]>() as u64,
243
usage: BufferUsages::INDIRECT | BufferUsages::STORAGE,
244
mapped_at_creation: false,
245
});
246
247
commands.entity(entity).insert(SolariLightingResources {
248
light_tile_samples,
249
light_tile_resolved_samples,
250
di_reservoirs_a,
251
di_reservoirs_b,
252
gi_reservoirs_a,
253
gi_reservoirs_b,
254
previous_gbuffer: (previous_gbuffer, previous_gbuffer_view),
255
previous_depth: (previous_depth, previous_depth_view),
256
world_cache_checksums,
257
world_cache_life,
258
world_cache_radiance,
259
world_cache_geometry_data,
260
world_cache_active_cells_new_radiance,
261
world_cache_a,
262
world_cache_b,
263
world_cache_active_cell_indices,
264
world_cache_active_cells_count,
265
world_cache_active_cells_dispatch,
266
view_size,
267
});
268
269
#[cfg(all(feature = "dlss", not(feature = "force_disable_dlss")))]
270
if has_dlss_rr {
271
let diffuse_albedo = render_device.create_texture(&TextureDescriptor {
272
label: Some("solari_lighting_diffuse_albedo"),
273
size: view_size.to_extents(),
274
mip_level_count: 1,
275
sample_count: 1,
276
dimension: TextureDimension::D2,
277
format: TextureFormat::Rgba8Unorm,
278
usage: TextureUsages::TEXTURE_BINDING | TextureUsages::STORAGE_BINDING,
279
view_formats: &[],
280
});
281
let diffuse_albedo_view = diffuse_albedo.create_view(&TextureViewDescriptor::default());
282
283
let specular_albedo = render_device.create_texture(&TextureDescriptor {
284
label: Some("solari_lighting_specular_albedo"),
285
size: view_size.to_extents(),
286
mip_level_count: 1,
287
sample_count: 1,
288
dimension: TextureDimension::D2,
289
format: TextureFormat::Rgba8Unorm,
290
usage: TextureUsages::TEXTURE_BINDING | TextureUsages::STORAGE_BINDING,
291
view_formats: &[],
292
});
293
let specular_albedo_view =
294
specular_albedo.create_view(&TextureViewDescriptor::default());
295
296
let normal_roughness = render_device.create_texture(&TextureDescriptor {
297
label: Some("solari_lighting_normal_roughness"),
298
size: view_size.to_extents(),
299
mip_level_count: 1,
300
sample_count: 1,
301
dimension: TextureDimension::D2,
302
format: TextureFormat::Rgba16Float,
303
usage: TextureUsages::TEXTURE_BINDING | TextureUsages::STORAGE_BINDING,
304
view_formats: &[],
305
});
306
let normal_roughness_view =
307
normal_roughness.create_view(&TextureViewDescriptor::default());
308
309
let specular_motion_vectors = render_device.create_texture(&TextureDescriptor {
310
label: Some("solari_lighting_specular_motion_vectors"),
311
size: view_size.to_extents(),
312
mip_level_count: 1,
313
sample_count: 1,
314
dimension: TextureDimension::D2,
315
format: TextureFormat::Rg16Float,
316
usage: TextureUsages::TEXTURE_BINDING | TextureUsages::STORAGE_BINDING,
317
view_formats: &[],
318
});
319
let specular_motion_vectors_view =
320
specular_motion_vectors.create_view(&TextureViewDescriptor::default());
321
322
commands
323
.entity(entity)
324
.insert(ViewDlssRayReconstructionTextures {
325
diffuse_albedo: CachedTexture {
326
texture: diffuse_albedo,
327
default_view: diffuse_albedo_view,
328
},
329
specular_albedo: CachedTexture {
330
texture: specular_albedo,
331
default_view: specular_albedo_view,
332
},
333
normal_roughness: CachedTexture {
334
texture: normal_roughness,
335
default_view: normal_roughness_view,
336
},
337
specular_motion_vectors: CachedTexture {
338
texture: specular_motion_vectors,
339
default_view: specular_motion_vectors_view,
340
},
341
});
342
}
343
}
344
}
345
346