{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts, FlexibleInstances, UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
module Gpu.Vulkan.Instance.Internal (
create, I(..), CreateInfo(..), ExtensionName(..),
enumerateLayerProperties,
enumerateExtensionProperties, ExtensionProperties(..),
) where
import Foreign.Storable.PeekPoke
import Control.Exception
import Data.TypeLevel.Maybe qualified as TMaybe
import Data.TypeLevel.ParMaybe qualified as TPMaybe
import Data.TypeLevel.Tuple.Uncurry
import Data.Default
import Gpu.Vulkan.Internal
import Gpu.Vulkan.Instance.Type
import qualified Gpu.Vulkan.AllocationCallbacks as AllocationCallbacks
import qualified Gpu.Vulkan.AllocationCallbacks.Type as AllocationCallbacks
import Gpu.Vulkan.Instance.Enum
import qualified Gpu.Vulkan.Instance.Middle as M
import Data.Text qualified as T
import Gpu.Vulkan.Middle qualified as M
create :: (
WithPoked (TMaybe.M mn), WithPoked (TMaybe.M ai),
AllocationCallbacks.ToMiddle mac ) =>
CreateInfo mn ai ->
TPMaybe.M (U2 AllocationCallbacks.A) mac ->
(forall s . I s -> IO a) -> IO a
create :: forall (mn :: Maybe (*)) (ai :: Maybe (*)) (mac :: Maybe (*, *)) a.
(WithPoked (M mn), WithPoked (M ai), ToMiddle mac) =>
CreateInfo mn ai -> M (U2 A) mac -> (forall s. I s -> IO a) -> IO a
create (CreateInfo mn ai -> CreateInfo mn ai
forall (mn :: Maybe (*)) (ai :: Maybe (*)).
CreateInfo mn ai -> CreateInfo mn ai
createInfoToMiddle -> CreateInfo mn ai
ci) (M (U2 A) mac -> M A (Snd mac)
forall (msa :: Maybe (*, *)).
ToMiddle msa =>
M (U2 A) msa -> M A (Snd msa)
AllocationCallbacks.toMiddle -> M A (Snd mac)
mac) forall s. I s -> IO a
f =
IO I -> (I -> IO ()) -> (I -> IO a) -> IO a
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (CreateInfo mn ai -> M A (Snd mac) -> IO I
forall (mn :: Maybe (*)) (a :: Maybe (*)) (mc :: Maybe (*)).
(WithPoked (M mn), WithPoked (M a)) =>
CreateInfo mn a -> M A mc -> IO I
M.create CreateInfo mn ai
ci M A (Snd mac)
mac) (I -> M A (Snd mac) -> IO ()
forall (md :: Maybe (*)). I -> M A md -> IO ()
`M.destroy` M A (Snd mac)
mac) (I Any -> IO a
forall s. I s -> IO a
f (I Any -> IO a) -> (I -> I Any) -> I -> IO a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. I -> I Any
forall s. I -> I s
I)
data CreateInfo mn ai = CreateInfo {
forall (mn :: Maybe (*)) (ai :: Maybe (*)).
CreateInfo mn ai -> M mn
createInfoNext :: TMaybe.M mn,
forall (mn :: Maybe (*)) (ai :: Maybe (*)).
CreateInfo mn ai -> CreateFlags
createInfoFlags :: CreateFlags,
forall (mn :: Maybe (*)) (ai :: Maybe (*)).
CreateInfo mn ai -> Maybe (ApplicationInfo ai)
createInfoApplicationInfo :: Maybe (ApplicationInfo ai),
forall (mn :: Maybe (*)) (ai :: Maybe (*)).
CreateInfo mn ai -> [LayerName]
createInfoEnabledLayerNames :: [LayerName],
forall (mn :: Maybe (*)) (ai :: Maybe (*)).
CreateInfo mn ai -> [ExtensionName]
createInfoEnabledExtensionNames :: [ExtensionName] }
newtype ExtensionName = ExtensionName { ExtensionName -> Text
unExtensionName :: T.Text }
deriving (Int -> ExtensionName -> ShowS
[ExtensionName] -> ShowS
ExtensionName -> String
(Int -> ExtensionName -> ShowS)
-> (ExtensionName -> String)
-> ([ExtensionName] -> ShowS)
-> Show ExtensionName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ExtensionName -> ShowS
showsPrec :: Int -> ExtensionName -> ShowS
$cshow :: ExtensionName -> String
show :: ExtensionName -> String
$cshowList :: [ExtensionName] -> ShowS
showList :: [ExtensionName] -> ShowS
Show, ExtensionName -> ExtensionName -> Bool
(ExtensionName -> ExtensionName -> Bool)
-> (ExtensionName -> ExtensionName -> Bool) -> Eq ExtensionName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ExtensionName -> ExtensionName -> Bool
== :: ExtensionName -> ExtensionName -> Bool
$c/= :: ExtensionName -> ExtensionName -> Bool
/= :: ExtensionName -> ExtensionName -> Bool
Eq)
deriving instance (Show (TMaybe.M mn), Show (TMaybe.M ai)) =>
Show (CreateInfo mn ai)
instance Default (CreateInfo 'Nothing a) where
def :: CreateInfo 'Nothing a
def = CreateInfo {
createInfoNext :: M 'Nothing
createInfoNext = M 'Nothing
TMaybe.N,
createInfoFlags :: CreateFlags
createInfoFlags = CreateFlags
CreateFlagsZero,
createInfoApplicationInfo :: Maybe (ApplicationInfo a)
createInfoApplicationInfo = Maybe (ApplicationInfo a)
forall a. Maybe a
Nothing,
createInfoEnabledLayerNames :: [LayerName]
createInfoEnabledLayerNames = [],
createInfoEnabledExtensionNames :: [ExtensionName]
createInfoEnabledExtensionNames = [] }
createInfoToMiddle :: CreateInfo mn ai -> M.CreateInfo mn ai
createInfoToMiddle :: forall (mn :: Maybe (*)) (ai :: Maybe (*)).
CreateInfo mn ai -> CreateInfo mn ai
createInfoToMiddle CreateInfo {
createInfoNext :: forall (mn :: Maybe (*)) (ai :: Maybe (*)).
CreateInfo mn ai -> M mn
createInfoNext = M mn
nxt,
createInfoFlags :: forall (mn :: Maybe (*)) (ai :: Maybe (*)).
CreateInfo mn ai -> CreateFlags
createInfoFlags = CreateFlags
flgs,
createInfoApplicationInfo :: forall (mn :: Maybe (*)) (ai :: Maybe (*)).
CreateInfo mn ai -> Maybe (ApplicationInfo ai)
createInfoApplicationInfo = Maybe (ApplicationInfo ai)
ai,
createInfoEnabledLayerNames :: forall (mn :: Maybe (*)) (ai :: Maybe (*)).
CreateInfo mn ai -> [LayerName]
createInfoEnabledLayerNames = [LayerName]
lns,
createInfoEnabledExtensionNames :: forall (mn :: Maybe (*)) (ai :: Maybe (*)).
CreateInfo mn ai -> [ExtensionName]
createInfoEnabledExtensionNames = [ExtensionName]
ens } = M.CreateInfo {
createInfoNext :: M mn
M.createInfoNext = M mn
nxt,
createInfoFlags :: CreateFlags
M.createInfoFlags = CreateFlags
flgs,
createInfoApplicationInfo :: Maybe (ApplicationInfo ai)
M.createInfoApplicationInfo = Maybe (ApplicationInfo ai)
ai,
createInfoEnabledLayerNames :: [Text]
M.createInfoEnabledLayerNames = LayerName -> Text
unLayerName (LayerName -> Text) -> [LayerName] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [LayerName]
lns,
createInfoEnabledExtensionNames :: [Text]
M.createInfoEnabledExtensionNames = ExtensionName -> Text
unExtensionName (ExtensionName -> Text) -> [ExtensionName] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ExtensionName]
ens }
enumerateLayerProperties :: IO [LayerProperties]
enumerateLayerProperties :: IO [LayerProperties]
enumerateLayerProperties =
(LayerProperties -> LayerProperties
layerPropertiesFromMiddle (LayerProperties -> LayerProperties)
-> [LayerProperties] -> [LayerProperties]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) ([LayerProperties] -> [LayerProperties])
-> IO [LayerProperties] -> IO [LayerProperties]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO [LayerProperties]
M.enumerateLayerProperties
enumerateExtensionProperties ::
Maybe LayerName -> IO [ExtensionProperties]
enumerateExtensionProperties :: Maybe LayerName -> IO [ExtensionProperties]
enumerateExtensionProperties (((\(LayerName Text
ln) -> Text
ln) (LayerName -> Text) -> Maybe LayerName -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) -> Maybe Text
mln) =
(ExtensionProperties -> ExtensionProperties
extensionPropertiesFromMiddle (ExtensionProperties -> ExtensionProperties)
-> [ExtensionProperties] -> [ExtensionProperties]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>)
([ExtensionProperties] -> [ExtensionProperties])
-> IO [ExtensionProperties] -> IO [ExtensionProperties]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Text -> IO [ExtensionProperties]
M.enumerateExtensionProperties Maybe Text
mln
data ExtensionProperties = ExtensionProperties {
ExtensionProperties -> ExtensionName
extensionPropertiesExtensionName :: ExtensionName,
ExtensionProperties -> ApiVersion
extensionPropertiesSpecVersion :: M.ApiVersion }
deriving Int -> ExtensionProperties -> ShowS
[ExtensionProperties] -> ShowS
ExtensionProperties -> String
(Int -> ExtensionProperties -> ShowS)
-> (ExtensionProperties -> String)
-> ([ExtensionProperties] -> ShowS)
-> Show ExtensionProperties
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ExtensionProperties -> ShowS
showsPrec :: Int -> ExtensionProperties -> ShowS
$cshow :: ExtensionProperties -> String
show :: ExtensionProperties -> String
$cshowList :: [ExtensionProperties] -> ShowS
showList :: [ExtensionProperties] -> ShowS
Show
extensionPropertiesFromMiddle :: M.ExtensionProperties -> ExtensionProperties
extensionPropertiesFromMiddle :: ExtensionProperties -> ExtensionProperties
extensionPropertiesFromMiddle M.ExtensionProperties {
extensionPropertiesExtensionName :: ExtensionProperties -> Text
M.extensionPropertiesExtensionName = Text
en,
extensionPropertiesSpecVersion :: ExtensionProperties -> ApiVersion
M.extensionPropertiesSpecVersion = ApiVersion
sv } = ExtensionProperties {
extensionPropertiesExtensionName :: ExtensionName
extensionPropertiesExtensionName = Text -> ExtensionName
ExtensionName Text
en,
extensionPropertiesSpecVersion :: ApiVersion
extensionPropertiesSpecVersion = ApiVersion
sv }