diff options
| author | Stenzek <stenzek@users.noreply.github.com> | 2017-09-06 18:32:43 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-09-06 18:32:43 +1000 |
| commit | 2e20cd0ffdfb909a52a70217474fa5b53bd12996 (patch) | |
| tree | 559a4d64b6da3be1ee1565dfa8ea8f2da95af216 /Source/Core/VideoBackends/Vulkan/VulkanContext.cpp | |
| parent | 92e5f5c5684c0ef4fac55497e939e21336eb14cb (diff) | |
| parent | a5be5a3a765207b55b16661cc182e5c5bbbf55de (diff) | |
Merge pull request #6025 from spxtr/present_queue
Vulkan: Use a separate queue for presenting.
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/VulkanContext.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/Vulkan/VulkanContext.cpp | 95 |
1 files changed, 63 insertions, 32 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp b/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp index 8bb7a5088e..9258a28f6f 100644 --- a/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp +++ b/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp @@ -494,36 +494,41 @@ bool VulkanContext::CreateDevice(VkSurfaceKHR surface, bool enable_validation_la queue_family_properties.data()); INFO_LOG(VIDEO, "%u vulkan queue families", queue_family_count); - // Find a graphics queue - // Currently we only use a single queue for both graphics and presenting. - // TODO: In the future we could do post-processing and presenting on a different queue. + // Find graphics and present queues. m_graphics_queue_family_index = queue_family_count; + m_present_queue_family_index = queue_family_count; for (uint32_t i = 0; i < queue_family_count; i++) { - if (queue_family_properties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) + VkBool32 graphics_supported = queue_family_properties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT; + if (graphics_supported) { - // Check that it can present to our surface from this queue - if (surface) + m_graphics_queue_family_index = i; + // Quit now, no need for a present queue. + if (!surface) { - VkBool32 present_supported; - VkResult res = - vkGetPhysicalDeviceSurfaceSupportKHR(m_physical_device, i, surface, &present_supported); - if (res != VK_SUCCESS) - { - LOG_VULKAN_ERROR(res, "vkGetPhysicalDeviceSurfaceSupportKHR failed: "); - return false; - } - - if (present_supported) - { - m_graphics_queue_family_index = i; - break; - } + break; + } + } + + if (surface) + { + VkBool32 present_supported; + VkResult res = + vkGetPhysicalDeviceSurfaceSupportKHR(m_physical_device, i, surface, &present_supported); + if (res != VK_SUCCESS) + { + LOG_VULKAN_ERROR(res, "vkGetPhysicalDeviceSurfaceSupportKHR failed: "); + return false; + } + + if (present_supported) + { + m_present_queue_family_index = i; } - else + + // Prefer one queue family index that does both graphics and present. + if (graphics_supported && present_supported) { - // We don't need present, so any graphics queue will do. - m_graphics_queue_family_index = i; break; } } @@ -533,6 +538,11 @@ bool VulkanContext::CreateDevice(VkSurfaceKHR surface, bool enable_validation_la ERROR_LOG(VIDEO, "Vulkan: Failed to find an acceptable graphics queue."); return false; } + if (surface && m_present_queue_family_index == queue_family_count) + { + ERROR_LOG(VIDEO, "Vulkan: Failed to find an acceptable present queue."); + return false; + } VkDeviceCreateInfo device_info = {}; device_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; @@ -540,15 +550,32 @@ bool VulkanContext::CreateDevice(VkSurfaceKHR surface, bool enable_validation_la device_info.flags = 0; static constexpr float queue_priorities[] = {1.0f}; - VkDeviceQueueCreateInfo queue_info = {}; - queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; - queue_info.pNext = nullptr; - queue_info.flags = 0; - queue_info.queueFamilyIndex = m_graphics_queue_family_index; - queue_info.queueCount = 1; - queue_info.pQueuePriorities = queue_priorities; + VkDeviceQueueCreateInfo graphics_queue_info = {}; + graphics_queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + graphics_queue_info.pNext = nullptr; + graphics_queue_info.flags = 0; + graphics_queue_info.queueFamilyIndex = m_graphics_queue_family_index; + graphics_queue_info.queueCount = 1; + graphics_queue_info.pQueuePriorities = queue_priorities; + + VkDeviceQueueCreateInfo present_queue_info = {}; + present_queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + present_queue_info.pNext = nullptr; + present_queue_info.flags = 0; + present_queue_info.queueFamilyIndex = m_present_queue_family_index; + present_queue_info.queueCount = 1; + present_queue_info.pQueuePriorities = queue_priorities; + + std::array<VkDeviceQueueCreateInfo, 2> queue_infos = {{ + graphics_queue_info, present_queue_info, + }}; + device_info.queueCreateInfoCount = 1; - device_info.pQueueCreateInfos = &queue_info; + if (m_graphics_queue_family_index != m_present_queue_family_index) + { + device_info.queueCreateInfoCount = 2; + } + device_info.pQueueCreateInfos = queue_infos.data(); ExtensionList enabled_extensions; if (!SelectDeviceExtensions(&enabled_extensions, surface != VK_NULL_HANDLE)) @@ -584,8 +611,12 @@ bool VulkanContext::CreateDevice(VkSurfaceKHR surface, bool enable_validation_la if (!LoadVulkanDeviceFunctions(m_device)) return false; - // Grab the graphics queue (only one we're using at this point). + // Grab the graphics and present queues. vkGetDeviceQueue(m_device, m_graphics_queue_family_index, 0, &m_graphics_queue); + if (surface) + { + vkGetDeviceQueue(m_device, m_present_queue_family_index, 0, &m_present_queue); + } return true; } |
