forked from NVIDIAGameWorks/RTXGI-DDGI
-
Notifications
You must be signed in to change notification settings - Fork 0
/
DDGIVolume_VK.h
521 lines (432 loc) · 35.6 KB
/
DDGIVolume_VK.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
/*
* Copyright (c) 2019-2023, NVIDIA CORPORATION. All rights reserved.
*
* NVIDIA CORPORATION and its licensors retain all intellectual property
* and proprietary rights in and to this software, related documentation
* and any modifications thereto. Any use, reproduction, disclosure or
* distribution of this software and related documentation without an express
* license agreement from NVIDIA CORPORATION is strictly prohibited.
*/
#pragma once
#include "../DDGIVolume.h"
#include <vulkan/vulkan.h>
namespace rtxgi
{
namespace vulkan
{
enum class EResourceViewType
{
UAV = 0,
SRV,
COUNT
};
enum class EDDGIVolumeBindings
{
Constants = 0,
RayData,
ProbeIrradiance,
ProbeDistance,
ProbeData,
ProbeVariability,
ProbeVariabilityAverage
};
//------------------------------------------------------------------------
// Managed Resource Mode (SDK manages volume resources)
//------------------------------------------------------------------------
struct ProbeRelocationBytecode
{
ShaderBytecode updateCS; // Probe relocation compute shader bytecode
ShaderBytecode resetCS; // Probe relocation reset compute shader bytecode
};
struct ProbeClassificationBytecode
{
ShaderBytecode updateCS; // Probe classification compute shader bytecode
ShaderBytecode resetCS; // Probe classification reset compute shader bytecode
};
struct ProbeVariabilityByteCode
{
ShaderBytecode reductionCS; // Probe variability reduction compute shader bytecode
ShaderBytecode extraReductionCS; // Probe variability reduction extra passes compute shader bytecode
};
struct DDGIVolumeManagedResourcesDesc
{
bool enabled = false; // Enable or disable managed resources mode
VkDevice device = nullptr; // Vulkan device handle
VkPhysicalDevice physicalDevice = nullptr; // Vulkan physical device handle
VkDescriptorPool descriptorPool = nullptr; // Vulkan descriptor pool
// Shader bytecode
ShaderBytecode probeBlendingIrradianceCS; // Probe blending (irradiance) compute shader bytecode
ShaderBytecode probeBlendingDistanceCS; // Probe blending (distance) compute shader bytecode
ProbeRelocationBytecode probeRelocation; // Probe Relocation bytecode
ProbeClassificationBytecode probeClassification; // Probe Classification bytecode
ProbeVariabilityByteCode probeVariability; // Probe Classification bytecode
};
//------------------------------------------------------------------------
// Unmanaged Resource Mode (Application manages volume resources)
//------------------------------------------------------------------------
struct ProbeRelocationPipeline
{
VkShaderModule updateModule = nullptr; // Probe relocation shader module
VkShaderModule resetModule = nullptr; // Probe relocation reset shader module
VkPipeline updatePipeline = nullptr; // Probe relocation compute pipeline
VkPipeline resetPipeline = nullptr; // Probe relocation reset compute pipeline
};
struct ProbeClassificationPipeline
{
VkShaderModule updateModule = nullptr; // Probe classification shader module
VkShaderModule resetModule = nullptr; // Probe classification reset shader module
VkPipeline updatePipeline = nullptr; // Probe classification compute pipeline
VkPipeline resetPipeline = nullptr; // Probe classification reset compute pipeline
};
struct ProbeVariabilityPipeline
{
VkShaderModule reductionModule = nullptr; // Probe variability reduction shader module
VkShaderModule extraReductionModule = nullptr; // Probe variability reduction extra passes shader module
VkPipeline reductionPipeline = nullptr; // Probe variability reduction compute pipeline
VkPipeline extraReductionPipeline = nullptr; // Probe variability extra reduction compute pipeline
};
struct DDGIVolumeUnmanagedResourcesDesc
{
bool enabled = false; // Enable or disable unmanaged resources mode
VkPipelineLayout pipelineLayout = nullptr; // Pipeline layout
VkDescriptorSet descriptorSet = nullptr; // Descriptor set
// Texture Resources
VkImage probeRayData = nullptr; // Probe ray data texture array - RGB: radiance | A: hit distance
VkImage probeIrradiance = nullptr; // Probe irradiance texture array - RGB: irradiance, encoded with a high gamma curve
VkImage probeDistance = nullptr; // Probe distance texture array - R: mean distance | G: mean distance^2
VkImage probeData = nullptr; // Probe data texture array - XYZ: world-space relocation offsets | W: classification state
VkImage probeVariability = nullptr; // Probe variability texture array
VkImage probeVariabilityAverage = nullptr; // Average of Probe variability for whole volume
VkBuffer probeVariabilityReadback = nullptr; // CPU-readable resource containing final Probe variability average
// Texture Memory
VkDeviceMemory probeRayDataMemory = nullptr; // Probe ray data texture array device memory
VkDeviceMemory probeIrradianceMemory = nullptr; // Probe irradiance texture array device memory
VkDeviceMemory probeDistanceMemory = nullptr; // Probe distance texture array device memory
VkDeviceMemory probeDataMemory = nullptr; // Probe data texture array device memory
VkDeviceMemory probeVariabilityMemory = nullptr; // Probe variability texture array device memory
VkDeviceMemory probeVariabilityAverageMemory = nullptr; // Probe variability average texture device memory
VkDeviceMemory probeVariabilityReadbackMemory = nullptr; // Probe variability readback texture device memory
// Texture Views
VkImageView probeRayDataView = nullptr; // Probe ray data texture array view
VkImageView probeIrradianceView = nullptr; // Probe irradiance texture array view
VkImageView probeDistanceView = nullptr; // Probe distance texture array view
VkImageView probeDataView = nullptr; // Probe data texture array view
VkImageView probeVariabilityView = nullptr; // Probe variability texture array view
VkImageView probeVariabilityAverageView = nullptr; // Probe variability average texture view
// Shader Modules
VkShaderModule probeBlendingIrradianceModule = nullptr; // Probe blending (irradiance) shader module
VkShaderModule probeBlendingDistanceModule = nullptr; // Probe blending (distance) shader module
// Pipelines
VkPipeline probeBlendingIrradiancePipeline = nullptr; // Probe blending (irradiance) compute pipeline
VkPipeline probeBlendingDistancePipeline = nullptr; // Probe blending (distance) compute pipeline
ProbeRelocationPipeline probeRelocation; // Probe Relocation pipelines
ProbeClassificationPipeline probeClassification; // Probe Classification pipelines
ProbeVariabilityPipeline probeVariabilityPipelines; // Probe Variability pipelines
};
//------------------------------------------------------------------------
struct DDGIVolumeBindlessResourcesDesc
{
bool enabled; // Specifies if bindless resources are used
uint32_t pushConstantsOffset = 0; // Offset to the DDGIConsts data in the push constants block
DDGIVolumeResourceIndices resourceIndices; // Indices of volume resources in bindless resource arrays
VkBuffer resourceIndicesBuffer = nullptr; // Resource indices structured buffer pointer (device)
// Provide these resources if you use UploadDDGIVolumeResourceIndices() to transfer volume resource indices to the GPU
VkBuffer resourceIndicesBufferUpload = nullptr; // [Optional] Constants structured buffer (upload)
VkDeviceMemory resourceIndicesBufferUploadMemory = nullptr; // [Optional] Constants structured buffer memory (upload)
uint64_t resourceIndicesBufferSizeInBytes = 0; // [Optional] Size (in bytes) of the constants structured buffer
};
/**
* Specifies the resources used by the DDGIVolume.
*/
struct DDGIVolumeResources
{
DDGIVolumeBindlessResourcesDesc bindless; // [Optional] Specifies properties of bindless resources
DDGIVolumeManagedResourcesDesc managed; // [Managed Resource Mode] Provides Vulkan device handles and compiled shader bytecode.
DDGIVolumeUnmanagedResourcesDesc unmanaged; // [Unmanaged Resource Mode] Provides a pipeline layout, descriptor set, and pointers to texture resources and pipelines.
VkBuffer constantsBuffer = nullptr; // Constants structured buffer (device)
// Provide these resources if you use UploadDDGIVolumeConstants() to transfer constants to the GPU
VkBuffer constantsBufferUpload = nullptr; // [Optional] Constants structured buffer (upload)
VkDeviceMemory constantsBufferUploadMemory = nullptr; // [Optional] Constants structured buffer memory (upload)
uint64_t constantsBufferSizeInBytes = 0; // [Optional] Size (in bytes) of the constants structured buffer
};
//------------------------------------------------------------------------
// Public RTXGI Vulkan namespace functions
//------------------------------------------------------------------------
/**
* Get the VkFormat type of the given texture resource.
*/
RTXGI_API VkFormat GetDDGIVolumeTextureFormat(EDDGIVolumeTextureType type, EDDGIVolumeTextureFormat format);
/**
* Get the number of descriptor bindings used by the descriptor set.
*/
RTXGI_API uint32_t GetDDGIVolumeLayoutBindingCount();
/**
* Get the DDGIVolume's descriptor set and pipeline layouts descriptors.
*/
RTXGI_API void GetDDGIVolumeLayoutDescs(
VkDescriptorSetLayoutCreateInfo& descriptorSetLayoutCreateInfo,
VkPushConstantRange& pushConstantRange,
VkPipelineLayoutCreateInfo& pipelineLayoutCreateInfo,
VkDescriptorSetLayoutBinding* bindings);
//------------------------------------------------------------------------
// DDGIVolume
//------------------------------------------------------------------------
/**
* DDGIVolume
* A volume within which irradiance queries at arbitrary points are supported using a grid
* of probes. A single DDGIVolume may cover the entire scene or some sub-volume of the scene.
*
* The probe grid of the volume is centered around the provided origin. Grid probes are numbered
* in ascending order from left to right, back to front (in a left handed coordinate system).
*
* If there are parts of a scene with very different geometric density or dimensions, use
* multiple DDGIVolumes with varying probe densities.
*/
class RTXGI_API DDGIVolume : public DDGIVolumeBase
{
public:
/**
* Performs other initialization of the DDGIVolume
* Validates resource pointers or allocates resources if resource management is enabled
*/
#if RTXGI_DDGI_RESOURCE_MANAGEMENT
ERTXGIStatus Create(VkCommandBuffer cmdBuffer, const DDGIVolumeDesc& desc, const DDGIVolumeResources& resources);
#else
ERTXGIStatus Create(const DDGIVolumeDesc& desc, const DDGIVolumeResources& resources);
#endif
/**
* Clears the volume's probe texture arrays
*/
ERTXGIStatus ClearProbes(VkCommandBuffer cmdBuffer);
/**
* Releases resources owned by the volume
*/
void Destroy();
//------------------------------------------------------------------------
// Resource Getters
//------------------------------------------------------------------------
// Stats
uint32_t GetGPUMemoryUsedInBytes() const;
// Pipeline Layout
VkPipelineLayout GetPipelineLayout() const { return m_pipelineLayout; }
bool GetBindlessEnabled() const { return m_bindlessResources.enabled; }
// Descriptors
const VkDescriptorSet* GetDescriptorSetConstPtr() const { return &m_descriptorSet; }
VkDescriptorSet* GetDescriptorSetPtr() { return &m_descriptorSet; }
VkDescriptorSetLayout GetDescriptorSetLayout() const { return m_descriptorSetLayout; }
// Push Constants
uint32_t GetPushConstantsOffset() const { return m_pushConstantsOffset; }
DDGIRootConstants GetPushConstants() const { return { m_desc.index, 0, 0, 0, 0, 0 }; }
// Resource Indices (Bindless)
DDGIVolumeResourceIndices GetResourceIndices() const { return m_bindlessResources.resourceIndices; }
VkBuffer GetResourceIndicesBuffer() const { return m_bindlessResources.resourceIndicesBuffer; }
VkBuffer GetResourceIndicesBufferUpload() const { return m_bindlessResources.resourceIndicesBufferUpload; }
VkDeviceMemory GetResourceIndicesBufferUploadMemory() const { return m_bindlessResources.resourceIndicesBufferUploadMemory; }
uint64_t GetResourceIndicesBufferSizeInBytes() const { return m_bindlessResources.resourceIndicesBufferSizeInBytes; }
// Constants
VkBuffer GetConstantsBuffer() const { return m_constantsBuffer; }
VkBuffer GetConstantsBufferUpload() const { return m_constantsBufferUpload; }
VkDeviceMemory GetConstantsBufferUploadMemory() const { return m_constantsBufferUploadMemory; }
uint64_t GetConstantsBufferSizeInBytes() const { return m_constantsBufferSizeInBytes; }
// Texture Arrays Format
EDDGIVolumeTextureFormat GetRayDataFormat() const { return m_desc.probeRayDataFormat; }
EDDGIVolumeTextureFormat GetIrradianceFormat() const { return m_desc.probeIrradianceFormat; }
EDDGIVolumeTextureFormat GetDistanceFormat() const { return m_desc.probeDistanceFormat; }
EDDGIVolumeTextureFormat GetProbeDataFormat() const { return m_desc.probeDataFormat; }
EDDGIVolumeTextureFormat GetProbeVariabilityFormat() const { return m_desc.probeVariabilityFormat; }
// Texture Arrays
VkImage GetProbeRayData() const { return m_probeRayData; }
VkImage GetProbeIrradiance() const { return m_probeIrradiance; }
VkImage GetProbeDistance() const { return m_probeDistance; }
VkImage GetProbeData() const { return m_probeData; }
VkImage GetProbeVariability() const { return m_probeVariability; }
VkImage GetProbeVariabilityAverage() const { return m_probeVariabilityAverage; }
VkBuffer GetProbeVariabilityReadback() const { return m_probeVariabilityReadback; }
// Texture Array Memory
VkDeviceMemory GetProbeRayDataMemory() const { return m_probeRayDataMemory; }
VkDeviceMemory GetProbeIrradianceMemory() const { return m_probeIrradianceMemory; }
VkDeviceMemory GetProbeDistanceMemory() const { return m_probeDistanceMemory; }
VkDeviceMemory GetProbeDataMemory() const { return m_probeDataMemory; }
VkDeviceMemory GetProbeVariabilityMemory() const { return m_probeVariabilityMemory; }
VkDeviceMemory GetProbeVariabilityAverageMemory() const { return m_probeVariabilityAverageMemory; }
VkDeviceMemory GetProbeVariabilityReadbackMemory() const { return m_probeVariabilityReadbackMemory; }
// Texture Array Views
VkImageView GetProbeRayDataView() const { return m_probeRayDataView; }
VkImageView GetProbeIrradianceView() const { return m_probeIrradianceView; }
VkImageView GetProbeDistanceView() const { return m_probeDistanceView; }
VkImageView GetProbeDataView() const { return m_probeDataView; }
VkImageView GetProbeVariabilityView() const { return m_probeVariabilityView; }
VkImageView GetProbeVariabilityAverageView() const { return m_probeVariabilityAverageView; }
// Shader Modules
VkShaderModule GetProbeBlendingIrradianceModule() const { return m_probeBlendingIrradianceModule; }
VkShaderModule GetProbeBlendingDistanceModule() const { return m_probeBlendingDistanceModule; }
VkShaderModule GetProbeRelocationModule() const { return m_probeRelocationModule; }
VkShaderModule GetProbeRelocationResetModule() const { return m_probeRelocationResetModule; }
VkShaderModule GetProbeClassificationModule() const { return m_probeClassificationModule; }
VkShaderModule GetProbeClassificationResetModule() const { return m_probeClassificationResetModule; }
VkShaderModule GetProbeVariabilityReductionModule() const { return m_probeVariabilityReductionModule; }
VkShaderModule GetProbeVariabilityExtraReductionModule() const { return m_probeVariabilityExtraReductionModule; }
// Pipelines
VkPipeline GetProbeBlendingIrradiancePipeline() const { return m_probeBlendingIrradiancePipeline; }
VkPipeline GetProbeBlendingDistancePipeline() const { return m_probeBlendingDistancePipeline; }
VkPipeline GetProbeRelocationPipeline() const { return m_probeRelocationPipeline; }
VkPipeline GetProbeRelocationResetPipeline() const { return m_probeRelocationResetPipeline; }
VkPipeline GetProbeClassificationPipeline() const { return m_probeClassificationPipeline; }
VkPipeline GetProbeClassificationResetPipeline() const { return m_probeClassificationResetPipeline; }
VkPipeline GetProbeVariabilityReductionPipeline() const { return m_probeVariabilityReductionPipeline; }
VkPipeline GetProbeVariabilityExtraReductionPipeline() const { return m_probeVariabilityExtraReductionPipeline; }
//------------------------------------------------------------------------
// Resource Setters
//------------------------------------------------------------------------
// Push Constants
void SetPushConstantsOffset(uint32_t offset) { m_pushConstantsOffset = offset; }
// Resource Indices (Bindless)
void SetResourceIndices(DDGIVolumeResourceIndices resourceIndices) { m_bindlessResources.resourceIndices = resourceIndices; }
void SetResourceIndicesBuffer(VkBuffer ptr) { m_bindlessResources.resourceIndicesBuffer = ptr; }
void SetResourceIndicesBufferUpload(VkBuffer ptr) { m_bindlessResources.resourceIndicesBufferUpload = ptr; }
void SetResourceIndicesBufferUploadMemory(VkDeviceMemory ptr) { m_bindlessResources.resourceIndicesBufferUploadMemory = ptr; }
void SetResourceIndicesBufferSizeInBytes(uint64_t size) { m_bindlessResources.resourceIndicesBufferSizeInBytes = size; }
// Constants
void SetConstantsBuffer(VkBuffer ptr) { m_constantsBuffer = ptr; }
void SetConstantsBufferUpload(VkBuffer ptr) { m_constantsBufferUpload = ptr; }
void SetConstantsBufferUploadMemory(VkDeviceMemory ptr) { m_constantsBufferUploadMemory = ptr; }
void SetConstantsBufferSizeInBytes(uint64_t value) { m_constantsBufferSizeInBytes = value; }
// Texture Array Format
void SetRayDataFormat(EDDGIVolumeTextureFormat format) { m_desc.probeRayDataFormat = format; }
void SetIrradianceFormat(EDDGIVolumeTextureFormat format) { m_desc.probeIrradianceFormat = format; }
void SetDistanceFormat(EDDGIVolumeTextureFormat format) { m_desc.probeDistanceFormat = format; }
void SetProbeDataFormat(EDDGIVolumeTextureFormat format) { m_desc.probeDataFormat = format; }
void SetProbeVariabilityFromat(EDDGIVolumeTextureFormat format) { m_desc.probeVariabilityFormat = format; }
#if !RTXGI_DDGI_RESOURCE_MANAGEMENT
void SetProbeRayData(VkImage ptr, VkDeviceMemory memoryPtr, VkImageView viewPtr) { m_probeRayData = ptr; m_probeRayDataMemory = memoryPtr; m_probeRayDataView = viewPtr; }
void SetProbeIrradiance(VkImage ptr, VkDeviceMemory memoryPtr, VkImageView viewPtr) { m_probeIrradiance = ptr; m_probeIrradianceMemory = memoryPtr; m_probeIrradianceView = viewPtr; }
void SetProbeDistance(VkImage ptr, VkDeviceMemory memoryPtr, VkImageView viewPtr) { m_probeDistance = ptr; m_probeDistanceMemory = memoryPtr; m_probeDistanceView = viewPtr; }
void SetProbeData(VkImage ptr, VkDeviceMemory memoryPtr, VkImageView viewPtr) { m_probeData = ptr; m_probeDataMemory = memoryPtr; m_probeDataView = viewPtr; }
void SetProbeVariability(VkImage ptr, VkDeviceMemory memoryPtr, VkImageView viewPtr) { m_probeVariability = ptr; m_probeVariabilityMemory = memoryPtr; m_probeVariabilityView = viewPtr; }
void SetProbeVariabilityAverage(VkImage ptr, VkDeviceMemory memoryPtr, VkImageView viewPtr) { m_probeVariabilityAverage = ptr; m_probeVariabilityAverageMemory = memoryPtr; m_probeVariabilityAverageView = viewPtr; }
void SetProbeVariabilityReadback(VkBuffer ptr, VkDeviceMemory memoryPtr) { m_probeVariabilityReadback = ptr; m_probeVariabilityReadbackMemory = memoryPtr; }
#endif
private:
#if RTXGI_DDGI_RESOURCE_MANAGEMENT
VkDevice m_device = nullptr; // Vulkan device handle
VkPhysicalDevice m_physicalDevice = nullptr; // Vulkan physical device handle
VkDescriptorPool m_descriptorPool = nullptr; // Vulkan descriptor pool handle
#endif
// Volume Constants (if you use UploadDDGIVolumeConstants() to transfer constants to the GPU)
VkBuffer m_constantsBuffer = nullptr; // Structured buffer that stores the volume's constants (device)
VkBuffer m_constantsBufferUpload = nullptr; // Structured buffer that stores the volume's constants (upload)
VkDeviceMemory m_constantsBufferUploadMemory = nullptr; // Memory for the volume's constants upload structured buffer
uint64_t m_constantsBufferSizeInBytes = 0; // Size (in bytes) of the structured buffer that stores constants for *all* volumes
// Texture Arrays
VkImage m_probeRayData = nullptr; // Probe ray data texture array - RGB: radiance | A: hit distance
VkImage m_probeIrradiance = nullptr; // Probe irradiance texture array - RGB: irradiance, encoded with a high gamma curve
VkImage m_probeDistance = nullptr; // Probe distance texture array - R: mean distance | G: mean distance^2
VkImage m_probeData = nullptr; // Probe data texture array - XYZ: world-space relocation offsets | W: classification state
VkImage m_probeVariability = nullptr; // Probe variability texture
VkImage m_probeVariabilityAverage = nullptr; // Probe variability average texture
VkBuffer m_probeVariabilityReadback = nullptr; // Probe variability readback texture
// Texture Array Memory
VkDeviceMemory m_probeRayDataMemory = nullptr; // Probe ray data memory
VkDeviceMemory m_probeIrradianceMemory = nullptr; // Probe irradiance memory
VkDeviceMemory m_probeDistanceMemory = nullptr; // Probe distance memory
VkDeviceMemory m_probeDataMemory = nullptr; // Probe data memory
VkDeviceMemory m_probeVariabilityMemory = nullptr; // Probe variability memory
VkDeviceMemory m_probeVariabilityAverageMemory = nullptr; // Probe variability average memory
VkDeviceMemory m_probeVariabilityReadbackMemory = nullptr; // Probe variability readback memory
// Texture Array Views
VkImageView m_probeRayDataView = nullptr; // Probe ray data view
VkImageView m_probeIrradianceView = nullptr; // Probe irradiance view
VkImageView m_probeDistanceView = nullptr; // Probe distance view
VkImageView m_probeDataView = nullptr; // Probe data view
VkImageView m_probeVariabilityView = nullptr; // Probe variability view
VkImageView m_probeVariabilityAverageView = nullptr; // Probe variability average view
// Pipeline Layout
VkPipelineLayout m_pipelineLayout = nullptr; // Pipeline layout, used for all update compute shaders
// Descriptors
VkDescriptorSet m_descriptorSet = nullptr; // Descriptor set
VkDescriptorSetLayout m_descriptorSetLayout = nullptr; // Descriptor set layout
// Push Constants
uint32_t m_pushConstantsOffset = 0; // Offset in the push constants block to DDGIRootConstants
// Bindless
DDGIVolumeBindlessResourcesDesc m_bindlessResources = {}; // Properties associated with bindless resources
// Shader Modules
VkShaderModule m_probeBlendingIrradianceModule = nullptr; // Probe blending (irradiance) shader module
VkShaderModule m_probeBlendingDistanceModule = nullptr; // Probe blending (distance) shader module
VkShaderModule m_probeRelocationModule = nullptr; // Probe relocation shader module
VkShaderModule m_probeRelocationResetModule = nullptr; // Probe relocation reset shader module
VkShaderModule m_probeClassificationModule = nullptr; // Probe classification shader module
VkShaderModule m_probeClassificationResetModule = nullptr; // Probe classification reset shader module
VkShaderModule m_probeVariabilityReductionModule = nullptr; // Probe variability reduction shader module
VkShaderModule m_probeVariabilityExtraReductionModule = nullptr; // Probe variability reduction extra passes shader module
// Pipelines
VkPipeline m_probeBlendingIrradiancePipeline = nullptr; // Probe blending (irradiance) compute shader pipeline
VkPipeline m_probeBlendingDistancePipeline = nullptr; // Probe blending (distance) compute shader pipeline
VkPipeline m_probeRelocationPipeline = nullptr; // Probe relocation compute shader pipeline
VkPipeline m_probeRelocationResetPipeline = nullptr; // Probe relocation reset compute shader pipeline
VkPipeline m_probeClassificationPipeline = nullptr; // Probe classification compute shader pipeline
VkPipeline m_probeClassificationResetPipeline = nullptr; // Probe classification reset compute shader pipeline
VkPipeline m_probeVariabilityReductionPipeline = nullptr; // Probe variability reduction compute shader pipeline
VkPipeline m_probeVariabilityExtraReductionPipeline = nullptr; // Probe variability reduction extra passes compute shader pipeline
#if RTXGI_DDGI_RESOURCE_MANAGEMENT
ERTXGIStatus CreateManagedResources(const DDGIVolumeDesc& desc, const DDGIVolumeManagedResourcesDesc& managed);
void ReleaseManagedResources();
void Transition(VkCommandBuffer cmdBuffer);
bool AllocateMemory(VkMemoryRequirements reqs, VkMemoryPropertyFlags props, VkMemoryAllocateFlags flags, VkDeviceMemory* memory);
bool CreateDescriptorSet();
bool CreateLayouts();
bool CreateComputePipeline(ShaderBytecode shader, const char* entryPoint, VkShaderModule* module, VkPipeline* pipeline, const char* debugName);
bool CreateTexture(uint32_t width, uint32_t height, uint32_t arraySize, VkFormat format, VkImageUsageFlags usage, VkImage* image, VkDeviceMemory* imageMemory, VkImageView* imageView);
bool CreateProbeRayData(const DDGIVolumeDesc& desc);
bool CreateProbeIrradiance(const DDGIVolumeDesc& desc);
bool CreateProbeDistance(const DDGIVolumeDesc& desc);
bool CreateProbeData(const DDGIVolumeDesc& desc);
bool CreateProbeVariability(const DDGIVolumeDesc& desc);
bool CreateProbeVariabilityAverage(const DDGIVolumeDesc& desc);
bool IsDeviceChanged(const DDGIVolumeManagedResourcesDesc& desc)
{
// Has the Vulkan device changed?
if (desc.device != m_device) return true;
return false;
}
#else
void StoreUnmanagedResourcesDesc(const DDGIVolumeUnmanagedResourcesDesc& unmanaged);
#endif
}; // class DDGIVolume
//------------------------------------------------------------------------
// Public RTXGI Vulkan namespace DDGIVolume Functions
//------------------------------------------------------------------------
/**
* Uploads resource indices for one or more volumes to the GPU.
* This function is for convenience and isn't necessary if you upload volume resource indices yourself.
*/
RTXGI_API ERTXGIStatus UploadDDGIVolumeResourceIndices(VkDevice device, VkCommandBuffer cmdBuffer, uint32_t bufferingIndex, uint32_t numVolumes, DDGIVolume** volumes);
/**
* Uploads constants for one or more volumes to the GPU.
* This function is for convenience and isn't necessary if you upload volume constants yourself.
*/
RTXGI_API ERTXGIStatus UploadDDGIVolumeConstants(VkDevice device, VkCommandBuffer cmdBuffer, uint32_t bufferingIndex, uint32_t numVolumes, DDGIVolume** volumes);
/**
* Updates one or more volume's probes using data in the volume's radiance texture.
* Probe blending and border update workloads are batched together for better performance.
*/
RTXGI_API ERTXGIStatus UpdateDDGIVolumeProbes(VkCommandBuffer cmdBuffer, uint32_t numVolumes, DDGIVolume** volumes);
/**
* Adjusts one or more volume's world-space probe positions to avoid them being too close to or inside of geometry.
* If a volume has the reset flag set, all probe relocation offsets are set to zero before relocation occurs.
*/
RTXGI_API ERTXGIStatus RelocateDDGIVolumeProbes(VkCommandBuffer cmdBuffer, uint32_t numVolumes, DDGIVolume** volumes);
/**
* Classifies one or more volume's probes as active or inactive based on the hit distance data in the ray data texture.
* If a volume has the reset flag set, all probes are set to active before classification occurs.
*/
RTXGI_API ERTXGIStatus ClassifyDDGIVolumeProbes(VkCommandBuffer cmdBuffer, uint32_t numVolumes, DDGIVolume** volumes);
/**
* Calculates average variability for all probes in each provided volume
*/
RTXGI_API ERTXGIStatus CalculateDDGIVolumeVariability(VkCommandBuffer cmdBuffer, uint32_t numVolumes, DDGIVolume** volumes);
/**
* Reads back average variability for each provided volume, at the time of the call
*/
RTXGI_API ERTXGIStatus ReadbackDDGIVolumeVariability(VkDevice device, uint32_t numVolumes, DDGIVolume** volumes);
} // namespace vulkan
} // namespace rtxgi