Replace uniform with storage buffer for instances
Signed-off-by: Piotr Krygier <piotrkrygier@everyonecancode@xyz>
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
#include <SDL3/SDL_render.h>
|
||||
#include <cglm/util.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.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(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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user