*/
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
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));
#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);
#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;
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);
#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; \
}
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];
#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);
&& !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};
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);
#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;