vulkan-2.0.0.1: src/Graphics/Vulkan/Core10/Device.hs
{-# language Strict #-}
{-# language CPP #-}
{-# language GeneralizedNewtypeDeriving #-}
{-# language PatternSynonyms #-}
{-# language DataKinds #-}
{-# language TypeOperators #-}
{-# language DuplicateRecordFields #-}
module Graphics.Vulkan.Core10.Device
( VkDeviceCreateFlags(..)
, VkDeviceQueueCreateFlagBits(..)
, vkCreateDevice
, vkDestroyDevice
, VkDeviceQueueCreateInfo(..)
, VkDeviceCreateInfo(..)
, VkDeviceQueueCreateFlags
) where
import Data.Bits
( Bits
, FiniteBits
)
import Data.Word
( Word32
)
import Foreign.C.Types
( CChar(..)
, CFloat(..)
)
import Foreign.Ptr
( plusPtr
, Ptr
)
import Foreign.Storable
( Storable(..)
, Storable
)
import GHC.Read
( expectP
, choose
)
import Graphics.Vulkan.NamedType
( (:::)
)
import Text.ParserCombinators.ReadPrec
( (+++)
, prec
, step
)
import Text.Read
( Read(..)
, parens
)
import Text.Read.Lex
( Lexeme(Ident)
)
import Graphics.Vulkan.Core10.Core
( VkStructureType(..)
, VkResult(..)
, VkFlags
)
import Graphics.Vulkan.Core10.DeviceInitialization
( VkPhysicalDeviceFeatures(..)
, VkDevice
, VkAllocationCallbacks(..)
, VkPhysicalDevice
)
-- ** VkDeviceCreateFlags
-- | VkDeviceCreateFlags - Reserved for future use
--
-- = Description
--
-- @VkDeviceCreateFlags@ is a bitmask type for setting a mask, but is
-- currently reserved for future use.
--
-- = See Also
--
-- 'VkDeviceCreateInfo'
newtype VkDeviceCreateFlags = VkDeviceCreateFlags VkFlags
deriving (Eq, Ord, Storable, Bits, FiniteBits)
instance Show VkDeviceCreateFlags where
showsPrec p (VkDeviceCreateFlags x) = showParen (p >= 11) (showString "VkDeviceCreateFlags " . showsPrec 11 x)
instance Read VkDeviceCreateFlags where
readPrec = parens ( choose [
] +++
prec 10 (do
expectP (Ident "VkDeviceCreateFlags")
v <- step readPrec
pure (VkDeviceCreateFlags v)
)
)
-- ** VkDeviceQueueCreateFlagBits
-- | VkDeviceQueueCreateFlagBits - Bitmask specifying behavior of the queue
--
-- = See Also
--
-- 'VkDeviceQueueCreateFlags'
newtype VkDeviceQueueCreateFlagBits = VkDeviceQueueCreateFlagBits VkFlags
deriving (Eq, Ord, Storable, Bits, FiniteBits)
instance Show VkDeviceQueueCreateFlagBits where
-- The following values are from extensions, the patterns themselves are exported from the extension modules
showsPrec _ (VkDeviceQueueCreateFlagBits 0x00000001) = showString "VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT"
showsPrec p (VkDeviceQueueCreateFlagBits x) = showParen (p >= 11) (showString "VkDeviceQueueCreateFlagBits " . showsPrec 11 x)
instance Read VkDeviceQueueCreateFlagBits where
readPrec = parens ( choose [ -- The following values are from extensions, the patterns themselves are exported from the extension modules
("VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT", pure (VkDeviceQueueCreateFlagBits 0x00000001))
] +++
prec 10 (do
expectP (Ident "VkDeviceQueueCreateFlagBits")
v <- step readPrec
pure (VkDeviceQueueCreateFlagBits v)
)
)
-- | vkCreateDevice - Create a new device instance
--
-- = Parameters
--
-- - @physicalDevice@ /must/ be one of the device handles returned from a
-- call to @vkEnumeratePhysicalDevices@ (see [Physical Device
-- Enumeration](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#devsandqueues-physical-device-enumeration)).
--
-- - @pCreateInfo@ is a pointer to a 'VkDeviceCreateInfo' structure
-- containing information about how to create the device.
--
-- - @pAllocator@ controls host memory allocation as described in the
-- [Memory
-- Allocation](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#memory-allocation)
-- chapter.
--
-- - @pDevice@ points to a handle in which the created @VkDevice@ is
-- returned.
--
-- = Description
--
-- @vkCreateDevice@ verifies that extensions and features requested in the
-- @ppEnabledExtensionNames@ and @pEnabledFeatures@ members of
-- @pCreateInfo@, respectively, are supported by the implementation. If any
-- requested extension is not supported, @vkCreateDevice@ /must/ return
-- @VK_ERROR_EXTENSION_NOT_PRESENT@. If any requested feature is not
-- supported, @vkCreateDevice@ /must/ return
-- @VK_ERROR_FEATURE_NOT_PRESENT@. Support for extensions /can/ be checked
-- before creating a device by querying
-- 'Graphics.Vulkan.Core10.ExtensionDiscovery.vkEnumerateDeviceExtensionProperties'.
-- Support for features /can/ similarly be checked by querying
-- 'Graphics.Vulkan.Core10.DeviceInitialization.vkGetPhysicalDeviceFeatures'.
--
-- After verifying and enabling the extensions the @VkDevice@ object is
-- created and returned to the application. If a requested extension is
-- only supported by a layer, both the layer and the extension need to be
-- specified at @vkCreateInstance@ time for the creation to succeed.
--
-- Multiple logical devices /can/ be created from the same physical device.
-- Logical device creation /may/ fail due to lack of device-specific
-- resources (in addition to the other errors). If that occurs,
-- @vkCreateDevice@ will return @VK_ERROR_TOO_MANY_OBJECTS@.
--
-- == Valid Usage
--
-- - All [required
-- extensions](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#extended-functionality-extensions-dependencies)
-- for each extension in the
-- 'VkDeviceCreateInfo'::@ppEnabledExtensionNames@ list /must/ also be
-- present in that list.
--
-- == Valid Usage (Implicit)
--
-- - @physicalDevice@ /must/ be a valid @VkPhysicalDevice@ handle
--
-- - @pCreateInfo@ /must/ be a valid pointer to a valid
-- @VkDeviceCreateInfo@ structure
--
-- - If @pAllocator@ is not @NULL@, @pAllocator@ /must/ be a valid
-- pointer to a valid @VkAllocationCallbacks@ structure
--
-- - @pDevice@ /must/ be a valid pointer to a @VkDevice@ handle
--
-- == Return Codes
--
-- [[Success](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#fundamentals-successcodes)]
-- - @VK_SUCCESS@
--
-- [[Failure](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#fundamentals-errorcodes)]
-- - @VK_ERROR_OUT_OF_HOST_MEMORY@
--
-- - @VK_ERROR_OUT_OF_DEVICE_MEMORY@
--
-- - @VK_ERROR_INITIALIZATION_FAILED@
--
-- - @VK_ERROR_EXTENSION_NOT_PRESENT@
--
-- - @VK_ERROR_FEATURE_NOT_PRESENT@
--
-- - @VK_ERROR_TOO_MANY_OBJECTS@
--
-- - @VK_ERROR_DEVICE_LOST@
--
-- = See Also
--
-- 'Graphics.Vulkan.Core10.DeviceInitialization.VkAllocationCallbacks',
-- 'Graphics.Vulkan.Core10.DeviceInitialization.VkDevice',
-- 'VkDeviceCreateInfo',
-- 'Graphics.Vulkan.Core10.DeviceInitialization.VkPhysicalDevice'
foreign import ccall "vkCreateDevice" vkCreateDevice :: ("physicalDevice" ::: VkPhysicalDevice) -> ("pCreateInfo" ::: Ptr VkDeviceCreateInfo) -> ("pAllocator" ::: Ptr VkAllocationCallbacks) -> ("pDevice" ::: Ptr VkDevice) -> IO VkResult
-- | vkDestroyDevice - Destroy a logical device
--
-- = Parameters
--
-- - @device@ is the logical device to destroy.
--
-- - @pAllocator@ controls host memory allocation as described in the
-- [Memory
-- Allocation](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#memory-allocation)
-- chapter.
--
-- = Description
--
-- To ensure that no work is active on the device,
-- 'Graphics.Vulkan.Core10.Queue.vkDeviceWaitIdle' /can/ be used to gate
-- the destruction of the device. Prior to destroying a device, an
-- application is responsible for destroying\/freeing any Vulkan objects
-- that were created using that device as the first parameter of the
-- corresponding @vkCreate*@ or @vkAllocate*@ command.
--
-- __Note__
--
-- The lifetime of each of these objects is bound by the lifetime of the
-- @VkDevice@ object. Therefore, to avoid resource leaks, it is critical
-- that an application explicitly free all of these resources prior to
-- calling @vkDestroyDevice@.
--
-- == Valid Usage
--
-- - All child objects created on @device@ /must/ have been destroyed
-- prior to destroying @device@
--
-- - If @VkAllocationCallbacks@ were provided when @device@ was created,
-- a compatible set of callbacks /must/ be provided here
--
-- - If no @VkAllocationCallbacks@ were provided when @device@ was
-- created, @pAllocator@ /must/ be @NULL@
--
-- == Valid Usage (Implicit)
--
-- - If @device@ is not @NULL@, @device@ /must/ be a valid @VkDevice@
-- handle
--
-- - If @pAllocator@ is not @NULL@, @pAllocator@ /must/ be a valid
-- pointer to a valid @VkAllocationCallbacks@ structure
--
-- == Host Synchronization
--
-- - Host access to @device@ /must/ be externally synchronized
--
-- = See Also
--
-- 'Graphics.Vulkan.Core10.DeviceInitialization.VkAllocationCallbacks',
-- 'Graphics.Vulkan.Core10.DeviceInitialization.VkDevice'
foreign import ccall "vkDestroyDevice" vkDestroyDevice :: ("device" ::: VkDevice) -> ("pAllocator" ::: Ptr VkAllocationCallbacks) -> IO ()
-- | VkDeviceQueueCreateInfo - Structure specifying parameters of a newly
-- created device queue
--
-- == Valid Usage
--
-- - @queueFamilyIndex@ /must/ be less than @pQueueFamilyPropertyCount@
-- returned by @vkGetPhysicalDeviceQueueFamilyProperties@
--
-- - @queueCount@ /must/ be less than or equal to the @queueCount@ member
-- of the @VkQueueFamilyProperties@ structure, as returned by
-- @vkGetPhysicalDeviceQueueFamilyProperties@ in the
-- @pQueueFamilyProperties@[@queueFamilyIndex@]
--
-- - Each element of @pQueuePriorities@ /must/ be between @0.0@ and @1.0@
-- inclusive
--
-- == Valid Usage (Implicit)
--
-- - @sType@ /must/ be @VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO@
--
-- - @pNext@ /must/ be @NULL@ or a pointer to a valid instance of
-- 'Graphics.Vulkan.Extensions.VK_EXT_global_priority.VkDeviceQueueGlobalPriorityCreateInfoEXT'
--
-- - @flags@ /must/ be a valid combination of
-- 'VkDeviceQueueCreateFlagBits' values
--
-- - @pQueuePriorities@ /must/ be a valid pointer to an array of
-- @queueCount@ @float@ values
--
-- - @queueCount@ /must/ be greater than @0@
--
-- = See Also
--
-- 'VkDeviceCreateInfo', 'VkDeviceQueueCreateFlags',
-- 'Graphics.Vulkan.Core10.Core.VkStructureType'
data VkDeviceQueueCreateInfo = VkDeviceQueueCreateInfo
{ -- | @sType@ is the type of this structure.
vkSType :: VkStructureType
, -- | @pNext@ is @NULL@ or a pointer to an extension-specific structure.
vkPNext :: Ptr ()
, -- | @flags@ is reserved for future use.
vkFlags :: VkDeviceQueueCreateFlags
, -- | @queueFamilyIndex@ is an unsigned integer indicating the index of the
-- queue family to create on this device. This index corresponds to the
-- index of an element of the @pQueueFamilyProperties@ array that was
-- returned by @vkGetPhysicalDeviceQueueFamilyProperties@.
vkQueueFamilyIndex :: Word32
, -- | @queueCount@ is an unsigned integer specifying the number of queues to
-- create in the queue family indicated by @queueFamilyIndex@.
vkQueueCount :: Word32
, -- | @pQueuePriorities@ is an array of @queueCount@ normalized floating point
-- values, specifying priorities of work that will be submitted to each
-- created queue. See [Queue
-- Priority](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#devsandqueues-priority)
-- for more information.
vkPQueuePriorities :: Ptr CFloat
}
deriving (Eq, Show)
instance Storable VkDeviceQueueCreateInfo where
sizeOf ~_ = 40
alignment ~_ = 8
peek ptr = VkDeviceQueueCreateInfo <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
<*> peek (ptr `plusPtr` 20)
<*> peek (ptr `plusPtr` 24)
<*> peek (ptr `plusPtr` 32)
poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDeviceQueueCreateInfo))
*> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDeviceQueueCreateInfo))
*> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDeviceQueueCreateInfo))
*> poke (ptr `plusPtr` 20) (vkQueueFamilyIndex (poked :: VkDeviceQueueCreateInfo))
*> poke (ptr `plusPtr` 24) (vkQueueCount (poked :: VkDeviceQueueCreateInfo))
*> poke (ptr `plusPtr` 32) (vkPQueuePriorities (poked :: VkDeviceQueueCreateInfo))
-- | VkDeviceCreateInfo - Structure specifying parameters of a newly created
-- device
--
-- == Valid Usage
--
-- - The @queueFamilyIndex@ member of each element of @pQueueCreateInfos@
-- /must/ be unique within @pQueueCreateInfos@
--
-- - If the @pNext@ chain includes a
-- 'Graphics.Vulkan.Core11.Promoted_from_VK_KHR_get_physical_device_properties2.VkPhysicalDeviceFeatures2'
-- structure, then @pEnabledFeatures@ /must/ be @NULL@
--
-- - @ppEnabledExtensionNames@ /must/ not contain both
-- @{html_spec_relative}#VK_KHR_maintenance1@ and
-- @{html_spec_relative}#VK_AMD_negative_viewport_height@
--
-- == Valid Usage (Implicit)
--
-- - @sType@ /must/ be @VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO@
--
-- - Each @pNext@ member of any structure (including this one) in the
-- @pNext@ chain /must/ be either @NULL@ or a pointer to a valid
-- instance of
-- 'Graphics.Vulkan.Core11.Promoted_from_VK_KHR_device_group_creation.VkDeviceGroupDeviceCreateInfo',
-- 'Graphics.Vulkan.Core11.Promoted_from_VK_KHR_16bit_storage.VkPhysicalDevice16BitStorageFeatures',
-- 'Graphics.Vulkan.Extensions.VK_EXT_descriptor_indexing.VkPhysicalDeviceDescriptorIndexingFeaturesEXT',
-- 'Graphics.Vulkan.Core11.Promoted_from_VK_KHR_get_physical_device_properties2.VkPhysicalDeviceFeatures2',
-- 'Graphics.Vulkan.Core11.Promoted_from_VK_KHR_multiview.VkPhysicalDeviceMultiviewFeatures',
-- 'Graphics.Vulkan.Core11.Promoted_From_VK_KHR_protected_memory.VkPhysicalDeviceProtectedMemoryFeatures',
-- 'Graphics.Vulkan.Core11.Promoted_from_VK_KHR_sampler_ycbcr_conversion.VkPhysicalDeviceSamplerYcbcrConversionFeatures',
-- or
-- 'Graphics.Vulkan.Core11.Promoted_from_VK_KHR_variable_pointers.VkPhysicalDeviceVariablePointerFeatures'
--
-- - Each @sType@ member in the @pNext@ chain /must/ be unique
--
-- - @flags@ /must/ be @0@
--
-- - @pQueueCreateInfos@ /must/ be a valid pointer to an array of
-- @queueCreateInfoCount@ valid @VkDeviceQueueCreateInfo@ structures
--
-- - If @enabledLayerCount@ is not @0@, @ppEnabledLayerNames@ /must/ be a
-- valid pointer to an array of @enabledLayerCount@ null-terminated
-- UTF-8 strings
--
-- - If @enabledExtensionCount@ is not @0@, @ppEnabledExtensionNames@
-- /must/ be a valid pointer to an array of @enabledExtensionCount@
-- null-terminated UTF-8 strings
--
-- - If @pEnabledFeatures@ is not @NULL@, @pEnabledFeatures@ /must/ be a
-- valid pointer to a valid @VkPhysicalDeviceFeatures@ structure
--
-- - @queueCreateInfoCount@ /must/ be greater than @0@
--
-- = See Also
--
-- 'VkDeviceCreateFlags', 'VkDeviceQueueCreateInfo',
-- 'Graphics.Vulkan.Core10.DeviceInitialization.VkPhysicalDeviceFeatures',
-- 'Graphics.Vulkan.Core10.Core.VkStructureType', 'vkCreateDevice'
data VkDeviceCreateInfo = VkDeviceCreateInfo
{ -- | @sType@ is the type of this structure.
vkSType :: VkStructureType
, -- | @pNext@ is @NULL@ or a pointer to an extension-specific structure.
vkPNext :: Ptr ()
, -- | @flags@ is reserved for future use.
vkFlags :: VkDeviceCreateFlags
, -- | @queueCreateInfoCount@ is the unsigned integer size of the
-- @pQueueCreateInfos@ array. Refer to the [Queue
-- Creation](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#devsandqueues-queue-creation)
-- section below for further details.
vkQueueCreateInfoCount :: Word32
, -- | @pQueueCreateInfos@ is a pointer to an array of
-- 'VkDeviceQueueCreateInfo' structures describing the queues that are
-- requested to be created along with the logical device. Refer to the
-- [Queue
-- Creation](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#devsandqueues-queue-creation)
-- section below for further details.
vkPQueueCreateInfos :: Ptr VkDeviceQueueCreateInfo
, -- | @enabledLayerCount@ is deprecated and ignored.
vkEnabledLayerCount :: Word32
, -- | @ppEnabledLayerNames@ is deprecated and ignored. See [Device Layer
-- Deprecation](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#extended-functionality-device-layer-deprecation).
vkPPEnabledLayerNames :: Ptr (Ptr CChar)
, -- | @enabledExtensionCount@ is the number of device extensions to enable.
vkEnabledExtensionCount :: Word32
, -- | @ppEnabledExtensionNames@ is a pointer to an array of
-- @enabledExtensionCount@ null-terminated UTF-8 strings containing the
-- names of extensions to enable for the created device. See the
-- [Extensions](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#extended-functionality-extensions)
-- section for further details.
vkPPEnabledExtensionNames :: Ptr (Ptr CChar)
, -- | @pEnabledFeatures@ is @NULL@ or a pointer to a
-- 'Graphics.Vulkan.Core10.DeviceInitialization.VkPhysicalDeviceFeatures'
-- structure that contains boolean indicators of all the features to be
-- enabled. Refer to the
-- [Features](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#features-features)
-- section for further details.
vkPEnabledFeatures :: Ptr VkPhysicalDeviceFeatures
}
deriving (Eq, Show)
instance Storable VkDeviceCreateInfo where
sizeOf ~_ = 72
alignment ~_ = 8
peek ptr = VkDeviceCreateInfo <$> peek (ptr `plusPtr` 0)
<*> peek (ptr `plusPtr` 8)
<*> peek (ptr `plusPtr` 16)
<*> peek (ptr `plusPtr` 20)
<*> peek (ptr `plusPtr` 24)
<*> peek (ptr `plusPtr` 32)
<*> peek (ptr `plusPtr` 40)
<*> peek (ptr `plusPtr` 48)
<*> peek (ptr `plusPtr` 56)
<*> peek (ptr `plusPtr` 64)
poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDeviceCreateInfo))
*> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDeviceCreateInfo))
*> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDeviceCreateInfo))
*> poke (ptr `plusPtr` 20) (vkQueueCreateInfoCount (poked :: VkDeviceCreateInfo))
*> poke (ptr `plusPtr` 24) (vkPQueueCreateInfos (poked :: VkDeviceCreateInfo))
*> poke (ptr `plusPtr` 32) (vkEnabledLayerCount (poked :: VkDeviceCreateInfo))
*> poke (ptr `plusPtr` 40) (vkPPEnabledLayerNames (poked :: VkDeviceCreateInfo))
*> poke (ptr `plusPtr` 48) (vkEnabledExtensionCount (poked :: VkDeviceCreateInfo))
*> poke (ptr `plusPtr` 56) (vkPPEnabledExtensionNames (poked :: VkDeviceCreateInfo))
*> poke (ptr `plusPtr` 64) (vkPEnabledFeatures (poked :: VkDeviceCreateInfo))
-- | VkDeviceQueueCreateFlags - Bitmask of VkDeviceQueueCreateFlagBits
--
-- = Description
--
-- @VkDeviceQueueCreateFlags@ is a bitmask type for setting a mask of zero
-- or more 'VkDeviceQueueCreateFlagBits'.
--
-- = See Also
--
-- 'VkDeviceQueueCreateFlagBits', 'VkDeviceQueueCreateInfo',
-- 'Graphics.Vulkan.Core11.Promoted_From_VK_KHR_protected_memory.VkDeviceQueueInfo2'
type VkDeviceQueueCreateFlags = VkDeviceQueueCreateFlagBits