36 auto name()
const -> std::string_view
override {
40 void recordPre(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index)
override;
43 void record(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index)
override { }
46 auto getCascadeMapView(uint32_t frame_index)
const -> vk::ImageView;
49 auto getPunctualMapView(uint32_t frame_index)
const -> vk::ImageView;
52 auto getShadowSampler() const -> vk::Sampler {
70 uint32_t moving_volumes = 0;
76 auto getStats() const noexcept -> const
Stats& {
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 {};
88 struct ShadowPushConstants {
89 uint32_t instance_base = 0;
90 uint32_t view_index = 0;
94 struct VoxelShadowPush {
95 uint32_t instance_index = 0;
96 uint32_t view_index = 0;
97 float constant_bias = 0.0f;
101 struct VoxelPipelineSet {
102 uint32_t view_mask = 1;
105 std::array<std::array<VulkanPipeline, 2>, 2> pipelines;
108 static constexpr uint32_t k_max_voxel_casters = 4096;
110 std::chrono::steady_clock::time_point m_last_caster_limit_warning;
113 uint32_t base_layer = 0;
114 uint32_t layer_count = 1;
117 uint32_t view_mask = 1;
119 std::optional<vk::raii::ImageView> view;
123 std::optional<uint64_t> signature;
126 std::optional<uint64_t> caster_signature;
129 std::optional<uint64_t> voxel_generation;
132 uint64_t revision = 0;
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;
145 uint32_t view_mask = 1;
146 VulkanPipeline pipeline;
161 void createResources(
const VulkanCore& core);
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
169 auto pipelineSetFor(uint32_t view_mask)
const ->
const PipelineSet*;
171 void createVoxelResources(
const VulkanCore& core);
175 auto prepareVoxels(uint32_t frame_index) -> uint32_t;
178 auto voxelPipelineSetFor(uint32_t view_mask)
const ->
const VoxelPipelineSet*;
180 void recordMap(vk::CommandBuffer cmd, ShadowMap& map, ShadowMap& static_map, uint32_t frame_index,
bool directional);
183 static auto selectShadowFormat(
const VulkanCore& core) -> vk::Format;
185 const VulkanCore* m_core =
nullptr;
186 vk::Format m_format = vk::Format::eUndefined;
188 ShaderLayout m_shader_layout;
191 std::array<PipelineSet, 2> m_pipeline_sets;
194 std::vector<VoxelCaster> m_voxel_eligible;
196 vk::raii::Sampler m_sampler =
nullptr;
197 std::vector<vk::raii::DescriptorSet> m_descriptor_sets;
198 std::vector<FrameTarget> m_targets;
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;
210 float m_voxel_constant_bias = 0.0f;
212 uint32_t m_voxel_instance_count = 0;
214 std::vector<uint32_t> m_voxel_draw_order;
216 std::vector<vk::ImageCopy> m_static_copies;