diff --git a/rendering_api/vulkan/src/output_device/vulkan_device_extensions.c b/rendering_api/vulkan/src/output_device/vulkan_device_extensions.c index c37c731..8c02f19 100644 --- a/rendering_api/vulkan/src/output_device/vulkan_device_extensions.c +++ b/rendering_api/vulkan/src/output_device/vulkan_device_extensions.c @@ -29,9 +29,11 @@ const char* *vkGetGryphnDeviceExtensions(uint32_t* outCount, VkPhysicalDevice de } free(vkExtensions); - count++; - extensiosns = realloc(extensiosns, sizeof(const char*) * count); - extensiosns[(count - 1)] = VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME; + if (supportsDescriptorPoolOverallocation) { + count++; + extensiosns = realloc(extensiosns, sizeof(const char*) * count); + extensiosns[(count - 1)] = VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME; + } *outCount = count; diff --git a/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.c b/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.c index 335bc65..e173d5f 100644 --- a/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.c +++ b/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.c @@ -9,94 +9,69 @@ gnReturnCode gnCreateUniformPoolFn(gnUniformPool pool, gnDeviceHandle device) { pool->uniformPool = malloc(sizeof(struct gnPlatformUniformPool_t)); pool->uniformPool->poolCount = 0; - pool->uniformPool->maxPoolCount = 2; + // pool->uniformPool->maxPoolCount = 2; pool->uniformPool->pools = malloc(sizeof(vkGryphnUniformPool) * pool->uniformPool->maxPoolCount); - if (device->outputDevice->enabledOversizedDescriptorPools == gnTrue) { - VkDescriptorPoolCreateInfo poolInfo = { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, - .flags = VK_DESCRIPTOR_POOL_CREATE_ALLOW_OVERALLOCATION_SETS_BIT_NV, - .poolSizeCount = 0, - .pPoolSizes = NULL, - .maxSets = 0 - }; + VkDescriptorPoolCreateInfo poolInfo = { + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, + .flags = VK_DESCRIPTOR_POOL_CREATE_ALLOW_OVERALLOCATION_SETS_BIT_NV, + .poolSizeCount = 0, + .pPoolSizes = NULL, + .maxSets = 0 + }; - if (vkCreateDescriptorPool( - pool->device->outputDevice->device, &poolInfo, NULL, - &pool->uniformPool->pools[pool->uniformPool->poolCount].pool - ) != VK_SUCCESS) - return GN_FAILED_TO_ALLOCATE_MEMORY; + if (vkCreateDescriptorPool( + pool->device->outputDevice->device, &poolInfo, NULL, + &pool->uniformPool->pools[0].pool + ) != VK_SUCCESS) + return GN_FAILED_TO_ALLOCATE_MEMORY; + + pool->uniformPool->pools[0].layouts = VkDescriptorSetLayoutArrayListCreate(); + + // if (device->outputDevice->enabledOversizedDescriptorPools == gnTrue) { + // VkDescriptorPoolCreateInfo poolInfo = { + // .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, + // .flags = VK_DESCRIPTOR_POOL_CREATE_ALLOW_OVERALLOCATION_SETS_BIT_NV, + // .poolSizeCount = 0, + // .pPoolSizes = NULL, + // .maxSets = 0 + // }; + + // if (vkCreateDescriptorPool( + // pool->device->outputDevice->device, &poolInfo, NULL, + // &pool->uniformPool->pools[pool->uniformPool->poolCount].pool + // ) != VK_SUCCESS) + // return GN_FAILED_TO_ALLOCATE_MEMORY; + + // pool->uniformPool->pools[0].layoutCount = 0; + // pool->uniformPool->pools[0].layouts = NULL; + // pool->uniformPool->poolCount = 1; + // } + + // pool->uniformPool->currentPool = 0; - pool->uniformPool->poolCount = 1; - } - pool->uniformPool->currentPool = 0; return GN_SUCCESS; } gnUniform* gnUniformPoolAllocateUniformsFn(gnUniformPool pool, gnUniformAllocationInfo allocInfo) { - gnBool fixedAllocCount = pool->device->outputDevice->enabledOversizedDescriptorPools; + uint32_t startingCount = pool->uniformPool->pools[0].layouts.count; + VkDescriptorSetLayoutArrayListExpand(&pool->uniformPool->pools[0].layouts, allocInfo.setCount); - if (fixedAllocCount) { - if (pool->uniformPool->poolCount >= pool->uniformPool->maxPoolCount) { - pool->uniformPool->maxPoolCount *= 2; - pool->uniformPool->pools = realloc(pool->uniformPool->pools, sizeof(vkGryphnUniformPool) * pool->uniformPool->maxPoolCount); - } - - VkDescriptorPoolSize uniformBufferSize = { - .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - .descriptorCount = 0 - }; - - VkDescriptorPoolSize imageSize = { - .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, - .descriptorCount = 0 - }; - - for (int i = 0; i < allocInfo.setCount; i++) { - for (int c = 0; c < allocInfo.sets[i].uniformBindingCount; c++) { - if (allocInfo.sets[i].uniformBindings[i].type == GN_UNIFORM_BUFFER_DESCRIPTOR) uniformBufferSize.descriptorCount++; - if (allocInfo.sets[i].uniformBindings[i].type == GN_IMAGE_DESCRIPTOR) imageSize.descriptorCount++; - } - } - - - - VkDescriptorPoolCreateInfo poolInfo = { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, - .poolSizeCount = 1, - .pPoolSizes = (VkDescriptorPoolSize[]){ uniformBufferSize, imageSize }, - .maxSets = allocInfo.setCount - }; - - if (vkCreateDescriptorPool( - pool->device->outputDevice->device, &poolInfo, NULL, - &pool->uniformPool->pools[pool->uniformPool->poolCount].pool - ) != VK_SUCCESS) - return NULL; - pool->uniformPool->poolCount++; - - uint32_t maxSets = uniformBufferSize.descriptorCount + uniformBufferSize.descriptorCount; - } - - if (fixedAllocCount) - pool->uniformPool->pools[pool->uniformPool->currentPool].layouts = malloc(sizeof(VkDescriptorSetLayout) * allocInfo.setCount); - else - pool->uniformPool->pools[pool->uniformPool->currentPool].layouts = realloc( - pool->uniformPool->pools[pool->uniformPool->currentPool].layouts, - sizeof(VkDescriptorSetLayout) * (allocInfo.setCount + pool->uniformPool->pools[pool->uniformPool->currentPool].layoutCount)); for (int i = 0; i < allocInfo.setCount; i++) { - pool->uniformPool->pools[pool->uniformPool->currentPool].layouts[pool->uniformPool->pools[pool->uniformPool->currentPool].layoutCount + i] = vkGryphnCreateSetLayouts(&allocInfo.sets[i], pool->device->outputDevice->device); + VkDescriptorSetLayoutArrayListAdd( + &pool->uniformPool->pools[0].layouts, + vkGryphnCreateSetLayouts(&allocInfo.sets[i], pool->device->outputDevice->device) + ); } VkDescriptorSetAllocateInfo vkAllocInfo = { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, - .descriptorPool = pool->uniformPool->pools[pool->uniformPool->currentPool].pool, + .descriptorPool = pool->uniformPool->pools[0].pool, .descriptorSetCount = allocInfo.setCount, - .pSetLayouts = &pool->uniformPool->pools[pool->uniformPool->currentPool].layouts[pool->uniformPool->pools[pool->uniformPool->currentPool].layoutCount] + .pSetLayouts = &pool->uniformPool->pools[0].layouts.data[startingCount] }; - pool->uniformPool->pools[pool->uniformPool->currentPool].layoutCount += allocInfo.setCount; VkDescriptorSet* sets = malloc(sizeof(VkDescriptorSet) * allocInfo.setCount); if (vkAllocateDescriptorSets(pool->device->outputDevice->device, &vkAllocInfo, sets) != VK_SUCCESS) @@ -109,14 +84,91 @@ gnUniform* gnUniformPoolAllocateUniformsFn(gnUniformPool pool, gnUniformAllocati uniforms[i]->uniform->set = sets[i]; } return uniforms; + + // gnBool fixedAllocCount = pool->device->outputDevice->enabledOversizedDescriptorPools; + + // if (fixedAllocCount) { + // if (pool->uniformPool->poolCount >= pool->uniformPool->maxPoolCount) { + // pool->uniformPool->maxPoolCount *= 2; + // pool->uniformPool->pools = realloc(pool->uniformPool->pools, sizeof(vkGryphnUniformPool) * pool->uniformPool->maxPoolCount); + // } + + // VkDescriptorPoolSize uniformBufferSize = { + // .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + // .descriptorCount = 0 + // }; + + // VkDescriptorPoolSize imageSize = { + // .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + // .descriptorCount = 0 + // }; + + // for (int i = 0; i < allocInfo.setCount; i++) { + // for (int c = 0; c < allocInfo.sets[i].uniformBindingCount; c++) { + // if (allocInfo.sets[i].uniformBindings[i].type == GN_UNIFORM_BUFFER_DESCRIPTOR) uniformBufferSize.descriptorCount++; + // if (allocInfo.sets[i].uniformBindings[i].type == GN_IMAGE_DESCRIPTOR) imageSize.descriptorCount++; + // } + // } + + + + // VkDescriptorPoolCreateInfo poolInfo = { + // .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, + // .poolSizeCount = 1, + // .pPoolSizes = (VkDescriptorPoolSize[]){ uniformBufferSize, imageSize }, + // .maxSets = allocInfo.setCount + // }; + + // if (vkCreateDescriptorPool( + // pool->device->outputDevice->device, &poolInfo, NULL, + // &pool->uniformPool->pools[pool->uniformPool->poolCount].pool + // ) != VK_SUCCESS) + // return NULL; + // pool->uniformPool->poolCount++; + + // uint32_t maxSets = uniformBufferSize.descriptorCount + uniformBufferSize.descriptorCount; + // } + + // if (fixedAllocCount) + // pool->uniformPool->pools[pool->uniformPool->currentPool].layouts = malloc(sizeof(VkDescriptorSetLayout) * allocInfo.setCount); + // else { + // if (pool->uniformPool->pools[pool->uniformPool->currentPool].layouts == NULL) { + // pool->uniformPool->pools[pool->uniformPool->currentPool].layouts = malloc(sizeof(VkDescriptorSetLayout) * allocInfo.setCount); + // } + // else { + // pool->uniformPool->pools[pool->uniformPool->currentPool].layouts = realloc( + // pool->uniformPool->pools[pool->uniformPool->currentPool].layouts, + // sizeof(VkDescriptorSetLayout) * (allocInfo.setCount + pool->uniformPool->pools[pool->uniformPool->currentPool].layoutCount)); + // } + // } + // for (int i = 0; i < allocInfo.setCount; i++) { + // pool->uniformPool->pools[pool->uniformPool->currentPool].layouts[pool->uniformPool->pools[pool->uniformPool->currentPool].layoutCount + i] = vkGryphnCreateSetLayouts(&allocInfo.sets[i], pool->device->outputDevice->device); + // } + + // VkDescriptorSetAllocateInfo vkAllocInfo = { + // .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, + // .descriptorPool = pool->uniformPool->pools[pool->uniformPool->currentPool].pool, + // .descriptorSetCount = allocInfo.setCount, + // .pSetLayouts = &pool->uniformPool->pools[pool->uniformPool->currentPool].layouts[pool->uniformPool->pools[pool->uniformPool->currentPool].layoutCount] + // }; + // pool->uniformPool->pools[pool->uniformPool->currentPool].layoutCount += allocInfo.setCount; + + // 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.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]; + // } + // return uniforms; } void gnDestroyUniformPoolFn(gnUniformPool pool) { - for (int i = 0; i < pool->uniformPool->poolCount; i++) { - vkDestroyDescriptorPool(pool->device->outputDevice->device, pool->uniformPool->pools[i].pool, NULL); - for (int k = 0; k < pool->uniformPool->pools[i].layoutCount; k++) { - vkDestroyDescriptorSetLayout(pool->device->outputDevice->device, pool->uniformPool->pools[i].layouts[k], NULL); - } + vkDestroyDescriptorPool(pool->device->outputDevice->device, pool->uniformPool->pools[0].pool, NULL); + for (int i = 0; i < pool->uniformPool->pools[0].layouts.count; i++) { + vkDestroyDescriptorSetLayout(pool->device->outputDevice->device, pool->uniformPool->pools[0].layouts.data[i], NULL); } - // free(pool->uniformPool); } diff --git a/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.h b/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.h index a20c404..cca3fef 100644 --- a/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.h +++ b/rendering_api/vulkan/src/uniforms/vulkan_uniform_pool.h @@ -2,10 +2,11 @@ #include #include +GN_ARRAY_LIST(VkDescriptorSetLayout); + typedef struct vkGryphnUniformPool { VkDescriptorPool pool; - uint32_t layoutCount; - VkDescriptorSetLayout* layouts; + VkDescriptorSetLayoutArrayList layouts; } vkGryphnUniformPool; struct gnPlatformUniformPool_t { diff --git a/src/utils b/src/utils index 9edc972..a8fa3e4 160000 --- a/src/utils +++ b/src/utils @@ -1 +1 @@ -Subproject commit 9edc972b373085106dd986b8af3e3005c643772b +Subproject commit a8fa3e4da0d81325bb64a5dfdc986553d1d2a8da