diff --git a/include/vkcv/QueueManager.hpp b/include/vkcv/QueueManager.hpp index 0919d20d8e07fee67ceb2f393c29b4a53c51b857..9d219c9d7a308cac29bec1580bd8894a70f68fb3 100644 --- a/include/vkcv/QueueManager.hpp +++ b/include/vkcv/QueueManager.hpp @@ -39,6 +39,14 @@ namespace vkcv { std::vector<std::pair<int, int>> &queuePairsCompute, std::vector<std::pair<int, int>> &queuePairsTransfer); + /** + * checks for surface support in the queues + * @param physicalDevice to get the Queues + * @param surface that needs to checked + * @return + */ + static uint32_t checkSurfaceSupport(const vk::PhysicalDevice &physicalDevice, vk::SurfaceKHR &surface); + private: std::vector<Queue> m_graphicsQueues; std::vector<Queue> m_computeQueues; diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp index 78ec4afe42aa96aec781e6b873676453d083487c..cad1a54a6de599ddc3d2c911a6deca53a634faab 100644 --- a/projects/first_triangle/src/main.cpp +++ b/projects/first_triangle/src/main.cpp @@ -18,7 +18,7 @@ int main(int argc, const char** argv) { { VK_KHR_SWAPCHAIN_EXTENSION_NAME } ); - vkcv::WindowHandle windowHandle = core.createWindow(applicationName, windowWidth, windowHeight, false); + vkcv::WindowHandle windowHandle = core.createWindow(applicationName, windowWidth, windowHeight, true); vkcv::Window& window = core.getWindow(windowHandle); auto triangleIndexBuffer = core.createBuffer<uint16_t>(vkcv::BufferType::INDEX, 3, vkcv::BufferMemoryType::DEVICE_LOCAL); diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp index a4383acc1cf7a03f894cf206b38a6948ab8dd76d..ff075c03aebb4847a0b37f81650cb2db472963ab 100644 --- a/src/vkcv/Core.cpp +++ b/src/vkcv/Core.cpp @@ -545,7 +545,7 @@ namespace vkcv vk::Result result; try { - result = queueManager.getPresentQueue().handle.presentKHR(presentInfo); + result = m_Context.getDevice().getQueue(m_SwapchainManager->getSwapchain(swapchainHandle).getPresentQueueIndex(),0).presentKHR(presentInfo); } catch (const vk::OutOfDateKHRError& e) { result = vk::Result::eErrorOutOfDateKHR; } catch (const vk::DeviceLostError& e) { diff --git a/src/vkcv/QueueManager.cpp b/src/vkcv/QueueManager.cpp index 3b50c4b21bd8c399061d5887865fa3b71a24c0f5..6f118595ca5cdbcb54adff1666d636e95b5b6415 100644 --- a/src/vkcv/QueueManager.cpp +++ b/src/vkcv/QueueManager.cpp @@ -5,6 +5,7 @@ #include "vkcv/QueueManager.hpp" #include "vkcv/Logger.hpp" +#include "vkcv/Swapchain.hpp" namespace vkcv { @@ -199,6 +200,24 @@ namespace vkcv { return QueueManager( std::move(graphicsQueues), std::move(computeQueues), std::move(transferQueues), 0); } + uint32_t QueueManager::checkSurfaceSupport( + const vk::PhysicalDevice &physicalDevice, + vk::SurfaceKHR &surface + ) { + std::vector<vk::QueueFamilyProperties> qFamilyProperties = physicalDevice.getQueueFamilyProperties(); + std::vector<vk::Bool32> presentSupport(qFamilyProperties.size(),-1); + + for(uint32_t i = 0; i < qFamilyProperties.size(); i++) + { + physicalDevice.getSurfaceSupportKHR(i,surface,&presentSupport[i]); + if(presentSupport[i] == VK_TRUE){ + return i; + } + } + vkcv_log(LogLevel::WARNING, "no supported present queueQ"); + return 0; + } + QueueManager::QueueManager(std::vector<Queue>&& graphicsQueues, std::vector<Queue>&& computeQueues, std::vector<Queue>&& transferQueues, size_t presentIndex) : m_graphicsQueues(graphicsQueues), m_computeQueues(computeQueues), m_transferQueues(transferQueues), m_presentIndex(presentIndex) {} diff --git a/src/vkcv/Swapchain.cpp b/src/vkcv/Swapchain.cpp index dc5c73df3bbf7d701880c7ffd6ff2d04e8805da5..90f589266cf51cbb3ef98edb5d64362c0a650c14 100644 --- a/src/vkcv/Swapchain.cpp +++ b/src/vkcv/Swapchain.cpp @@ -160,10 +160,11 @@ namespace vkcv const vk::Device& device = context.getDevice(); Surface surface; - surface.handle = createSurface(window.getWindow(), instance, physicalDevice); - surface.formats = physicalDevice.getSurfaceFormatsKHR(surface.handle); - surface.capabilities = physicalDevice.getSurfaceCapabilitiesKHR(surface.handle); - surface.presentModes = physicalDevice.getSurfacePresentModesKHR(surface.handle); + surface.handle = createSurface(window.getWindow(), instance, physicalDevice); + surface.formats = physicalDevice.getSurfaceFormatsKHR(surface.handle); + surface.capabilities = physicalDevice.getSurfaceCapabilitiesKHR(surface.handle); + surface.presentModes = physicalDevice.getSurfacePresentModesKHR(surface.handle); + surface.presentQueueIndex = QueueManager::checkSurfaceSupport(physicalDevice, surface.handle); vk::Extent2D chosenExtent = chooseExtent(physicalDevice, surface.handle, window); vk::SurfaceFormatKHR chosenSurfaceFormat = chooseSurfaceFormat(physicalDevice, surface.handle);