packages feed

vulkan-3.27: src/Vulkan/Extensions/VK_EXT_metal_objects.hs

{-# language CPP #-}
-- | = Name
--
-- VK_EXT_metal_objects - device extension
--
-- = VK_EXT_metal_objects
--
-- [__Name String__]
--     @VK_EXT_metal_objects@
--
-- [__Extension Type__]
--     Device extension
--
-- [__Registered Extension Number__]
--     312
--
-- [__Revision__]
--     2
--
-- [__Ratification Status__]
--     Ratified
--
-- [__Extension and Version Dependencies__]
--     None
--
-- [__Contact__]
--
--     -   Bill Hollings
--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?body=[VK_EXT_metal_objects] @billhollings%0A*Here describe the issue or question you have about the VK_EXT_metal_objects extension* >
--
-- [__Extension Proposal__]
--     <https://github.com/KhronosGroup/Vulkan-Docs/tree/main/proposals/VK_EXT_metal_objects.adoc VK_EXT_metal_objects>
--
-- == Other Extension Metadata
--
-- [__Last Modified Date__]
--     2024-04-04
--
-- [__IP Status__]
--     No known IP claims.
--
-- [__Contributors__]
--
--     -   Bill Hollings, The Brenwill Workshop Ltd.
--
--     -   Dzmitry Malyshau, Mozilla Corp.
--
-- == Description
--
-- In a Vulkan implementation that is layered on top of Metal on Apple
-- device platforms, this extension provides the ability to import and
-- export the underlying Metal objects associated with specific Vulkan
-- objects.
--
-- As detailed in the
-- <https://github.com/KhronosGroup/Vulkan-Docs/tree/main/proposals/VK_EXT_metal_objects.adoc extension proposal document>,
-- this extension adds one new Vulkan command, 'exportMetalObjectsEXT', to
-- export underlying Metal objects from Vulkan objects, and supports
-- importing the appropriate existing Metal objects when creating Vulkan
-- objects of types 'Vulkan.Core10.Handles.DeviceMemory',
-- 'Vulkan.Core10.Handles.Image', 'Vulkan.Core10.Handles.Semaphore', and
-- 'Vulkan.Core10.Handles.Event',
--
-- The intent is that this extension will be advertised and supported only
-- on implementations that are layered on top of Metal on Apple device
-- platforms.
--
-- == New Base Types
--
-- -   'IOSurfaceRef'
--
-- -   'MTLBuffer_id'
--
-- -   'MTLCommandQueue_id'
--
-- -   'MTLDevice_id'
--
-- -   'MTLSharedEvent_id'
--
-- -   'MTLTexture_id'
--
-- == New Commands
--
-- -   'exportMetalObjectsEXT'
--
-- == New Structures
--
-- -   'ExportMetalObjectsInfoEXT'
--
-- -   Extending 'ExportMetalObjectsInfoEXT':
--
--     -   'ExportMetalBufferInfoEXT'
--
--     -   'ExportMetalCommandQueueInfoEXT'
--
--     -   'ExportMetalDeviceInfoEXT'
--
--     -   'ExportMetalIOSurfaceInfoEXT'
--
--     -   'ExportMetalSharedEventInfoEXT'
--
--     -   'ExportMetalTextureInfoEXT'
--
-- -   Extending 'Vulkan.Core10.Image.ImageCreateInfo':
--
--     -   'ImportMetalIOSurfaceInfoEXT'
--
--     -   'ImportMetalTextureInfoEXT'
--
-- -   Extending 'Vulkan.Core10.DeviceInitialization.InstanceCreateInfo',
--     'Vulkan.Core10.Memory.MemoryAllocateInfo',
--     'Vulkan.Core10.Image.ImageCreateInfo',
--     'Vulkan.Core10.ImageView.ImageViewCreateInfo',
--     'Vulkan.Core10.BufferView.BufferViewCreateInfo',
--     'Vulkan.Core10.QueueSemaphore.SemaphoreCreateInfo',
--     'Vulkan.Core10.Event.EventCreateInfo':
--
--     -   'ExportMetalObjectCreateInfoEXT'
--
-- -   Extending 'Vulkan.Core10.Memory.MemoryAllocateInfo':
--
--     -   'ImportMetalBufferInfoEXT'
--
-- -   Extending 'Vulkan.Core10.QueueSemaphore.SemaphoreCreateInfo',
--     'Vulkan.Core10.Event.EventCreateInfo':
--
--     -   'ImportMetalSharedEventInfoEXT'
--
-- == New Enums
--
-- -   'ExportMetalObjectTypeFlagBitsEXT'
--
-- == New Bitmasks
--
-- -   'ExportMetalObjectTypeFlagsEXT'
--
-- == New Enum Constants
--
-- -   'EXT_METAL_OBJECTS_EXTENSION_NAME'
--
-- -   'EXT_METAL_OBJECTS_SPEC_VERSION'
--
-- -   Extending 'Vulkan.Core10.Enums.StructureType.StructureType':
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_EXPORT_METAL_BUFFER_INFO_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_EXPORT_METAL_COMMAND_QUEUE_INFO_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_EXPORT_METAL_DEVICE_INFO_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_EXPORT_METAL_IO_SURFACE_INFO_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_EXPORT_METAL_OBJECTS_INFO_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_EXPORT_METAL_OBJECT_CREATE_INFO_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_EXPORT_METAL_SHARED_EVENT_INFO_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_EXPORT_METAL_TEXTURE_INFO_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_IMPORT_METAL_BUFFER_INFO_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_IMPORT_METAL_IO_SURFACE_INFO_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_IMPORT_METAL_SHARED_EVENT_INFO_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_IMPORT_METAL_TEXTURE_INFO_EXT'
--
-- == Issues
--
-- None.
--
-- == Version History
--
-- -   Revision 1, 2022-05-28 (Bill Hollings)
--
--     -   Initial draft.
--
--     -   Incorporated feedback from review by the Vulkan Working Group.
--         Renamed many structures, moved import\/export of MTLBuffer to
--         VkDeviceMemory, added export of MTLSharedEvent, added import of
--         MTLSharedEvent for VkSemaphore and VkEvent, and changed used bit
--         mask fields to individual bit fields to simplify Valid Usage
--         rules.
--
-- -   Revision 2, 2024-04-04 (Bill Hollings)
--
--     -   Add an @__unsafe_unretained@ ownership qualifier to all Metal
--         object declarations, to support Automatic Reference Counting
--         (ARC) on Apple devices.
--
-- == See Also
--
-- No cross-references are available
--
-- == Document Notes
--
-- For more information, see the
-- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VK_EXT_metal_objects Vulkan Specification>.
--
-- This page is a generated document. Fixes and changes should be made to
-- the generator scripts, not directly.
module Vulkan.Extensions.VK_EXT_metal_objects  ( exportMetalObjectsEXT
                                               , ExportMetalObjectCreateInfoEXT(..)
                                               , ExportMetalObjectsInfoEXT(..)
                                               , ExportMetalDeviceInfoEXT(..)
                                               , ExportMetalCommandQueueInfoEXT(..)
                                               , ExportMetalBufferInfoEXT(..)
                                               , ImportMetalBufferInfoEXT(..)
                                               , ExportMetalTextureInfoEXT(..)
                                               , ImportMetalTextureInfoEXT(..)
                                               , ExportMetalIOSurfaceInfoEXT(..)
                                               , ImportMetalIOSurfaceInfoEXT(..)
                                               , ExportMetalSharedEventInfoEXT(..)
                                               , ImportMetalSharedEventInfoEXT(..)
                                               , ExportMetalObjectTypeFlagsEXT
                                               , ExportMetalObjectTypeFlagBitsEXT( EXPORT_METAL_OBJECT_TYPE_METAL_DEVICE_BIT_EXT
                                                                                 , EXPORT_METAL_OBJECT_TYPE_METAL_COMMAND_QUEUE_BIT_EXT
                                                                                 , EXPORT_METAL_OBJECT_TYPE_METAL_BUFFER_BIT_EXT
                                                                                 , EXPORT_METAL_OBJECT_TYPE_METAL_TEXTURE_BIT_EXT
                                                                                 , EXPORT_METAL_OBJECT_TYPE_METAL_IOSURFACE_BIT_EXT
                                                                                 , EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT
                                                                                 , ..
                                                                                 )
                                               , EXT_METAL_OBJECTS_SPEC_VERSION
                                               , pattern EXT_METAL_OBJECTS_SPEC_VERSION
                                               , EXT_METAL_OBJECTS_EXTENSION_NAME
                                               , pattern EXT_METAL_OBJECTS_EXTENSION_NAME
                                               , MTLDevice_id
                                               , MTLCommandQueue_id
                                               , MTLBuffer_id
                                               , MTLTexture_id
                                               , IOSurfaceRef
                                               , MTLSharedEvent_id
                                               ) where

import Data.Bits (Bits)
import Data.Bits (FiniteBits)
import Vulkan.Internal.Utils (enumReadPrec)
import Vulkan.Internal.Utils (enumShowsPrec)
import Vulkan.Internal.Utils (traceAroundEvent)
import Control.Monad (unless)
import Control.Monad.IO.Class (liftIO)
import Data.Typeable (eqT)
import Foreign.Marshal.Alloc (allocaBytes)
import GHC.IO (throwIO)
import GHC.Ptr (castPtr)
import GHC.Ptr (nullFunPtr)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
import GHC.Show (showString)
import Numeric (showHex)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Cont (evalContT)
import Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Zero (Zero)
import Vulkan.Zero (Zero(..))
import Control.Monad.IO.Class (MonadIO)
import Data.String (IsString)
import Data.Type.Equality ((:~:)(Refl))
import Data.Typeable (Typeable)
import Foreign.Storable (Storable)
import Foreign.Storable (Storable(peek))
import Foreign.Storable (Storable(poke))
import qualified Foreign.Storable (Storable(..))
import GHC.Generics (Generic)
import GHC.IO.Exception (IOErrorType(..))
import GHC.IO.Exception (IOException(..))
import Foreign.Ptr (FunPtr)
import Foreign.Ptr (Ptr)
import GHC.Read (Read(readPrec))
import GHC.Show (Show(showsPrec))
import Data.Kind (Type)
import Control.Monad.Trans.Cont (ContT(..))
import Vulkan.CStruct.Extends (forgetExtensions)
import Vulkan.Core10.Handles (BufferView)
import Vulkan.CStruct.Extends (Chain)
import Vulkan.Core10.Handles (Device)
import Vulkan.Core10.Handles (Device(..))
import Vulkan.Core10.Handles (Device(Device))
import Vulkan.Dynamic (DeviceCmds(pVkExportMetalObjectsEXT))
import Vulkan.Core10.Handles (DeviceMemory)
import Vulkan.Core10.Handles (Device_T)
import Vulkan.Core10.Handles (Event)
import Vulkan.CStruct.Extends (Extends)
import Vulkan.CStruct.Extends (Extendss)
import Vulkan.CStruct.Extends (Extensible(..))
import Vulkan.Core10.FundamentalTypes (Flags)
import Vulkan.Core10.Handles (Image)
import Vulkan.Core10.Enums.ImageAspectFlagBits (ImageAspectFlagBits)
import Vulkan.Core10.Handles (ImageView)
import Vulkan.CStruct.Extends (PeekChain)
import Vulkan.CStruct.Extends (PeekChain(..))
import Vulkan.CStruct.Extends (PokeChain)
import Vulkan.CStruct.Extends (PokeChain(..))
import Vulkan.Core10.Handles (Queue_T)
import Vulkan.Core10.Handles (Semaphore)
import Vulkan.CStruct.Extends (SomeStruct)
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_EXPORT_METAL_BUFFER_INFO_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_EXPORT_METAL_COMMAND_QUEUE_INFO_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_EXPORT_METAL_DEVICE_INFO_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_EXPORT_METAL_IO_SURFACE_INFO_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_EXPORT_METAL_OBJECTS_INFO_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_EXPORT_METAL_OBJECT_CREATE_INFO_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_EXPORT_METAL_SHARED_EVENT_INFO_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_EXPORT_METAL_TEXTURE_INFO_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_IMPORT_METAL_BUFFER_INFO_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_IMPORT_METAL_IO_SURFACE_INFO_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_IMPORT_METAL_SHARED_EVENT_INFO_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_IMPORT_METAL_TEXTURE_INFO_EXT))
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkExportMetalObjectsEXT
  :: FunPtr (Ptr Device_T -> Ptr (SomeStruct ExportMetalObjectsInfoEXT) -> IO ()) -> Ptr Device_T -> Ptr (SomeStruct ExportMetalObjectsInfoEXT) -> IO ()

