diff --git a/graphics/src/descriptor_builder.c b/graphics/src/descriptor_builder.c index 499aaadc..decf8f70 100644 --- a/graphics/src/descriptor_builder.c +++ b/graphics/src/descriptor_builder.c @@ -23,9 +23,6 @@ #define POOL_MAX_SETS (32U) -VkDescriptorSetLayoutBinding g_layout_bindings[DESCRIPTOR_MAX_SETS]; -static uint32_t g_layout_bindings_count = 0U; - rse_err_t descriptor_pool_add_type(struct graphics_context_t* context, VkDescriptorType type, uint32_t count) { context->descriptor_data.pool_sizes[context->descriptor_data.pool_sizes_count].type = type; @@ -68,28 +65,31 @@ rse_err_t descriptor_create_new_set(struct graphics_context_t* context, uint32_t return RSE_ERROR_NO_ERROR; } -rse_err_t descriptor_add_layout(uint32_t binding, +rse_err_t descriptor_add_layout(struct descriptor_set_layout_bindings_t* layout_bindings, + uint32_t binding, VkDescriptorType type, uint32_t descriptor_count, VkShaderStageFlags shader_stages) { - g_layout_bindings[g_layout_bindings_count].binding = binding; - g_layout_bindings[g_layout_bindings_count].descriptorType = type; - g_layout_bindings[g_layout_bindings_count].descriptorCount = descriptor_count; - g_layout_bindings[g_layout_bindings_count].stageFlags = shader_stages; + layout_bindings->layout_bindings[layout_bindings->layout_bindings_count].binding = binding; + layout_bindings->layout_bindings[layout_bindings->layout_bindings_count].descriptorType = type; + layout_bindings->layout_bindings[layout_bindings->layout_bindings_count].descriptorCount = descriptor_count; + layout_bindings->layout_bindings[layout_bindings->layout_bindings_count].stageFlags = shader_stages; - g_layout_bindings_count++; + layout_bindings->layout_bindings_count++; return RSE_ERROR_NO_ERROR; } -rse_err_t descriptor_set_finish(struct graphics_context_t* context, uint32_t set_id) +rse_err_t descriptor_set_finish(struct graphics_context_t* context, + struct descriptor_set_layout_bindings_t* layout_bindings, + uint32_t set_id) { VkDescriptorSetLayoutCreateInfo create_info = {0}; create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - create_info.bindingCount = g_layout_bindings_count; - create_info.pBindings = g_layout_bindings; + create_info.bindingCount = layout_bindings->layout_bindings_count; + create_info.pBindings = layout_bindings->layout_bindings; if (VK_SUCCESS != vkCreateDescriptorSetLayout(context->vulkan_handles.device, &create_info, @@ -99,8 +99,8 @@ rse_err_t descriptor_set_finish(struct graphics_context_t* context, uint32_t set return RSE_ERROR_INTERNAL_ERROR; } - g_layout_bindings_count = 0U; - rse_memset(g_layout_bindings, 0, sizeof(VkDescriptorSetLayoutBinding) * DESCRIPTOR_MAX_SETS); + layout_bindings->layout_bindings_count = 0U; + rse_memset(layout_bindings->layout_bindings, 0, sizeof(VkDescriptorSetLayoutBinding) * DESCRIPTOR_MAX_SETS); return RSE_ERROR_NO_ERROR; } diff --git a/graphics/src/descriptor_builder.h b/graphics/src/descriptor_builder.h index 35fd95cc..40d63d94 100644 --- a/graphics/src/descriptor_builder.h +++ b/graphics/src/descriptor_builder.h @@ -26,12 +26,15 @@ rse_err_t descriptor_pool_initialize(struct graphics_context_t* context); rse_err_t descriptor_create_new_set(struct graphics_context_t* context, uint32_t* set_id); -rse_err_t descriptor_add_layout(uint32_t binding, +rse_err_t descriptor_add_layout(struct descriptor_set_layout_bindings_t* layout_bindings, + uint32_t binding, VkDescriptorType type, uint32_t descriptor_count, VkShaderStageFlags shader_stages); -rse_err_t descriptor_set_finish(struct graphics_context_t* context, uint32_t set_id); +rse_err_t descriptor_set_finish(struct graphics_context_t* context, + struct descriptor_set_layout_bindings_t* layout_bindings, + uint32_t set_id); rse_err_t descriptor_build_sets(struct graphics_context_t* context); diff --git a/graphics/src/graphics_context.h b/graphics/src/graphics_context.h index 780c427d..5e2ce736 100644 --- a/graphics/src/graphics_context.h +++ b/graphics/src/graphics_context.h @@ -180,6 +180,12 @@ struct descriptor_data_t VkDescriptorSetLayout set_layouts[DESCRIPTOR_MAX_SETS]; }; +struct descriptor_set_layout_bindings_t +{ + VkDescriptorSetLayoutBinding layout_bindings[DESCRIPTOR_MAX_SETS]; + uint32_t layout_bindings_count; +}; + struct render_target_t { struct vulkan_buffer_t vertex_buffer; diff --git a/graphics/src/rse_graphics.c b/graphics/src/rse_graphics.c index 7adaee16..a195d1dd 100644 --- a/graphics/src/rse_graphics.c +++ b/graphics/src/rse_graphics.c @@ -117,6 +117,7 @@ rse_err_t rse_graphics_test_function(struct rse_graphics_context_t* rse_context) uint16_t textures[2] = {0}; struct pipeline_t pipeline; uint32_t descriptor_set_handle = 0; + struct descriptor_set_layout_bindings_t layout_bindings = {0}; struct pipeline_infos_t pipeline_infos = {0}; struct vulkan_buffer_t model_view_projection_buffer = {0}; uint32_t mesh_id_1, mesh_id_2 = 0; @@ -183,13 +184,10 @@ rse_err_t rse_graphics_test_function(struct rse_graphics_context_t* rse_context) /* Normal rendering */ descriptor_create_new_set(context, &descriptor_set_handle); - descriptor_add_layout(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT); - descriptor_add_layout(1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT); - descriptor_add_layout(2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2, VK_SHADER_STAGE_FRAGMENT_BIT); - - descriptor_set_finish(context, descriptor_set_handle); - - descriptor_add_layout(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + descriptor_add_layout(&layout_bindings, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT); + descriptor_add_layout(&layout_bindings, 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT); + descriptor_add_layout(&layout_bindings, 2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2, VK_SHADER_STAGE_FRAGMENT_BIT); + descriptor_set_finish(context, &layout_bindings, descriptor_set_handle); descriptor_build_sets(context); descriptor_attach_buffer(context,