----------------------------------------------------------------------------- Purpose: Initialize Vulkan VkDevice -----------------------------------------------------------------------------
| 929 | // Purpose: Initialize Vulkan VkDevice |
| 930 | //----------------------------------------------------------------------------- |
| 931 | bool CMainApplication::BInitVulkanDevice() |
| 932 | { |
| 933 | uint32_t nDeviceCount = 0; |
| 934 | VkResult nResult = vkEnumeratePhysicalDevices( m_pInstance, &nDeviceCount, NULL ); |
| 935 | if ( nResult != VK_SUCCESS || nDeviceCount == 0 ) |
| 936 | { |
| 937 | dprintf( "vkEnumeratePhysicalDevices failed, unable to init and enumerate GPUs with Vulkan.\n" ); |
| 938 | return false; |
| 939 | } |
| 940 | |
| 941 | VkPhysicalDevice *pPhysicalDevices = new VkPhysicalDevice[ nDeviceCount ]; |
| 942 | nResult = vkEnumeratePhysicalDevices( m_pInstance, &nDeviceCount, pPhysicalDevices ); |
| 943 | if ( nResult != VK_SUCCESS || nDeviceCount == 0 ) |
| 944 | { |
| 945 | dprintf( "vkEnumeratePhysicalDevices failed, unable to init and enumerate GPUs with Vulkan.\n" ); |
| 946 | return false; |
| 947 | } |
| 948 | |
| 949 | // Query OpenVR for the physical device to use |
| 950 | uint64_t pHMDPhysicalDevice = 0; |
| 951 | m_pHMD->GetOutputDevice( &pHMDPhysicalDevice, vr::TextureType_Vulkan, ( VkInstance_T * ) m_pInstance ); |
| 952 | |
| 953 | // Select the HMD physical device |
| 954 | m_pPhysicalDevice = VK_NULL_HANDLE; |
| 955 | for ( uint32_t nPhysicalDevice = 0; nPhysicalDevice < nDeviceCount; nPhysicalDevice++ ) |
| 956 | { |
| 957 | if ( ( ( VkPhysicalDevice ) pHMDPhysicalDevice ) == pPhysicalDevices[ nPhysicalDevice ] ) |
| 958 | { |
| 959 | m_pPhysicalDevice = ( VkPhysicalDevice ) pHMDPhysicalDevice; |
| 960 | break; |
| 961 | } |
| 962 | } |
| 963 | if ( m_pPhysicalDevice == VK_NULL_HANDLE ) |
| 964 | { |
| 965 | // Fallback: Grab the first physical device |
| 966 | dprintf( "Failed to find GetOutputDevice VkPhysicalDevice, falling back to choosing first device.\n" ); |
| 967 | m_pPhysicalDevice = pPhysicalDevices[ 0 ]; |
| 968 | } |
| 969 | delete [] pPhysicalDevices; |
| 970 | |
| 971 | vkGetPhysicalDeviceProperties( m_pPhysicalDevice, &m_physicalDeviceProperties ); |
| 972 | vkGetPhysicalDeviceMemoryProperties( m_pPhysicalDevice, &m_physicalDeviceMemoryProperties ); |
| 973 | vkGetPhysicalDeviceFeatures( m_pPhysicalDevice, &m_physicalDeviceFeatures ); |
| 974 | |
| 975 | //--------------------// |
| 976 | // VkDevice creation // |
| 977 | //--------------------// |
| 978 | // Query OpenVR for the required device extensions for this physical device |
| 979 | std::vector< std::string > requiredDeviceExtensions; |
| 980 | GetVulkanDeviceExtensionsRequired( m_pPhysicalDevice, requiredDeviceExtensions ); |
| 981 | // Add additional required extensions |
| 982 | requiredDeviceExtensions.push_back( VK_KHR_SWAPCHAIN_EXTENSION_NAME ); |
| 983 | |
| 984 | // Find the first graphics queue |
| 985 | uint32_t nQueueCount = 0; |
| 986 | vkGetPhysicalDeviceQueueFamilyProperties( m_pPhysicalDevice, &nQueueCount, 0 ); |
| 987 | VkQueueFamilyProperties *pQueueFamilyProperties = new VkQueueFamilyProperties[ nQueueCount ]; |
| 988 | vkGetPhysicalDeviceQueueFamilyProperties( m_pPhysicalDevice, &nQueueCount, pQueueFamilyProperties ); |
nothing calls this directly
no test coverage detected