add support for sets within uniforms

This commit is contained in:
Gregory Wells
2025-06-15 07:03:34 -04:00
parent 0c3329b1df
commit 118e50223b
8 changed files with 34 additions and 57 deletions

View File

@@ -180,9 +180,9 @@ gnReturnCode gnCreateGraphicsPipelineFn(gnGraphicsPipeline graphicsPipeline, gnD
.blendConstants[3] = 0.0f .blendConstants[3] = 0.0f
}; };
graphicsPipeline->graphicsPipeline->setCount = 1; graphicsPipeline->graphicsPipeline->setCount = info.uniformLayout.setCount;
graphicsPipeline->graphicsPipeline->sets = malloc(sizeof(VkDescriptorSetLayout)); graphicsPipeline->graphicsPipeline->sets = malloc(sizeof(VkDescriptorSetLayout) * info.uniformLayout.setCount);
graphicsPipeline->graphicsPipeline->sets[0] = vkGryphnCreateSetLayouts(&info.uniformLayout, device->outputDevice->device); for (int i = 0; i < info.uniformLayout.setCount; i++) graphicsPipeline->graphicsPipeline->sets[i] = vkGryphnCreateSetLayouts(&info.uniformLayout.sets[i], device->outputDevice->device);
VkPipelineLayoutCreateInfo pipelineLayoutInfo = { VkPipelineLayoutCreateInfo pipelineLayoutInfo = {
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,

View File

@@ -10,26 +10,26 @@ VkDescriptorType vkGryphnUniformType(gnUniformType type) {
} }
VkDescriptorSetLayout vkGryphnCreateSetLayouts( VkDescriptorSetLayout vkGryphnCreateSetLayouts(
const gnUniformLayout* layout, const gnUniformSet* set,
VkDevice device VkDevice device
) { ) {
VkDescriptorSetLayout vkLayout; VkDescriptorSetLayout vkLayout;
gnUniformLayout uniformLayout = *layout; gnUniformSet uniformSet = *set;
VkDescriptorSetLayoutBinding* bindings = malloc(sizeof(VkDescriptorSetLayoutBinding) * uniformLayout.uniformBindingCount); VkDescriptorSetLayoutBinding* bindings = malloc(sizeof(VkDescriptorSetLayoutBinding) * uniformSet.uniformBindingCount);
for (int i = 0; i < uniformLayout.uniformBindingCount; i++) { for (int i = 0; i < uniformSet.uniformBindingCount; i++) {
bindings[i] = (VkDescriptorSetLayoutBinding){ bindings[i] = (VkDescriptorSetLayoutBinding){
.binding = uniformLayout.uniformBindings[i].binding, .binding = uniformSet.uniformBindings[i].binding,
.descriptorCount = 1, .descriptorCount = 1,
.descriptorType = vkGryphnUniformType(uniformLayout.uniformBindings[i].type), .descriptorType = vkGryphnUniformType(uniformSet.uniformBindings[i].type),
.stageFlags = vkGryphnShaderModuleStage(uniformLayout.uniformBindings[i].stage) .stageFlags = vkGryphnShaderModuleStage(uniformSet.uniformBindings[i].stage)
}; };
} }
VkDescriptorSetLayoutCreateInfo info = { VkDescriptorSetLayoutCreateInfo info = {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
.bindingCount = uniformLayout.uniformBindingCount, .bindingCount = uniformSet.uniformBindingCount,
.pBindings = bindings .pBindings = bindings
}; };

View File

@@ -2,5 +2,5 @@
#include <vulkan/vulkan.h> #include <vulkan/vulkan.h>
#include <core/uniforms/gryphn_uniform_layout.h> #include <core/uniforms/gryphn_uniform_layout.h>
VkDescriptorSetLayout vkGryphnCreateSetLayouts(const gnUniformLayout* layout, VkDevice device); VkDescriptorSetLayout vkGryphnCreateSetLayouts(const gnUniformSet* set, VkDevice device);
VkDescriptorType vkGryphnUniformType(gnUniformType type); VkDescriptorType vkGryphnUniformType(gnUniformType type);

View File

@@ -15,51 +15,22 @@ gnReturnCode gnCreateUniformPoolFn(gnUniformPool pool, gnDeviceHandle device) {
return GN_SUCCESS; return GN_SUCCESS;
} }
VkDescriptorSetLayout* fsdfsdfsdfsdfsdfdsf(
const gnUniformLayout* layout, uint32_t* setCount,
VkDevice device
) {
gnUniformLayout uniformLayout = *layout;
*setCount = uniformLayout.uniformBindingCount;
VkDescriptorSetLayout* sets = malloc(sizeof(VkDescriptorSetLayoutBinding) * uniformLayout.uniformBindingCount);
for (int i = 0; i < uniformLayout.uniformBindingCount; i++) {
VkDescriptorSetLayoutBinding setLayout = {
.binding = uniformLayout.uniformBindings[i].binding,
.descriptorCount = 1,
.descriptorType = vkGryphnUniformType(uniformLayout.uniformBindings[i].type),
.stageFlags = vkGryphnShaderModuleStage(uniformLayout.uniformBindings[i].stage)
};
VkDescriptorSetLayoutCreateInfo info = {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
.bindingCount = 1,
.pBindings = &setLayout
};
if (vkCreateDescriptorSetLayout(device, &info, NULL, sets) != VK_SUCCESS) {
return NULL;
}
}
return sets;
}
gnUniform* gnUniformPoolAllocateUniformsFn(gnUniformPool pool, gnUniformAllocationInfo allocInfo) { gnUniform* gnUniformPoolAllocateUniformsFn(gnUniformPool pool, gnUniformAllocationInfo allocInfo) {
if (pool->uniformPool->poolCount >= pool->uniformPool->maxPoolCount) { if (pool->uniformPool->poolCount >= pool->uniformPool->maxPoolCount) {
pool->uniformPool->maxPoolCount *= 2; pool->uniformPool->maxPoolCount *= 2;
pool->uniformPool->pools = realloc(pool->uniformPool->pools, sizeof(vkGryphnUniformPool) * pool->uniformPool->maxPoolCount); pool->uniformPool->pools = realloc(pool->uniformPool->pools, sizeof(vkGryphnUniformPool) * pool->uniformPool->maxPoolCount);
} }
pool->uniformPool->pools[pool->uniformPool->poolCount].layouts = malloc(sizeof(VkDescriptorSetLayout) * allocInfo.layoutCount); pool->uniformPool->pools[pool->uniformPool->poolCount].layouts = malloc(sizeof(VkDescriptorSetLayout) * allocInfo.setCount);
pool->uniformPool->pools[pool->uniformPool->poolCount].layoutCount = allocInfo.layoutCount; pool->uniformPool->pools[pool->uniformPool->poolCount].layoutCount = allocInfo.setCount;
VkDescriptorPoolSize uniformBufferSize = { VkDescriptorPoolSize uniformBufferSize = {
.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
.descriptorCount = 0 .descriptorCount = 0
}; };
for (int i = 0; i < allocInfo.layoutCount; i++) { for (int i = 0; i < allocInfo.setCount; i++) {
for (int c = 0; c < allocInfo.layouts[i].uniformBindingCount; c++) for (int c = 0; c < allocInfo.sets[i].uniformBindingCount; c++)
if (allocInfo.layouts[i].uniformBindings[c].type == GN_UNIFORM_BUFFER_DESCRIPTOR) uniformBufferSize.descriptorCount++; if (allocInfo.sets[i].uniformBindings[c].type == GN_UNIFORM_BUFFER_DESCRIPTOR) uniformBufferSize.descriptorCount++;
pool->uniformPool->pools[pool->uniformPool->poolCount].layouts[i] = vkGryphnCreateSetLayouts(&allocInfo.layouts[i], pool->device->outputDevice->device); pool->uniformPool->pools[pool->uniformPool->poolCount].layouts[i] = vkGryphnCreateSetLayouts(&allocInfo.sets[i], pool->device->outputDevice->device);
} }
uint32_t maxSets = uniformBufferSize.descriptorCount; uint32_t maxSets = uniformBufferSize.descriptorCount;
@@ -80,16 +51,16 @@ gnUniform* gnUniformPoolAllocateUniformsFn(gnUniformPool pool, gnUniformAllocati
VkDescriptorSetAllocateInfo vkAllocInfo = { VkDescriptorSetAllocateInfo vkAllocInfo = {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
.descriptorPool = pool->uniformPool->pools[pool->uniformPool->poolCount].pool, .descriptorPool = pool->uniformPool->pools[pool->uniformPool->poolCount].pool,
.descriptorSetCount = allocInfo.layoutCount, .descriptorSetCount = allocInfo.setCount,
.pSetLayouts = pool->uniformPool->pools[pool->uniformPool->poolCount].layouts .pSetLayouts = pool->uniformPool->pools[pool->uniformPool->poolCount].layouts
}; };
VkDescriptorSet* sets = malloc(sizeof(VkDescriptorSet) * allocInfo.layoutCount); VkDescriptorSet* sets = malloc(sizeof(VkDescriptorSet) * allocInfo.setCount);
if (vkAllocateDescriptorSets(pool->device->outputDevice->device, &vkAllocInfo, sets) != VK_SUCCESS) if (vkAllocateDescriptorSets(pool->device->outputDevice->device, &vkAllocInfo, sets) != VK_SUCCESS)
return NULL; return NULL;
gnUniform* uniforms = malloc(sizeof(gnUniform) * allocInfo.layoutCount); gnUniform* uniforms = malloc(sizeof(gnUniform) * allocInfo.setCount);
for (int i = 0; i < allocInfo.layoutCount; i++) { for (int i = 0; i < allocInfo.setCount; i++) {
uniforms[i] = malloc(sizeof(struct gnUniform_t)); uniforms[i] = malloc(sizeof(struct gnUniform_t));
uniforms[i]->uniform = malloc(sizeof(struct gnPlatformUniform_t)); uniforms[i]->uniform = malloc(sizeof(struct gnPlatformUniform_t));
uniforms[i]->uniform->set = sets[i]; uniforms[i]->uniform->set = sets[i];

View File

@@ -89,6 +89,7 @@ typedef struct gnGraphicsPipelineInfo_t {
uint32_t shaderModuleCount; uint32_t shaderModuleCount;
gnShaderModuleHandle* shaderModules; gnShaderModuleHandle* shaderModules;
gnShaderInputLayout shaderInputLayout; gnShaderInputLayout shaderInputLayout;
gnUniformLayout uniformLayout; gnUniformLayout uniformLayout;
} gnGraphicsPipelineInfo; } gnGraphicsPipelineInfo;

View File

@@ -14,7 +14,12 @@ typedef struct gnUniformBinding {
gnShaderModuleStage stage; gnShaderModuleStage stage;
} gnUniformBinding; } gnUniformBinding;
typedef struct gnUniformLayout { typedef struct gnUniformSet {
uint32_t uniformBindingCount; uint32_t uniformBindingCount;
gnUniformBinding* uniformBindings; gnUniformBinding* uniformBindings;
} gnUniformSet;
typedef struct gnUniformLayout {
uint32_t setCount;
gnUniformSet* sets;
} gnUniformLayout; } gnUniformLayout;

View File

@@ -13,12 +13,12 @@ gnReturnCode gnCreateUniformPool(gnUniformPool* pool, gnDeviceHandle device) {
// you own this memory now // you own this memory now
gnUniformArrayList gnUniformPoolAllocateUniforms(gnUniformPool pool, gnUniformAllocationInfo allocInfo) { gnUniformArrayList gnUniformPoolAllocateUniforms(gnUniformPool pool, gnUniformAllocationInfo allocInfo) {
gnUniform* uniforms = pool->device->deviceFunctions->_gnUniformPoolAllocateUniforms(pool, allocInfo); gnUniform* uniforms = pool->device->deviceFunctions->_gnUniformPoolAllocateUniforms(pool, allocInfo);
for (int i = 0; i < allocInfo.layoutCount; i++) for (int i = 0; i < allocInfo.setCount; i++)
uniforms[i]->pool = pool; uniforms[i]->pool = pool;
gnUniformArrayList list = gnUniformArrayListCreate(); gnUniformArrayList list = gnUniformArrayListCreate();
gnUniformArrayListResize(&list, allocInfo.layoutCount); gnUniformArrayListResize(&list, allocInfo.setCount);
for (int i = 0; i < allocInfo.layoutCount; i++) list.data[i] = uniforms[i]; for (int i = 0; i < allocInfo.setCount; i++) list.data[i] = uniforms[i];
return list; return list;
} }

View File

@@ -12,8 +12,8 @@ struct gnUniformPool_t {
#endif #endif
typedef struct gnUniformAllocationInfo { typedef struct gnUniformAllocationInfo {
const uint32_t layoutCount; const uint32_t setCount;
const gnUniformLayout* layouts; const gnUniformSet* sets;
} gnUniformAllocationInfo; } gnUniformAllocationInfo;
gnReturnCode gnCreateUniformPool(gnUniformPool* pool, gnDeviceHandle device); gnReturnCode gnCreateUniformPool(gnUniformPool* pool, gnDeviceHandle device);