bool Tutorial01::CreateDevice() { uint32_t num_devices = 0; if( (vkEnumeratePhysicalDevices( Vulkan.Instance, &num_devices, nullptr ) != VK_SUCCESS) || (num_devices == 0) ) { std::cout << "Error occurred during physical devices enumeration!" << std::endl; return false; } std::vector<VkPhysicalDevice> physical_devices( num_devices ); if( vkEnumeratePhysicalDevices( Vulkan.Instance, &num_devices, physical_devices.data() ) != VK_SUCCESS ) { std::cout << "Error occurred during physical devices enumeration!" << std::endl; return false; } VkPhysicalDevice selected_physical_device = VK_NULL_HANDLE; uint32_t selected_queue_family_index = UINT32_MAX; for( uint32_t i = 0; i < num_devices; ++i ) { if( CheckPhysicalDeviceProperties( physical_devices[i], selected_queue_family_index ) ) { selected_physical_device = physical_devices[i]; break; } } if( selected_physical_device == VK_NULL_HANDLE ) { std::cout << "Could not select physical device based on the chosen properties!" << std::endl; return false; } std::vector<float> queue_priorities = { 1.0f }; VkDeviceQueueCreateInfo queue_create_info = { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType nullptr, // const void *pNext 0, // VkDeviceQueueCreateFlags flags selected_queue_family_index, // uint32_t queueFamilyIndex static_cast<uint32_t>(queue_priorities.size()), // uint32_t queueCount queue_priorities.data() // const float *pQueuePriorities }; VkDeviceCreateInfo device_create_info = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // VkStructureType sType nullptr, // const void *pNext 0, // VkDeviceCreateFlags flags 1, // uint32_t queueCreateInfoCount &queue_create_info, // const VkDeviceQueueCreateInfo *pQueueCreateInfos 0, // uint32_t enabledLayerCount nullptr, // const char * const *ppEnabledLayerNames 0, // uint32_t enabledExtensionCount nullptr, // const char * const *ppEnabledExtensionNames nullptr // const VkPhysicalDeviceFeatures *pEnabledFeatures }; if( vkCreateDevice( selected_physical_device, &device_create_info, nullptr, &Vulkan.Device ) != VK_SUCCESS ) { std::cout << "Could not create Vulkan device!" << std::endl; return false; } Vulkan.QueueFamilyIndex = selected_queue_family_index; return true; }
void RegisterInstance(VkInstance instance, const InstanceData &data) { uint32_t num_devices = 0; data.vkEnumeratePhysicalDevices(instance, &num_devices, nullptr); std::vector<VkPhysicalDevice> physical_devices(num_devices); data.vkEnumeratePhysicalDevices(instance, &num_devices, physical_devices.data()); auto physical_device_map = GetGlobalContext().GetPhysicalDeviceMap(); for (VkPhysicalDevice physical_device : physical_devices) { PhysicalDeviceData dat{instance}; data.vkGetPhysicalDeviceMemoryProperties(physical_device, &dat.memory_properties_); data.vkGetPhysicalDeviceProperties(physical_device, &dat.physical_device_properties_); (*physical_device_map)[physical_device] = dat; } }
bool create_device() { uint32_t num_devices = 0; VK_VERIFY (vkEnumeratePhysicalDevices(vk_globals::instance, &num_devices, nullptr)); VERIFY_LOG (num_devices > 0, LOG_TYPE, "Error occurred during physical devices enumeration!", ""); std::vector<VkPhysicalDevice> physical_devices(num_devices); VK_VERIFY(vkEnumeratePhysicalDevices(vk_globals::instance, &num_devices, &physical_devices[0])); uint32_t selected_graphics_queue_family_index = UINT32_MAX; uint32_t selected_present_queue_family_index = UINT32_MAX; std::vector<const char *> extensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME }; for (uint32_t i = 0; i < num_devices; ++i) { if (check_physical_device_properties(physical_devices[i], selected_graphics_queue_family_index, selected_present_queue_family_index, extensions)) { vk_globals::gpu = physical_devices[i]; } } VERIFY_LOG (vk_globals::gpu != nullptr, LOG_TYPE, "Could not select physical device based on the chosen properties!", ""); vkGetPhysicalDeviceMemoryProperties(vk_globals::gpu, &vk_globals::gpu_memory_properties); std::vector<VkDeviceQueueCreateInfo> queue_create_infos; std::vector<float> queue_priorities = {1.0f}; queue_create_infos.push_back( { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType nullptr, // const void *pNext 0, // VkDeviceQueueCreateFlags flags selected_graphics_queue_family_index, // uint32_t queueFamilyIndex static_cast<uint32_t>(queue_priorities.size()), // uint32_t queueCount &queue_priorities[0] // const float *pQueuePriorities } ); if (selected_graphics_queue_family_index != selected_present_queue_family_index) { queue_create_infos.push_back( { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType nullptr, // const void *pNext 0, // VkDeviceQueueCreateFlags flags selected_present_queue_family_index, // uint32_t queueFamilyIndex static_cast<uint32_t>(queue_priorities.size()), // uint32_t queueCount &queue_priorities[0] // const float *pQueuePriorities } ); } VkDeviceCreateInfo device_create_info = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // VkStructureType sType nullptr, // const void *pNext 0, // VkDeviceCreateFlags flags static_cast<uint32_t>(queue_create_infos.size()), // uint32_t queueCreateInfoCount &queue_create_infos[0], // const VkDeviceQueueCreateInfo *pQueueCreateInfos 0, // uint32_t enabledLayerCount nullptr, // const char * const *ppEnabledLayerNames static_cast<uint32_t>(extensions.size()), // uint32_t enabledExtensionCount &extensions[0], // const char * const *ppEnabledExtensionNames nullptr // const VkPhysicalDeviceFeatures *pEnabledFeatures }; VK_VERIFY (vkCreateDevice(vk_globals::gpu, &device_create_info, nullptr, &(vk_globals::device))); vk_globals::graphics_queue.index = selected_graphics_queue_family_index; vk_globals::present_queue.index = selected_present_queue_family_index; return true; }
bool VulkanCommon::CreateDevice() { uint32_t num_devices = 0; if( (vkEnumeratePhysicalDevices( Vulkan.Instance, &num_devices, nullptr ) != VK_SUCCESS) || (num_devices == 0) ) { std::cout << "Error occurred during physical devices enumeration!" << std::endl; return false; } std::vector<VkPhysicalDevice> physical_devices( num_devices ); if( vkEnumeratePhysicalDevices( Vulkan.Instance, &num_devices, &physical_devices[0] ) != VK_SUCCESS ) { std::cout << "Error occurred during physical devices enumeration!" << std::endl; return false; } uint32_t selected_graphics_queue_family_index = UINT32_MAX; uint32_t selected_present_queue_family_index = UINT32_MAX; for( uint32_t i = 0; i < num_devices; ++i ) { if( CheckPhysicalDeviceProperties( physical_devices[i], selected_graphics_queue_family_index, selected_present_queue_family_index ) ) { Vulkan.PhysicalDevice = physical_devices[i]; } } if( Vulkan.PhysicalDevice == VK_NULL_HANDLE ) { std::cout << "Could not select physical device based on the chosen properties!" << std::endl; return false; } std::vector<VkDeviceQueueCreateInfo> queue_create_infos; std::vector<float> queue_priorities = { 1.0f }; queue_create_infos.push_back( { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType nullptr, // const void *pNext 0, // VkDeviceQueueCreateFlags flags selected_graphics_queue_family_index, // uint32_t queueFamilyIndex static_cast<uint32_t>(queue_priorities.size()), // uint32_t queueCount &queue_priorities[0] // const float *pQueuePriorities } ); if( selected_graphics_queue_family_index != selected_present_queue_family_index ) { queue_create_infos.push_back( { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType nullptr, // const void *pNext 0, // VkDeviceQueueCreateFlags flags selected_present_queue_family_index, // uint32_t queueFamilyIndex static_cast<uint32_t>(queue_priorities.size()), // uint32_t queueCount &queue_priorities[0] // const float *pQueuePriorities } ); } std::vector<const char*> extensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME }; VkDeviceCreateInfo device_create_info = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // VkStructureType sType nullptr, // const void *pNext 0, // VkDeviceCreateFlags flags static_cast<uint32_t>(queue_create_infos.size()), // uint32_t queueCreateInfoCount &queue_create_infos[0], // const VkDeviceQueueCreateInfo *pQueueCreateInfos 0, // uint32_t enabledLayerCount nullptr, // const char * const *ppEnabledLayerNames static_cast<uint32_t>(extensions.size()), // uint32_t enabledExtensionCount &extensions[0], // const char * const *ppEnabledExtensionNames nullptr // const VkPhysicalDeviceFeatures *pEnabledFeatures }; if( vkCreateDevice( Vulkan.PhysicalDevice, &device_create_info, nullptr, &Vulkan.Device ) != VK_SUCCESS ) { std::cout << "Could not create Vulkan device!" << std::endl; return false; } Vulkan.GraphicsQueue.FamilyIndex = selected_graphics_queue_family_index; Vulkan.PresentQueue.FamilyIndex = selected_present_queue_family_index; return true; }