-- | vkExportMetalObjectsEXT - Export Metal objects from the corresponding
-- Vulkan objects
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_metal_objects VK_EXT_metal_objects>,
-- 'Vulkan.Core10.Handles.Device', 'ExportMetalObjectsInfoEXT'
exportMetalObjectsEXT :: forall a io
                       . ( Extendss ExportMetalObjectsInfoEXT a
                         , PokeChain a
                         , PeekChain a
                         , MonadIO io )
                      => -- | @device@ is the device that created the Vulkan objects.
                         --
                         -- #VUID-vkExportMetalObjectsEXT-device-parameter# @device@ /must/ be a
                         -- valid 'Vulkan.Core10.Handles.Device' handle
                         Device
                      -> io (ExportMetalObjectsInfoEXT a)
exportMetalObjectsEXT device = liftIO . evalContT $ do
  let vkExportMetalObjectsEXTPtr = pVkExportMetalObjectsEXT (case device of Device{deviceCmds} -> deviceCmds)
  lift $ unless (vkExportMetalObjectsEXTPtr /= nullFunPtr) $
    throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkExportMetalObjectsEXT is null" Nothing Nothing
  let vkExportMetalObjectsEXT' = mkVkExportMetalObjectsEXT vkExportMetalObjectsEXTPtr
  pPMetalObjectsInfo <- ContT (withZeroCStruct @(ExportMetalObjectsInfoEXT _))
  lift $ traceAroundEvent "vkExportMetalObjectsEXT" (vkExportMetalObjectsEXT'
                                                       (deviceHandle (device))
                                                       (forgetExtensions (pPMetalObjectsInfo)))
  pMetalObjectsInfo <- lift $ peekCStruct @(ExportMetalObjectsInfoEXT _) pPMetalObjectsInfo
  pure $ (pMetalObjectsInfo)


-- | VkExportMetalObjectCreateInfoEXT - Structure that identifies the Metal
-- objects that can be exported from Vulkan objects
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-VkExportMetalObjectCreateInfoEXT-sType-sType# @sType@ /must/
--     be
--     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_EXPORT_METAL_OBJECT_CREATE_INFO_EXT'
--
-- -   #VUID-VkExportMetalObjectCreateInfoEXT-exportObjectType-parameter#
--     If @exportObjectType@ is not @0@, @exportObjectType@ /must/ be a
--     valid 'ExportMetalObjectTypeFlagBitsEXT' value
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structures>]
--
--     -   'Vulkan.Core10.BufferView.BufferViewCreateInfo'
--
--     -   'Vulkan.Core10.Event.EventCreateInfo'
--
--     -   'Vulkan.Core10.Image.ImageCreateInfo'
--
--     -   'Vulkan.Core10.ImageView.ImageViewCreateInfo'
--
--     -   'Vulkan.Core10.DeviceInitialization.InstanceCreateInfo'
--
--     -   'Vulkan.Core10.Memory.MemoryAllocateInfo'
--
--     -   'Vulkan.Core10.QueueSemaphore.SemaphoreCreateInfo'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_metal_objects VK_EXT_metal_objects>,
-- 'ExportMetalObjectTypeFlagBitsEXT',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data ExportMetalObjectCreateInfoEXT = ExportMetalObjectCreateInfoEXT
  { -- | @exportObjectType@ is a 'ExportMetalObjectTypeFlagBitsEXT' indicating
    -- the type of Metal object that the application may request to be exported
    -- from the Vulkan object.
    exportObjectType :: ExportMetalObjectTypeFlagBitsEXT }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ExportMetalObjectCreateInfoEXT)
