2
3
4
5
12#include "Resources/Mesh/Attribute.h"
13#include "../../../assets/Shaders/src/Header/ShaderCommon.h"
18
19
24 std::array<uint64_t, SpicesShader::MESH_BUFFER_MAXNUM>
descs;
28
29
35
36
47
48
61
62
63
67
68
72
73
74
78
79
80
81
82
83
84
85
86
88 const std::vector<BlasInput>& input ,
93
94
95
96
97
98 void UpdateBlas(uint32_t blasIdx,
const BlasInput& blas, VkBuildAccelerationStructureFlagsKHR flags)
const;
103
104
105
106
107
108
109
111 const std::vector<VkAccelerationStructureInstanceKHR>& instances ,
117
118
119
120
121
122
123
124
127 const std::vector<T>& instances ,
134
135
136
137
138
139
140
141
142
143
145 VkCommandBuffer cmdBuf ,
146 uint32_t countInstance ,
147 VkDeviceAddress instBufferAddr ,
148 std::unique_ptr<VulkanBuffer>& scratchBuffer ,
149 VkBuildAccelerationStructureFlagsKHR flags ,
159
160
161
162 void SetHitGroups(std::shared_ptr<std::unordered_map<std::string, uint32_t>> groups) { m_HitGroups = groups; }
165
166
167
175
176
177
178
179
183
184
185
189
190
191
195
196
197
201
202
203
211
212
213
221
222
223
224
225
226
227
228
229
230
232 VkCommandBuffer cmdBuf ,
233 const std::vector<uint32_t>& indices ,
234 std::vector<BuildAccelerationStructure>& buildAs ,
235 VkDeviceAddress scratchAddress ,
240
241
242
243
244
245
246
247
249 VkCommandBuffer cmdBuf ,
250 const std::vector<uint32_t>& indices ,
251 std::vector<BuildAccelerationStructure>& buildAs ,
256
257
258
259
260
261 bool hasFlag(VkFlags item, VkFlags flag) {
return (item & flag) == flag; }
264
265
266
267
273
274
280
281
289
290
294
295
299
300
304
305
309
310
318
319
327 const std::vector<T>& instances ,
328 VkBuildAccelerationStructureFlagsKHR flags ,
336
337
338 assert(m_tlas.accel == VK_NULL_HANDLE || update);
339 const uint32_t countInstance =
static_cast<uint32_t>(instances.size());
342
343
346 "TLASInstancesBuffer" ,
347 sizeof(T) * instances.size() ,
348 VK_BUFFER_USAGE_TRANSFER_DST_BIT |
349 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
350 VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR ,
357 sizeof(T) * instances.size() ,
358 VK_BUFFER_USAGE_TRANSFER_SRC_BIT ,
359 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
360 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
363 stagingBuffer.WriteToBuffer(instances.data());
365 instancesBuffer.CopyBuffer(stagingBuffer.Get(), instancesBuffer.Get(),
sizeof(T) * instances.size());
367 const VkDeviceAddress instBufferAddr = instancesBuffer.GetAddress();
370
371
372 std::unique_ptr<VulkanBuffer> scratchBuffer =
nullptr;
376
377
378 VkMemoryBarrier barrier{};
379 barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
380 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
381 barrier.dstAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR;
383 vkCmdPipelineBarrier(
385 VK_PIPELINE_STAGE_TRANSFER_BIT ,
386 VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR ,
#define SPICES_PROFILE_ZONEN(...)
#define SPICES_PROFILE_ZONE
static FrameInfo & Get()
Get FrameInfo.
RendererType m_RendererType
The renderer type of current world.
FrameInfo Class. This class defines the FrameInfo data.
Material Class. This class contains a branch of parameter and shader, also descriptor.
MeshComponent Class. This class defines the specific behaves of MeshComponent.
virtual void CreateDescriptorSet() override
The interface is inherited from Renderer. Create specific descriptor set for sub pass.
static std::shared_ptr< VulkanRayTracing > m_VulkanRayTracing
In Used VulkanRayTracing.
void CreateTopLevelAS(FrameInfo &frameInfo, std::shared_ptr< std::vector< uint32_t > > view, std::shared_ptr< VulkanRayTracing > rayTracingInstance, bool update=false)
Create TopLevelAS.
static VkAccelerationStructureKHR GetAccelerationStructure()
Get RayTracing AccelerationStructure.
void SetHitGroupsCache(std::shared_ptr< std::unordered_map< std::string, uint32_t > > cache)
Set HitGroupsCache.
virtual void CreatePipeline(std::shared_ptr< Material > material, VkPipelineLayout &layout, std::shared_ptr< RendererSubPass > subPass) override
The interface is inherited from Renderer. Create Material Specific Pipeline.
virtual void Render(TimeStep &ts, FrameInfo &frameInfo) override
The interface is inherited from Renderer.
RayTracingRenderer(const std::string &rendererName, VulkanState &vulkanState, const std::shared_ptr< VulkanDescriptorPool > &descriptorPool, const std::shared_ptr< VulkanDevice > &device, const std::shared_ptr< RendererResourcePool > &rendererResourcePool)
Constructor Function. Init member variables.
virtual void OnMeshAddedWorld() override
virtual ~RayTracingRenderer() override
Destructor Function.
std::shared_ptr< std::unordered_map< std::string, uint32_t > > GetHitGroupsCache()
Get HitGroupsCache.
std::shared_ptr< std::unordered_map< std::string, uint32_t > > m_HitGroupsCache
Hit groups cached data.
void CreateRTShaderBindingTable(std::shared_ptr< VulkanRayTracing > rayTracingInstance)
Create Shader Binding Table.
virtual void CreateRendererPass() override
The interface is inherited from Renderer. Create specific render pass.
void CreateBottomLevelAS(FrameInfo &frameInfo, std::shared_ptr< std::vector< uint32_t > > view, std::shared_ptr< VulkanRayTracing > rayTracingInstance)
Create BottomLevelAS with all MeshComponents.
void UpdateTopLevelAS(FrameInfo &frameInfo, std::shared_ptr< VulkanRayTracing > rayTracingInstance, bool update=true)
Update TopLevelAS.
RayTracingRenderer Class. This class defines the ray tracing behaves.
RendererResourcePool Class. This class is a pool of all framebuffer's attachment.
This Class Combines some data relative to sub pass. Usually as a member variable of RendererPass.
virtual void EndRenderPass() override
End this Renderer's RenderPass.
void TraceRays() const
Call vkCmdTraceRaysKHR here.
virtual void BeginRenderPass() override
Begin this Renderer's RenderPass.
This class helps to bind pipeline and bind buffer. Specific for RayTracing Renderer....
RendererPassBuilder & EndSubPass()
End recording a sub pass.
void Build() const
Build the RendererPass.
RendererPassBuilder & AddSubPass(const std::string &subPassName, Querier::StatisticsFlags flags=Querier::ALL)
Add a new SubPass to Renderer Pass.
virtual void OnMeshAddedWorld()
Renderer(const std::string &rendererName, VulkanState &vulkanState, const std::shared_ptr< VulkanDescriptorPool > &DescriptorPool, const std::shared_ptr< VulkanDevice > &device, const std::shared_ptr< RendererResourcePool > &rendererResourcePool, bool isLoadDefaultMaterial=true)
Constructor Function. Init member variables.
void GetDirectionalLight(FrameInfo &frameInfo, std::array< SpicesShader::DirectionalLight, SpicesShader::DIRECTIONALLIGHT_BUFFER_MAXNUM > &dLightBuffer)
Get DirectionalLightComponent's render data in World.
void GetPointLight(FrameInfo &frameInfo, std::array< SpicesShader::PointLight, SpicesShader::POINTLIGHT_BUFFER_MAXNUM > &pLightBuffer)
Get PointLightComponent's render data in World.
Renderer Class. This class defines the basic behaves of renderer. When we add an new Renderer,...
SkyBoxComponent Class. This class defines the specific behaves of SkyBoxComponent.
This Class handles our engine time step during frames. Global Unique.
This Class is a Wrapper of VulkanBuffer.
VulkanCommandBuffer Class. This class defines the VulkanCommandBuffer behaves. This class is just a w...
VulkanDescriptorPool Class. This class is the wrapper of VkDescriptorPool.
VulkanInstance Class. This class defines the VulkanDevice behave. This class is just a wrapper of vkd...
VulkanState & m_VulkanState
The global VulkanState Referenced from VulkanRenderBackend.
VulkanObject Class. This class defines the basic behaves of VulkanObject. When we create an new Vulka...
This Class is a Wrapper of VulkanQueryPool.
VkStridedDeviceAddressRegionKHR m_MissRegion
Ray Missing Region.
void BuildBLAS(const std::vector< BlasInput > &input, VkBuildAccelerationStructureFlagsKHR flags=VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR)
Create all the BLAS from the vector of BlasInput. There will be one BLAS per input-vector entry....
VkStridedDeviceAddressRegionKHR & GetCallRegion()
Get SBT CallRegion.
void BuildTLAS(const std::vector< T > &instances, VkBuildAccelerationStructureFlagsKHR flags=VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR, bool update=false, bool motion=false)
Build TLAS from an array of VkAccelerationStructureInstanceKHR. The resulting TLAS will be stored in ...
std::unique_ptr< VulkanBuffer > m_RTSBTBuffer
Shader Binding Table Buffer.
VulkanRayTracing(VulkanState &vulkanState)
Constructor Function.
void CmdCreateTLAS(VkCommandBuffer cmdBuf, uint32_t countInstance, VkDeviceAddress instBufferAddr, std::unique_ptr< VulkanBuffer > &scratchBuffer, VkBuildAccelerationStructureFlagsKHR flags, bool update, bool motion)
Low level of Tlas creation. Creating the TLAS, called by buildTlas.
VkStridedDeviceAddressRegionKHR & GetMissRegion()
Get SBT MissRegion.
std::shared_ptr< std::unordered_map< std::string, uint32_t > > m_HitGroups
Scene ray hit shader groups.
VkStridedDeviceAddressRegionKHR m_HitRegion
Ray Hit Region.
void CmdCreateBLAS(VkCommandBuffer cmdBuf, const std::vector< uint32_t > &indices, std::vector< BuildAccelerationStructure > &buildAs, VkDeviceAddress scratchAddress, std::shared_ptr< VulkanQueryPool > queryPool) const
Creating the bottom level acceleration structure for all indices of buildAs vector....
bool hasFlag(VkFlags item, VkFlags flag)
Is item in flags.
const VkAccelerationStructureKHR GetAccelerationStructure() const
Get AccelerationStructure.
VkStridedDeviceAddressRegionKHR m_CallRegion
Ray Callable Region.
AccelKHR m_tlas
Top-level acceleration structure.
VkStridedDeviceAddressRegionKHR m_RgenRegion
Ray Generation Region.
VkStridedDeviceAddressRegionKHR & GetRgenRegion()
Get SBT RgenRegion.
Attribute< uint64_t > & GetMeshDesc()
Get Mesh Description.
void SetHitGroups(std::shared_ptr< std::unordered_map< std::string, uint32_t > > groups)
Set Scene hit groups.
void BuildTLAS(const std::vector< VkAccelerationStructureInstanceKHR > &instances, VkBuildAccelerationStructureFlagsKHR flags=VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR, bool update=false)
Creating the top-level acceleration structure from the vector of Instance. The resulting TLAS will be...
void CmdCompactBLAS(VkCommandBuffer cmdBuf, const std::vector< uint32_t > &indices, std::vector< BuildAccelerationStructure > &buildAs, std::shared_ptr< VulkanQueryPool > queryPool) const
Create and replace a new acceleration structure and buffer based on the size retrieved by the Query....
AccelKHR CreateAcceleration(VkAccelerationStructureCreateInfoKHR &accel) const
Create Acceleration.
virtual ~VulkanRayTracing() override=default
Destructor Function.
VkStridedDeviceAddressRegionKHR & GetHitRegion()
Get SBT HitRegion.
std::shared_ptr< std::unordered_map< std::string, uint32_t > > GetHitGroups()
Get Scene hit groups.
Attribute< uint64_t > m_MeshDesc
Scene Mesh Description Buffer.
void UpdateBlas(uint32_t blasIdx, const BlasInput &blas, VkBuildAccelerationStructureFlagsKHR flags) const
Update part of BLAS.
void CreateRTShaderBindingTable(uint32_t rgenCount, uint32_t missCount, VkPipeline pipeline)
Create Shader Binding Table.
Wrapper of Scene RayTracing (KHR/VK) Features and Data.
World Class. This class defines the basic behaves of World. When we create an new world,...
MeshResource's item template.
std::array< uint64_t, SpicesShader::MESH_BUFFER_MAXNUM > descs
std::array< SpicesShader::DirectionalLight, SpicesShader::DIRECTIONALLIGHT_BUFFER_MAXNUM > lights
std::array< SpicesShader::PointLight, SpicesShader::POINTLIGHT_BUFFER_MAXNUM > lights
const VkAccelerationStructureBuildRangeInfoKHR * rangeInfo
VkAccelerationStructureBuildGeometryInfoKHR buildInfo
VkAccelerationStructureBuildSizesInfoKHR sizeInfo
AccelerationStructure Build Info and result.
This struct contains all Vulkan object in used global.