From f2ef21cce012132b20937c17fd5b623711859f44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Delgado=20Kr=C3=A4mer?= Date: Sat, 27 Jul 2024 22:51:00 +0200 Subject: [PATCH] gi/cgpu: use uniform buffers for light data --- src/cgpu/impl/Cgpu.cpp | 19 ++++++++++++++----- src/ggpu/gtl/ggpu/SyncBuffer.h | 2 +- src/gi/shaders/rp_main.ahit | 1 + src/gi/shaders/rp_main.chit | 1 + src/gi/shaders/rp_main.miss | 1 + src/gi/shaders/rp_main.rgen | 1 + src/gi/shaders/rp_main_descriptors.glsl | 10 ++++++---- src/gi/shaders/rp_main_shadow.miss | 1 + 8 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/cgpu/impl/Cgpu.cpp b/src/cgpu/impl/Cgpu.cpp index 3d3b0f9d..c2cc9dd8 100644 --- a/src/cgpu/impl/Cgpu.cpp +++ b/src/cgpu/impl/Cgpu.cpp @@ -1587,7 +1587,8 @@ namespace gtl CGPU_RETURN_ERROR("failed to create descriptor set layout"); } - uint32_t bufferCount = 0; + uint32_t uniformBufferCount = 0; + uint32_t storageBufferCount = 0; uint32_t storageImageCount = 0; uint32_t sampledImageCount = 0; uint32_t samplerCount = 0; @@ -1599,7 +1600,8 @@ namespace gtl switch (binding->descriptorType) { - case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: bufferCount += binding->count; break; + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: storageBufferCount += binding->count; break; + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: uniformBufferCount += binding->count; break; case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: storageImageCount += binding->count; break; case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: sampledImageCount += binding->count; break; case VK_DESCRIPTOR_TYPE_SAMPLER: samplerCount += binding->count; break; @@ -1618,10 +1620,16 @@ namespace gtl uint32_t poolSizeCount = 0; VkDescriptorPoolSize poolSizes[16]; - if (bufferCount > 0) + if (uniformBufferCount > 0) + { + poolSizes[poolSizeCount].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + poolSizes[poolSizeCount].descriptorCount = uniformBufferCount; + poolSizeCount++; + } + if (storageBufferCount > 0) { poolSizes[poolSizeCount].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - poolSizes[poolSizeCount].descriptorCount = bufferCount; + poolSizes[poolSizeCount].descriptorCount = storageBufferCount; poolSizeCount++; } if (storageImageCount > 0) @@ -2667,7 +2675,8 @@ namespace gtl { bool slotHandled = false; - if (layoutBinding->descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) + if (layoutBinding->descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER || + layoutBinding->descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) { for (uint32_t k = 0; k < bindings->bufferCount; ++k) { diff --git a/src/ggpu/gtl/ggpu/SyncBuffer.h b/src/ggpu/gtl/ggpu/SyncBuffer.h index 43a41dca..7ea511ac 100644 --- a/src/ggpu/gtl/ggpu/SyncBuffer.h +++ b/src/ggpu/gtl/ggpu/SyncBuffer.h @@ -45,7 +45,7 @@ namespace gtl GgpuDelayedResourceDestroyer& delayedResourceDestroyer, uint64_t elementSize, UpdateStrategy updateStrategy = UpdateStrategy::OptimalStaging, - CgpuBufferUsageFlags bufferUsage = CGPU_BUFFER_USAGE_FLAG_STORAGE_BUFFER); + CgpuBufferUsageFlags bufferUsage = CGPU_BUFFER_USAGE_FLAG_UNIFORM_BUFFER); ~GgpuSyncBuffer(); diff --git a/src/gi/shaders/rp_main.ahit b/src/gi/shaders/rp_main.ahit index 68e10031..96e7dea9 100644 --- a/src/gi/shaders/rp_main.ahit +++ b/src/gi/shaders/rp_main.ahit @@ -8,6 +8,7 @@ #extension GL_EXT_nonuniform_qualifier: require #extension GL_EXT_shader_explicit_arithmetic_types_int64: require #extension GL_EXT_buffer_reference: require +#extension GL_EXT_scalar_block_layout: require #include "colormap.glsl" diff --git a/src/gi/shaders/rp_main.chit b/src/gi/shaders/rp_main.chit index 8155a72e..289379a5 100644 --- a/src/gi/shaders/rp_main.chit +++ b/src/gi/shaders/rp_main.chit @@ -8,6 +8,7 @@ #extension GL_EXT_nonuniform_qualifier: require #extension GL_EXT_shader_explicit_arithmetic_types_int64: require #extension GL_EXT_buffer_reference: require +#extension GL_EXT_scalar_block_layout: require #include "mdl_types.glsl" #include "rp_main_descriptors.glsl" diff --git a/src/gi/shaders/rp_main.miss b/src/gi/shaders/rp_main.miss index 6ae157de..9d3a07f6 100644 --- a/src/gi/shaders/rp_main.miss +++ b/src/gi/shaders/rp_main.miss @@ -6,6 +6,7 @@ #extension GL_EXT_nonuniform_qualifier: require #extension GL_EXT_shader_explicit_arithmetic_types_int64: require #extension GL_EXT_buffer_reference: require +#extension GL_EXT_scalar_block_layout: require #include "rp_main_payload.glsl" #include "rp_main_descriptors.glsl" diff --git a/src/gi/shaders/rp_main.rgen b/src/gi/shaders/rp_main.rgen index 925e1ace..fac86064 100644 --- a/src/gi/shaders/rp_main.rgen +++ b/src/gi/shaders/rp_main.rgen @@ -9,6 +9,7 @@ #ifdef REORDER_INVOCATIONS #extension GL_NV_shader_invocation_reorder: require #endif +#extension GL_EXT_scalar_block_layout: require #include "rp_main_payload.glsl" #include "rp_main_descriptors.glsl" diff --git a/src/gi/shaders/rp_main_descriptors.glsl b/src/gi/shaders/rp_main_descriptors.glsl index f9a34f88..4d6e01fd 100644 --- a/src/gi/shaders/rp_main_descriptors.glsl +++ b/src/gi/shaders/rp_main_descriptors.glsl @@ -1,22 +1,24 @@ #include "interface/rp_main.h" #include "common.glsl" +#define MAX_LIGHT_COUNT 50000 + layout(binding = BINDING_INDEX_OUT_PIXELS, std430) buffer Framebuffer { vec4 pixels[]; }; #if SPHERE_LIGHT_COUNT > 0 -layout(binding = BINDING_INDEX_SPHERE_LIGHTS, std430) readonly buffer SphereLightBuffer { SphereLight sphereLights[]; }; +layout(binding = BINDING_INDEX_SPHERE_LIGHTS, std430) uniform SphereLightBuffer { SphereLight sphereLights[MAX_LIGHT_COUNT]; }; #endif #if DISTANT_LIGHT_COUNT > 0 -layout(binding = BINDING_INDEX_DISTANT_LIGHTS, std430) readonly buffer DistantLightBuffer { DistantLight distantLights[]; }; +layout(binding = BINDING_INDEX_DISTANT_LIGHTS, std430) uniform DistantLightBuffer { DistantLight distantLights[MAX_LIGHT_COUNT]; }; #endif #if RECT_LIGHT_COUNT > 0 -layout(binding = BINDING_INDEX_RECT_LIGHTS, std430) readonly buffer RectLightBuffer { RectLight rectLights[]; }; +layout(binding = BINDING_INDEX_RECT_LIGHTS, std430) uniform RectLightBuffer { RectLight rectLights[MAX_LIGHT_COUNT]; }; #endif #if DISK_LIGHT_COUNT > 0 -layout(binding = BINDING_INDEX_DISK_LIGHTS, std430) readonly buffer DiskLightBuffer { DiskLight diskLights[]; }; +layout(binding = BINDING_INDEX_DISK_LIGHTS, std430) uniform DiskLightBuffer { DiskLight diskLights[MAX_LIGHT_COUNT]; }; #endif #if (TEXTURE_COUNT_2D > 0) || (TEXTURE_COUNT_3D > 0) diff --git a/src/gi/shaders/rp_main_shadow.miss b/src/gi/shaders/rp_main_shadow.miss index e8bcee1b..5a57709b 100644 --- a/src/gi/shaders/rp_main_shadow.miss +++ b/src/gi/shaders/rp_main_shadow.miss @@ -5,6 +5,7 @@ #extension GL_EXT_shader_explicit_arithmetic_types_int16: require #extension GL_EXT_shader_explicit_arithmetic_types_int64: require #extension GL_EXT_buffer_reference: require +#extension GL_EXT_scalar_block_layout: require #include "rp_main_payload.glsl" #include "rp_main_descriptors.glsl"