Toast Engine
Loading...
Searching...
No Matches
ray_tracing_scene.hpp
Go to the documentation of this file.
1
6
7#pragma once
8
9#include "vulkan_common.hpp"
10
11#include <cstdint>
12#include <glm/glm.hpp>
13#include <optional>
14#include <vector>
15
16namespace renderer {
17class VulkanCore;
18
19class RayTracingScene {
20public:
21 struct Instance {
22 glm::mat4 transform {1.0f};
23 vk::DeviceAddress blas_address = 0;
24 uint32_t custom_index = 0;
25 uint8_t mask = 0xFF;
26 bool deforming = false;
27 };
28
29 RayTracingScene(const VulkanCore& core, uint32_t frames_in_flight);
30
31 void beginFrame();
32
33 void addInstance(const Instance& instance);
34
35 void build(vk::CommandBuffer cmd, uint32_t frame_index, bool tracing);
36
37 [[nodiscard]]
38 auto getAccelerationStructure(uint32_t frame_index) const -> vk::AccelerationStructureKHR;
39
41 [[nodiscard]]
42 auto getAccelerationStructureGeneration(uint32_t frame_index) const -> uint64_t {
43 return frame_index < m_frames.size() ? m_frames[frame_index].tlas_generation : 0;
44 }
45
46 [[nodiscard]]
47 auto getInstanceCount() const noexcept -> uint32_t {
48 return static_cast<uint32_t>(m_instances.size());
49 }
50
51 static constexpr uint32_t k_max_instances = 8192;
52
53 static constexpr uint32_t k_max_refits_before_rebuild = 240;
54
55private:
56 struct FrameResources {
57 std::optional<vma::raii::Buffer> instance_buffer;
58 std::optional<vma::raii::Buffer> tlas_buffer;
59 std::optional<vma::raii::Buffer> scratch;
60 vk::raii::AccelerationStructureKHR tlas = nullptr;
61 uint64_t tlas_generation = 0;
62 uint32_t built_instances = 0;
63
64 std::vector<Instance> built;
65 uint32_t refits_since_build = 0;
66 };
67
68 const VulkanCore* m_core = nullptr;
69 std::vector<FrameResources> m_frames;
70 std::vector<Instance> m_instances;
71
73 PFN_vkCmdBuildAccelerationStructuresKHR m_build_acceleration_structures = nullptr;
74};
75
76}
auto getAccelerationStructureGeneration(uint32_t frame_index) const -> uint64_t
Bumped whenever the structure of frame_index is recreated since the new one can reuse the old handle ...
Definition ray_tracing_scene.hpp:42
Definition vulkan_core.hpp:48
Definition vulkan_common.hpp:13
Definition ray_tracing_scene.hpp:21