{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.PhysicalDevice (

	-- * ENUMERATE

	enumerate, M.P,

	-- * PHYSICAL DEVICE PROPERTIES AND FEATURES

	M.getProperties, M.Properties(..), M.getFeatures,

	-- ** Get Properties 2

	getProperties2ExtensionName,
	M.getFeatures2, M.Features2(..),

	-- * OTHER PROPERTIES

	M.getMemoryProperties, M.MemoryProperties(..),
	M.getQueueFamilyProperties, M.getFormatProperties,
	enumerateExtensionProperties,
	ExtensionProperties(..), ExtensionName(..),

	-- * OTHER FEATURES

	M.ShaderDrawParametersFeatures(..),

	-- * EXTENSIONS

	maintenance3ExtensionName,

	-- * ENUM AND STRUCT

	module Gpu.Vulkan.PhysicalDevice.Enum,

	Limits(..), Features(..),
	Vulkan12Features(..), Vulkan12FeaturesNoNext(..), vulkan12FeaturesZero,
	Vulkan13Features(..), Vulkan13FeaturesNoNext(..), vulkan13FeaturesZero,
	DescriptorIndexingFeatures(..), DescriptorIndexingFeaturesNoNext(..),
	descriptorIndexingFeaturesZero

	) where

import Gpu.Vulkan.Internal
import Gpu.Vulkan.Instance.Internal qualified as Instance
import Gpu.Vulkan.Instance.Type qualified as Instance.T
import Gpu.Vulkan.PhysicalDevice.Middle qualified as M
import Gpu.Vulkan.PhysicalDevice.Enum
import Gpu.Vulkan.PhysicalDevice.Struct

import Gpu.Vulkan.Middle qualified as M
import Data.Text qualified as T

enumerate :: Instance.T.I s -> IO [M.P]
enumerate :: forall s. I s -> IO [P]
enumerate (Instance.T.I I
i) = I -> IO [P]
M.enumerate I
i

enumerateExtensionProperties ::
	M.P -> Maybe LayerName -> IO [ExtensionProperties]
enumerateExtensionProperties :: P -> Maybe LayerName -> IO [ExtensionProperties]
enumerateExtensionProperties P
p (((\(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
mlnm) =
	(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
<$> P -> Maybe Text -> IO [ExtensionProperties]
M.enumerateExtensionProperties P
p Maybe Text
mlnm

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 }

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)

maintenance3ExtensionName :: ExtensionName
maintenance3ExtensionName :: ExtensionName
maintenance3ExtensionName = Text -> ExtensionName
ExtensionName Text
M.maintenance3ExtensionName

getProperties2ExtensionName :: Instance.ExtensionName
getProperties2ExtensionName :: ExtensionName
getProperties2ExtensionName = Text -> ExtensionName
Instance.ExtensionName Text
M.getProperties2ExtensionName