Foundation
Loading...
Searching...
No Matches
GPUScene.hpp
Go to the documentation of this file.
1#pragma once
2#include <Core/Allocator.hpp>
4#include <Core/JobSystem.hpp>
5#include <Core/Logging.hpp>
8#include <cstddef>
9#include "Curve.hpp"
10#include "Mesh.hpp"
11#include "Precompute.hpp"
12#include "Shaders/Flags.h"
13#include "Texture.hpp"
14
15using namespace Math;
16using namespace RenderCore;
17struct RendererUBO;
18struct GPUSceneImpl;
19
20// Must match the procedural hit-group bindings in Render/Pathtracer.cpp.
21inline constexpr uint32_t kRectLightSBTOffset = 3u;
22inline constexpr uint32_t kDiskLightSBTOffset = 4u;
23inline constexpr uint32_t kCurveSBTOffset = 5u;
24inline constexpr uint32_t kSphereLightSBTOffset = 6u;
25inline constexpr uint32_t kGSInstanceTypeMesh = 0u;
26inline constexpr uint32_t kGSInstanceTypeCurve = 1u;
27inline constexpr uint32_t kGSInstanceTypeMask = 0xFFu;
28// Light Flags
29inline constexpr uint32_t kGSLightTypeMask = 0xFFu;
30inline constexpr uint32_t kGSLightTypeEnvironment = 0u;
31inline constexpr uint32_t kGSLightTypeDirectional = 1u;
32inline constexpr uint32_t kGSLightTypePoint = 2u;
33inline constexpr uint32_t kGSLightTypeSpot = 3u;
34inline constexpr uint32_t kGSLightTypeDisk = 4u;
35inline constexpr uint32_t kGSLightTypeRect = 5u;
36inline constexpr uint32_t kLightSelectionClusterBit = 1u << 31u;
37inline constexpr uint32_t kLightSelectionIndexMask = ~kLightSelectionClusterBit;
38
40{
41 uint32_t offset{0u};
42 uint32_t count{0u};
43};
44static_assert(sizeof(GSOffsetCount) == 8);
45
47{
48 uint32_t index{~0u};
49 uint32_t version{0};
50 [[nodiscard]] bool IsValid() const { return index != ~0u; }
51};
52
54{
55 uint32_t index{~0u};
56 uint32_t version{0};
57 bool is3D{false};
58 [[nodiscard]] bool IsValid() const { return index != ~0u; }
59};
60
61BITMASK_ENUM_BEGIN(GSData, uint8_t)
62Mesh = 1 << 0
64
65#pragma pack(push, 1)
66struct GSMesh
67{
68 GSOffsetCount vertices; // absolute byte offset + count in Primitive buffer (@ref FVertex / FQVertex)
69 GSOffsetCount indices; // LOD0 UINT32 indices
70 GSOffsetCount groups; // DAG LOD Group @ref FLODGroup
71 GSOffsetCount meshlets; // DAG Meshlets @ref FMeshlet
72 uint32_t meshletVtxOffset;
73 uint32_t meshletTriOffset;
74 uint32_t meshletGlobalIndex;
75 GSOffsetCount emissiveMeshlets;
76 GSOffsetCount emissiveAliases;
77 GSOffsetCount emissivePrimitiveMap;
78};
80{
81 // TRS
82 float3 transform{0, 0, 0};
83 quat rotation{0, 0, 0, 1};
84 float3 scale{1, 1, 1};
85 uint32_t resourceOffset{UINT32_MAX}; // Mesh or curve set offset in Primitive buffer (bytes)
86 uint32_t materialIndex{0u}; // In Material buffer (offset)
87 uint32_t resourceIndex{UINT32_MAX}; // CPU side resource index, see @ref Geometry
89 uint32_t emissiveClusterOffset{UINT32_MAX};
90};
91// XXX: Uber. Super, even. Surely this works for all our needs...
131{
132 uint32_t flags; // type in low byte; see GSLightFlagsBits
133 float3 color; // Normalized RGB color
134 float power; // Radiant power (type-dependent unit)
137 // Directional: x=angularDiameter. Point: x=radius. Spot: x=radius, y=innerCos, z=outerCos.
138 // Disk: xy=radius. Environment: x=azimuthOffset, y=averageRadiance, 0 when solid color
140 float3 dpdu; // tangent u-axis (Rect: half-extent u)
141 float3 dpdv; // tangent v-axis (Rect: half-extent v)
142};
154{
155 GSOffsetCount vertices; // FCurveDOTSVertex
156 GSOffsetCount indices; // uint32_t, 12 indices per leaf
157 GSOffsetCount leaves; // FCurveLeaf
158};
159#pragma pack(pop)
160static_assert(sizeof(GSMesh) == 68);
161static_assert(sizeof(GSInstance) == 60);
162static_assert(sizeof(GSMaterial) == 192);
163static_assert(sizeof(GSLight) == 84);
164static_assert(sizeof(GSEmissiveCluster) == 44);
165static_assert(sizeof(GSCurveSet) == 24);
166static_assert(sizeof(FCurveDOTSVertex) == 8);
167static_assert(sizeof(FCurveLeaf) == 40);
168
170{
171 uint32_t primitiveBudget = 16 * (1u << 20); // 16MB
172 uint32_t instanceBudget = static_cast<uint32_t>(1e4); // # of GSInstance elements (ring)
173 uint32_t materialBudget = static_cast<uint32_t>(1e3); // # of materials (ring)
174 uint32_t lightBudget = static_cast<uint32_t>(1e4); // # of lights (ring)
175 uint32_t emissiveClusterBudget = static_cast<uint32_t>(1e5);
176 uint32_t texturesBudget = static_cast<uint32_t>(1e3); // # of textures
177 uint32_t geometryBudget = static_cast<uint32_t>(1e4); // # of geometry (ring)
178 uint32_t tlasInstanceBudget = static_cast<uint32_t>(1e4); // # of TLAS instances (ring)
179 uint32_t tlasBudget = 16 * (1u << 20); // 16MB
180 uint32_t tlasScratchBudget = 32 * (1u << 20); // 32MB (ring)
181 uint32_t dynamicGeometryBudget = 0; // device-local bytes (0 = disabled)
182 uint32_t dynamicStagingBudget = 0; // CPU staging buffer size for dynamic geometry (0 = disabled)
183 uint32_t dynamicStagingFramesInFlight = 1; // CPU staging frames in flight
184};
185
187{
188public:
190 {
191 UAV,
192 RTV
193 };
194 enum class Result
195 {
196 Ready,
202 Cancelled,
203 };
204
205 [[nodiscard]] static size_t CalculateMeshPrimitiveSize(FSerializedMesh const& src);
206 [[nodiscard]] static size_t CalculateCurvePrimitiveSize(FSerializedCurve const& src);
207
208 GPUScene(RHIDevice* device, JobSystem* jobs, Allocator* allocator, GPUSceneDesc const& desc,
209 AllocatorStack* frameScratch = nullptr);
211
212 Result Upload(FBlobDeserializer* blobs, FSerializedMesh const& source, GeometryHandle& outHandle);
213 Result Upload(FImportedMesh const& source, GeometryHandle& outHandle);
214
219 Result Allocate(uint32_t vertexCount, uint32_t indexCount, GeometryHandle& outHandle, bool isGpu = false);
220 Result Allocate(uint32_t vertexCount, uint32_t indexCount, uint32_t leafCount, GeometryHandle& outHandle,
221 bool isGpu = false);
222 Result Allocate(RHITextureDesc const& desc, TextureHandle& outHandle, bool isGpu = false, const char* debugName = nullptr);
223
224 Result Upload(FBlobDeserializer* blobs, FSerializedCurve const& source, GeometryHandle& outHandle);
225
226 Result Upload(FBlobDeserializer* blobs, FSerializedTexture const& source, TextureHandle& outTexture,
227 const char* debugName = nullptr, bool pinned = false);
228 Result Upload(FTexture const& source, TextureHandle& outTexture, const char* debugName = nullptr,
229 bool pinned = false);
230 Result UploadEnvironmentMap(FTexture const& source);
231 [[nodiscard]] bool HasEnvironmentMap() const { return mEnvMapIndex.IsValid(); }
232
233 Result Upload(RHIBuffer* dst, Span<const unsigned char> data, uint32_t dstOffset = 0);
234
235 [[nodiscard]] Result Query(GeometryHandle handle) const;
236 [[nodiscard]] Result Query(TextureHandle texture) const;
237
238 void Join();
239 [[nodiscard]] Result Poll(size_t timeout);
240
241
242 void UpdateUBO(RendererUBO& globals) const;
243
266
276
277 GPUSceneTables BeginScene(uint32_t instanceCount, uint32_t materialCount, uint32_t lightCount);
278 void ResolveGeometry(GeometryHandle handle, uint32_t& outPrimitiveOffset, uint32_t& outPrimitiveType,
279 GSInstanceFlags& outPrimitiveFlags) const;
280 UpdateResult EndScene(GPUSceneTables& tables);
281
283 {
285 size_t bytes;
286 };
287 void DbgGetMemoryStatistics(Vector<MemoryStat>& outStats) const;
288 [[nodiscard]] String DbgGetBufferStatistics() const;
289 [[nodiscard]] uint32_t GetLightCapacity() const;
290
292 {
293 Built,
294 Empty
295 };
296 [[nodiscard]] TLASBuildResult BuildTLAS(RHICommandList* cmd, bool update = false);
297 [[nodiscard]] bool HasDynamicGeometry() const;
298 [[nodiscard]] bool HasDynamicTextures() const;
299 [[nodiscard]] bool HasCurveGeometry() const;
300
301 void BeginDynamicUpdate();
306 Span<const uint32_t> indices = {});
311 void UpdateDynamicMeshGPU(GeometryHandle handle, bool updateVertices, bool updateIndices);
316 Span<const uint32_t> indices = {}, Span<const FCurveLeaf> leaves = {});
321 void UpdateDynamicCurveGPU(GeometryHandle handle, bool updateVertices, bool updateIndices, bool updateLeaves);
325 void UpdateDynamicTextureCPU(TextureHandle handle, FTexture const& source);
332 void EndDynamicUpdate();
333
341 void EndDynamicTextureGPU(RHICommandList* cmd, bool is3D, DynamicTextureGPUAccess access);
342 [[nodiscard]] RHITexture* ResolveDynamicTextureGPU(TextureHandle handle, RHITextureUsage requiredUsage) const;
344
345 void BuildBLAS(RHICommandList* cmd);
346 [[nodiscard]] uint32_t GetDynamicRefitCount() const;
347 [[nodiscard]] uint32_t GetDynamicRebuildCount() const;
348
353 void Collect();
354
355 [[nodiscard]] GSInstance GetInstance(uint32_t index) const
356 {
357 CHECK_MSG(index < mCommittedInstances.size(), "GetInstance index {} out of range ({})", index,
358 mCommittedInstances.size());
359 return mCommittedInstances[index];
360 }
361 [[nodiscard]] uint32_t GetInstanceCount() const { return static_cast<uint32_t>(mCommittedInstances.size()); }
362 [[nodiscard]] uint32_t InstanceFromTLAS(uint32_t tlasID) const
363 {
364 if (tlasID >= mTLASInstanceMap.size())
365 return UINT32_MAX;
366 return mTLASInstanceMap[tlasID];
367 }
368 [[nodiscard]] GSLight GetLight(uint32_t index) const
369 {
370 CHECK_MSG(index < mCommittedLights.size(), "GetLight index {} out of range ({})", index,
371 mCommittedLights.size());
372 return mCommittedLights[index];
373 }
374 [[nodiscard]] uint32_t GetLightCount() const { return static_cast<uint32_t>(mCommittedLights.size()); }
375 [[nodiscard]] GSMaterial GetMaterial(uint32_t index) const
376 {
377 CHECK_MSG(index < mCommittedMaterials.size(), "GetMaterial index {} out of range ({})", index,
378 mCommittedMaterials.size());
379 return mCommittedMaterials[index];
380 }
381 [[nodiscard]] uint32_t GetMaterialCount() const { return static_cast<uint32_t>(mCommittedMaterials.size()); }
382
383 /* Geometry */
384 [[nodiscard]] RHIBuffer* GetPrimitiveBuffer() const { return mPrimitiveBuffer.Get(); }
385 [[nodiscard]] RHIBuffer* GetDynamicPrimitiveBuffer() const;
386 [[nodiscard]] RHIBuffer* GetDynamicStagingBuffer() const;
387 [[nodiscard]] RHIBuffer* GetInstanceBuffer() const;
388 [[nodiscard]] RHIBuffer* GetMaterialBuffer() const;
389 [[nodiscard]] RHIBuffer* GetLightBuffer() const;
390 [[nodiscard]] RHIBuffer* GetEmissiveClusterBuffer() const;
391 [[nodiscard]] RHIBuffer* GetLightBVHNodeBuffer() const;
392 [[nodiscard]] RHIBuffer* GetLightBVHLightIndexBuffer() const;
393 [[nodiscard]] RHIBuffer* GetLightBVHBitmaskBuffer() const;
394 [[nodiscard]] RHIBuffer* GetLightBVHGlobalIndexBuffer() const;
395 [[nodiscard]] RHIBuffer* GetLightBVHNodeIndexBuffer() const;
396 [[nodiscard]] bool NeedsLightBVHRefit() const;
397 [[nodiscard]] uint32_t GetLightBVHRefitLevelCount() const;
398 [[nodiscard]] uint32_t GetLightBVHRefitLevelOffset(uint32_t level) const;
399 [[nodiscard]] uint32_t GetLightBVHRefitLevelNodeCount(uint32_t level) const;
400 [[nodiscard]] uint32_t GetLightBVHFirstNodeIndex() const;
401 [[nodiscard]] GSOffsetCount GetLightBVHNodes() const;
402 [[nodiscard]] GSOffsetCount GetLightBVHDistantNodes() const;
403 /* Textures */
404 [[nodiscard]] BindlessPool* GetTexture2DPool();
405 [[nodiscard]] BindlessPool* GetTexture3DPool();
406 [[nodiscard]] BindlessPool const* GetTexture2DPool() const;
407 [[nodiscard]] BindlessPool const* GetTexture3DPool() const;
408 [[nodiscard]] RHITexture* GetFoundationDefaultTexture2D() const;
409 [[nodiscard]] RHITexture* GetFoundationDefaultTexture2DFloat() const;
411 /* AS */
412 [[nodiscard]] RHIAccelerationStructure* GetTLAS() const
413 {
414 return mTLAS.IsValid() ? mTLAS.Get() : nullptr;
415 }
416 /* Samplers */
417 [[nodiscard]] RHIBuffer* GetSobolMatricesBuffer() const { return mSobolMatricesBuffer.Get(); }
418
419 void Reset();
420
421private:
422 friend struct GPUSceneImpl;
424
426 // Per-frame commits
430 // TLAS instanceID -> committed instance index
432 // Primitive buffer for geometries
436 // Shared default resources
439
440public:
441 // Texture Handles
444 // Precomputed LUTs (texture2D pool)
449 // Precomputed LUTs (texture3D pool)
453 // Environment map (texture2D pool)
460};
461
464ENUM_NAME(InProgress)
465ENUM_NAME(InvalidInput)
466ENUM_NAME(InvalidHandle)
467ENUM_NAME(OutOfMemory)
468ENUM_NAME(DecodeFailed)
#define CHECK_MSG(expr, format_str,...)
#define ENUM_NAME_CONV_BEGIN(T)
Defines convince to_string() method and format_as() [fmt] for the respective enum class Example usage...
Definition Enums.hpp:82
#define BITMASK_ENUM_BEGIN(T, INT_T)
Defines a bitmask enum type {T}Bits with underlying integer type INT_T whilst defining a wrapper clas...
Definition Enums.hpp:47
#define ENUM_NAME(E)
Definition Enums.hpp:93
constexpr uint32_t kGSLightTypeDisk
Definition GPUScene.hpp:34
constexpr uint32_t kCurveSBTOffset
Definition GPUScene.hpp:23
constexpr uint32_t kSphereLightSBTOffset
Definition GPUScene.hpp:24
constexpr uint32_t kGSInstanceTypeCurve
Definition GPUScene.hpp:26
constexpr uint32_t kLightSelectionClusterBit
Definition GPUScene.hpp:36
constexpr uint32_t kGSLightTypeEnvironment
Definition GPUScene.hpp:30
constexpr uint32_t kGSLightTypeMask
Definition GPUScene.hpp:29
constexpr uint32_t kGSInstanceTypeMask
Definition GPUScene.hpp:27
constexpr uint32_t kGSLightTypeDirectional
Definition GPUScene.hpp:31
constexpr uint32_t kGSLightTypeSpot
Definition GPUScene.hpp:33
constexpr uint32_t kGSLightTypeRect
Definition GPUScene.hpp:35
constexpr uint32_t kDiskLightSBTOffset
Definition GPUScene.hpp:22
Mesh
Definition GPUScene.hpp:62
constexpr uint32_t kGSInstanceTypeMesh
Definition GPUScene.hpp:25
constexpr uint32_t kRectLightSBTOffset
Definition GPUScene.hpp:21
constexpr uint32_t kGSLightTypePoint
Definition GPUScene.hpp:32
constexpr uint32_t kLightSelectionIndexMask
Definition GPUScene.hpp:37
Implements a lock-free stack-based bump allocator.
Definition AllocatorStack.hpp:13
Allocator interface (noexcept)
Definition Allocator.hpp:29
Definition JobSystem.hpp:135
Definition Resource.hpp:57
Definition Command.hpp:42
Definition Device.hpp:246
Scoped move-only RAII handle wrapper for RHI Objects.
Definition Details.hpp:85
Definition Resource.hpp:216
Definition GPUScene.hpp:187
RHIBuffer * GetMaterialBuffer() const
Definition GPUScene.cpp:3542
TextureHandle mLUTGGXEIORIndex
Definition GPUScene.hpp:450
TextureHandle mEnvMapConditionalCDFIndex
Definition GPUScene.hpp:456
Array< float3, 9 > mEnvSHCoeffs
Definition GPUScene.hpp:458
RHIBuffer * GetLightBVHNodeIndexBuffer() const
Definition GPUScene.cpp:3549
GSOffsetCount GetLightBVHNodes() const
Definition GPUScene.cpp:3566
TextureHandle mLUTGGXEIORavgIndex
Definition GPUScene.hpp:447
void UpdateDynamicCurveCPU(GeometryHandle handle, Span< const FCurveDOTSVertex > vertices={}, Span< const uint32_t > indices={}, Span< const FCurveLeaf > leaves={})
Host-mapped copy. Requires isGpu = false with Allocate.
Definition GPUScene.cpp:3497
BindlessPool * GetTexture3DPool()
Definition GPUScene.cpp:3569
void BuildBLAS(RHICommandList *cmd)
Definition GPUScene.cpp:3529
void DbgGetMemoryStatistics(Vector< MemoryStat > &outStats) const
Definition GPUScene.cpp:3471
Vector< GSMaterial > mCommittedMaterials
Definition GPUScene.hpp:429
RHIBuffer * GetPrimitiveBuffer() const
Definition GPUScene.hpp:384
void EndDynamicTextureGPU(RHICommandList *cmd, bool is3D, DynamicTextureGPUAccess access)
Definition GPUScene.cpp:3517
void UpdateDynamicTextureCPU(TextureHandle handle, FTexture const &source)
Host-mapped copy. Requires isGpu = false with Allocate.
Definition GPUScene.cpp:3502
void BeginDynamicUpdate()
Definition GPUScene.cpp:3483
uint32_t GetLightCount() const
Definition GPUScene.hpp:374
void UploadDynamicGeometryCPU(RHICommandList *cmd)
Commits host-side geometry and texture updates. GPU-side updates are not required to be committed,...
Definition GPUScene.cpp:3511
void BeginDynamicTextureGPU(RHICommandList *cmd, bool is3D, DynamicTextureGPUAccess access)
Definition GPUScene.cpp:3513
RHIDeviceScopedHandle< RHIBuffer > mSobolMatricesBuffer
Definition GPUScene.hpp:437
void EndDynamicUpdate()
Definition GPUScene.cpp:3510
RHIDeviceScopedHandle< RHIBuffer > mFoundationDefaultBufferFloat
Definition GPUScene.hpp:438
void UpdateUBO(RendererUBO &globals) const
Definition GPUScene.cpp:989
void Reset()
Definition GPUScene.cpp:3478
TextureHandle mLUTGGXEavgIndex
Definition GPUScene.hpp:446
TextureHandle mLUTSheenLTCIndex
Definition GPUScene.hpp:452
bool NeedsLightBVHRefit() const
Definition GPUScene.cpp:3550
uint32_t mEnvMapPrefilteredMips
Definition GPUScene.hpp:457
GSMaterial GetMaterial(uint32_t index) const
Definition GPUScene.hpp:375
RHIBuffer * GetSobolMatricesBuffer() const
Definition GPUScene.hpp:417
Result UploadEnvironmentMap(FTexture const &source)
Definition GPUScene.cpp:3455
void Collect()
Garbage-collects geometry and textures no longer referenced by the committed scene tables.
Definition GPUScene.cpp:3477
GSInstance GetInstance(uint32_t index) const
Definition GPUScene.hpp:355
RHIBuffer * GetLightBVHBitmaskBuffer() const
Definition GPUScene.cpp:3547
void CompleteDynamicTextureGPU(TextureHandle handle, DynamicTextureGPUAccess access)
Definition GPUScene.cpp:3525
Result Allocate(uint32_t vertexCount, uint32_t indexCount, GeometryHandle &outHandle, bool isGpu=false)
Allocates a dynamic geometry handle.
Definition GPUScene.cpp:3419
uint32_t GetDynamicRefitCount() const
Definition GPUScene.cpp:3530
RHITexture * ResolveDynamicTextureGPU(TextureHandle handle, RHITextureUsage requiredUsage) const
Definition GPUScene.cpp:3521
TextureHandle mEnvMapMarginalCDFIndex
Definition GPUScene.hpp:455
void UploadDynamicTexturesCPU(RHICommandList *cmd)
Definition GPUScene.cpp:3512
uint32_t GetLightBVHFirstNodeIndex() const
Definition GPUScene.cpp:3565
static size_t CalculateMeshPrimitiveSize(FSerializedMesh const &src)
Definition GPUScene.cpp:447
uint32_t InstanceFromTLAS(uint32_t tlasID) const
Definition GPUScene.hpp:362
BindlessPool * GetTexture2DPool()
Definition GPUScene.cpp:3568
GSLight GetLight(uint32_t index) const
Definition GPUScene.hpp:368
TextureHandle mLUTGGXEIORInvIndex
Definition GPUScene.hpp:451
Result
Definition GPUScene.hpp:195
Vector< GSLight > mCommittedLights
Definition GPUScene.hpp:428
UniquePtr< GPUSceneImpl > mImpl
Definition GPUScene.hpp:423
void Join()
Definition GPUScene.cpp:3453
Result Poll(size_t timeout)
Definition GPUScene.cpp:3454
RHIBuffer * GetLightBuffer() const
Definition GPUScene.cpp:3543
RHIBuffer * GetEmissiveClusterBuffer() const
Definition GPUScene.cpp:3544
TextureHandle mLUTGGXEIndex
Definition GPUScene.hpp:445
TextureHandle mEnvMapIndex
Definition GPUScene.hpp:454
Result Query(GeometryHandle handle) const
Definition GPUScene.cpp:3451
float mEnvMapAverageRadiance
Definition GPUScene.hpp:459
uint32_t mLastTLASInstancesCount
Definition GPUScene.hpp:435
RHITexture * GetFoundationDefaultTexture2D() const
Definition GPUScene.cpp:3336
void UpdateDynamicMeshCPU(GeometryHandle handle, Span< const FQVertex > vertices={}, Span< const uint32_t > indices={})
Host-mapped copy. Requires isGpu = false with Allocate.
Definition GPUScene.cpp:3492
bool HasDynamicGeometry() const
Definition GPUScene.cpp:3480
RHITexture * GetFoundationDefaultTexture2DFloat() const
Definition GPUScene.cpp:3341
uint32_t UpdateDynamicTextureGPU(TextureHandle handle, DynamicTextureGPUAccess access=DynamicTextureGPUAccess::UAV)
Device local writes. Requires isGpu = true with Allocate.
Definition GPUScene.cpp:3506
Vector< GSInstance > mCommittedInstances
Definition GPUScene.hpp:427
TextureHandle mFoundationDefaultTexture2DFloatIndex
Definition GPUScene.hpp:443
RHIBuffer * GetDynamicPrimitiveBuffer() const
Definition GPUScene.cpp:3533
uint32_t GetDynamicRebuildCount() const
Definition GPUScene.cpp:3531
DynamicTextureGPUAccess
Definition GPUScene.hpp:190
bool HasEnvironmentMap() const
Definition GPUScene.hpp:231
RHIBuffer * GetLightBVHNodeBuffer() const
Definition GPUScene.cpp:3545
TLASBuildResult
Definition GPUScene.hpp:292
bool HasCurveGeometry() const
Definition GPUScene.cpp:3482
RHIDeviceScopedHandle< RHIBuffer > mPrimitiveBuffer
Definition GPUScene.hpp:433
void UpdateDynamicCurveGPU(GeometryHandle handle, bool updateVertices, bool updateIndices, bool updateLeaves)
Device local writes. Requires isGpu = true with Allocate.
Definition GPUScene.cpp:3488
TextureHandle mLUTGGXEIORInvavgIndex
Definition GPUScene.hpp:448
GSOffsetCount GetLightBVHDistantNodes() const
Definition GPUScene.cpp:3567
uint32_t GetLightBVHRefitLevelOffset(uint32_t level) const
Definition GPUScene.cpp:3555
Vector< uint32_t > mTLASInstanceMap
Definition GPUScene.hpp:431
TextureHandle mFoundationDefaultTexture2DIndex
Definition GPUScene.hpp:442
RHIBuffer * GetInstanceBuffer() const
Definition GPUScene.cpp:3541
void ResolveGeometry(GeometryHandle handle, uint32_t &outPrimitiveOffset, uint32_t &outPrimitiveType, GSInstanceFlags &outPrimitiveFlags) const
Definition GPUScene.cpp:3461
GPUSceneTables BeginScene(uint32_t instanceCount, uint32_t materialCount, uint32_t lightCount)
Definition GPUScene.cpp:3457
UpdateResult EndScene(GPUSceneTables &tables)
Definition GPUScene.cpp:3470
TLASBuildResult BuildTLAS(RHICommandList *cmd, bool update=false)
Definition GPUScene.cpp:3473
RHIBuffer * GetLightBVHGlobalIndexBuffer() const
Definition GPUScene.cpp:3548
RHIBuffer * GetFoundationDefaultBufferFloat() const
Definition GPUScene.hpp:410
static size_t CalculateCurvePrimitiveSize(FSerializedCurve const &src)
Definition GPUScene.cpp:455
void UpdateDynamicMeshGPU(GeometryHandle handle, bool updateVertices, bool updateIndices)
Device local writes. Requires isGpu = true with Allocate.
Definition GPUScene.cpp:3484
RHIBuffer * GetLightBVHLightIndexBuffer() const
Definition GPUScene.cpp:3546
UpdateResult mLastUpdateResult
Definition GPUScene.hpp:425
uint32_t GetLightBVHRefitLevelCount() const
Definition GPUScene.cpp:3551
uint32_t GetInstanceCount() const
Definition GPUScene.hpp:361
RHIAccelerationStructure * GetTLAS() const
Definition GPUScene.hpp:412
uint32_t GetLightBVHRefitLevelNodeCount(uint32_t level) const
Definition GPUScene.cpp:3560
uint32_t GetLightCapacity() const
Definition GPUScene.cpp:3572
String DbgGetBufferStatistics() const
Definition GPUScene.cpp:3472
uint32_t GetMaterialCount() const
Definition GPUScene.hpp:381
bool HasDynamicTextures() const
Definition GPUScene.cpp:3481
RHIDeviceScopedHandle< RHIAccelerationStructure > mTLAS
Definition GPUScene.hpp:434
RHIBuffer * GetDynamicStagingBuffer() const
Definition GPUScene.cpp:3537
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:149
std::basic_string< char, std::char_traits< char >, StlDefaultAllocator< char > > String
Alias for std::basic_string<char>, without an explicit allocator constructor.
Definition Container.hpp:120
std::array< T, Size > Array
Alias for std::array
Definition Container.hpp:45
std::unique_ptr< T, Deleter > UniquePtr
std::unique_ptr with custom deleter that uses a Foundation::Core::Allocator to deallocate memory.
Definition Allocator.hpp:180
std::span< T > Span
Alias for std::span
Definition Container.hpp:62
vec3 float3
Definition Math.hpp:26
vec4 float4
Definition Math.hpp:25
Definition Serialization.hpp:119
Definition Curve.hpp:11
Definition Curve.hpp:16
Definition Mesh.hpp:129
Definition Curve.hpp:26
Definition Mesh.hpp:106
Definition Texture.hpp:46
Definition Texture.hpp:79
Definition Resource.hpp:142
Definition GPUScene.hpp:170
uint32_t dynamicStagingFramesInFlight
Definition GPUScene.hpp:183
uint32_t materialBudget
Definition GPUScene.hpp:173
uint32_t tlasScratchBudget
Definition GPUScene.hpp:180
uint32_t dynamicGeometryBudget
Definition GPUScene.hpp:181
uint32_t primitiveBudget
Definition GPUScene.hpp:171
uint32_t dynamicStagingBudget
Definition GPUScene.hpp:182
uint32_t tlasBudget
Definition GPUScene.hpp:179
uint32_t tlasInstanceBudget
Definition GPUScene.hpp:178
uint32_t geometryBudget
Definition GPUScene.hpp:177
uint32_t texturesBudget
Definition GPUScene.hpp:176
uint32_t lightBudget
Definition GPUScene.hpp:174
uint32_t emissiveClusterBudget
Definition GPUScene.hpp:175
uint32_t instanceBudget
Definition GPUScene.hpp:172
Definition GPUScene.cpp:114
Definition GPUScene.hpp:268
Span< GSInstance > instances
Definition GPUScene.hpp:269
GSOffsetCount materialRange
Definition GPUScene.hpp:273
GSOffsetCount instanceRange
Definition GPUScene.hpp:272
Span< GSLight > lights
Definition GPUScene.hpp:271
GSOffsetCount lightRange
Definition GPUScene.hpp:274
Span< GSMaterial > materials
Definition GPUScene.hpp:270
Definition GPUScene.hpp:283
size_t bytes
Definition GPUScene.hpp:285
String name
Definition GPUScene.hpp:284
Definition GPUScene.hpp:251
GSOffsetCount distantNodes
Definition GPUScene.hpp:255
GSOffsetCount lightIndices
Definition GPUScene.hpp:257
GSOffsetCount nodeIndices
Definition GPUScene.hpp:254
GSOffsetCount bitmasks
Definition GPUScene.hpp:256
GSOffsetCount nodes
Definition GPUScene.hpp:253
uint32_t valid
Definition GPUScene.hpp:252
GSOffsetCount globalLightIndices
Definition GPUScene.hpp:258
Definition GPUScene.hpp:245
GSOffsetCount instances
Definition GPUScene.hpp:246
uint64_t lightsHash
Definition GPUScene.hpp:263
GSOffsetCount lights
Definition GPUScene.hpp:248
uint64_t instancesHash
Definition GPUScene.hpp:261
GSOffsetCount materials
Definition GPUScene.hpp:247
GSOffsetCount emissiveClusters
Definition GPUScene.hpp:249
uint64_t materialsHash
Definition GPUScene.hpp:262
struct GPUScene::UpdateResult::LightBVH lightBVH
uint64_t emissiveClustersHash
Definition GPUScene.hpp:264
Definition GPUScene.hpp:154
GSOffsetCount indices
Definition GPUScene.hpp:156
GSOffsetCount leaves
Definition GPUScene.hpp:157
GSOffsetCount vertices
Definition GPUScene.hpp:155
Definition GPUScene.hpp:144
uint32_t triCount
Definition GPUScene.hpp:148
float3 origin
Definition GPUScene.hpp:150
float flux
Definition GPUScene.hpp:149
uint32_t aliasOffset
Definition GPUScene.hpp:147
uint32_t instanceIndex
Definition GPUScene.hpp:145
float3 extent
Definition GPUScene.hpp:151
uint32_t meshletIndex
Definition GPUScene.hpp:146
Definition GPUScene.hpp:80
float3 scale
Definition GPUScene.hpp:84
float3 transform
Definition GPUScene.hpp:82
uint32_t resourceOffset
Definition GPUScene.hpp:85
uint32_t emissiveClusterOffset
Definition GPUScene.hpp:89
uint32_t resourceIndex
Definition GPUScene.hpp:87
uint32_t materialIndex
Definition GPUScene.hpp:86
quat rotation
Definition GPUScene.hpp:83
uint32_t type
Definition GPUScene.hpp:88
Definition GPUScene.hpp:131
float3 dpdu
Definition GPUScene.hpp:140
float3 dpdv
Definition GPUScene.hpp:141
float power
Definition GPUScene.hpp:134
float3 position
Definition GPUScene.hpp:135
float4 params
Definition GPUScene.hpp:139
float3 color
Definition GPUScene.hpp:133
float3 direction
Definition GPUScene.hpp:136
uint32_t flags
Definition GPUScene.hpp:132
Definition GPUScene.hpp:93
uint32_t specularColorTexture
Definition GPUScene.hpp:101
uint32_t normalTexture
Definition GPUScene.hpp:97
uint32_t anisotropyTexture
Definition GPUScene.hpp:102
float specularFactor
Definition GPUScene.hpp:113
float sheenRoughnessFactor
Definition GPUScene.hpp:118
float hairBetaM
Definition GPUScene.hpp:126
float3 specularColorFactor
Definition GPUScene.hpp:114
float3 sheenColorFactor
Definition GPUScene.hpp:117
float4 baseColorFactor
Definition GPUScene.hpp:107
float3 subsurfaceRadius
Definition GPUScene.hpp:124
float anisotropyStrength
Definition GPUScene.hpp:115
float clearcoatFactor
Definition GPUScene.hpp:119
float3 emissiveFactor
Definition GPUScene.hpp:108
uint32_t clearcoatRoughnessTexture
Definition GPUScene.hpp:106
float clearcoatRoughnessFactor
Definition GPUScene.hpp:120
float3 subsurfaceColor
Definition GPUScene.hpp:123
uint32_t clearcoatTexture
Definition GPUScene.hpp:105
float anisotropyRotation
Definition GPUScene.hpp:116
uint32_t shaderBlockID
Definition GPUScene.hpp:125
uint32_t sheenColorTexture
Definition GPUScene.hpp:103
float transmissionFactor
Definition GPUScene.hpp:111
float metallicFactor
Definition GPUScene.hpp:109
uint32_t emissiveTexture
Definition GPUScene.hpp:95
uint32_t baseColorTexture
Definition GPUScene.hpp:94
float normalScale
Definition GPUScene.hpp:98
uint32_t transmissionTexture
Definition GPUScene.hpp:99
uint32_t sheenRoughnessTexture
Definition GPUScene.hpp:104
uint32_t metallicRoughnessTexture
Definition GPUScene.hpp:96
float ior
Definition GPUScene.hpp:112
float subsurfaceScale
Definition GPUScene.hpp:122
uint32_t specularTexture
Definition GPUScene.hpp:100
float hairBetaN
Definition GPUScene.hpp:127
float subsurfaceFactor
Definition GPUScene.hpp:121
float roughnessFactor
Definition GPUScene.hpp:110
float hairAlpha
Definition GPUScene.hpp:128
Definition GPUScene.hpp:40
uint32_t offset
Definition GPUScene.hpp:41
uint32_t count
Definition GPUScene.hpp:42
Definition GPUScene.hpp:47
bool IsValid() const
Definition GPUScene.hpp:50
uint32_t index
Definition GPUScene.hpp:48
uint32_t version
Definition GPUScene.hpp:49
Definition Renderer.hpp:11
Definition GPUScene.hpp:54
bool IsValid() const
Definition GPUScene.hpp:58
bool is3D
Definition GPUScene.hpp:57
uint32_t version
Definition GPUScene.hpp:56
uint32_t index
Definition GPUScene.hpp:55