#endif
deriving instance Show ExportMetalObjectCreateInfoEXT

instance ToCStruct ExportMetalObjectCreateInfoEXT where
  withCStruct x f = allocaBytes 24 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p ExportMetalObjectCreateInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_OBJECT_CREATE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr ExportMetalObjectTypeFlagBitsEXT)) (exportObjectType)
    f
  cStructSize = 24
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_OBJECT_CREATE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    f

instance FromCStruct ExportMetalObjectCreateInfoEXT where
  peekCStruct p = do
    exportObjectType <- peek @ExportMetalObjectTypeFlagBitsEXT ((p `plusPtr` 16 :: Ptr ExportMetalObjectTypeFlagBitsEXT))
    pure $ ExportMetalObjectCreateInfoEXT
             exportObjectType

instance Storable ExportMetalObjectCreateInfoEXT where
  sizeOf ~_ = 24
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero ExportMetalObjectCreateInfoEXT where
  zero = ExportMetalObjectCreateInfoEXT
           zero


-- | VkExportMetalObjectsInfoEXT - Structure whose pNext chain identifies
-- Vulkan objects and corresponding Metal objects
--
-- == Valid Usage
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06791# If the @pNext@ chain
--     includes a 'ExportMetalDeviceInfoEXT' structure, the
--     'Vulkan.Core10.Handles.Instance' /must/ have been created with
--     'EXPORT_METAL_OBJECT_TYPE_METAL_DEVICE_BIT_EXT' in the
--     @exportObjectType@ member of a 'ExportMetalObjectCreateInfoEXT'
--     structure in the @pNext@ chain of the
--     'Vulkan.Core10.DeviceInitialization.InstanceCreateInfo' structure in
--     the 'Vulkan.Core10.DeviceInitialization.createInstance' command
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06792# If the @pNext@ chain
--     includes a 'ExportMetalCommandQueueInfoEXT' structure, the
--     'Vulkan.Core10.Handles.Instance' /must/ have been created with
--     'EXPORT_METAL_OBJECT_TYPE_METAL_COMMAND_QUEUE_BIT_EXT' in the
--     @exportObjectType@ member of a 'ExportMetalObjectCreateInfoEXT'
--     structure in the @pNext@ chain of the
--     'Vulkan.Core10.DeviceInitialization.InstanceCreateInfo' structure in
--     the 'Vulkan.Core10.DeviceInitialization.createInstance' command
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06793# If the @pNext@ chain
--     includes a 'ExportMetalBufferInfoEXT' structure, the
--     'Vulkan.Core10.Handles.DeviceMemory' in its @memory@ member /must/
--     have been allocated with
--     'EXPORT_METAL_OBJECT_TYPE_METAL_BUFFER_BIT_EXT' in the
--     @exportObjectType@ member of a 'ExportMetalObjectCreateInfoEXT'
--     structure in the @pNext@ chain of the
--     'Vulkan.Core10.Memory.MemoryAllocateInfo' structure in the
--     'Vulkan.Core10.Memory.allocateMemory' command
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06794# If the @pNext@ chain
--     includes a 'ExportMetalTextureInfoEXT' structure, exactly one of its
--     @image@, @imageView@, or @bufferView@ members /must/ not be
--     'Vulkan.Core10.APIConstants.NULL_HANDLE'
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06795# If the @pNext@ chain
--     includes a 'ExportMetalTextureInfoEXT' structure, and its @image@
--     member is not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the
--     'Vulkan.Core10.Handles.Image' in its @image@ member /must/ have been
--     created with 'EXPORT_METAL_OBJECT_TYPE_METAL_TEXTURE_BIT_EXT' in the
--     @exportObjectType@ member of a 'ExportMetalObjectCreateInfoEXT'
--     structure in the @pNext@ chain of the
--     'Vulkan.Core10.Image.ImageCreateInfo' structure in the
--     'Vulkan.Core10.Image.createImage' command
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06796# If the @pNext@ chain
--     includes a 'ExportMetalTextureInfoEXT' structure, and its
--     @imageView@ member is not 'Vulkan.Core10.APIConstants.NULL_HANDLE',
--     the 'Vulkan.Core10.Handles.ImageView' in its @imageView@ member
--     /must/ have been created with
--     'EXPORT_METAL_OBJECT_TYPE_METAL_TEXTURE_BIT_EXT' in the
--     @exportObjectType@ member of a 'ExportMetalObjectCreateInfoEXT'
--     structure in the @pNext@ chain of the
--     'Vulkan.Core10.ImageView.ImageViewCreateInfo' structure in the
--     'Vulkan.Core10.ImageView.createImageView' command
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06797# If the @pNext@ chain
--     includes a 'ExportMetalTextureInfoEXT' structure, and its
--     @bufferView@ member is not 'Vulkan.Core10.APIConstants.NULL_HANDLE',
--     the 'Vulkan.Core10.Handles.BufferView' in its @bufferView@ member
--     /must/ have been created with
--     'EXPORT_METAL_OBJECT_TYPE_METAL_TEXTURE_BIT_EXT' in the
--     @exportObjectType@ member of a 'ExportMetalObjectCreateInfoEXT'
--     structure in the @pNext@ chain of the
--     'Vulkan.Core10.BufferView.BufferViewCreateInfo' structure in the
--     'Vulkan.Core10.BufferView.createBufferView' command
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06798# If the @pNext@ chain
--     includes a 'ExportMetalTextureInfoEXT' structure, and if either its
--     @image@ or @imageView@ member is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', then @plane@ /must/ be
--     'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_0_BIT',
--     'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_1_BIT',
--     or
--     'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_2_BIT'
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06799# If the @pNext@ chain
--     includes a 'ExportMetalTextureInfoEXT' structure, and if the
--     'Vulkan.Core10.Handles.Image' in its @image@ member does not have a
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#formats-multiplanar multi-planar format>,
--     then its @plane@ member /must/ be
--     'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_0_BIT'
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06800# If the @pNext@ chain
--     includes a 'ExportMetalTextureInfoEXT' structure, and if the
--     'Vulkan.Core10.Handles.Image' in its @image@ member has a
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#formats-multiplanar multi-planar format>
--     with only two planes, then its @plane@ member /must/ not be
--     'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_2_BIT'
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06801# If the @pNext@ chain
--     includes a 'ExportMetalTextureInfoEXT' structure, and if the
--     'Vulkan.Core10.Handles.ImageView' in its @imageView@ member does not
--     have a
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#formats-multiplanar multi-planar format>,
--     then its @plane@ member /must/ be
--     'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_0_BIT'
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06802# If the @pNext@ chain
--     includes a 'ExportMetalTextureInfoEXT' structure, and if the
--     'Vulkan.Core10.Handles.ImageView' in its @imageView@ member has a
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#formats-multiplanar multi-planar format>
--     with only two planes, then its @plane@ member /must/ not be
--     'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_2_BIT'
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06803# If the @pNext@ chain
--     includes a 'ExportMetalIOSurfaceInfoEXT' structure, the
--     'Vulkan.Core10.Handles.Image' in its @image@ member /must/ have been
--     created with 'EXPORT_METAL_OBJECT_TYPE_METAL_IOSURFACE_BIT_EXT' in
--     the @exportObjectType@ member of a 'ExportMetalObjectCreateInfoEXT'
--     structure in the @pNext@ chain of the
--     'Vulkan.Core10.Image.ImageCreateInfo' structure in the
--     'Vulkan.Core10.Image.createImage' command
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06804# If the @pNext@ chain
--     includes a 'ExportMetalSharedEventInfoEXT' structure, exactly one of
--     its @semaphore@ or @event@ members /must/ not be
--     'Vulkan.Core10.APIConstants.NULL_HANDLE'
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06805# If the @pNext@ chain
--     includes a 'ExportMetalSharedEventInfoEXT' structure, and its
--     @semaphore@ member is not 'Vulkan.Core10.APIConstants.NULL_HANDLE',
--     the 'Vulkan.Core10.Handles.Semaphore' in its @semaphore@ member
--     /must/ have been created with
--     'EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT' in the
--     @exportObjectType@ member of a 'ExportMetalObjectCreateInfoEXT'
--     structure in the @pNext@ chain of the
--     'Vulkan.Core10.QueueSemaphore.SemaphoreCreateInfo' structure in the
--     'Vulkan.Core10.QueueSemaphore.createSemaphore' command
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-06806# If the @pNext@ chain
--     includes a 'ExportMetalSharedEventInfoEXT' structure, and its
--     @event@ member is not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the
--     'Vulkan.Core10.Handles.Event' in its @event@ member /must/ have been
--     created with 'EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT'
--     in the @exportObjectType@ member of a
--     'ExportMetalObjectCreateInfoEXT' structure in the @pNext@ chain of
--     the 'Vulkan.Core10.Event.EventCreateInfo' structure in the
--     'Vulkan.Core10.Event.createEvent' command
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-sType-sType# @sType@ /must/ be
--     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_EXPORT_METAL_OBJECTS_INFO_EXT'
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-pNext-pNext# 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
--     'ExportMetalBufferInfoEXT', 'ExportMetalCommandQueueInfoEXT',
--     'ExportMetalDeviceInfoEXT', 'ExportMetalIOSurfaceInfoEXT',
--     'ExportMetalSharedEventInfoEXT', or 'ExportMetalTextureInfoEXT'
--
-- -   #VUID-VkExportMetalObjectsInfoEXT-sType-unique# The @sType@ value of
--     each structure in the @pNext@ chain /must/ be unique, with the
--     exception of structures of type 'ExportMetalBufferInfoEXT',
--     'ExportMetalCommandQueueInfoEXT', 'ExportMetalIOSurfaceInfoEXT',
--     'ExportMetalSharedEventInfoEXT', or 'ExportMetalTextureInfoEXT'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_metal_objects VK_EXT_metal_objects>,
-- 'Vulkan.Core10.Enums.StructureType.StructureType',
-- 'exportMetalObjectsEXT'
data ExportMetalObjectsInfoEXT (es :: [Type]) = ExportMetalObjectsInfoEXT
  { -- | @pNext@ is @NULL@ or a pointer to a structure extending this structure.
    next :: Chain es }
  deriving (Typeable)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ExportMetalObjectsInfoEXT (es :: [Type]))
