From b12cc383864b89fead9fd7945396078cd7e4c7e2 Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Mon, 16 Jun 2025 10:04:11 -0400 Subject: [PATCH] enable descriptor pool overallocation if supported --- .../output_device/vulkan_device_extensions.c | 37 +++++++++++++++---- .../output_device/vulkan_device_extensions.h | 2 +- .../src/output_device/vulkan_output_device.c | 4 +- 3 files changed, 33 insertions(+), 10 deletions(-) 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 8f4a8ab..c37c731 100644 --- a/rendering_api/vulkan/src/output_device/vulkan_device_extensions.c +++ b/rendering_api/vulkan/src/output_device/vulkan_device_extensions.c @@ -1,16 +1,39 @@ #include "vulkan_device_extensions.h" +#include "utils/gryphn_bool.h" #include "stdlib.h" +#include "string.h" +#include "stdio.h" -const char* *vkGetGryphnDeviceExtensions(uint32_t* count) { - const char* *extensiosns = malloc(sizeof(const char*)); - extensiosns[0] = VK_KHR_SWAPCHAIN_EXTENSION_NAME; +const char* *vkGetGryphnDeviceExtensions(uint32_t* outCount, VkPhysicalDevice device) { + uint32_t count = 1; + const char* *extensiosns = malloc(sizeof(const char*) * count); + extensiosns[count-1] = VK_KHR_SWAPCHAIN_EXTENSION_NAME; - *count = 1; #ifdef GN_PLATFORM_MACOS - *count++; - extensiosns = realloc(sizeof(const char*), *count); - extensiosns[1] = "VK_KHR_portability_subset"; + count++; + extensiosns = realloc(extensiosns, sizeof(const char*) * count); + extensiosns[(count - 1)] = "VK_KHR_portability_subset"; #endif + uint32_t extensionCount = 0; + vkEnumerateDeviceExtensionProperties(device, NULL, &extensionCount, NULL); + VkExtensionProperties* vkExtensions = malloc(sizeof(VkExtensionProperties) * extensionCount); + vkEnumerateDeviceExtensionProperties(device, NULL, &extensionCount, vkExtensions); + + gnBool supportsDescriptorPoolOverallocation = gnFalse; + for (uint32_t i = 0; i < extensionCount; i++) { + if (strcmp(VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME, vkExtensions[i].extensionName) == 0) { + supportsDescriptorPoolOverallocation = gnTrue; + break; + } + } + free(vkExtensions); + + count++; + extensiosns = realloc(extensiosns, sizeof(const char*) * count); + extensiosns[(count - 1)] = VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME; + + *outCount = count; + return extensiosns; } diff --git a/rendering_api/vulkan/src/output_device/vulkan_device_extensions.h b/rendering_api/vulkan/src/output_device/vulkan_device_extensions.h index 42175ff..973eecd 100644 --- a/rendering_api/vulkan/src/output_device/vulkan_device_extensions.h +++ b/rendering_api/vulkan/src/output_device/vulkan_device_extensions.h @@ -1,4 +1,4 @@ #pragma once #include -const char* *vkGetGryphnDeviceExtensions(uint32_t* count); +const char* *vkGetGryphnDeviceExtensions(uint32_t* count, VkPhysicalDevice device); diff --git a/rendering_api/vulkan/src/output_device/vulkan_output_device.c b/rendering_api/vulkan/src/output_device/vulkan_output_device.c index 801a922..8c7f392 100644 --- a/rendering_api/vulkan/src/output_device/vulkan_output_device.c +++ b/rendering_api/vulkan/src/output_device/vulkan_output_device.c @@ -5,7 +5,7 @@ #include "core/instance/gryphn_instance.h" #include "commands/command_buffer/vulkan_command_buffer.h" -gnReturnCode gnCreateOutputDeviceFn(gnOutputDeviceHandle outputDevice, gnInstanceHandle instance, struct gnOutputDeviceInfo_t deviceInfo) { +gnReturnCode gnCreateOutputDeviceFn(gnOutputDeviceHandle outputDevice, gnInstanceHandle instance, gnOutputDeviceInfo deviceInfo) { outputDevice->outputDevice = malloc(sizeof(gnPlatformOutputDevice)); VkDeviceQueueCreateInfo* queueCreateInfos = malloc(sizeof(VkDeviceQueueCreateInfo) * deviceInfo.queueInfoCount); @@ -30,7 +30,7 @@ gnReturnCode gnCreateOutputDeviceFn(gnOutputDeviceHandle outputDevice, gnInstanc .pQueueCreateInfos = queueCreateInfos, .pEnabledFeatures = &deviceFeatures }; - deviceCreateInfo.ppEnabledExtensionNames = vkGetGryphnDeviceExtensions(&deviceCreateInfo.enabledExtensionCount); + deviceCreateInfo.ppEnabledExtensionNames = vkGetGryphnDeviceExtensions(&deviceCreateInfo.enabledExtensionCount, deviceInfo.physicalDevice.physicalDevice->device); if (instance->debugger == NULL) deviceCreateInfo.enabledLayerCount = 0;