diff --git a/liblava/base/device.cpp b/liblava/base/device.cpp index 9b7861b6aa5f8ac0686128e33c79d86968370c7c..2d2d15f29d6ba42f5eb995ff68a94f469d08ce2a 100644 --- a/liblava/base/device.cpp +++ b/liblava/base/device.cpp @@ -191,7 +191,12 @@ namespace lava { } bool device::surface_supported(VkSurfaceKHR surface) const { - return physical_device->surface_supported(get_graphics_queue().family, surface); + for (auto& queue : queue_list) { + if (physical_device->surface_supported(queue.family, surface)) + return true; + } + + return false; } VkPhysicalDevice device::get_vk_physical_device() const { diff --git a/liblava/base/queue.hpp b/liblava/base/queue.hpp index 9882e65fab18dd8f13891800e9c3ba355e3b262b..e9c2e8b36da5d80e1fa0b57ef685db46bf9c63dd 100644 --- a/liblava/base/queue.hpp +++ b/liblava/base/queue.hpp @@ -18,6 +18,10 @@ namespace lava { index family = 0; r32 priority = 1.f; + bool valid() const { + return vk_queue != nullptr; + } + bool operator<(queue const& other) const { return priority < other.priority; } diff --git a/liblava/frame/renderer.cpp b/liblava/frame/renderer.cpp index 5277313b37a66be0d7c29ff3202d226b3bcec3fc..03725d8f236a6eddee9cc3a772b18345f08855d3 100644 --- a/liblava/frame/renderer.cpp +++ b/liblava/frame/renderer.cpp @@ -8,10 +8,19 @@ namespace lava { bool renderer::create(swapchain* t) { + for (auto& queue : t->get_device()->get_graphics_queues()) { + if (t->surface_supported(queue.family)) { + graphics_queue = queue; + break; + } + } + + if (!graphics_queue.valid()) + return false; + target = t; device = target->get_device(); - graphics_queue = device->get_graphics_queue(); queued_frames = target->get_backbuffer_count(); fences.resize(queued_frames); diff --git a/liblava/frame/swapchain.cpp b/liblava/frame/swapchain.cpp index 25f1d54dff503a01ac55fd6e2ab253e6cb8b6657..16b80e855c210b44678c9cb9afdfda3529b44a94 100644 --- a/liblava/frame/swapchain.cpp +++ b/liblava/frame/swapchain.cpp @@ -226,4 +226,8 @@ namespace lava { remove(callbacks, cb); } + bool swapchain::surface_supported(index queue_family) const { + return device->get_physical_device()->surface_supported(queue_family, surface); + } + } // namespace lava diff --git a/liblava/frame/swapchain.hpp b/liblava/frame/swapchain.hpp index cd59d3cb577214c4257c2f121ddf011b73854e9a..8b2abcd6cb8f5105433dd87f7c81cc59d82ff03d 100644 --- a/liblava/frame/swapchain.hpp +++ b/liblava/frame/swapchain.hpp @@ -61,6 +61,8 @@ namespace lava { return v_sync_active; } + bool surface_supported(index queue_family) const; + private: void set_surface_format();