MCPcopy Create free account
hub / github.com/ValveSoftware/openvr / BInitVulkanDevice

Method BInitVulkanDevice

samples/hellovr_vulkan/hellovr_vulkan_main.cpp:931–1078  ·  view source on GitHub ↗

----------------------------------------------------------------------------- Purpose: Initialize Vulkan VkDevice -----------------------------------------------------------------------------

Source from the content-addressed store, hash-verified

929// Purpose: Initialize Vulkan VkDevice
930//-----------------------------------------------------------------------------
931bool 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 );

Callers

nothing calls this directly

Calls 4

GetOutputDeviceMethod · 0.80
sizeMethod · 0.80
dprintfFunction · 0.70
stricmpFunction · 0.50

Tested by

no test coverage detected