{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE DataKinds #-} module Instance where import Control.Monad.IO.Class import Control.Monad.Trans.Resource import qualified Data.ByteString as BS import qualified Data.Vector as V import qualified SDL hiding (V2) import qualified SDL.Video.Vulkan as SDL import qualified Vulkan as Vk import qualified Vulkan.Zero as Vk createInstance :: MonadResource m => SDL.Window -> m Vk.Instance createInstance window = do windowExtensions <- liftIO $ fmap ( [ Vk.EXT_DEBUG_UTILS_EXTENSION_NAME ] ++) $ traverse BS.packCString =<< SDL.vkGetInstanceExtensions window liftIO $ do putStrLn "activating following extensions:" print windowExtensions let createInfo = Vk.zero { Vk.applicationInfo = Just Vk.zero { Vk.applicationName = Just "Haskell ❤️ Vulkan" , Vk.apiVersion = Vk.API_VERSION_1_3 } -- enable debug util extension for debugging purposes , Vk.enabledExtensionNames = V.fromList windowExtensions -- enable validation layer for debugging purposes -- , Vk.enabledLayerNames = V.singleton "VK_LAYER_KHRONOS_validation" } (_, inst) <- allocate (Vk.createInstance createInfo Nothing) (\inst -> do putStrLn "destroying instance" Vk.destroyInstance inst Nothing ) return inst