redo vulkan descriptor pool support on nvidia graphics cards

This commit is contained in:
Gregory Wells
2025-06-17 11:58:55 -04:00
parent b3bd2209be
commit 4a7eb0bcd1
4 changed files with 137 additions and 82 deletions

View File

@@ -29,9 +29,11 @@ const char* *vkGetGryphnDeviceExtensions(uint32_t* outCount, VkPhysicalDevice de
} }
free(vkExtensions); free(vkExtensions);
if (supportsDescriptorPoolOverallocation) {
count++; count++;
extensiosns = realloc(extensiosns, sizeof(const char*) * count); extensiosns = realloc(extensiosns, sizeof(const char*) * count);
extensiosns[(count - 1)] = VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME; extensiosns[(count - 1)] = VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME;
}
*outCount = count; *outCount = count;

View File

@@ -9,10 +9,9 @@
gnReturnCode gnCreateUniformPoolFn(gnUniformPool pool, gnDeviceHandle device) { gnReturnCode gnCreateUniformPoolFn(gnUniformPool pool, gnDeviceHandle device) {
pool->uniformPool = malloc(sizeof(struct gnPlatformUniformPool_t)); pool->uniformPool = malloc(sizeof(struct gnPlatformUniformPool_t));
pool->uniformPool->poolCount = 0; pool->uniformPool->poolCount = 0;
pool->uniformPool->maxPoolCount = 2; // pool->uniformPool->maxPoolCount = 2;
pool->uniformPool->pools = malloc(sizeof(vkGryphnUniformPool) * pool->uniformPool->maxPoolCount); pool->uniformPool->pools = malloc(sizeof(vkGryphnUniformPool) * pool->uniformPool->maxPoolCount);
if (device->outputDevice->enabledOversizedDescriptorPools == gnTrue) {
VkDescriptorPoolCreateInfo poolInfo = { VkDescriptorPoolCreateInfo poolInfo = {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
.flags = VK_DESCRIPTOR_POOL_CREATE_ALLOW_OVERALLOCATION_SETS_BIT_NV, .flags = VK_DESCRIPTOR_POOL_CREATE_ALLOW_OVERALLOCATION_SETS_BIT_NV,
@@ -23,80 +22,56 @@ gnReturnCode gnCreateUniformPoolFn(gnUniformPool pool, gnDeviceHandle device) {
if (vkCreateDescriptorPool( if (vkCreateDescriptorPool(
pool->device->outputDevice->device, &poolInfo, NULL, pool->device->outputDevice->device, &poolInfo, NULL,
&pool->uniformPool->pools[pool->uniformPool->poolCount].pool &pool->uniformPool->pools[0].pool
) != VK_SUCCESS) ) != VK_SUCCESS)
return GN_FAILED_TO_ALLOCATE_MEMORY; return GN_FAILED_TO_ALLOCATE_MEMORY;
pool->uniformPool->poolCount = 1; 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->currentPool = 0;
return GN_SUCCESS; return GN_SUCCESS;
} }
gnUniform* gnUniformPoolAllocateUniformsFn(gnUniformPool pool, gnUniformAllocationInfo allocInfo) { 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 i = 0; i < allocInfo.setCount; i++) {
for (int c = 0; c < allocInfo.sets[i].uniformBindingCount; c++) { VkDescriptorSetLayoutArrayListAdd(
if (allocInfo.sets[i].uniformBindings[i].type == GN_UNIFORM_BUFFER_DESCRIPTOR) uniformBufferSize.descriptorCount++; &pool->uniformPool->pools[0].layouts,
if (allocInfo.sets[i].uniformBindings[i].type == GN_IMAGE_DESCRIPTOR) imageSize.descriptorCount++; vkGryphnCreateSetLayouts(&allocInfo.sets[i], pool->device->outputDevice->device)
} );
}
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);
} }
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->currentPool].pool, .descriptorPool = pool->uniformPool->pools[0].pool,
.descriptorSetCount = allocInfo.setCount, .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); 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)
@@ -109,14 +84,91 @@ gnUniform* gnUniformPoolAllocateUniformsFn(gnUniformPool pool, gnUniformAllocati
uniforms[i]->uniform->set = sets[i]; uniforms[i]->uniform->set = sets[i];
} }
return uniforms; 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) { void gnDestroyUniformPoolFn(gnUniformPool pool) {
for (int i = 0; i < pool->uniformPool->poolCount; i++) { vkDestroyDescriptorPool(pool->device->outputDevice->device, pool->uniformPool->pools[0].pool, NULL);
vkDestroyDescriptorPool(pool->device->outputDevice->device, pool->uniformPool->pools[i].pool, NULL); for (int i = 0; i < pool->uniformPool->pools[0].layouts.count; i++) {
for (int k = 0; k < pool->uniformPool->pools[i].layoutCount; k++) { vkDestroyDescriptorSetLayout(pool->device->outputDevice->device, pool->uniformPool->pools[0].layouts.data[i], NULL);
vkDestroyDescriptorSetLayout(pool->device->outputDevice->device, pool->uniformPool->pools[i].layouts[k], NULL);
} }
}
// free(pool->uniformPool);
} }

View File

@@ -2,10 +2,11 @@
#include <vulkan/vulkan.h> #include <vulkan/vulkan.h>
#include <core/uniforms/gryphn_uniform_pool.h> #include <core/uniforms/gryphn_uniform_pool.h>
GN_ARRAY_LIST(VkDescriptorSetLayout);
typedef struct vkGryphnUniformPool { typedef struct vkGryphnUniformPool {
VkDescriptorPool pool; VkDescriptorPool pool;
uint32_t layoutCount; VkDescriptorSetLayoutArrayList layouts;
VkDescriptorSetLayout* layouts;
} vkGryphnUniformPool; } vkGryphnUniformPool;
struct gnPlatformUniformPool_t { struct gnPlatformUniformPool_t {