Replace uniform with storage buffer for instances

Signed-off-by: Piotr Krygier <piotrkrygier@everyonecancode@xyz>
This commit is contained in:
Piotr Krygier
2026-02-10 19:07:40 +01:00
parent ff527767b9
commit de597ebc5d
3 changed files with 16 additions and 12 deletions
+2 -4
View File
@@ -6,8 +6,6 @@ layout(push_constant) uniform pc {
mat4 proj; mat4 proj;
} ubo; } ubo;
#define MAX_INSTANCES 1024
struct InstanceData struct InstanceData
{ {
vec3 pos; vec3 pos;
@@ -16,8 +14,8 @@ struct InstanceData
uint texture_id; uint texture_id;
}; };
layout(binding = 0) uniform InstanceUniformBuffer { layout(set=0, binding = 0, std430) readonly buffer InstanceBuffer {
InstanceData instances[MAX_INSTANCES]; InstanceData instances[];
}; };
layout(location = 0) in vec3 inPosition; layout(location = 0) in vec3 inPosition;
+3 -4
View File
@@ -5,7 +5,6 @@
#include <SDL3/SDL_render.h> #include <SDL3/SDL_render.h>
#include <cglm/util.h> #include <cglm/util.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
#include <vulkan/vulkan_core.h> #include <vulkan/vulkan_core.h>
@@ -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(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_add_type(context, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, TEXTURES_COUNT));
STATUS_CHECK(descriptor_pool_initialize(context)); STATUS_CHECK(descriptor_pool_initialize(context));
/* Normal rendering */ /* Normal rendering */
STATUS_CHECK(descriptor_create_new_set(context, &descriptor_set_handle)); STATUS_CHECK(descriptor_create_new_set(context, &descriptor_set_handle));
STATUS_CHECK( 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, STATUS_CHECK(descriptor_add_layout(&layout_bindings,
1, 1,
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 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, descriptor_set_handle,
&context->render_targets[RENDER_TARGET_3D].instance_buffer, &context->render_targets[RENDER_TARGET_3D].instance_buffer,
0, 0,
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER)); VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
STATUS_CHECK(descriptor_attach_images(context, STATUS_CHECK(descriptor_attach_images(context,
descriptor_set_handle, descriptor_set_handle,
+11 -4
View File
@@ -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; buffer_size = sizeof(struct instance_data_t) * MAX_INSTANCE_NUMBER;
STATUS_CHECK( 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? */ /* TODO: Move creation to somewhere else? */
STATUS_CHECK(create_buffer(context, STATUS_CHECK(create_buffer(context,
CMD_BUFFER_SIZE, 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].vertex_buffer);
destroy_buffer(context, &context->render_targets[RENDER_TARGET_3D].index_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].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) for (iter = 0U; iter < context->uniform_buffers.vulkan_buffers_count; ++iter) {
{ vmaDestroyBuffer(context->vulkan_handles.allocator,
vmaDestroyBuffer(context->vulkan_handles.allocator, context->uniform_buffers.vulkan_buffers[iter].buffer, context->uniform_buffers.vulkan_buffers[iter].allocation); context->uniform_buffers.vulkan_buffers[iter].buffer,
context->uniform_buffers.vulkan_buffers[iter].allocation);
} }
context->uniform_buffers.vulkan_buffers_count = 0; context->uniform_buffers.vulkan_buffers_count = 0;