From de597ebc5d41f78a91ec4caca6e3b201a6f0de10 Mon Sep 17 00:00:00 2001 From: Piotr Krygier Date: Tue, 10 Feb 2026 19:07:40 +0100 Subject: [PATCH] Replace uniform with storage buffer for instances Signed-off-by: Piotr Krygier --- graphics/shaders/shader.vert | 6 ++---- graphics/src/rse_graphics.c | 7 +++---- graphics/src/vulkan_buffers.c | 15 +++++++++++---- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/graphics/shaders/shader.vert b/graphics/shaders/shader.vert index da23d7a0..df229617 100644 --- a/graphics/shaders/shader.vert +++ b/graphics/shaders/shader.vert @@ -6,8 +6,6 @@ layout(push_constant) uniform pc { mat4 proj; } ubo; -#define MAX_INSTANCES 1024 - struct InstanceData { vec3 pos; @@ -16,8 +14,8 @@ struct InstanceData uint texture_id; }; -layout(binding = 0) uniform InstanceUniformBuffer { - InstanceData instances[MAX_INSTANCES]; +layout(set=0, binding = 0, std430) readonly buffer InstanceBuffer { + InstanceData instances[]; }; layout(location = 0) in vec3 inPosition; diff --git a/graphics/src/rse_graphics.c b/graphics/src/rse_graphics.c index 501d0e72..1e7df270 100644 --- a/graphics/src/rse_graphics.c +++ b/graphics/src/rse_graphics.c @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -203,14 +202,14 @@ rse_err_t rse_graphics_test_function(struct rse_graphics_context_t* rse_context) STATUS_CHECK(sampler_create(context, &context->vulkan_handles.sampler)); - STATUS_CHECK(descriptor_pool_add_type(context, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1)); + STATUS_CHECK(descriptor_pool_add_type(context, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1)); STATUS_CHECK(descriptor_pool_add_type(context, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, TEXTURES_COUNT)); STATUS_CHECK(descriptor_pool_initialize(context)); /* Normal rendering */ STATUS_CHECK(descriptor_create_new_set(context, &descriptor_set_handle)); STATUS_CHECK( - descriptor_add_layout(&layout_bindings, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT)); + descriptor_add_layout(&layout_bindings, 0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT)); STATUS_CHECK(descriptor_add_layout(&layout_bindings, 1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, @@ -223,7 +222,7 @@ rse_err_t rse_graphics_test_function(struct rse_graphics_context_t* rse_context) descriptor_set_handle, &context->render_targets[RENDER_TARGET_3D].instance_buffer, 0, - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER)); + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)); STATUS_CHECK(descriptor_attach_images(context, descriptor_set_handle, diff --git a/graphics/src/vulkan_buffers.c b/graphics/src/vulkan_buffers.c index bd44f3ca..88968274 100644 --- a/graphics/src/vulkan_buffers.c +++ b/graphics/src/vulkan_buffers.c @@ -119,7 +119,12 @@ static rse_err_t create_instance_buffers(struct graphics_context_t* context) buffer_size = sizeof(struct instance_data_t) * MAX_INSTANCE_NUMBER; STATUS_CHECK( - buffer_create_uniform(context, &context->render_targets[RENDER_TARGET_3D].instance_buffer, buffer_size)); + create_buffer(context, + buffer_size, + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, + VMA_MEMORY_USAGE_AUTO_PREFER_HOST, + VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT, + &context->render_targets[RENDER_TARGET_3D].instance_buffer)); /* TODO: Move creation to somewhere else? */ STATUS_CHECK(create_buffer(context, CMD_BUFFER_SIZE, @@ -435,10 +440,12 @@ void destroy_buffers(struct graphics_context_t* context) destroy_buffer(context, &context->render_targets[RENDER_TARGET_3D].vertex_buffer); destroy_buffer(context, &context->render_targets[RENDER_TARGET_3D].index_buffer); destroy_buffer(context, &context->render_targets[RENDER_TARGET_3D].draw_indirect_command_buffer); + destroy_buffer(context, &context->render_targets[RENDER_TARGET_3D].instance_buffer); - for (iter = 0U; iter < context->uniform_buffers.vulkan_buffers_count; ++iter) - { - vmaDestroyBuffer(context->vulkan_handles.allocator, context->uniform_buffers.vulkan_buffers[iter].buffer, context->uniform_buffers.vulkan_buffers[iter].allocation); + for (iter = 0U; iter < context->uniform_buffers.vulkan_buffers_count; ++iter) { + vmaDestroyBuffer(context->vulkan_handles.allocator, + context->uniform_buffers.vulkan_buffers[iter].buffer, + context->uniform_buffers.vulkan_buffers[iter].allocation); } context->uniform_buffers.vulkan_buffers_count = 0;