#endif
deriving instance Show (Chain es) => Show (ExportMetalObjectsInfoEXT es)

instance Extensible ExportMetalObjectsInfoEXT where
  extensibleTypeName = "ExportMetalObjectsInfoEXT"
  setNext _ next' = ExportMetalObjectsInfoEXT{next = next'}
  getNext ExportMetalObjectsInfoEXT{..} = next
  extends :: forall e b proxy. Typeable e => proxy e -> (Extends ExportMetalObjectsInfoEXT e => b) -> Maybe b
  extends _ f
    | Just Refl <- eqT @e @ExportMetalSharedEventInfoEXT = Just f
    | Just Refl <- eqT @e @ExportMetalIOSurfaceInfoEXT = Just f
    | Just Refl <- eqT @e @ExportMetalTextureInfoEXT = Just f
    | Just Refl <- eqT @e @ExportMetalBufferInfoEXT = Just f
    | Just Refl <- eqT @e @ExportMetalCommandQueueInfoEXT = Just f
    | Just Refl <- eqT @e @ExportMetalDeviceInfoEXT = Just f
    | otherwise = Nothing

instance ( Extendss ExportMetalObjectsInfoEXT es
         , PokeChain es ) => ToCStruct (ExportMetalObjectsInfoEXT es) where
  withCStruct x f = allocaBytes 16 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p ExportMetalObjectsInfoEXT{..} f = evalContT $ do
    lift $ poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_OBJECTS_INFO_EXT)
    pNext'' <- fmap castPtr . ContT $ withChain (next)
    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) pNext''
    lift $ f
  cStructSize = 16
  cStructAlignment = 8
  pokeZeroCStruct p f = evalContT $ do
    lift $ poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_OBJECTS_INFO_EXT)
    pNext' <- fmap castPtr . ContT $ withZeroChain @es
    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) pNext'
    lift $ f

instance ( Extendss ExportMetalObjectsInfoEXT es
         , PeekChain es ) => FromCStruct (ExportMetalObjectsInfoEXT es) where
  peekCStruct p = do
    pNext <- peek @(Ptr ()) ((p `plusPtr` 8 :: Ptr (Ptr ())))
    next <- peekChain (castPtr pNext)
    pure $ ExportMetalObjectsInfoEXT
             next

instance es ~ '[] => Zero (ExportMetalObjectsInfoEXT es) where
  zero = ExportMetalObjectsInfoEXT
           ()


-- | VkExportMetalDeviceInfoEXT - Structure that identifies a VkDevice object
-- and corresponding Metal MTLDevice object
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structure>]
--
--     -   'ExportMetalObjectsInfoEXT'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_metal_objects VK_EXT_metal_objects>,
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data ExportMetalDeviceInfoEXT = ExportMetalDeviceInfoEXT
  { -- | @mtlDevice@ is the Metal @id\<MTLDevice>@ object underlying the
    -- 'Vulkan.Core10.Handles.PhysicalDevice' associated with the
    -- 'Vulkan.Core10.Handles.Device' object identified in the call. The
    -- implementation will return the @MTLDevice@ in this member, or it will
    -- return @NULL@ if no @MTLDevice@ could be found underlying the
    -- 'Vulkan.Core10.Handles.PhysicalDevice' object.
    mtlDevice :: MTLDevice_id }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ExportMetalDeviceInfoEXT)
#endif
deriving instance Show ExportMetalDeviceInfoEXT

instance ToCStruct ExportMetalDeviceInfoEXT where
  withCStruct x f = allocaBytes 24 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p ExportMetalDeviceInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_DEVICE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr MTLDevice_id)) (mtlDevice)
    f
  cStructSize = 24
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_DEVICE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr MTLDevice_id)) (zero)
    f

instance FromCStruct ExportMetalDeviceInfoEXT where
  peekCStruct p = do
    mtlDevice <- peek @MTLDevice_id ((p `plusPtr` 16 :: Ptr MTLDevice_id))
    pure $ ExportMetalDeviceInfoEXT
             mtlDevice

instance Storable ExportMetalDeviceInfoEXT where
  sizeOf ~_ = 24
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero ExportMetalDeviceInfoEXT where
  zero = ExportMetalDeviceInfoEXT
           zero


-- | VkExportMetalCommandQueueInfoEXT - Structure that identifies a VkQueue
-- object and corresponding Metal MTLCommandQueue object
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structure>]
--
--     -   'ExportMetalObjectsInfoEXT'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_metal_objects VK_EXT_metal_objects>,
-- 'Vulkan.Core10.Handles.Queue',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data ExportMetalCommandQueueInfoEXT = ExportMetalCommandQueueInfoEXT
  { -- | @queue@ is a 'Vulkan.Core10.Handles.Queue'.
    --
    -- #VUID-VkExportMetalCommandQueueInfoEXT-queue-parameter# @queue@ /must/
    -- be a valid 'Vulkan.Core10.Handles.Queue' handle
    queue :: Ptr Queue_T
  , -- | @mtlCommandQueue@ is the Metal @id\<MTLCommandQueue>@ object underlying
    -- the 'Vulkan.Core10.Handles.Queue' object in @queue@. The implementation
    -- will return the @MTLCommandQueue@ in this member, or it will return
    -- @NULL@ if no @MTLCommandQueue@ could be found underlying the
    -- 'Vulkan.Core10.Handles.Queue' object.
    mtlCommandQueue :: MTLCommandQueue_id
  }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ExportMetalCommandQueueInfoEXT)
#endif
deriving instance Show ExportMetalCommandQueueInfoEXT

