From 13bbf02a67129c55d2d8c1d117976bb6a450d592 Mon Sep 17 00:00:00 2001 From: pheonix Date: Sun, 11 Oct 2020 20:38:57 -0700 Subject: [PATCH] Vulkan API version auto selector (#2283) * [vulkan] Vulkan API auto-selection for latest available. - Selects for the maximum vulkan API version available on the host's vulkan driver for a created instance. - Stores the created instance's vulkan API version on RendererContextVK. - Created instance's vulkan API version dumped using BX_TRACE in MAJOR.MINOR.PATCH format. - Physical Device's vulkan API version dumped in MAJOR.MINOR.PATCH format. * Address code review notes. - Actually use `vkEnumerateInstanceVersion` if it exists. - Remove "bgfx supported" vulkan api static array. --- src/renderer_vk.cpp | 55 ++++++++++++++++++++++++++++++++------------- src/renderer_vk.h | 1 + 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/renderer_vk.cpp b/src/renderer_vk.cpp index 4d8dd3680..591bf7d66 100644 --- a/src/renderer_vk.cpp +++ b/src/renderer_vk.cpp @@ -1345,15 +1345,6 @@ VK_IMPORT { dumpExtensions(); - VkApplicationInfo appInfo; - appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; - appInfo.pNext = NULL; - appInfo.pApplicationName = "bgfx"; - appInfo.applicationVersion = BGFX_API_VERSION; - appInfo.pEngineName = "bgfx"; - appInfo.engineVersion = BGFX_API_VERSION; - appInfo.apiVersion = VK_MAKE_VERSION(1, 0, 0); //VK_HEADER_VERSION); - uint32_t numEnabledLayers = 0; const char* enabledLayer[Layer::Count]; @@ -1398,6 +1389,30 @@ VK_IMPORT } } + uint32_t vulkanApiVersionSelector; + if (NULL != vkEnumerateInstanceVersion) + { + result = vkEnumerateInstanceVersion(&vulkanApiVersionSelector); + if (VK_SUCCESS != result) + { + BX_TRACE("Init error: vkEnumerateInstanceVersion failed %d: %s.", result, getName(result) ); + goto error; + } + } + else + { + vulkanApiVersionSelector = VK_API_VERSION_1_0; + } + + VkApplicationInfo appInfo; + appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; + appInfo.pNext = NULL; + appInfo.pApplicationName = "bgfx"; + appInfo.applicationVersion = BGFX_API_VERSION; + appInfo.pEngineName = "bgfx"; + appInfo.engineVersion = BGFX_API_VERSION; + appInfo.apiVersion = vulkanApiVersionSelector; + VkInstanceCreateInfo ici; ici.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; ici.pNext = NULL; @@ -1418,12 +1433,16 @@ VK_IMPORT , m_allocatorCb , &m_instance ); - } - - if (VK_SUCCESS != result) - { - BX_TRACE("Init error: vkCreateInstance failed %d: %s.", result, getName(result) ); - goto error; + if (VK_SUCCESS != result) + { + BX_TRACE("Init error: vkCreateInstance failed %d: %s.", result, getName(result) ); + goto error; + } + m_instanceApiVersion = vulkanApiVersionSelector; + BX_TRACE("Instance API Version Selected: %d.%d.%d" + , VK_VERSION_MAJOR(m_instanceApiVersion) + , VK_VERSION_MINOR(m_instanceApiVersion) + , VK_VERSION_PATCH(m_instanceApiVersion) ); } errorState = ErrorState::InstanceCreated; @@ -1500,7 +1519,10 @@ VK_IMPORT_INSTANCE vkGetPhysicalDeviceProperties(physicalDevices[ii], &pdp); BX_TRACE("Physical device %d:", ii); BX_TRACE("\t Name: %s", pdp.deviceName); - BX_TRACE("\t API version: %x", pdp.apiVersion); + BX_TRACE("\t API version: %d.%d.%d" + , VK_VERSION_MAJOR(pdp.apiVersion) + , VK_VERSION_MINOR(pdp.apiVersion) + , VK_VERSION_PATCH(pdp.apiVersion) ); BX_TRACE("\tDriver version: %x", pdp.driverVersion); BX_TRACE("\t VendorId: %x", pdp.vendorID); BX_TRACE("\t DeviceId: %x", pdp.deviceID); @@ -4618,6 +4640,7 @@ VK_IMPORT_DEVICE VkDebugReportCallbackEXT m_debugReportCallback; VkInstance m_instance; VkPhysicalDevice m_physicalDevice; + uint32_t m_instanceApiVersion; VkPhysicalDeviceProperties m_deviceProperties; VkPhysicalDeviceMemoryProperties m_memoryProperties; diff --git a/src/renderer_vk.h b/src/renderer_vk.h index d557481d8..ca9145683 100644 --- a/src/renderer_vk.h +++ b/src/renderer_vk.h @@ -42,6 +42,7 @@ VK_IMPORT_FUNC(false, vkGetDeviceProcAddr); \ VK_IMPORT_FUNC(false, vkEnumerateInstanceExtensionProperties); \ VK_IMPORT_FUNC(false, vkEnumerateInstanceLayerProperties); \ + VK_IMPORT_FUNC(false, vkEnumerateInstanceVersion); \ #define VK_IMPORT_INSTANCE_ANDROID \ VK_IMPORT_INSTANCE_FUNC(true, vkCreateAndroidSurfaceKHR);