diff --git a/rendering_api/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.c b/rendering_api/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.c index b1dc990..1d222a9 100644 --- a/rendering_api/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.c +++ b/rendering_api/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.c @@ -180,9 +180,9 @@ gnReturnCode gnCreateGraphicsPipelineFn(gnGraphicsPipeline graphicsPipeline, gnD .blendConstants[3] = 0.0f }; - graphicsPipeline->graphicsPipeline->setCount = 1; - graphicsPipeline->graphicsPipeline->sets = malloc(sizeof(VkDescriptorSetLayout)); - graphicsPipeline->graphicsPipeline->sets[0] = vkGryphnCreateSetLayouts(&info.uniformLayout, device->outputDevice->device); + graphicsPipeline->graphicsPipeline->setCount = info.uniformLayout.setCount; + graphicsPipeline->graphicsPipeline->sets = malloc(sizeof(VkDescriptorSetLayout) * info.uniformLayout.setCount); + for (int i = 0; i < info.uniformLayout.setCount; i++) graphicsPipeline->graphicsPipeline->sets[i] = vkGryphnCreateSetLayouts(&info.uniformLayout.sets[i], device->outputDevice->device); VkPipelineLayoutCreateInfo pipelineLayoutInfo = { .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, diff --git a/rendering_api/vulkan/src/uniforms/vulkan_uniform_layout.c b/rendering_api/vulkan/src/uniforms/vulkan_uniform_layout.c index 64e2290..09a6009 100644 --- a/rendering_api/vulkan/src/uniforms/vulkan_uniform_layout.c +++ b/rendering_api/vulkan/src/uniforms/vulkan_uniform_layout.c @@ -10,26 +10,26 @@ VkDescriptorType vkGryphnUniformType(gnUniformType type) { } VkDescriptorSetLayout vkGryphnCreateSetLayouts( - const gnUniformLayout* layout, + const gnUniformSet* set, VkDevice device ) { VkDescriptorSetLayout vkLayout; - gnUniformLayout uniformLayout = *layout; + gnUniformSet uniformSet = *set; - VkDescriptorSetLayoutBinding* bindings = malloc(sizeof(VkDescriptorSetLayoutBinding) * uniformLayout.uniformBindingCount); - for (int i = 0; i < uniformLayout.uniformBindingCount; i++) { + VkDescriptorSetLayoutBinding* bindings = malloc(sizeof(VkDescriptorSetLayoutBinding) * uniformSet.uniformBindingCount); + for (int i = 0; i < uniformSet.uniformBindingCount; i++) { bindings[i] = (VkDescriptorSetLayoutBinding){ - .binding = uniformLayout.uniformBindings[i].binding, + .binding = uniformSet.uniformBindings[i].binding, .descriptorCount = 1, - .descriptorType = vkGryphnUniformType(uniformLayout.uniformBindings[i].type), - .stageFlags = vkGryphnShaderModuleStage(uniformLayout.uniformBindings[i].stage) + .descriptorType = vkGryphnUniformType(uniformSet.uniformBindings[i].type), + .stageFlags = vkGryphnShaderModuleStage(uniformSet.uniformBindings[i].stage) }; } VkDescriptorSetLayoutCreateInfo info = { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, - .bindingCount = uniformLayout.uniformBindingCount, + .bindingCount = uniformSet.uniformBindingCount, .pBindings = bindings }; diff --git a/rendering_api/vulkan/src/uniforms/vulkan_uniform_layout.h b/rendering_api/vulkan/src/uniforms/vulkan_uniform_layout.h index d48a1c3..95513b0 100644 --- a/rendering_api/vulkan/src/uniforms/vulkan_uniform_layout.h +++ b/rendering_api/vulkan/src/uniforms/vulkan_uniform_layout.h @@ -2,5 +2,5 @@ #include #include -VkDescriptorSetLayout vkGryphnCreateSetLayouts(const gnUniformLayout* layout, VkDevice device); +VkDescriptorSetLayout vkGryphnCreateSetLayouts(const gnUniformSet* set, VkDevice device); VkDescriptorType vkGryphnUniformType(gnUniformType type); diff --git a/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.c b/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.c index a6d7018..e290707 100644 --- a/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.c +++ b/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.c @@ -15,51 +15,22 @@ gnReturnCode gnCreateUniformPoolFn(gnUniformPool pool, gnDeviceHandle device) { 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) { if (pool->uniformPool->poolCount >= pool->uniformPool->maxPoolCount) { pool->uniformPool->maxPoolCount *= 2; 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].layoutCount = allocInfo.layoutCount; + pool->uniformPool->pools[pool->uniformPool->poolCount].layouts = malloc(sizeof(VkDescriptorSetLayout) * allocInfo.setCount); + pool->uniformPool->pools[pool->uniformPool->poolCount].layoutCount = allocInfo.setCount; VkDescriptorPoolSize uniformBufferSize = { .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .descriptorCount = 0 }; - for (int i = 0; i < allocInfo.layoutCount; i++) { - for (int c = 0; c < allocInfo.layouts[i].uniformBindingCount; c++) - if (allocInfo.layouts[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); + for (int i = 0; i < allocInfo.setCount; i++) { + for (int c = 0; c < allocInfo.sets[i].uniformBindingCount; c++) + if (allocInfo.sets[i].uniformBindings[c].type == GN_UNIFORM_BUFFER_DESCRIPTOR) uniformBufferSize.descriptorCount++; + pool->uniformPool->pools[pool->uniformPool->poolCount].layouts[i] = vkGryphnCreateSetLayouts(&allocInfo.sets[i], pool->device->outputDevice->device); } uint32_t maxSets = uniformBufferSize.descriptorCount; @@ -80,16 +51,16 @@ gnUniform* gnUniformPoolAllocateUniformsFn(gnUniformPool pool, gnUniformAllocati VkDescriptorSetAllocateInfo vkAllocInfo = { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, .descriptorPool = pool->uniformPool->pools[pool->uniformPool->poolCount].pool, - .descriptorSetCount = allocInfo.layoutCount, + .descriptorSetCount = allocInfo.setCount, .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) return NULL; - gnUniform* uniforms = malloc(sizeof(gnUniform) * allocInfo.layoutCount); - for (int i = 0; i < allocInfo.layoutCount; i++) { + gnUniform* uniforms = malloc(sizeof(gnUniform) * allocInfo.setCount); + for (int i = 0; i < allocInfo.setCount; i++) { uniforms[i] = malloc(sizeof(struct gnUniform_t)); uniforms[i]->uniform = malloc(sizeof(struct gnPlatformUniform_t)); uniforms[i]->uniform->set = sets[i]; diff --git a/src/core/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h b/src/core/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h index e6c5c92..6039ea9 100644 --- a/src/core/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h +++ b/src/core/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h @@ -89,6 +89,7 @@ typedef struct gnGraphicsPipelineInfo_t { uint32_t shaderModuleCount; gnShaderModuleHandle* shaderModules; gnShaderInputLayout shaderInputLayout; + gnUniformLayout uniformLayout; } gnGraphicsPipelineInfo; diff --git a/src/core/uniforms/gryphn_uniform_layout.h b/src/core/uniforms/gryphn_uniform_layout.h index 7a4da63..68c7fbf 100644 --- a/src/core/uniforms/gryphn_uniform_layout.h +++ b/src/core/uniforms/gryphn_uniform_layout.h @@ -14,7 +14,12 @@ typedef struct gnUniformBinding { gnShaderModuleStage stage; } gnUniformBinding; -typedef struct gnUniformLayout { +typedef struct gnUniformSet { uint32_t uniformBindingCount; gnUniformBinding* uniformBindings; +} gnUniformSet; + +typedef struct gnUniformLayout { + uint32_t setCount; + gnUniformSet* sets; } gnUniformLayout; diff --git a/src/core/uniforms/gryphn_uniform_pool.c b/src/core/uniforms/gryphn_uniform_pool.c index d6898b7..d9f72ab 100644 --- a/src/core/uniforms/gryphn_uniform_pool.c +++ b/src/core/uniforms/gryphn_uniform_pool.c @@ -13,12 +13,12 @@ gnReturnCode gnCreateUniformPool(gnUniformPool* pool, gnDeviceHandle device) { // you own this memory now gnUniformArrayList gnUniformPoolAllocateUniforms(gnUniformPool pool, gnUniformAllocationInfo 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; gnUniformArrayList list = gnUniformArrayListCreate(); - gnUniformArrayListResize(&list, allocInfo.layoutCount); - for (int i = 0; i < allocInfo.layoutCount; i++) list.data[i] = uniforms[i]; + gnUniformArrayListResize(&list, allocInfo.setCount); + for (int i = 0; i < allocInfo.setCount; i++) list.data[i] = uniforms[i]; return list; } diff --git a/src/core/uniforms/gryphn_uniform_pool.h b/src/core/uniforms/gryphn_uniform_pool.h index 2faca17..e10d681 100644 --- a/src/core/uniforms/gryphn_uniform_pool.h +++ b/src/core/uniforms/gryphn_uniform_pool.h @@ -12,8 +12,8 @@ struct gnUniformPool_t { #endif typedef struct gnUniformAllocationInfo { - const uint32_t layoutCount; - const gnUniformLayout* layouts; + const uint32_t setCount; + const gnUniformSet* sets; } gnUniformAllocationInfo; gnReturnCode gnCreateUniformPool(gnUniformPool* pool, gnDeviceHandle device);