Correctly check if device/queue supports presenting to surface
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user