instance ToCStruct ExportMetalCommandQueueInfoEXT where
  withCStruct x f = allocaBytes 32 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p ExportMetalCommandQueueInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_COMMAND_QUEUE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr (Ptr Queue_T))) (queue)
    poke ((p `plusPtr` 24 :: Ptr MTLCommandQueue_id)) (mtlCommandQueue)
    f
  cStructSize = 32
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_COMMAND_QUEUE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr (Ptr Queue_T))) (zero)
    poke ((p `plusPtr` 24 :: Ptr MTLCommandQueue_id)) (zero)
    f

instance FromCStruct ExportMetalCommandQueueInfoEXT where
  peekCStruct p = do
    queue <- peek @(Ptr Queue_T) ((p `plusPtr` 16 :: Ptr (Ptr Queue_T)))
    mtlCommandQueue <- peek @MTLCommandQueue_id ((p `plusPtr` 24 :: Ptr MTLCommandQueue_id))
    pure $ ExportMetalCommandQueueInfoEXT
             queue mtlCommandQueue

instance Storable ExportMetalCommandQueueInfoEXT where
  sizeOf ~_ = 32
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero ExportMetalCommandQueueInfoEXT where
  zero = ExportMetalCommandQueueInfoEXT
           zero
           zero


-- | VkExportMetalBufferInfoEXT - Structure that identifies a VkDeviceMemory
-- object and corresponding Metal MTLBuffer object
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structure>]
--
--     -   'ExportMetalObjectsInfoEXT'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_metal_objects VK_EXT_metal_objects>,
-- 'Vulkan.Core10.Handles.DeviceMemory',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data ExportMetalBufferInfoEXT = ExportMetalBufferInfoEXT
  { -- | @memory@ is a 'Vulkan.Core10.Handles.DeviceMemory'.
    --
    -- #VUID-VkExportMetalBufferInfoEXT-memory-parameter# @memory@ /must/ be a
    -- valid 'Vulkan.Core10.Handles.DeviceMemory' handle
    memory :: DeviceMemory
  , -- | @mtlBuffer@ is the Metal @id\<MTLBuffer>@ object underlying the
    -- 'Vulkan.Core10.Handles.DeviceMemory' object in @memory@. The
    -- implementation will return the @MTLBuffer@ in this member, or it will
    -- return @NULL@ if no @MTLBuffer@ could be found underlying the
    -- 'Vulkan.Core10.Handles.DeviceMemory' object.
    mtlBuffer :: MTLBuffer_id
  }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ExportMetalBufferInfoEXT)
#endif
deriving instance Show ExportMetalBufferInfoEXT

instance ToCStruct ExportMetalBufferInfoEXT where
  withCStruct x f = allocaBytes 32 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p ExportMetalBufferInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_BUFFER_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr DeviceMemory)) (memory)
    poke ((p `plusPtr` 24 :: Ptr MTLBuffer_id)) (mtlBuffer)
    f
  cStructSize = 32
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_BUFFER_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr DeviceMemory)) (zero)
    poke ((p `plusPtr` 24 :: Ptr MTLBuffer_id)) (zero)
    f

instance FromCStruct ExportMetalBufferInfoEXT where
  peekCStruct p = do
    memory <- peek @DeviceMemory ((p `plusPtr` 16 :: Ptr DeviceMemory))
    mtlBuffer <- peek @MTLBuffer_id ((p `plusPtr` 24 :: Ptr MTLBuffer_id))
    pure $ ExportMetalBufferInfoEXT
             memory mtlBuffer

instance Storable ExportMetalBufferInfoEXT where
  sizeOf ~_ = 32
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero ExportMetalBufferInfoEXT where
  zero = ExportMetalBufferInfoEXT
           zero
           zero


-- | VkImportMetalBufferInfoEXT - Structure that identifies a Metal MTLBuffer
-- object to use when creating a VkDeviceMemory object.
--
-- = Description
--
-- The application /must/ ensure that the configuration of the
-- @id\<MTLBuffer>@ object is compatible with the configuration of the
-- 'Vulkan.Core10.Handles.DeviceMemory'. Failure to do so results in
-- undefined behavior.
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structure>]
--
--     -   'Vulkan.Core10.Memory.MemoryAllocateInfo'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_metal_objects VK_EXT_metal_objects>,
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data ImportMetalBufferInfoEXT = ImportMetalBufferInfoEXT
  { -- | @mtlBuffer@ is the Metal @id\<MTLBuffer>@ object that is to underlie the
    -- 'Vulkan.Core10.Handles.DeviceMemory'.
    mtlBuffer :: MTLBuffer_id }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ImportMetalBufferInfoEXT)
#endif
deriving instance Show ImportMetalBufferInfoEXT

instance ToCStruct ImportMetalBufferInfoEXT where
  withCStruct x f = allocaBytes 24 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p ImportMetalBufferInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_IMPORT_METAL_BUFFER_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr MTLBuffer_id)) (mtlBuffer)
    f
  cStructSize = 24
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_IMPORT_METAL_BUFFER_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr MTLBuffer_id)) (zero)
    f

instance FromCStruct ImportMetalBufferInfoEXT where
  peekCStruct p = do
    mtlBuffer <- peek @MTLBuffer_id ((p `plusPtr` 16 :: Ptr MTLBuffer_id))
    pure $ ImportMetalBufferInfoEXT
             mtlBuffer

instance Storable ImportMetalBufferInfoEXT where
  sizeOf ~_ = 24
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero ImportMetalBufferInfoEXT where
  zero = ImportMetalBufferInfoEXT
           zero


-- | VkExportMetalTextureInfoEXT - Structure that identifies a VkImage,
-- VkImageView, or VkBufferView object and corresponding Metal MTLTexture
-- object
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-VkExportMetalTextureInfoEXT-sType-sType# @sType@ /must/ be
--     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_EXPORT_METAL_TEXTURE_INFO_EXT'
--
-- -   #VUID-VkExportMetalTextureInfoEXT-image-parameter# If @image@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', @image@ /must/ be a valid
--     'Vulkan.Core10.Handles.Image' handle
--
-- -   #VUID-VkExportMetalTextureInfoEXT-imageView-parameter# If
--     @imageView@ is not 'Vulkan.Core10.APIConstants.NULL_HANDLE',
--     @imageView@ /must/ be a valid 'Vulkan.Core10.Handles.ImageView'
--     handle
--
-- -   #VUID-VkExportMetalTextureInfoEXT-bufferView-parameter# If
--     @bufferView@ is not 'Vulkan.Core10.APIConstants.NULL_HANDLE',
--     @bufferView@ /must/ be a valid 'Vulkan.Core10.Handles.BufferView'
--     handle
--
-- -   #VUID-VkExportMetalTextureInfoEXT-plane-parameter# @plane@ /must/ be
--     a valid
--     'Vulkan.Core10.Enums.ImageAspectFlagBits.ImageAspectFlagBits' value
--
-- -   #VUID-VkExportMetalTextureInfoEXT-commonparent# Each of
--     @bufferView@, @image@, and @imageView@ that are valid handles of
--     non-ignored parameters /must/ have been created, allocated, or
--     retrieved from the same 'Vulkan.Core10.Handles.Device'
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structure>]
--
--     -   'ExportMetalObjectsInfoEXT'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_metal_objects VK_EXT_metal_objects>,
-- 'Vulkan.Core10.Handles.BufferView', 'Vulkan.Core10.Handles.Image',
-- 'Vulkan.Core10.Enums.ImageAspectFlagBits.ImageAspectFlagBits',
-- 'Vulkan.Core10.Handles.ImageView',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data ExportMetalTextureInfoEXT = ExportMetalTextureInfoEXT
  { -- | @image@ is 'Vulkan.Core10.APIConstants.NULL_HANDLE' or a
    -- 'Vulkan.Core10.Handles.Image'.
    image :: Image
  , -- | @imageView@ is 'Vulkan.Core10.APIConstants.NULL_HANDLE' or a
    -- 'Vulkan.Core10.Handles.ImageView'.
    imageView :: ImageView
  , -- | @bufferView@ is 'Vulkan.Core10.APIConstants.NULL_HANDLE' or a
    -- 'Vulkan.Core10.Handles.BufferView'.
    bufferView :: BufferView
  , -- | @plane@ specifies the plane of a multi-planar
    -- 'Vulkan.Core10.Handles.Image' or 'Vulkan.Core10.Handles.ImageView'.
    plane :: ImageAspectFlagBits
  , -- | @mtlTexture@ is the Metal @id\<MTLTexture>@ object underlying the
    -- 'Vulkan.Core10.Handles.Image', 'Vulkan.Core10.Handles.ImageView', or
    -- 'Vulkan.Core10.Handles.BufferView' object in @image@, @imageView@, or
    -- @bufferView@, respectively, at the plane indicated in @aspectMask@. The
    -- implementation will return the @MTLTexture@ in this member, or it will
    -- return @NULL@ if no @MTLTexture@ could be found underlying the
    -- 'Vulkan.Core10.Handles.Image', 'Vulkan.Core10.Handles.ImageView', or
    -- 'Vulkan.Core10.Handles.BufferView' object, at the plane indicated in
    -- @aspectMask@.
    mtlTexture :: MTLTexture_id
  }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ExportMetalTextureInfoEXT)
