From 8fef9a4830d01048ea3bb59d211e534c28a73b42 Mon Sep 17 00:00:00 2001 From: nek0 Date: Tue, 12 Jul 2022 16:58:25 +0200 Subject: [PATCH] pick queueFamily programmatically --- src/Devices.hs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Devices.hs b/src/Devices.hs index df37e9a..f57d191 100644 --- a/src/Devices.hs +++ b/src/Devices.hs @@ -7,6 +7,8 @@ import Control.Monad import Control.Monad.IO.Class (liftIO) import Control.Monad.Trans.Resource import qualified Data.Vector as V +import Data.Maybe (fromMaybe) +import Data.Bits import Foreign.C.Types (CInt) import Linear import qualified Vulkan as Vk @@ -64,10 +66,22 @@ createLogicalDevice physDevice surface = do putStrLn "There are currently following queue families available" print queueFamiliyProperties + let graphicsQueueFamilies = V.foldl + (\acc (index, queueFamily) -> + if Vk.queueFlags queueFamily .&. Vk.QUEUE_GRAPHICS_BIT /= zeroBits + then Just index + else acc + ) + Nothing + (V.zip (V.fromList [0..]) queueFamiliyProperties) + let priorities = V.singleton 1 extensionNames = V.singleton Vk.KHR_SWAPCHAIN_EXTENSION_NAME queueCreateInfo = Vk.zero - { Vk.queueFamilyIndex = 0 + { Vk.queueFamilyIndex = + fromMaybe + (error "createLogicalDevice: No suitable queu for graphics usage") + graphicsQueueFamilies , Vk.queuePriorities = priorities } deviceCreateInfo = Vk.zero @@ -84,7 +98,7 @@ createLogicalDevice physDevice surface = do (result, formats) <- Vk.getPhysicalDeviceSurfaceFormatsKHR physDevice surface unless (result == Vk.SUCCESS) $ - error "Failed retrieving surface image formats" + error "createLogicalDevice: Failed retrieving surface image formats" return (logDevice, formats)