Mandrill 2025.6.0
Loading...
Searching...
No Matches
AccelerationStructure.h
1#pragma once
2
3#include "Common.h"
4
5#include "Buffer.h"
6#include "Device.h"
7
8namespace Mandrill
9{
10 struct AccelerationStructureBuildInfo {
11 VkAccelerationStructureBuildGeometryInfoKHR geometry;
12 VkAccelerationStructureBuildSizesInfoKHR size;
13 const VkAccelerationStructureBuildRangeInfoKHR* range;
14 };
15
16 struct BLAS {
17 VkAccelerationStructureKHR accelerationStructure;
18 VkAccelerationStructureGeometryKHR geometry;
19 VkAccelerationStructureBuildRangeInfoKHR buildRange;
20
21 AccelerationStructureBuildInfo buildInfo;
22 };
23
24 // Forward declare Descriptor and Scene
25 class Descriptor;
26 class Scene;
27
31 class AccelerationStructure : public std::enable_shared_from_this<AccelerationStructure>
32 {
33 public:
34 MANDRILL_NON_COPYABLE(AccelerationStructure)
35
36
42 MANDRILL_API AccelerationStructure(ptr<Device> pDevice, std::weak_ptr<Scene> wpScene,
43 VkBuildAccelerationStructureFlagsKHR flags);
44
48 MANDRILL_API ~AccelerationStructure();
49
54 MANDRILL_API void update(VkBuildAccelerationStructureFlagsKHR flags);
55
60 MANDRILL_API VkAccelerationStructureKHR getAccelerationStructure() const
61 {
62 return mTLAS;
63 }
64
70 MANDRILL_API VkWriteDescriptorSet getWriteDescriptor(uint32_t binding) const
71 {
72 static VkWriteDescriptorSetAccelerationStructureKHR as = {
73 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,
74 .accelerationStructureCount = 1,
75 .pAccelerationStructures = &mTLAS,
76 };
77
78 VkWriteDescriptorSet write = {
79 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
80 .pNext = &as,
81 .dstBinding = binding,
82 .dstArrayElement = 0,
83 .descriptorCount = 1,
84 .descriptorType = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR,
85 };
86
87 return write;
88 }
89
90 private:
96 MANDRILL_API void createBLASes(VkBuildAccelerationStructureFlagsKHR flags);
97
104 MANDRILL_API void createTLAS(VkBuildAccelerationStructureFlagsKHR flags, bool update = false);
105
106 ptr<Device> mpDevice;
107 std::weak_ptr<Scene> mwpScene; // Use weak pointer to scene so scene can destruct freely
108
109 VkAccelerationStructureKHR mTLAS;
110 VkAccelerationStructureGeometryKHR mGeometry;
111 VkAccelerationStructureBuildRangeInfoKHR mBuildRange;
112
113 AccelerationStructureBuildInfo mBuildInfo;
114
115 std::vector<BLAS> mBLASes;
116
117 ptr<Buffer> mpBLASBuffer;
118 ptr<Buffer> mpTLASBuffer;
119 ptr<Buffer> mpScratch;
120 ptr<Buffer> mpInstances;
121 };
122} // namespace Mandrill
Acceleration structure class for building and managing acceleration structures.
Definition AccelerationStructure.h:32
MANDRILL_API void update(VkBuildAccelerationStructureFlagsKHR flags)
Rebuild the top level of the acceleration structure to account for updates in instance transforms.
Definition AccelerationStructure.cpp:43
MANDRILL_API VkWriteDescriptorSet getWriteDescriptor(uint32_t binding) const
Get the write descriptor of the acceleration structure.
Definition AccelerationStructure.h:70
MANDRILL_API VkAccelerationStructureKHR getAccelerationStructure() const
Get the TLAS acceleration structure handle.
Definition AccelerationStructure.h:60
MANDRILL_API ~AccelerationStructure()
Destructor for acceleration structure.
Definition AccelerationStructure.cpp:32