Toast Engine
Loading...
Searching...
No Matches
shadow_pass.hpp
Go to the documentation of this file.
1
6
7#pragma once
8
9#include "../render_pass_base.hpp"
10#include "../shader_layout.hpp"
13#include "../vulkan_common.hpp"
14#include "../vulkan_pipeline.hpp"
15
16#include <array>
17#include <chrono>
18#include <glm/glm.hpp>
19#include <memory>
20#include <optional>
21#include <span>
22#include <vector>
23
24namespace renderer {
25class VulkanCore;
26class VoxelGpuStorage;
27
28[[nodiscard]]
29auto createShadowSampler(const VulkanCore& core, vk::Format format) -> vk::raii::Sampler;
30
31class ShadowPass : public IRenderPass {
32public:
33 explicit ShadowPass(const VulkanCore& core);
34
35 [[nodiscard]]
36 auto name() const -> std::string_view override {
37 return "ShadowPass";
38 }
39
40 void recordPre(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index) override;
41
43 void record(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index) override { }
44
45 [[nodiscard]]
46 auto getCascadeMapView(uint32_t frame_index) const -> vk::ImageView;
47
48 [[nodiscard]]
49 auto getPunctualMapView(uint32_t frame_index) const -> vk::ImageView;
50
51 [[nodiscard]]
52 auto getShadowSampler() const -> vk::Sampler {
53 return *m_sampler;
54 }
55
57 struct Stats {
58 uint32_t draws = 0;
59 uint32_t scopes = 0;
61 uint32_t cached = 0;
63 uint32_t composed = 0;
65 uint32_t static_views = 0;
67 uint32_t static_casters = 0;
69 uint32_t static_edits = 0;
70 uint32_t moving_volumes = 0;
72 uint32_t spared = 0;
73 };
74
75 [[nodiscard]]
76 auto getStats() const noexcept -> const Stats& {
77 return m_stats;
78 }
79
80private:
82 struct ShadowUBO {
83 std::array<glm::mat4, shadows::k_max_shadow_views> view_projection {};
84 std::array<glm::mat4, shadows::k_max_shadow_views> inverse_view_projection {};
85 };
86
88 struct ShadowPushConstants {
89 uint32_t instance_base = 0;
90 uint32_t view_index = 0;
91 };
92
94 struct VoxelShadowPush {
95 uint32_t instance_index = 0;
96 uint32_t view_index = 0;
97 float constant_bias = 0.0f;
98 uint32_t pad0 = 0;
99 };
100
101 struct VoxelPipelineSet {
102 uint32_t view_mask = 1;
103
105 std::array<std::array<VulkanPipeline, 2>, 2> pipelines;
106 };
107
108 static constexpr uint32_t k_max_voxel_casters = 4096;
110 std::chrono::steady_clock::time_point m_last_caster_limit_warning;
111
112 struct LayerGroup {
113 uint32_t base_layer = 0;
114 uint32_t layer_count = 1;
115
117 uint32_t view_mask = 1;
118
119 std::optional<vk::raii::ImageView> view;
120
121 bool dirty = true;
122
123 std::optional<uint64_t> signature;
124
126 std::optional<uint64_t> caster_signature;
127
129 std::optional<uint64_t> voxel_generation;
130
132 uint64_t revision = 0;
133 };
134
135 struct ShadowMap {
136 std::optional<vma::raii::Image> image;
137 std::optional<vk::raii::ImageView> array_view;
138 std::vector<LayerGroup> groups;
139 sync::ImageState state;
140 uint32_t resolution = 0;
141 uint32_t layer_count = 0;
142 };
143
144 struct PipelineSet {
145 uint32_t view_mask = 1;
146 VulkanPipeline pipeline;
147 };
148
149 struct FrameTarget {
150 ShadowMap cascades;
151 ShadowMap punctual;
152 FrameResources ubo;
153 };
154
156 struct StaticMaps {
157 ShadowMap cascades;
158 ShadowMap punctual;
159 };
160
161 void createResources(const VulkanCore& core);
162
163 void createShadowMap(
164 const VulkanCore& core, ShadowMap& map, uint32_t resolution, std::span<const uint32_t> group_layers,
165 vk::ImageUsageFlags usage, std::string_view debug_name
166 );
167
168 [[nodiscard]]
169 auto pipelineSetFor(uint32_t view_mask) const -> const PipelineSet*;
170
171 void createVoxelResources(const VulkanCore& core);
172
174 [[nodiscard]]
175 auto prepareVoxels(uint32_t frame_index) -> uint32_t;
176
177 [[nodiscard]]
178 auto voxelPipelineSetFor(uint32_t view_mask) const -> const VoxelPipelineSet*;
179
180 void recordMap(vk::CommandBuffer cmd, ShadowMap& map, ShadowMap& static_map, uint32_t frame_index, bool directional);
181
182 [[nodiscard]]
183 static auto selectShadowFormat(const VulkanCore& core) -> vk::Format;
184
185 const VulkanCore* m_core = nullptr;
186 vk::Format m_format = vk::Format::eUndefined;
187
188 ShaderLayout m_shader_layout;
189
191 std::array<PipelineSet, 2> m_pipeline_sets;
192
193 Stats m_stats;
194 std::vector<VoxelCaster> m_voxel_eligible;
195
196 vk::raii::Sampler m_sampler = nullptr;
197 std::vector<vk::raii::DescriptorSet> m_descriptor_sets;
198 std::vector<FrameTarget> m_targets;
199 StaticMaps m_static;
200
201 ShaderLayout m_voxel_layout;
202 std::array<VoxelPipelineSet, 2> m_voxel_pipeline_sets;
203 std::vector<vk::raii::DescriptorSet> m_voxel_shadow_sets;
204 std::vector<vk::raii::DescriptorSet> m_voxel_storage_sets;
205 std::vector<vma::raii::Buffer> m_voxel_instance_buffers;
206 std::vector<std::shared_ptr<const VoxelGpuStorage>> m_voxel_bound_storage;
207 bool m_voxels_ready = false;
208
210 float m_voxel_constant_bias = 0.0f;
211
212 uint32_t m_voxel_instance_count = 0;
213
214 std::vector<uint32_t> m_voxel_draw_order;
215
216 std::vector<vk::ImageCopy> m_static_copies;
217};
218
219}
Definition render_pass_base.hpp:19
void record(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index) override
Everything records in recordPre().
Definition shadow_pass.hpp:43
void recordPre(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index) override
Records outside any rendering scope before the main scope opens.
Definition shadow_pass.cpp:980
Immutable scene version and versions from small carves share buffers patched in place.
Definition voxel_gpu_storage.hpp:54
Definition vulkan_core.hpp:48
Mirrored by shadow_depth.slang and mesh.slang.
Per frame and per layer group unless noted.
Definition shadow_pass.hpp:57
uint32_t composed
Slot groups rebuilt from their static copy and the moving casters.
Definition shadow_pass.hpp:63
uint32_t static_views
Static renders whose views moved.
Definition shadow_pass.hpp:65
uint32_t spared
Cached static groups that a voxel edit elsewhere would have re-rendered.
Definition shadow_pass.hpp:72
uint32_t static_edits
Static renders for a voxel edit reaching them.
Definition shadow_pass.hpp:69
uint32_t static_casters
Static renders whose resting voxel casters changed.
Definition shadow_pass.hpp:67
uint32_t cached
Slot groups left as they were.
Definition shadow_pass.hpp:61