#endif
deriving instance Show ExportMetalTextureInfoEXT

instance ToCStruct ExportMetalTextureInfoEXT where
  withCStruct x f = allocaBytes 56 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p ExportMetalTextureInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_TEXTURE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr Image)) (image)
    poke ((p `plusPtr` 24 :: Ptr ImageView)) (imageView)
    poke ((p `plusPtr` 32 :: Ptr BufferView)) (bufferView)
    poke ((p `plusPtr` 40 :: Ptr ImageAspectFlagBits)) (plane)
    poke ((p `plusPtr` 48 :: Ptr MTLTexture_id)) (mtlTexture)
    f
  cStructSize = 56
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_TEXTURE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 40 :: Ptr ImageAspectFlagBits)) (zero)
    poke ((p `plusPtr` 48 :: Ptr MTLTexture_id)) (zero)
    f

instance FromCStruct ExportMetalTextureInfoEXT where
  peekCStruct p = do
    image <- peek @Image ((p `plusPtr` 16 :: Ptr Image))
    imageView <- peek @ImageView ((p `plusPtr` 24 :: Ptr ImageView))
    bufferView <- peek @BufferView ((p `plusPtr` 32 :: Ptr BufferView))
    plane <- peek @ImageAspectFlagBits ((p `plusPtr` 40 :: Ptr ImageAspectFlagBits))
    mtlTexture <- peek @MTLTexture_id ((p `plusPtr` 48 :: Ptr MTLTexture_id))
    pure $ ExportMetalTextureInfoEXT
             image imageView bufferView plane mtlTexture

instance Storable ExportMetalTextureInfoEXT where
  sizeOf ~_ = 56
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero ExportMetalTextureInfoEXT where
  zero = ExportMetalTextureInfoEXT
           zero
           zero
           zero
           zero
           zero


-- | VkImportMetalTextureInfoEXT - Structure that identifies Metal MTLTexture
-- objects to use when creating a VkImage.
--
-- = Description
--
-- The @pNext@ chain /must/ include one 'ImportMetalTextureInfoEXT'
-- structure for each plane in the 'Vulkan.Core10.Handles.Image'. The
-- application /must/ ensure that the configuration of the Metal
-- @id\<MTLTexture>@ objects are compatible with the configuration of the
-- 'Vulkan.Core10.Handles.Image'. Failure to do so results in undefined
-- behavior.
--
-- Due to @id\<MTLTexture>@ already being backed by memory, images created
-- with 'ImportMetalTextureInfoEXT' in the @pNext@ of the
-- 'Vulkan.Core10.Image.ImageCreateInfo' will be treated as bound to a
-- VkDeviceMemory.
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structure>]
--
--     -   'Vulkan.Core10.Image.ImageCreateInfo'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_metal_objects VK_EXT_metal_objects>,
-- 'Vulkan.Core10.Enums.ImageAspectFlagBits.ImageAspectFlagBits',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data ImportMetalTextureInfoEXT = ImportMetalTextureInfoEXT
  { -- | @plane@ specifies the plane of the 'Vulkan.Core10.Handles.Image' that
    -- the @id\<MTLTexture>@ object should be attached to.
    --
    -- #VUID-VkImportMetalTextureInfoEXT-plane-parameter# @plane@ /must/ be a
    -- valid 'Vulkan.Core10.Enums.ImageAspectFlagBits.ImageAspectFlagBits'
    -- value
    plane :: ImageAspectFlagBits
  , -- | @mtlTexture@ is a the Metal @id\<MTLTexture>@ object that is to underlie
    -- the 'Vulkan.Core10.Handles.Image' plane.
    mtlTexture :: MTLTexture_id
  }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ImportMetalTextureInfoEXT)
#endif
deriving instance Show ImportMetalTextureInfoEXT

instance ToCStruct ImportMetalTextureInfoEXT where
  withCStruct x f = allocaBytes 32 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p ImportMetalTextureInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_IMPORT_METAL_TEXTURE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr ImageAspectFlagBits)) (plane)
    poke ((p `plusPtr` 24 :: Ptr MTLTexture_id)) (mtlTexture)
    f
  cStructSize = 32
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_IMPORT_METAL_TEXTURE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr ImageAspectFlagBits)) (zero)
    poke ((p `plusPtr` 24 :: Ptr MTLTexture_id)) (zero)
    f

instance FromCStruct ImportMetalTextureInfoEXT where
  peekCStruct p = do
    plane <- peek @ImageAspectFlagBits ((p `plusPtr` 16 :: Ptr ImageAspectFlagBits))
    mtlTexture <- peek @MTLTexture_id ((p `plusPtr` 24 :: Ptr MTLTexture_id))
    pure $ ImportMetalTextureInfoEXT
             plane mtlTexture

instance Storable ImportMetalTextureInfoEXT where
  sizeOf ~_ = 32
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero ImportMetalTextureInfoEXT where
  zero = ImportMetalTextureInfoEXT
           zero
           zero


-- | VkExportMetalIOSurfaceInfoEXT - Structure that identifies a VkImage
-- object and corresponding Metal IOSurfaceRef object
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structure>]
--
--     -   'ExportMetalObjectsInfoEXT'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_metal_objects VK_EXT_metal_objects>,
-- 'Vulkan.Core10.Handles.Image',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data ExportMetalIOSurfaceInfoEXT = ExportMetalIOSurfaceInfoEXT
  { -- | @image@ is a 'Vulkan.Core10.Handles.Image'.
    --
    -- #VUID-VkExportMetalIOSurfaceInfoEXT-image-parameter# @image@ /must/ be a
    -- valid 'Vulkan.Core10.Handles.Image' handle
    image :: Image
  , -- | @ioSurface@ is the Metal 'IOSurfaceRef' object underlying the
    -- 'Vulkan.Core10.Handles.Image' object in @image@. The implementation will
    -- return the 'IOSurfaceRef' in this member, or it will return @NULL@ if no
    -- 'IOSurfaceRef' could be found underlying the
    -- 'Vulkan.Core10.Handles.Image' object.
    ioSurface :: IOSurfaceRef
  }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ExportMetalIOSurfaceInfoEXT)
#endif
deriving instance Show ExportMetalIOSurfaceInfoEXT

instance ToCStruct ExportMetalIOSurfaceInfoEXT where
  withCStruct x f = allocaBytes 32 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p ExportMetalIOSurfaceInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_IO_SURFACE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr Image)) (image)
    poke ((p `plusPtr` 24 :: Ptr IOSurfaceRef)) (ioSurface)
    f
  cStructSize = 32
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_IO_SURFACE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr Image)) (zero)
    poke ((p `plusPtr` 24 :: Ptr IOSurfaceRef)) (zero)
    f

instance FromCStruct ExportMetalIOSurfaceInfoEXT where
  peekCStruct p = do
    image <- peek @Image ((p `plusPtr` 16 :: Ptr Image))
    ioSurface <- peek @IOSurfaceRef ((p `plusPtr` 24 :: Ptr IOSurfaceRef))
    pure $ ExportMetalIOSurfaceInfoEXT
             image ioSurface

