From: Jean-Philippe Bruyère Date: Fri, 25 Feb 2022 15:26:44 +0000 (+0100) Subject: expose public methods to query required inst and dev extensions as well as required... X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=755e7ee44fdddf2e9ca92ee764024ac77de5f7f8;p=jp%2Fvkvg.git expose public methods to query required inst and dev extensions as well as required features --- diff --git a/include/vkvg.h b/include/vkvg.h index d0b8def..e6918de 100644 --- a/include/vkvg.h +++ b/include/vkvg.h @@ -655,6 +655,34 @@ void vkvg_device_set_dpy (VkvgDevice dev, int hdpy, int vdpy); */ vkvg_public void vkvg_device_get_dpy (VkvgDevice dev, int* hdpy, int* vdpy); + +/** + * @brief query required instance extensions for vkvg. + * + * @param pExtensions a valid pointer to the array of extension names to fill, the size may be queried + * by calling this method with pExtension being a NULL pointer. + * @param pExtCount a valid pointer to an integer that will be fill with the required extension count. + */ +vkvg_public +void vkvg_get_required_instance_extensions (const char** pExtensions, uint32_t* pExtCount); +/** + * @brief query required device extensions for vkvg. + * @param phy the vulkan physical device that will be used to create the @ref VkvgDevice. + * @param pExtensions a valid pointer to the array of extension names to fill, the size may be queried + * by calling this method with pExtension being a NULL pointer. + * @param pExtCount a valid pointer to an integer that will be fill with the required extension count. + */ +vkvg_public +void vkvg_get_required_device_extensions (VkPhysicalDevice phy, const char** pExtensions, uint32_t* pExtCount); +/** + * @brief get vulkan device creation requirement to fit vkvg needs. + * + * @param pEnabledFeatures a pointer to the feature structure to fill for the vulkan device creation. + * @return the required pNext chain for the vulkan device creation. The first structure is guarantied to + * be VkPhysicalDeviceVulkan12Features if vulkan version is >= 1.2 + */ +vkvg_public +const void* vkvg_get_device_requirements (VkPhysicalDeviceFeatures* pEnabledFeatures); /** @}*/ /** @addtogroup surface diff --git a/src/vkvg_device.c b/src/vkvg_device.c index 6906951..6a48917 100644 --- a/src/vkvg_device.c +++ b/src/vkvg_device.c @@ -122,6 +122,89 @@ void _device_init (VkvgDevice dev, VkInstance inst, VkPhysicalDevice phy, VkDevi dev->status = VKVG_STATUS_SUCCESS; } +#define _CHECK_INST_EXT(ext)\ +if (vkh_instance_extension_supported(#ext)) { \ + if (pExtensions) \ + pExtensions[*pExtCount] = #ext; \ + (*pExtCount)++; \ +} +void vkvg_get_required_instance_extensions (const char** pExtensions, uint32_t* pExtCount) { + *pExtCount = 0; + + vkh_instance_extensions_check_init (); + +#if defined(DEBUG) && defined (VKVG_DBG_UTILS) + _CHECK_INST_EXT(VK_EXT_debug_utils) +#endif + _CHECK_INST_EXT(VK_KHR_get_physical_device_properties2) + + vkh_instance_extensions_check_release(); +} + +bool _get_dev_extension_is_supported (VkExtensionProperties* pExtensionProperties, uint32_t extensionCount, const char* name) { + for (uint32_t i=0; ifillModeNonSolid = true; + + void* pNext = NULL; + +#ifdef VKVG_VK_SCALAR_BLOCK_SUPPORTED +#ifdef VK_VERSION_1_2 + static VkPhysicalDeviceVulkan12Features enabledFeatures12 = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, + .scalarBlockLayout = VK_TRUE + }; + enabledFeatures12.pNext = pNext; + pNext = &enabledFeatures12; +#else + static VkPhysicalDeviceScalarBlockLayoutFeaturesEXT scalarBlockFeat = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT, + .scalarBlockLayout = VK_TRUE + }; + scalarBlockFeat.pNext = pNext; + pNext = &scalarBlockFeat; + +#endif +#endif + + return pNext; +} + + VkvgDevice vkvg_device_create(VkSampleCountFlags samples, bool deferredResolve) { LOG(VKVG_LOG_INFO, "CREATE Device\n"); VkvgDevice dev = (vkvg_device*)calloc(1,sizeof(vkvg_device)); @@ -149,17 +232,7 @@ VkvgDevice vkvg_device_create(VkSampleCountFlags samples, bool deferredResolve) #endif vkh_layers_check_release(); - vkh_instance_extensions_check_init (); - -#if defined(DEBUG) && defined (VKVG_DBG_UTILS) - bool dbgUtilsSupported = vkh_instance_extension_supported("VK_EXT_debug_utils"); - if (dbgUtilsSupported) - enabledExts[enabledExtsCount++] = "VK_EXT_debug_utils"; -#endif - if (vkh_instance_extension_supported("VK_KHR_get_physical_device_properties2")) - enabledExts[enabledExtsCount++] = "VK_KHR_get_physical_device_properties2"; - - vkh_instance_extensions_check_release(); + vkvg_get_required_instance_extensions (enabledExts, &enabledExtsCount); #ifdef VK_VERSION_1_2 VkhApp app = vkh_app_create(1, 2, "vkvg", enabledLayersCount, enabledLayers, enabledExtsCount, enabledExts); @@ -168,12 +241,12 @@ VkvgDevice vkvg_device_create(VkSampleCountFlags samples, bool deferredResolve) #endif #if defined(DEBUG) && defined (VKVG_DBG_UTILS) - if (dbgUtilsSupported) - vkh_app_enable_debug_messenger(app - , VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT - , VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT - , NULL); + vkh_app_enable_debug_messenger(app + , VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT + , VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT + , NULL); #endif + VkhPhyInfo* phys = vkh_app_get_phyinfos (app, &phyCount, VK_NULL_HANDLE); if (phyCount == 0) { dev->status = VKVG_STATUS_DEVICE_ERROR; @@ -207,49 +280,20 @@ VkvgDevice vkvg_device_create(VkSampleCountFlags samples, bool deferredResolve) VkPhysicalDeviceScalarBlockLayoutFeatures scalarBlockLayoutSupport = {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES}; phyFeat2.pNext = &scalarBlockLayoutSupport; - vkGetPhysicalDeviceFeatures2(pi->phy, &phyFeat2); + vkGetPhysicalDeviceFeatures2 (pi->phy, &phyFeat2); - TRY_LOAD_DEVICE_EXT (VK_EXT_blend_operation_advanced) - //https://vulkan.lunarg.com/doc/view/1.2.162.0/mac/1.2-extensions/vkspec.html#VK_KHR_portability_subset - TRY_LOAD_DEVICE_EXT (VK_KHR_portability_subset) - TRY_LOAD_DEVICE_EXT (VK_KHR_relaxed_block_layout) + vkvg_get_required_device_extensions (pi->phy, enabledExts, &enabledExtsCount); - VkPhysicalDeviceFeatures enabledFeatures = { - .fillModeNonSolid = true, - //.sampleRateShading = true - }; + VkPhysicalDeviceFeatures enabledFeatures = {0}; + const void* pNext = vkvg_get_device_requirements (&enabledFeatures); VkDeviceCreateInfo device_info = { .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, .queueCreateInfoCount = qCount, .pQueueCreateInfos = (VkDeviceQueueCreateInfo*)&pQueueInfos, .enabledExtensionCount = enabledExtsCount, .ppEnabledExtensionNames = enabledExts, - .pEnabledFeatures = &enabledFeatures}; - -#ifdef VKVG_VK_SCALAR_BLOCK_SUPPORTED - #ifdef VK_VERSION_1_2 - VkPhysicalDeviceVulkan12Features enabledFeatures12 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, - .scalarBlockLayout = VK_TRUE - }; - device_info.pNext = &enabledFeatures12; - #else - if (!vkh_phyinfo_try_get_extension_properties(pi, "VK_EXT_scalar_block_layout", NULL)) { - LOG(VKVG_LOG_ERR, "CREATE Device failed: VK_EXT_scalar_block_layout unsupported\n"); - dev->status = VKVG_STATUS_DEVICE_ERROR; - vkh_app_free_phyinfos (phyCount, phys); - vkh_app_destroy (app); - return dev; - } - enabledExts[device_info.enabledExtensionCount++] = "VK_EXT_scalar_block_layout"; - VkPhysicalDeviceScalarBlockLayoutFeaturesEXT scalarBlockFeat = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT, - .scalarBlockLayout = VK_TRUE - }; - device_info.pNext = &scalarBlockFeat; - #endif -#endif - + .pEnabledFeatures = &enabledFeatures, + .pNext = pNext}; VkhDevice vkhd = vkh_device_create(app, pi, &device_info); diff --git a/tests/common/vkengine.c b/tests/common/vkengine.c index 6f12e94..b43d309 100644 --- a/tests/common/vkengine.c +++ b/tests/common/vkengine.c @@ -28,6 +28,8 @@ #include "vkh_image.h" #include "vkh_device.h" +#include "vkvg.h" + #define TRY_LOAD_DEVICE_EXT(ext) { \ if (vkh_phyinfo_try_get_extension_properties(pi, #ext, NULL)) \ enabledExts[enabledExtsCount++] = #ext; \ @@ -111,17 +113,17 @@ bool instance_extension_supported (VkExtensionProperties* instanceExtProps, uint } vk_engine_t* vkengine_create (VkPhysicalDeviceType preferedGPU, VkPresentModeKHR presentMode, uint32_t width, uint32_t height) { - glfwSetErrorCallback(glfw_error_callback); + glfwSetErrorCallback(glfw_error_callback); - if (!glfwInit()) { - perror ("glfwInit failed"); - exit(-1); - } + if (!glfwInit()) { + perror ("glfwInit failed"); + exit(-1); + } - if (!glfwVulkanSupported()) { - perror ("glfwVulkanSupported return false."); - exit(-1); - } + if (!glfwVulkanSupported()) { + perror ("glfwVulkanSupported return false."); + exit(-1); + } const char* enabledLayers[10]; const char* enabledExts [10]; @@ -139,35 +141,35 @@ vk_engine_t* vkengine_create (VkPhysicalDeviceType preferedGPU, VkPresentModeKHR #endif vkh_layers_check_release(); - const char** gflwExts = glfwGetRequiredInstanceExtensions (&enabledExtsCount); + uint32_t glfwReqExtsCount = 0; + const char** gflwExts = glfwGetRequiredInstanceExtensions (&glfwReqExtsCount); - for (uint32_t i=0;iapp = vkh_app_create(1 ,2 , "vkvgTest", enabledLayersCount, enabledLayers, enabledExtsCount, enabledExts); + +#ifdef VK_VERSION_1_2 + e->app = vkh_app_create(1, 2, "vkvg", enabledLayersCount, enabledLayers, enabledExtsCount, enabledExts); +#else + e->app = vkh_app_create(1, 1, "vkvg", enabledLayersCount, enabledLayers, enabledExtsCount, enabledExts); +#endif + + #if defined(DEBUG) && defined (VKVG_DBG_UTILS) - if (dbgUtilsSupported) - vkh_app_enable_debug_messenger(e->app - , VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT - //| VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT - //| VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT - , VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT - | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT - //| VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT - //| VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT - , NULL); + vkh_app_enable_debug_messenger(e->app + , VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT + //| VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT + //| VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT + , VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT + | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT + //| VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT + //| VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT + , NULL); #endif glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); @@ -187,11 +189,10 @@ vk_engine_t* vkengine_create (VkPhysicalDeviceType preferedGPU, VkPresentModeKHR && !vkengine_try_get_phyinfo(phys, phyCount, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, &pi) && !vkengine_try_get_phyinfo(phys, phyCount, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU, &pi)) pi = phys[0]; + assert(pi && "No vulkan physical device found."); - if (pi) { - e->memory_properties = pi->memProps; - e->gpu_props = pi->properties; - } + e->memory_properties = pi->memProps; + e->gpu_props = pi->properties; uint32_t qCount = 0; float qPriorities[] = {0.0}; @@ -212,45 +213,19 @@ vk_engine_t* vkengine_create (VkPhysicalDeviceType preferedGPU, VkPresentModeKHR vkGetPhysicalDeviceFeatures2(pi->phy, &phyFeat2); + vkvg_get_required_device_extensions (pi->phy, enabledExts, &enabledExtsCount); TRY_LOAD_DEVICE_EXT (VK_KHR_swapchain) - TRY_LOAD_DEVICE_EXT (VK_EXT_blend_operation_advanced) - TRY_LOAD_DEVICE_EXT (VK_KHR_portability_subset) - TRY_LOAD_DEVICE_EXT (VK_KHR_relaxed_block_layout) - VkPhysicalDeviceFeatures enabledFeatures = { - .fillModeNonSolid = true, - //.sampleRateShading = true - }; + VkPhysicalDeviceFeatures enabledFeatures = {0}; + const void* pNext = vkvg_get_device_requirements (&enabledFeatures); VkDeviceCreateInfo device_info = { .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, .queueCreateInfoCount = qCount, .pQueueCreateInfos = (VkDeviceQueueCreateInfo*)&pQueueInfos, .enabledExtensionCount = enabledExtsCount, .ppEnabledExtensionNames = enabledExts, - .pEnabledFeatures = &enabledFeatures}; -#ifdef VKVG_VK_SCALAR_BLOCK_SUPPORTED - #ifdef VK_VERSION_1_2 - VkPhysicalDeviceVulkan12Features enabledFeatures12 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, - .scalarBlockLayout = VK_TRUE - }; - device_info.pNext = &enabledFeatures12; - #else - if (!vkh_phyinfo_try_get_extension_properties(pi, "VK_EXT_scalar_block_layout", NULL)) { - LOG(VKVG_LOG_ERR, "CREATE Device failed: VK_EXT_scalar_block_layout unsupported\n"); - dev->status = VKVG_STATUS_DEVICE_ERROR; - vkh_app_free_phyinfos (phyCount, phys); - vkh_app_destroy (app); - return dev; - } - enabledExts[device_info.enabledExtensionCount++] = "VK_EXT_scalar_block_layout"; - VkPhysicalDeviceScalarBlockLayoutFeaturesEXT scalarBlockFeat = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT, - .scalarBlockLayout = VK_TRUE - }; - device_info.pNext = &scalarBlockFeat; - #endif -#endif + .pEnabledFeatures = &enabledFeatures, + .pNext = pNext}; e->dev = vkh_device_create(e->app, pi, &device_info); diff --git a/tests/common/vkengine.h b/tests/common/vkengine.h index 3ca0c88..7b38b4a 100644 --- a/tests/common/vkengine.h +++ b/tests/common/vkengine.h @@ -34,12 +34,6 @@ #include "vkh.h" -#ifdef VK_VERSION_1_2 - #ifndef VKVG_VK_SCALAR_BLOCK_SUPPORTED - #define VKVG_VK_SCALAR_BLOCK_SUPPORTED 1 - #endif -#endif - #define FENCE_TIMEOUT 100000000 typedef struct _vk_engine_t* VkEngine;