[WIP] Add descriptors and pipeline builder
This commit is contained in:
1 parent
173a82b9d1
commit
f8eb98ddf4
36 files changed
+613
-458
No files matched your search
@@ -0,0 +1,228 @@
|
||||
/**
|
||||
* @file descriptor_builder.c
|
||||
* @author Piotr Krygier (everyonecancode@gmail.com)
|
||||
* @brief
|
||||
* @version 0.1
|
||||
* @date 2025-03-14
|
||||
*
|
||||
* @copyright Copyright (c) 2025
|
||||
*
|
||||
*/
|
||||
|
||||
#include "descriptor_builder.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "src/graphics_context.h"
|
||||
#include "utilities/commons.h"
|
||||
#include "utilities/errors_common.h"
|
||||
#include "utilities/linked_list.h"
|
||||
#include "utilities/localization.h"
|
||||
#include "utilities/logger.h"
|
||||
#include "vulkan/vulkan_core.h"
|
||||
#include "vulkan_errors.h"
|
||||
|
||||
RSE_LINKED_LIST_DEFINE(descriptor_set_layout_list_t,
|
||||
VkDescriptorSetLayoutBinding);
|
||||
|
||||
struct descriptor_t
|
||||
{
|
||||
uint32_t binding;
|
||||
VkDescriptorType type;
|
||||
uint32_t descriptors_count;
|
||||
VkShaderStageFlags shader_stages;
|
||||
VkSampler immutable_sampler;
|
||||
};
|
||||
RSE_LINKED_LIST_DEFINE(descriptors_list_t, struct descriptor_t);
|
||||
|
||||
/* FIXME: When new descriptors are introduced to Vulkan, this enum has to be
|
||||
* updated */
|
||||
enum descriptor_type_id_t
|
||||
{
|
||||
DESCRIPTOR_TYPE_SAMPLER_ID,
|
||||
DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER_ID,
|
||||
DESCRIPTOR_TYPE_SAMPLED_IMAGE_ID,
|
||||
DESCRIPTOR_TYPE_STORAGE_IMAGE_ID,
|
||||
DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER_ID,
|
||||
DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER_ID,
|
||||
DESCRIPTOR_TYPE_UNIFORM_BUFFER_ID,
|
||||
DESCRIPTOR_TYPE_STORAGE_BUFFER_ID,
|
||||
DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC_ID,
|
||||
DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC_ID,
|
||||
DESCRIPTOR_TYPE_INPUT_ATTACHMENT_ID,
|
||||
DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_ID,
|
||||
DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR_ID,
|
||||
DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV_ID,
|
||||
DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM_ID,
|
||||
DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM_ID,
|
||||
DESCRIPTOR_TYPE_MUTABLE_EXT_ID,
|
||||
DESCRIPTOR_TYPE_ID_MAX_ENUM,
|
||||
};
|
||||
|
||||
struct descriptors_data_t
|
||||
{
|
||||
VkDescriptorPool pool;
|
||||
VkDescriptorSet set;
|
||||
struct descriptor_set_layout_list_t layouts_list;
|
||||
};
|
||||
|
||||
rse_err_t descriptor_add(struct descriptors_list_t* descriptors_list,
|
||||
uint32_t binding, VkDescriptorType type,
|
||||
uint32_t descriptors_count,
|
||||
VkShaderStageFlags shader_stages, VkSampler sampler)
|
||||
{
|
||||
struct descriptor_t descriptor = {.binding = binding,
|
||||
.type = type,
|
||||
.descriptors_count = descriptors_count,
|
||||
.shader_stages = shader_stages,
|
||||
.immutable_sampler = sampler};
|
||||
|
||||
RSE_LINKED_LIST_PUSH_BACK(descriptors_list, descriptor);
|
||||
|
||||
return RSE_ERROR_NO_ERROR;
|
||||
}
|
||||
|
||||
rse_err_t descriptors_build(struct graphics_context_t* context,
|
||||
struct descriptors_list_t* descriptors)
|
||||
{
|
||||
VkDescriptorPoolCreateInfo pool_create_info = {};
|
||||
VkDescriptorPoolCreateFlags pool_create_flags = 0U;
|
||||
VkDescriptorPool descriptor_pool = VK_NULL_HANDLE;
|
||||
VkDescriptorPoolSize pool_sizes[DESCRIPTOR_TYPE_ID_MAX_ENUM] = {};
|
||||
VkDescriptorPoolSize requested_pool_sizes[DESCRIPTOR_TYPE_ID_MAX_ENUM] = {};
|
||||
uint32_t pool_max_sets = 0;
|
||||
size_t pool_size_count = 0U;
|
||||
size_t iterator = 0U;
|
||||
|
||||
if (NULL == context) {
|
||||
LOGF(_("Provided NULL context\n"));
|
||||
|
||||
return RSE_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
RSE_LINKED_LIST_FOREACH(descriptors, descriptor)
|
||||
{
|
||||
switch (descriptor->data.type) {
|
||||
case VK_DESCRIPTOR_TYPE_SAMPLER:
|
||||
pool_sizes[DESCRIPTOR_TYPE_SAMPLER_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_SAMPLER;
|
||||
pool_sizes[DESCRIPTOR_TYPE_SAMPLER_ID].descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
|
||||
pool_sizes[DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||
pool_sizes[DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER_ID]
|
||||
.descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
|
||||
pool_sizes[DESCRIPTOR_TYPE_SAMPLED_IMAGE_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
|
||||
pool_sizes[DESCRIPTOR_TYPE_SAMPLED_IMAGE_ID].descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
|
||||
pool_sizes[DESCRIPTOR_TYPE_STORAGE_IMAGE_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
|
||||
pool_sizes[DESCRIPTOR_TYPE_STORAGE_IMAGE_ID].descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
|
||||
pool_sizes[DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
|
||||
pool_sizes[DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER_ID]
|
||||
.descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
|
||||
pool_sizes[DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
|
||||
pool_sizes[DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER_ID]
|
||||
.descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
||||
pool_sizes[DESCRIPTOR_TYPE_UNIFORM_BUFFER_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
pool_sizes[DESCRIPTOR_TYPE_UNIFORM_BUFFER_ID].descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
|
||||
pool_sizes[DESCRIPTOR_TYPE_STORAGE_BUFFER_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
|
||||
pool_sizes[DESCRIPTOR_TYPE_STORAGE_BUFFER_ID].descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
|
||||
pool_sizes[DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
|
||||
pool_sizes[DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC_ID]
|
||||
.descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
|
||||
pool_sizes[DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC;
|
||||
pool_sizes[DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC_ID]
|
||||
.descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
|
||||
pool_sizes[DESCRIPTOR_TYPE_INPUT_ATTACHMENT_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
|
||||
pool_sizes[DESCRIPTOR_TYPE_INPUT_ATTACHMENT_ID]
|
||||
.descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK:
|
||||
pool_sizes[DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK;
|
||||
pool_sizes[DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_ID]
|
||||
.descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
|
||||
pool_sizes[DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR;
|
||||
pool_sizes[DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR_ID]
|
||||
.descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV:
|
||||
pool_sizes[DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV;
|
||||
pool_sizes[DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV_ID]
|
||||
.descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM:
|
||||
pool_sizes[DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM;
|
||||
pool_sizes[DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM_ID]
|
||||
.descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM:
|
||||
pool_sizes[DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM;
|
||||
pool_sizes[DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM_ID]
|
||||
.descriptorCount++;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_MUTABLE_EXT:
|
||||
pool_sizes[DESCRIPTOR_TYPE_MUTABLE_EXT_ID].type =
|
||||
VK_DESCRIPTOR_TYPE_MUTABLE_EXT;
|
||||
pool_sizes[DESCRIPTOR_TYPE_MUTABLE_EXT_ID].descriptorCount++;
|
||||
default:
|
||||
LOGF(_("Invalid descriptor type provided\n"));
|
||||
return VULKAN_ERROR_UNKNOWN_DESCRIPTOR_TYPE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Allocate pool based on layout */
|
||||
/* create array of required descriptors */
|
||||
for (iterator = 0U; iterator < DESCRIPTOR_TYPE_ID_MAX_ENUM; ++iterator) {
|
||||
if (pool_sizes[iterator].descriptorCount > 0) {
|
||||
requested_pool_sizes[pool_size_count].type =
|
||||
pool_sizes[iterator].type;
|
||||
requested_pool_sizes[pool_size_count].descriptorCount =
|
||||
pool_sizes[iterator].descriptorCount;
|
||||
pool_size_count++;
|
||||
}
|
||||
}
|
||||
|
||||
pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
||||
pool_create_info.pNext = NULL;
|
||||
pool_create_info.flags = pool_create_flags;
|
||||
pool_create_info.maxSets =
|
||||
0; // FIXME: Calculate number of sets based on layout
|
||||
pool_create_info.poolSizeCount = pool_size_count;
|
||||
pool_create_info.pPoolSizes = requested_pool_sizes;
|
||||
|
||||
return RSE_ERROR_NO_ERROR;
|
||||
}
|
||||
Reference in new issue
Block a user