instance Storable ExportMetalIOSurfaceInfoEXT where
  sizeOf ~_ = 32
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero ExportMetalIOSurfaceInfoEXT where
  zero = ExportMetalIOSurfaceInfoEXT
           zero
           zero


-- | VkImportMetalIOSurfaceInfoEXT - Structure that identifies a VkImage
-- object and corresponding Metal IOSurfaceRef object to use.
--
-- = Description
--
-- If @ioSurface@ is not 'Vulkan.Core10.APIConstants.NULL_HANDLE', it will
-- be used to underlie the 'Vulkan.Core10.Handles.Image'. If @ioSurface@ is
-- 'Vulkan.Core10.APIConstants.NULL_HANDLE', the implementation will create
-- a new @IOSurface@ to underlie the 'Vulkan.Core10.Handles.Image'.
--
-- If provided, the application /must/ ensure that the configuration of the
-- 'IOSurfaceRef' object is compatible with the configuration of the
-- 'Vulkan.Core10.Handles.Image'. Failure to do so results in undefined
-- behavior.
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structure>]
--
--     -   'Vulkan.Core10.Image.ImageCreateInfo'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_metal_objects VK_EXT_metal_objects>,
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data ImportMetalIOSurfaceInfoEXT = ImportMetalIOSurfaceInfoEXT
  { -- | @ioSurface@ is 'Vulkan.Core10.APIConstants.NULL_HANDLE' or the Metal
    -- 'IOSurfaceRef' object that is to underlie the
    -- 'Vulkan.Core10.Handles.Image'.
    ioSurface :: IOSurfaceRef }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ImportMetalIOSurfaceInfoEXT)
#endif
deriving instance Show ImportMetalIOSurfaceInfoEXT

instance ToCStruct ImportMetalIOSurfaceInfoEXT where
  withCStruct x f = allocaBytes 24 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p ImportMetalIOSurfaceInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_IMPORT_METAL_IO_SURFACE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr IOSurfaceRef)) (ioSurface)
    f
  cStructSize = 24
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_IMPORT_METAL_IO_SURFACE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    f

instance FromCStruct ImportMetalIOSurfaceInfoEXT where
  peekCStruct p = do
    ioSurface <- peek @IOSurfaceRef ((p `plusPtr` 16 :: Ptr IOSurfaceRef))
    pure $ ImportMetalIOSurfaceInfoEXT
             ioSurface

instance Storable ImportMetalIOSurfaceInfoEXT where
  sizeOf ~_ = 24
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero ImportMetalIOSurfaceInfoEXT where
  zero = ImportMetalIOSurfaceInfoEXT
           zero


-- | VkExportMetalSharedEventInfoEXT - Structure that identifies a
-- VkSemaphore or VkEvent object and corresponding Metal MTLSharedEvent
-- object
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-VkExportMetalSharedEventInfoEXT-sType-sType# @sType@ /must/ be
--     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_EXPORT_METAL_SHARED_EVENT_INFO_EXT'
--
-- -   #VUID-VkExportMetalSharedEventInfoEXT-semaphore-parameter# If
--     @semaphore@ is not 'Vulkan.Core10.APIConstants.NULL_HANDLE',
--     @semaphore@ /must/ be a valid 'Vulkan.Core10.Handles.Semaphore'
--     handle
--
-- -   #VUID-VkExportMetalSharedEventInfoEXT-event-parameter# If @event@ is
--     not 'Vulkan.Core10.APIConstants.NULL_HANDLE', @event@ /must/ be a
--     valid 'Vulkan.Core10.Handles.Event' handle
--
-- -   #VUID-VkExportMetalSharedEventInfoEXT-commonparent# Both of @event@,
--     and @semaphore@ that are valid handles of non-ignored parameters
--     /must/ have been created, allocated, or retrieved from the same
--     'Vulkan.Core10.Handles.Device'
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structure>]
--
--     -   'ExportMetalObjectsInfoEXT'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_metal_objects VK_EXT_metal_objects>,
-- 'Vulkan.Core10.Handles.Event', 'Vulkan.Core10.Handles.Semaphore',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data ExportMetalSharedEventInfoEXT = ExportMetalSharedEventInfoEXT
  { -- | @semaphore@ is 'Vulkan.Core10.APIConstants.NULL_HANDLE' or a
    -- 'Vulkan.Core10.Handles.Semaphore'.
    semaphore :: Semaphore
  , -- | @event@ is 'Vulkan.Core10.APIConstants.NULL_HANDLE' or a
    -- 'Vulkan.Core10.Handles.Event'.
    event :: Event
  , -- | @mtlSharedEvent@ is the Metal @id\<MTLSharedEvent>@ object underlying
    -- the 'Vulkan.Core10.Handles.Semaphore' or 'Vulkan.Core10.Handles.Event'
    -- object in @semaphore@ or @event@, respectively. The implementation will
    -- return the @MTLSharedEvent@ in this member, or it will return @NULL@ if
    -- no @MTLSharedEvent@ could be found underlying the
    -- 'Vulkan.Core10.Handles.Semaphore' or 'Vulkan.Core10.Handles.Event'
    -- object.
    mtlSharedEvent :: MTLSharedEvent_id
  }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ExportMetalSharedEventInfoEXT)
#endif
deriving instance Show ExportMetalSharedEventInfoEXT

instance ToCStruct ExportMetalSharedEventInfoEXT where
  withCStruct x f = allocaBytes 40 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p ExportMetalSharedEventInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_SHARED_EVENT_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr Semaphore)) (semaphore)
    poke ((p `plusPtr` 24 :: Ptr Event)) (event)
    poke ((p `plusPtr` 32 :: Ptr MTLSharedEvent_id)) (mtlSharedEvent)
    f
  cStructSize = 40
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_EXPORT_METAL_SHARED_EVENT_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 32 :: Ptr MTLSharedEvent_id)) (zero)
    f

instance FromCStruct ExportMetalSharedEventInfoEXT where
  peekCStruct p = do
    semaphore <- peek @Semaphore ((p `plusPtr` 16 :: Ptr Semaphore))
    event <- peek @Event ((p `plusPtr` 24 :: Ptr Event))
    mtlSharedEvent <- peek @MTLSharedEvent_id ((p `plusPtr` 32 :: Ptr MTLSharedEvent_id))
    pure $ ExportMetalSharedEventInfoEXT
             semaphore event mtlSharedEvent

instance Storable ExportMetalSharedEventInfoEXT where
  sizeOf ~_ = 40
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero ExportMetalSharedEventInfoEXT where
  zero = ExportMetalSharedEventInfoEXT
           zero
           zero
           zero


-- | VkImportMetalSharedEventInfoEXT - Structure that identifies a
-- VkSemaphore or VkEvent object and corresponding Metal Shared Event
-- object to use.
--
-- = Description
--
-- If the @pNext@ chain of the
-- 'Vulkan.Core10.QueueSemaphore.SemaphoreCreateInfo' structure includes
-- both 'ImportMetalSharedEventInfoEXT' and
-- 'Vulkan.Core12.Promoted_From_VK_KHR_timeline_semaphore.SemaphoreTypeCreateInfo',
-- the @signaledValue@ property of the imported @id\<MTLSharedEvent>@
-- object will be set to
-- 'Vulkan.Core12.Promoted_From_VK_KHR_timeline_semaphore.SemaphoreTypeCreateInfo'::@initialValue@.
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structures>]
--
--     -   'Vulkan.Core10.Event.EventCreateInfo'
--
--     -   'Vulkan.Core10.QueueSemaphore.SemaphoreCreateInfo'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_metal_objects VK_EXT_metal_objects>,
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data ImportMetalSharedEventInfoEXT = ImportMetalSharedEventInfoEXT
  { -- | @mtlSharedEvent@ is the Metal @id\<MTLSharedEvent>@ object that is to
    -- underlie the 'Vulkan.Core10.Handles.Semaphore' or
    -- 'Vulkan.Core10.Handles.Event'.
    mtlSharedEvent :: MTLSharedEvent_id }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ImportMetalSharedEventInfoEXT)
#endif
deriving instance Show ImportMetalSharedEventInfoEXT

