]> O.S.I.I.S - jp/vkvg.git/commitdiff
expose public methods to query required inst and dev extensions as well as required...
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Fri, 25 Feb 2022 15:26:44 +0000 (16:26 +0100)
committerj-p <jp_bruyere@hotmail.com>
Sat, 26 Feb 2022 09:45:08 +0000 (10:45 +0100)
include/vkvg.h
src/vkvg_device.c
tests/common/vkengine.c
tests/common/vkengine.h

index d0b8deffbea78141182b046cfdbb856030472183..e6918def8a78185f59862aafa8357699450379c9 100644 (file)
@@ -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
index 69069512b315fec5d9d1f3f1a63f96a43c3e8e3d..6a48917425b59f37acf2556d4de424c2db0a1eb6 100644 (file)
@@ -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; i<extensionCount; i++) {
+               if (strcmp(name, pExtensionProperties[i].extensionName)==0)
+                       return true;
+       }
+       return false;
+}
+#define _CHECK_DEV_EXT(ext) {                                  \
+if (_get_dev_extension_is_supported(pExtensionProperties, extensionCount, #ext)){      \
+       if (pExtensions)                                                        \
+               pExtensions[*pExtCount] = #ext;                 \
+       (*pExtCount)++;                                                         \
+}
+void vkvg_get_required_device_extensions (VkPhysicalDevice phy, const char** pExtensions, uint32_t* pExtCount) {
+       VkExtensionProperties* pExtensionProperties;
+       uint32_t extensionCount;
+
+       *pExtCount = 0;
+
+       VK_CHECK_RESULT(vkEnumerateDeviceExtensionProperties(phy, NULL, &extensionCount, NULL));
+       pExtensionProperties = (VkExtensionProperties*)malloc(extensionCount * sizeof(VkExtensionProperties));
+       VK_CHECK_RESULT(vkEnumerateDeviceExtensionProperties(phy, NULL, &extensionCount, pExtensionProperties));
+
+       //https://vulkan.lunarg.com/doc/view/1.2.162.0/mac/1.2-extensions/vkspec.html#VK_KHR_portability_subset
+       _CHECK_DEV_EXT(VK_KHR_portability_subset)
+
+       if (_get_dev_extension_is_supported(pExtensionProperties, extensionCount, "VK_EXT_scalar_block_layout"))
+               if (pExtensions)
+                       pExtensions[*pExtCount] = "VK_EXT_scalar_block_layout";
+               (*pExtCount)++;
+
+       }
+}
+
+//enabledFeature12 is guarantied to be the first in pNext chain
+const void* vkvg_get_device_requirements (VkPhysicalDeviceFeatures* pEnabledFeatures) {
+
+       pEnabledFeatures->fillModeNonSolid = 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);
 
index 6f12e944d58a3bfd7b1785cfe4c2d218b65d853c..b43d3092186dbefb7862135ef108d047f98afa60 100644 (file)
@@ -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;i<enabledExtsCount;i++)
-               enabledExts[i] = gflwExts[i];
+       vkvg_get_required_instance_extensions (enabledExts, &enabledExtsCount);
 
-       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";
+       for (uint32_t i=0;i<glfwReqExtsCount;i++)
+               enabledExts[i+enabledExtsCount] = gflwExts[i];
 
-       vkh_instance_extensions_check_release();
+       enabledExtsCount += glfwReqExtsCount;
 
        vk_engine_t* e = (vk_engine_t*)calloc(1,sizeof(vk_engine_t));
-       e->app = 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);
 
index 3ca0c8825ba8bbc051de6438e54ec082813463e8..7b38b4aed3c8697154633fdd520c14d913dca8c6 100644 (file)
 
 #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;