23 uint32_t occupied = 0;
26 uint32_t max_count = 0;
27 uint32_t overflowed = 0;
33 void update(uint32_t frame_index,
float dt)
override;
35 void dispatch(vk::CommandBuffer cmd, uint32_t frame_index)
override;
38 auto getClusterParamsBuffer(uint32_t frame_index)
const -> vk::Buffer;
41 auto getLightsBuffer(uint32_t frame_index)
const -> vk::Buffer;
44 auto getClusterLightGridBuffer(uint32_t frame_index)
const -> vk::Buffer;
47 auto getLightIndexListBuffer(uint32_t frame_index)
const -> vk::Buffer;
57 static auto summarizeGrid(std::span<const uint32_t> counts) ->
GridStats;
61 struct ClusterParamsGpu {
62 glm::mat4 inverse_projection;
63 glm::uvec4 cluster_dims;
64 glm::vec4 screen_size_near_far;
65 glm::vec4 slice_depth;
66 glm::uvec4 light_counts;
69 static_assert(
sizeof(ClusterParamsGpu) == 128,
"ClusterParamsGpu must match the ClusterParams layout in the shaders");
71 enum class HostAccess : uint8_t {
78 struct ClusterAabbGpu {
84 FrameResources cluster_params;
85 FrameResources lights;
86 FrameResources cluster_aabb;
87 FrameResources cluster_light_grid;
88 FrameResources light_index_list;
90 FrameResources cluster_light_grid_readback;
91 bool readback_valid =
false;
94 void createResources(
const renderer::VulkanCore& core);
97 static auto createBuffer(
const renderer::VulkanCore& core, vk::DeviceSize size, vk::BufferUsageFlags usage, HostAccess access)
100 VulkanPipeline m_build_clusters_pipeline;
101 VulkanPipeline m_cull_lights_pipeline;
103 ShaderLayout m_shader_layout;
104 std::vector<vk::raii::DescriptorSet> m_descriptor_sets;
106 std::vector<FrameBuffers> m_frame_buffers;
108 mutable std::atomic<uint32_t> m_readback_hold {0};
auto getClusterLightGridCounts(uint32_t frame_index) const -> std::span< const uint32_t >
Unclamped counts and empty until a copy for this frame slot has landed.
Definition cluster_lighting_pass.cpp:285