Correctly check if device/queue supports presenting to surface

This commit is contained in:
2025-05-09 15:58:13 +10:00
parent b4284fb6ee
commit fd5cdbf692

View File

@@ -351,19 +351,23 @@ bool VulkanRenderDriver::get_device_supports_surface(const u32 p_index, SurfaceI
NOVA_ASSERT(p_index < m_devices.size()); NOVA_ASSERT(p_index < m_devices.size());
NOVA_ASSERT(p_surface); NOVA_ASSERT(p_surface);
// TODO: Check other queue families? VkPhysicalDevice physical_device = static_cast<VkPhysicalDevice>(m_devices[p_index].handle);
VkBool32 supported = false; u32 count;
if (vkGetPhysicalDeviceSurfaceSupportKHR( vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &count, nullptr);
static_cast<VkPhysicalDevice>(m_devices[p_index].handle),
0, for (u32 i = 0; i < count; i++) {
p_surface->handle, VkBool32 supports_present = VK_FALSE;
&supported if (vkGetPhysicalDeviceSurfaceSupportKHR(physical_device, i, p_surface->handle, &supports_present)
) != VK_SUCCESS) {
!= VK_SUCCESS) { continue;
return false; }
if (supports_present) {
return true;
}
} }
return supported;
return false;
} }
void VulkanRenderDriver::select_device(const u32 p_index) { void VulkanRenderDriver::select_device(const u32 p_index) {
@@ -397,9 +401,12 @@ u32 VulkanRenderDriver::choose_queue_family(QueueType p_type, SurfaceID p_surfac
continue; continue;
} }
if (p_surface) { if (p_surface) {
VkBool32 supports_surface; VkBool32 supports_present = VK_FALSE;
vkGetPhysicalDeviceSurfaceSupportKHR(m_physical_device, index, p_surface->handle, &supports_surface); if (vkGetPhysicalDeviceSurfaceSupportKHR(m_physical_device, index, p_surface->handle, &supports_present)
if (!supports_surface) { != VK_SUCCESS) {
continue;
}
if (!supports_present) {
continue; continue;
} }
} }
@@ -416,7 +423,7 @@ u32 VulkanRenderDriver::choose_queue_family(QueueType p_type, SurfaceID p_surfac
QueueID VulkanRenderDriver::get_queue(u32 p_queue_family) { QueueID VulkanRenderDriver::get_queue(u32 p_queue_family) {
NOVA_AUTO_TRACE(); NOVA_AUTO_TRACE();
NOVA_ASSERT(m_queue_families.contains(p_queue_family)); NOVA_ASSERT(!m_queues.empty());
QueueID best_queue = nullptr; QueueID best_queue = nullptr;
u32 best_usage = std::numeric_limits<u32>::max(); u32 best_usage = std::numeric_limits<u32>::max();
@@ -431,9 +438,11 @@ QueueID VulkanRenderDriver::get_queue(u32 p_queue_family) {
} }
} }
if (best_queue) { if (!best_queue) {
best_queue->usage_count++; throw std::runtime_error("Failed to find a queue");
} }
best_queue->usage_count++;
return best_queue; return best_queue;
} }