instance ToCStruct ImportMetalSharedEventInfoEXT where
  withCStruct x f = allocaBytes 24 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p ImportMetalSharedEventInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_IMPORT_METAL_SHARED_EVENT_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr MTLSharedEvent_id)) (mtlSharedEvent)
    f
  cStructSize = 24
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_IMPORT_METAL_SHARED_EVENT_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr MTLSharedEvent_id)) (zero)
    f

instance FromCStruct ImportMetalSharedEventInfoEXT where
  peekCStruct p = do
    mtlSharedEvent <- peek @MTLSharedEvent_id ((p `plusPtr` 16 :: Ptr MTLSharedEvent_id))
    pure $ ImportMetalSharedEventInfoEXT
             mtlSharedEvent

instance Storable ImportMetalSharedEventInfoEXT where
  sizeOf ~_ = 24
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero ImportMetalSharedEventInfoEXT where
  zero = ImportMetalSharedEventInfoEXT
           zero


type ExportMetalObjectTypeFlagsEXT = ExportMetalObjectTypeFlagBitsEXT

-- | VkExportMetalObjectTypeFlagBitsEXT - Bitmask specifying Metal object
-- types that can be exported from a Vulkan object
--
-- = Description
--
-- -   'EXPORT_METAL_OBJECT_TYPE_METAL_DEVICE_BIT_EXT' specifies that a
--     Metal @MTLDevice@ may be exported.
--
-- -   'EXPORT_METAL_OBJECT_TYPE_METAL_COMMAND_QUEUE_BIT_EXT' specifies
--     that a Metal @MTLCommandQueue@ may be exported.
--
-- -   'EXPORT_METAL_OBJECT_TYPE_METAL_BUFFER_BIT_EXT' specifies that a
--     Metal @MTLBuffer@ may be exported.
--
-- -   'EXPORT_METAL_OBJECT_TYPE_METAL_TEXTURE_BIT_EXT' specifies that a
--     Metal @MTLTexture@ may be exported.
--
-- -   'EXPORT_METAL_OBJECT_TYPE_METAL_IOSURFACE_BIT_EXT' specifies that a
--     Metal @IOSurface@ may be exported.
--
-- -   'EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT' specifies that
--     a Metal @MTLSharedEvent@ may be exported.
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_metal_objects VK_EXT_metal_objects>,
-- 'ExportMetalObjectCreateInfoEXT', 'ExportMetalObjectTypeFlagsEXT'
newtype ExportMetalObjectTypeFlagBitsEXT = ExportMetalObjectTypeFlagBitsEXT Flags
  deriving newtype (Eq, Ord, Storable, Zero, Bits, FiniteBits)

-- No documentation found for Nested "VkExportMetalObjectTypeFlagBitsEXT" "VK_EXPORT_METAL_OBJECT_TYPE_METAL_DEVICE_BIT_EXT"
pattern EXPORT_METAL_OBJECT_TYPE_METAL_DEVICE_BIT_EXT = ExportMetalObjectTypeFlagBitsEXT 0x00000001

-- No documentation found for Nested "VkExportMetalObjectTypeFlagBitsEXT" "VK_EXPORT_METAL_OBJECT_TYPE_METAL_COMMAND_QUEUE_BIT_EXT"
pattern EXPORT_METAL_OBJECT_TYPE_METAL_COMMAND_QUEUE_BIT_EXT = ExportMetalObjectTypeFlagBitsEXT 0x00000002

-- No documentation found for Nested "VkExportMetalObjectTypeFlagBitsEXT" "VK_EXPORT_METAL_OBJECT_TYPE_METAL_BUFFER_BIT_EXT"
pattern EXPORT_METAL_OBJECT_TYPE_METAL_BUFFER_BIT_EXT = ExportMetalObjectTypeFlagBitsEXT 0x00000004

-- No documentation found for Nested "VkExportMetalObjectTypeFlagBitsEXT" "VK_EXPORT_METAL_OBJECT_TYPE_METAL_TEXTURE_BIT_EXT"
pattern EXPORT_METAL_OBJECT_TYPE_METAL_TEXTURE_BIT_EXT = ExportMetalObjectTypeFlagBitsEXT 0x00000008

-- No documentation found for Nested "VkExportMetalObjectTypeFlagBitsEXT" "VK_EXPORT_METAL_OBJECT_TYPE_METAL_IOSURFACE_BIT_EXT"
pattern EXPORT_METAL_OBJECT_TYPE_METAL_IOSURFACE_BIT_EXT = ExportMetalObjectTypeFlagBitsEXT 0x00000010

-- No documentation found for Nested "VkExportMetalObjectTypeFlagBitsEXT" "VK_EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT"
pattern EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT = ExportMetalObjectTypeFlagBitsEXT 0x00000020

conNameExportMetalObjectTypeFlagBitsEXT :: String
conNameExportMetalObjectTypeFlagBitsEXT = "ExportMetalObjectTypeFlagBitsEXT"

enumPrefixExportMetalObjectTypeFlagBitsEXT :: String
enumPrefixExportMetalObjectTypeFlagBitsEXT = "EXPORT_METAL_OBJECT_TYPE_METAL_"

showTableExportMetalObjectTypeFlagBitsEXT :: [(ExportMetalObjectTypeFlagBitsEXT, String)]
showTableExportMetalObjectTypeFlagBitsEXT =
  [
    ( EXPORT_METAL_OBJECT_TYPE_METAL_DEVICE_BIT_EXT
    , "DEVICE_BIT_EXT"
    )
  ,
    ( EXPORT_METAL_OBJECT_TYPE_METAL_COMMAND_QUEUE_BIT_EXT
    , "COMMAND_QUEUE_BIT_EXT"
    )
  ,
    ( EXPORT_METAL_OBJECT_TYPE_METAL_BUFFER_BIT_EXT
    , "BUFFER_BIT_EXT"
    )
  ,
    ( EXPORT_METAL_OBJECT_TYPE_METAL_TEXTURE_BIT_EXT
    , "TEXTURE_BIT_EXT"
    )
  ,
    ( EXPORT_METAL_OBJECT_TYPE_METAL_IOSURFACE_BIT_EXT
    , "IOSURFACE_BIT_EXT"
    )
  ,
    ( EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT
    , "SHARED_EVENT_BIT_EXT"
    )
  ]

instance Show ExportMetalObjectTypeFlagBitsEXT where
  showsPrec =
    enumShowsPrec
      enumPrefixExportMetalObjectTypeFlagBitsEXT
      showTableExportMetalObjectTypeFlagBitsEXT
      conNameExportMetalObjectTypeFlagBitsEXT
      (\(ExportMetalObjectTypeFlagBitsEXT x) -> x)
      (\x -> showString "0x" . showHex x)

instance Read ExportMetalObjectTypeFlagBitsEXT where
  readPrec =
    enumReadPrec
      enumPrefixExportMetalObjectTypeFlagBitsEXT
      showTableExportMetalObjectTypeFlagBitsEXT
      conNameExportMetalObjectTypeFlagBitsEXT
      ExportMetalObjectTypeFlagBitsEXT

type EXT_METAL_OBJECTS_SPEC_VERSION = 2

-- No documentation found for TopLevel "VK_EXT_METAL_OBJECTS_SPEC_VERSION"
pattern EXT_METAL_OBJECTS_SPEC_VERSION :: forall a . Integral a => a
pattern EXT_METAL_OBJECTS_SPEC_VERSION = 2


type EXT_METAL_OBJECTS_EXTENSION_NAME = "VK_EXT_metal_objects"

-- No documentation found for TopLevel "VK_EXT_METAL_OBJECTS_EXTENSION_NAME"
pattern EXT_METAL_OBJECTS_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern EXT_METAL_OBJECTS_EXTENSION_NAME = "VK_EXT_metal_objects"


type MTLDevice_id = Ptr ()


type MTLCommandQueue_id = Ptr ()


type MTLBuffer_id = Ptr ()


type MTLTexture_id = Ptr ()


type IOSurfaceRef = Ptr ()


type MTLSharedEvent_id = Ptr ()