{-# language CPP #-}
-- No documentation found for Chapter "Promoted_From_VK_KHR_sampler_ycbcr_conversion"
module Vulkan.Core11.Promoted_From_VK_KHR_sampler_ycbcr_conversion  ( createSamplerYcbcrConversion
                                                                    , withSamplerYcbcrConversion
                                                                    , destroySamplerYcbcrConversion
                                                                    , SamplerYcbcrConversionInfo(..)
                                                                    , SamplerYcbcrConversionCreateInfo(..)
                                                                    , BindImagePlaneMemoryInfo(..)
                                                                    , ImagePlaneMemoryRequirementsInfo(..)
                                                                    , PhysicalDeviceSamplerYcbcrConversionFeatures(..)
                                                                    , SamplerYcbcrConversionImageFormatProperties(..)
                                                                    , SamplerYcbcrConversion(..)
                                                                    , Format(..)
                                                                    , StructureType(..)
                                                                    , ObjectType(..)
                                                                    , ImageCreateFlagBits(..)
                                                                    , ImageCreateFlags
                                                                    , FormatFeatureFlagBits(..)
                                                                    , FormatFeatureFlags
                                                                    , ImageAspectFlagBits(..)
                                                                    , ImageAspectFlags
                                                                    , SamplerYcbcrModelConversion(..)
                                                                    , SamplerYcbcrRange(..)
                                                                    , ChromaLocation(..)
                                                                    ) where

import Vulkan.Internal.Utils (traceAroundEvent)
import Control.Exception.Base (bracket)
import Control.Monad (unless)
import Control.Monad.IO.Class (liftIO)
import Data.Typeable (eqT)
import Foreign.Marshal.Alloc (allocaBytes)
import Foreign.Marshal.Alloc (callocBytes)
import Foreign.Marshal.Alloc (free)
import GHC.Base (when)
import GHC.IO (throwIO)
import GHC.Ptr (castPtr)
import GHC.Ptr (nullFunPtr)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
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 Control.Monad.IO.Class (MonadIO)
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 Data.Word (Word32)
import Data.Kind (Type)
import Control.Monad.Trans.Cont (ContT(..))
import Vulkan.Core10.FundamentalTypes (bool32ToBool)
import Vulkan.Core10.FundamentalTypes (boolToBool32)
import Vulkan.CStruct.Extends (forgetExtensions)
import Vulkan.NamedType ((:::))
import Vulkan.Core10.AllocationCallbacks (AllocationCallbacks)
import Vulkan.Core10.FundamentalTypes (Bool32)
import Vulkan.CStruct.Extends (Chain)
import Vulkan.Core11.Enums.ChromaLocation (ChromaLocation)
import Vulkan.Core10.ImageView (ComponentMapping)
import Vulkan.Core10.Handles (Device)
import Vulkan.Core10.Handles (Device(..))
import Vulkan.Core10.Handles (Device(Device))
import Vulkan.Dynamic (DeviceCmds(pVkCreateSamplerYcbcrConversion))
import Vulkan.Dynamic (DeviceCmds(pVkDestroySamplerYcbcrConversion))
import Vulkan.Core10.Handles (Device_T)
import Vulkan.CStruct.Extends (Extends)
import Vulkan.CStruct.Extends (Extendss)
import Vulkan.CStruct.Extends (Extensible(..))
import {-# SOURCE #-} Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer (ExternalFormatANDROID)
import {-# SOURCE #-} Vulkan.Extensions.VK_QNX_external_memory_screen_buffer (ExternalFormatQNX)
import Vulkan.Core10.Enums.Filter (Filter)
import Vulkan.Core10.Enums.Format (Format)
import Vulkan.Core10.Enums.ImageAspectFlagBits (ImageAspectFlagBits)
import Vulkan.CStruct.Extends (PeekChain)
import Vulkan.CStruct.Extends (PeekChain(..))
import Vulkan.CStruct.Extends (PokeChain)
import Vulkan.CStruct.Extends (PokeChain(..))
import Vulkan.Core10.Enums.Result (Result)
import Vulkan.Core10.Enums.Result (Result(..))
import Vulkan.Core11.Handles (SamplerYcbcrConversion)
import Vulkan.Core11.Handles (SamplerYcbcrConversion(..))
import {-# SOURCE #-} Vulkan.Extensions.VK_QCOM_ycbcr_degamma (SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM)
import Vulkan.Core11.Enums.SamplerYcbcrModelConversion (SamplerYcbcrModelConversion)
import Vulkan.Core11.Enums.SamplerYcbcrRange (SamplerYcbcrRange)
import Vulkan.CStruct.Extends (SomeStruct)
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.Exception (VulkanException(..))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO))
import Vulkan.Core10.Enums.Result (Result(SUCCESS))
import Vulkan.Core11.Enums.ChromaLocation (ChromaLocation(..))
import Vulkan.Core10.Enums.Format (Format(..))
import Vulkan.Core10.Enums.FormatFeatureFlagBits (FormatFeatureFlagBits(..))
import Vulkan.Core10.Enums.FormatFeatureFlagBits (FormatFeatureFlags)
import Vulkan.Core10.Enums.ImageAspectFlagBits (ImageAspectFlagBits(..))
import Vulkan.Core10.Enums.ImageAspectFlagBits (ImageAspectFlags)
import Vulkan.Core10.Enums.ImageCreateFlagBits (ImageCreateFlagBits(..))
import Vulkan.Core10.Enums.ImageCreateFlagBits (ImageCreateFlags)
import Vulkan.Core10.Enums.ObjectType (ObjectType(..))
import Vulkan.Core11.Handles (SamplerYcbcrConversion(..))
import Vulkan.Core11.Enums.SamplerYcbcrModelConversion (SamplerYcbcrModelConversion(..))
import Vulkan.Core11.Enums.SamplerYcbcrRange (SamplerYcbcrRange(..))
import Vulkan.Core10.Enums.StructureType (StructureType(..))
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkCreateSamplerYcbcrConversion
  :: FunPtr (Ptr Device_T -> Ptr (SomeStruct SamplerYcbcrConversionCreateInfo) -> Ptr AllocationCallbacks -> Ptr SamplerYcbcrConversion -> IO Result) -> Ptr Device_T -> Ptr (SomeStruct SamplerYcbcrConversionCreateInfo) -> Ptr AllocationCallbacks -> Ptr SamplerYcbcrConversion -> IO Result

-- | vkCreateSamplerYcbcrConversion - Create a new Y′CBCR conversion
--
-- = Description
--
-- The interpretation of the configured sampler Y′CBCR conversion is
-- described in more detail in
-- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#textures-sampler-YCbCr-conversion the description of sampler Y′CBCR conversion>
-- in the
-- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#textures Image Operations>
-- chapter.
--
-- == Valid Usage
--
-- -   #VUID-vkCreateSamplerYcbcrConversion-None-01648# The
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#features-samplerYcbcrConversion samplerYcbcrConversion>
--     feature /must/ be enabled
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkCreateSamplerYcbcrConversion-device-parameter# @device@
--     /must/ be a valid 'Vulkan.Core10.Handles.Device' handle
--
-- -   #VUID-vkCreateSamplerYcbcrConversion-pCreateInfo-parameter#
--     @pCreateInfo@ /must/ be a valid pointer to a valid
--     'SamplerYcbcrConversionCreateInfo' structure
--
-- -   #VUID-vkCreateSamplerYcbcrConversion-pAllocator-parameter# If
--     @pAllocator@ is not @NULL@, @pAllocator@ /must/ be a valid pointer
--     to a valid 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks'
--     structure
--
-- -   #VUID-vkCreateSamplerYcbcrConversion-pYcbcrConversion-parameter#
--     @pYcbcrConversion@ /must/ be a valid pointer to a
--     'Vulkan.Core11.Handles.SamplerYcbcrConversion' handle
--
-- == Return Codes
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-successcodes Success>]
--
--     -   'Vulkan.Core10.Enums.Result.SUCCESS'
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-errorcodes Failure>]
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_HOST_MEMORY'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_DEVICE_MEMORY'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_1 VK_VERSION_1_1>,
-- 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks',
-- 'Vulkan.Core10.Handles.Device',
-- 'Vulkan.Core11.Handles.SamplerYcbcrConversion',
-- 'SamplerYcbcrConversionCreateInfo'
createSamplerYcbcrConversion :: forall a io
                              . ( Extendss SamplerYcbcrConversionCreateInfo a
                                , PokeChain a
                                , MonadIO io )
                             => -- | @device@ is the logical device that creates the sampler Y′CBCR
                                -- conversion.
                                Device
                             -> -- | @pCreateInfo@ is a pointer to a 'SamplerYcbcrConversionCreateInfo'
                                -- structure specifying the requested sampler Y′CBCR conversion.
                                (SamplerYcbcrConversionCreateInfo a)
                             -> -- | @pAllocator@ controls host memory allocation as described in the
                                -- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#memory-allocation Memory Allocation>
                                -- chapter.
                                ("allocator" ::: Maybe AllocationCallbacks)
                             -> io (SamplerYcbcrConversion)
createSamplerYcbcrConversion :: forall (a :: [*]) (io :: * -> *).
(Extendss SamplerYcbcrConversionCreateInfo a, PokeChain a,
 MonadIO io) =>
Device
-> SamplerYcbcrConversionCreateInfo a
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io SamplerYcbcrConversion
createSamplerYcbcrConversion Device
device
                               SamplerYcbcrConversionCreateInfo a
createInfo
                               "allocator" ::: Maybe AllocationCallbacks
allocator = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT forall a b. (a -> b) -> a -> b
$ do
  let vkCreateSamplerYcbcrConversionPtr :: FunPtr
  (Ptr Device_T
   -> ("pCreateInfo"
       ::: Ptr (SomeStruct SamplerYcbcrConversionCreateInfo))
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> ("pYcbcrConversion" ::: Ptr SamplerYcbcrConversion)
   -> IO Result)
vkCreateSamplerYcbcrConversionPtr = DeviceCmds
-> FunPtr
     (Ptr Device_T
      -> ("pCreateInfo"
          ::: Ptr (SomeStruct SamplerYcbcrConversionCreateInfo))
      -> ("pAllocator" ::: Ptr AllocationCallbacks)
      -> ("pYcbcrConversion" ::: Ptr SamplerYcbcrConversion)
      -> IO Result)
pVkCreateSamplerYcbcrConversion (case Device
device of Device{DeviceCmds
$sel:deviceCmds:Device :: Device -> DeviceCmds
deviceCmds :: DeviceCmds
deviceCmds} -> DeviceCmds
deviceCmds)
  forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr Device_T
   -> ("pCreateInfo"
       ::: Ptr (SomeStruct SamplerYcbcrConversionCreateInfo))
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> ("pYcbcrConversion" ::: Ptr SamplerYcbcrConversion)
   -> IO Result)
vkCreateSamplerYcbcrConversionPtr forall a. Eq a => a -> a -> Bool
/= forall a. FunPtr a
nullFunPtr) forall a b. (a -> b) -> a -> b
$
    forall e a. Exception e => e -> IO a
throwIO forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError forall a. Maybe a
Nothing IOErrorType
InvalidArgument String
"" String
"The function pointer for vkCreateSamplerYcbcrConversion is null" forall a. Maybe a
Nothing forall a. Maybe a
Nothing
  let vkCreateSamplerYcbcrConversion' :: Ptr Device_T
-> ("pCreateInfo"
    ::: Ptr (SomeStruct SamplerYcbcrConversionCreateInfo))
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> ("pYcbcrConversion" ::: Ptr SamplerYcbcrConversion)
-> IO Result
vkCreateSamplerYcbcrConversion' = FunPtr
  (Ptr Device_T
   -> ("pCreateInfo"
       ::: Ptr (SomeStruct SamplerYcbcrConversionCreateInfo))
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> ("pYcbcrConversion" ::: Ptr SamplerYcbcrConversion)
   -> IO Result)
-> Ptr Device_T
-> ("pCreateInfo"
    ::: Ptr (SomeStruct SamplerYcbcrConversionCreateInfo))
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> ("pYcbcrConversion" ::: Ptr SamplerYcbcrConversion)
-> IO Result
mkVkCreateSamplerYcbcrConversion FunPtr
  (Ptr Device_T
   -> ("pCreateInfo"
       ::: Ptr (SomeStruct SamplerYcbcrConversionCreateInfo))
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> ("pYcbcrConversion" ::: Ptr SamplerYcbcrConversion)
   -> IO Result)
vkCreateSamplerYcbcrConversionPtr
  Ptr (SamplerYcbcrConversionCreateInfo a)
pCreateInfo <- forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b
withCStruct (SamplerYcbcrConversionCreateInfo a
createInfo)
  "pAllocator" ::: Ptr AllocationCallbacks
pAllocator <- case ("allocator" ::: Maybe AllocationCallbacks
allocator) of
    "allocator" ::: Maybe AllocationCallbacks
Nothing -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Ptr a
nullPtr
    Just AllocationCallbacks
j -> forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b
withCStruct (AllocationCallbacks
j)
  "pYcbcrConversion" ::: Ptr SamplerYcbcrConversion
pPYcbcrConversion <- forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (forall a. Int -> IO (Ptr a)
callocBytes @SamplerYcbcrConversion Int
8) forall a. Ptr a -> IO ()
free
  Result
r <- forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. String -> IO a -> IO a
traceAroundEvent String
"vkCreateSamplerYcbcrConversion" (Ptr Device_T
-> ("pCreateInfo"
    ::: Ptr (SomeStruct SamplerYcbcrConversionCreateInfo))
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> ("pYcbcrConversion" ::: Ptr SamplerYcbcrConversion)
-> IO Result
vkCreateSamplerYcbcrConversion'
                                                                   (Device -> Ptr Device_T
deviceHandle (Device
device))
                                                                   (forall (a :: [*] -> *) (es :: [*]).
Ptr (a es) -> Ptr (SomeStruct a)
forgetExtensions Ptr (SamplerYcbcrConversionCreateInfo a)
pCreateInfo)
                                                                   "pAllocator" ::: Ptr AllocationCallbacks
pAllocator
                                                                   ("pYcbcrConversion" ::: Ptr SamplerYcbcrConversion
pPYcbcrConversion))
  forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Result
r forall a. Ord a => a -> a -> Bool
< Result
SUCCESS) (forall e a. Exception e => e -> IO a
throwIO (Result -> VulkanException
VulkanException Result
r))
  SamplerYcbcrConversion
pYcbcrConversion <- forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> IO a
peek @SamplerYcbcrConversion "pYcbcrConversion" ::: Ptr SamplerYcbcrConversion
pPYcbcrConversion
  forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ (SamplerYcbcrConversion
pYcbcrConversion)

-- | A convenience wrapper to make a compatible pair of calls to
-- 'createSamplerYcbcrConversion' and 'destroySamplerYcbcrConversion'
--
-- To ensure that 'destroySamplerYcbcrConversion' is always called: pass
-- 'Control.Exception.bracket' (or the allocate function from your
-- favourite resource management library) as the last argument.
-- To just extract the pair pass '(,)' as the last argument.
--
withSamplerYcbcrConversion :: forall a io r . (Extendss SamplerYcbcrConversionCreateInfo a, PokeChain a, MonadIO io) => Device -> SamplerYcbcrConversionCreateInfo a -> Maybe AllocationCallbacks -> (io SamplerYcbcrConversion -> (SamplerYcbcrConversion -> io ()) -> r) -> r
withSamplerYcbcrConversion :: forall (a :: [*]) (io :: * -> *) r.
(Extendss SamplerYcbcrConversionCreateInfo a, PokeChain a,
 MonadIO io) =>
Device
-> SamplerYcbcrConversionCreateInfo a
-> ("allocator" ::: Maybe AllocationCallbacks)
-> (io SamplerYcbcrConversion
    -> (SamplerYcbcrConversion -> io ()) -> r)
-> r
withSamplerYcbcrConversion Device
device SamplerYcbcrConversionCreateInfo a
pCreateInfo "allocator" ::: Maybe AllocationCallbacks
pAllocator io SamplerYcbcrConversion -> (SamplerYcbcrConversion -> io ()) -> r
b =
  io SamplerYcbcrConversion -> (SamplerYcbcrConversion -> io ()) -> r
b (forall (a :: [*]) (io :: * -> *).
(Extendss SamplerYcbcrConversionCreateInfo a, PokeChain a,
 MonadIO io) =>
Device
-> SamplerYcbcrConversionCreateInfo a
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io SamplerYcbcrConversion
createSamplerYcbcrConversion Device
device SamplerYcbcrConversionCreateInfo a
pCreateInfo "allocator" ::: Maybe AllocationCallbacks
pAllocator)
    (\(SamplerYcbcrConversion
o0) -> forall (io :: * -> *).
MonadIO io =>
Device
-> SamplerYcbcrConversion
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io ()
destroySamplerYcbcrConversion Device
device SamplerYcbcrConversion
o0 "allocator" ::: Maybe AllocationCallbacks
pAllocator)


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkDestroySamplerYcbcrConversion
  :: FunPtr (Ptr Device_T -> SamplerYcbcrConversion -> Ptr AllocationCallbacks -> IO ()) -> Ptr Device_T -> SamplerYcbcrConversion -> Ptr AllocationCallbacks -> IO ()

-- | vkDestroySamplerYcbcrConversion - Destroy a created Y′CBCR conversion
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkDestroySamplerYcbcrConversion-device-parameter# @device@
--     /must/ be a valid 'Vulkan.Core10.Handles.Device' handle
--
-- -   #VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parameter# If
--     @ycbcrConversion@ is not 'Vulkan.Core10.APIConstants.NULL_HANDLE',
--     @ycbcrConversion@ /must/ be a valid
--     'Vulkan.Core11.Handles.SamplerYcbcrConversion' handle
--
-- -   #VUID-vkDestroySamplerYcbcrConversion-pAllocator-parameter# If
--     @pAllocator@ is not @NULL@, @pAllocator@ /must/ be a valid pointer
--     to a valid 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks'
--     structure
--
-- -   #VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parent# If
--     @ycbcrConversion@ is a valid handle, it /must/ have been created,
--     allocated, or retrieved from @device@
--
-- == Host Synchronization
--
-- -   Host access to @ycbcrConversion@ /must/ be externally synchronized
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_1 VK_VERSION_1_1>,
-- 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks',
-- 'Vulkan.Core10.Handles.Device',
-- 'Vulkan.Core11.Handles.SamplerYcbcrConversion'
destroySamplerYcbcrConversion :: forall io
                               . (MonadIO io)
                              => -- | @device@ is the logical device that destroys the Y′CBCR conversion.
                                 Device
                              -> -- | @ycbcrConversion@ is the conversion to destroy.
                                 SamplerYcbcrConversion
                              -> -- | @pAllocator@ controls host memory allocation as described in the
                                 -- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#memory-allocation Memory Allocation>
                                 -- chapter.
                                 ("allocator" ::: Maybe AllocationCallbacks)
                              -> io ()
destroySamplerYcbcrConversion :: forall (io :: * -> *).
MonadIO io =>
Device
-> SamplerYcbcrConversion
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io ()
destroySamplerYcbcrConversion Device
device
                                SamplerYcbcrConversion
ycbcrConversion
                                "allocator" ::: Maybe AllocationCallbacks
allocator = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT forall a b. (a -> b) -> a -> b
$ do
  let vkDestroySamplerYcbcrConversionPtr :: FunPtr
  (Ptr Device_T
   -> SamplerYcbcrConversion
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> IO ())
vkDestroySamplerYcbcrConversionPtr = DeviceCmds
-> FunPtr
     (Ptr Device_T
      -> SamplerYcbcrConversion
      -> ("pAllocator" ::: Ptr AllocationCallbacks)
      -> IO ())
pVkDestroySamplerYcbcrConversion (case Device
device of Device{DeviceCmds
deviceCmds :: DeviceCmds
$sel:deviceCmds:Device :: Device -> DeviceCmds
deviceCmds} -> DeviceCmds
deviceCmds)
  forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr Device_T
   -> SamplerYcbcrConversion
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> IO ())
vkDestroySamplerYcbcrConversionPtr forall a. Eq a => a -> a -> Bool
/= forall a. FunPtr a
nullFunPtr) forall a b. (a -> b) -> a -> b
$
    forall e a. Exception e => e -> IO a
throwIO forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError forall a. Maybe a
Nothing IOErrorType
InvalidArgument String
"" String
"The function pointer for vkDestroySamplerYcbcrConversion is null" forall a. Maybe a
Nothing forall a. Maybe a
Nothing
  let vkDestroySamplerYcbcrConversion' :: Ptr Device_T
-> SamplerYcbcrConversion
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> IO ()
vkDestroySamplerYcbcrConversion' = FunPtr
  (Ptr Device_T
   -> SamplerYcbcrConversion
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> IO ())
-> Ptr Device_T
-> SamplerYcbcrConversion
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> IO ()
mkVkDestroySamplerYcbcrConversion FunPtr
  (Ptr Device_T
   -> SamplerYcbcrConversion
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> IO ())
vkDestroySamplerYcbcrConversionPtr
  "pAllocator" ::: Ptr AllocationCallbacks
pAllocator <- case ("allocator" ::: Maybe AllocationCallbacks
allocator) of
    "allocator" ::: Maybe AllocationCallbacks
Nothing -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Ptr a
nullPtr
    Just AllocationCallbacks
j -> forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b
withCStruct (AllocationCallbacks
j)
  forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. String -> IO a -> IO a
traceAroundEvent String
"vkDestroySamplerYcbcrConversion" (Ptr Device_T
-> SamplerYcbcrConversion
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> IO ()
vkDestroySamplerYcbcrConversion'
                                                               (Device -> Ptr Device_T
deviceHandle (Device
device))
                                                               (SamplerYcbcrConversion
ycbcrConversion)
                                                               "pAllocator" ::: Ptr AllocationCallbacks
pAllocator)
  forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ ()


-- | VkSamplerYcbcrConversionInfo - Structure specifying Y′CBCR conversion to
-- a sampler or image view
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_1 VK_VERSION_1_1>,
-- 'Vulkan.Core11.Handles.SamplerYcbcrConversion',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data SamplerYcbcrConversionInfo = SamplerYcbcrConversionInfo
  { -- | @conversion@ is a 'Vulkan.Core11.Handles.SamplerYcbcrConversion' handle
    -- created with 'createSamplerYcbcrConversion'.
    --
    -- #VUID-VkSamplerYcbcrConversionInfo-conversion-parameter# @conversion@
    -- /must/ be a valid 'Vulkan.Core11.Handles.SamplerYcbcrConversion' handle
    SamplerYcbcrConversionInfo -> SamplerYcbcrConversion
conversion :: SamplerYcbcrConversion }
  deriving (Typeable, SamplerYcbcrConversionInfo -> SamplerYcbcrConversionInfo -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SamplerYcbcrConversionInfo -> SamplerYcbcrConversionInfo -> Bool
$c/= :: SamplerYcbcrConversionInfo -> SamplerYcbcrConversionInfo -> Bool
== :: SamplerYcbcrConversionInfo -> SamplerYcbcrConversionInfo -> Bool
$c== :: SamplerYcbcrConversionInfo -> SamplerYcbcrConversionInfo -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (SamplerYcbcrConversionInfo)
#endif
deriving instance Show SamplerYcbcrConversionInfo

instance ToCStruct SamplerYcbcrConversionInfo where
  withCStruct :: forall b.
SamplerYcbcrConversionInfo
-> (Ptr SamplerYcbcrConversionInfo -> IO b) -> IO b
withCStruct SamplerYcbcrConversionInfo
x Ptr SamplerYcbcrConversionInfo -> IO b
f = forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
24 forall a b. (a -> b) -> a -> b
$ \Ptr SamplerYcbcrConversionInfo
p -> forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr SamplerYcbcrConversionInfo
p SamplerYcbcrConversionInfo
x (Ptr SamplerYcbcrConversionInfo -> IO b
f Ptr SamplerYcbcrConversionInfo
p)
  pokeCStruct :: forall b.
Ptr SamplerYcbcrConversionInfo
-> SamplerYcbcrConversionInfo -> IO b -> IO b
pokeCStruct Ptr SamplerYcbcrConversionInfo
p SamplerYcbcrConversionInfo{SamplerYcbcrConversion
conversion :: SamplerYcbcrConversion
$sel:conversion:SamplerYcbcrConversionInfo :: SamplerYcbcrConversionInfo -> SamplerYcbcrConversion
..} IO b
f = do
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SamplerYcbcrConversionInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SamplerYcbcrConversionInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (forall a. Ptr a
nullPtr)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SamplerYcbcrConversionInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr SamplerYcbcrConversion)) (SamplerYcbcrConversion
conversion)
    IO b
f
  cStructSize :: Int
cStructSize = Int
24
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b. Ptr SamplerYcbcrConversionInfo -> IO b -> IO b
pokeZeroCStruct Ptr SamplerYcbcrConversionInfo
p IO b
f = do
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SamplerYcbcrConversionInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SamplerYcbcrConversionInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (forall a. Ptr a
nullPtr)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SamplerYcbcrConversionInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr SamplerYcbcrConversion)) (forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct SamplerYcbcrConversionInfo where
  peekCStruct :: Ptr SamplerYcbcrConversionInfo -> IO SamplerYcbcrConversionInfo
peekCStruct Ptr SamplerYcbcrConversionInfo
p = do
    SamplerYcbcrConversion
conversion <- forall a. Storable a => Ptr a -> IO a
peek @SamplerYcbcrConversion ((Ptr SamplerYcbcrConversionInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr SamplerYcbcrConversion))
    forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ SamplerYcbcrConversion -> SamplerYcbcrConversionInfo
SamplerYcbcrConversionInfo
             SamplerYcbcrConversion
conversion

instance Storable SamplerYcbcrConversionInfo where
  sizeOf :: SamplerYcbcrConversionInfo -> Int
sizeOf ~SamplerYcbcrConversionInfo
_ = Int
24
  alignment :: SamplerYcbcrConversionInfo -> Int
alignment ~SamplerYcbcrConversionInfo
_ = Int
8
  peek :: Ptr SamplerYcbcrConversionInfo -> IO SamplerYcbcrConversionInfo
peek = forall a. FromCStruct a => Ptr a -> IO a
peekCStruct
  poke :: Ptr SamplerYcbcrConversionInfo
-> SamplerYcbcrConversionInfo -> IO ()
poke Ptr SamplerYcbcrConversionInfo
ptr SamplerYcbcrConversionInfo
poked = forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr SamplerYcbcrConversionInfo
ptr SamplerYcbcrConversionInfo
poked (forall (f :: * -> *) a. Applicative f => a -> f a
pure ())

instance Zero SamplerYcbcrConversionInfo where
  zero :: SamplerYcbcrConversionInfo
zero = SamplerYcbcrConversion -> SamplerYcbcrConversionInfo
SamplerYcbcrConversionInfo
           forall a. Zero a => a
zero


-- | VkSamplerYcbcrConversionCreateInfo - Structure specifying the parameters
-- of the newly created conversion
--
-- = Description
--
-- Note
--
-- Setting @forceExplicitReconstruction@ to
-- 'Vulkan.Core10.FundamentalTypes.TRUE' /may/ have a performance penalty
-- on implementations where explicit reconstruction is not the default mode
-- of operation.
--
-- If @format@ supports
-- 'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT'
-- the @forceExplicitReconstruction@ value behaves as if it was set to
-- 'Vulkan.Core10.FundamentalTypes.TRUE'.
--
-- If the @pNext@ chain includes a
-- 'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ExternalFormatANDROID'
-- structure with non-zero @externalFormat@ member, the sampler Y′CBCR
-- conversion object represents an /external format conversion/, and
-- @format@ /must/ be 'Vulkan.Core10.Enums.Format.FORMAT_UNDEFINED'. Such
-- conversions /must/ only be used to sample image views with a matching
-- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#memory-external-android-hardware-buffer-external-formats external format>.
-- When creating an external format conversion, the value of @components@
-- is ignored.
--
-- == Valid Usage
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-format-01904# If an
--     external format conversion is being created, @format@ /must/ be
--     'Vulkan.Core10.Enums.Format.FORMAT_UNDEFINED'
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-format-04061# If an
--     external format conversion is not being created, @format@ /must/
--     represent unsigned normalized values (i.e. the format /must/ be a
--     @UNORM@ format)
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-format-01650# The
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#potential-format-features potential format features>
--     of the sampler Y′CBCR conversion /must/ support
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT'
--     or
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT'
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651# If the
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#potential-format-features potential format features>
--     of the sampler Y′CBCR conversion do not support
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT',
--     @xChromaOffset@ and @yChromaOffset@ /must/ not be
--     'Vulkan.Core11.Enums.ChromaLocation.CHROMA_LOCATION_COSITED_EVEN' if
--     the corresponding components are
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#textures-chroma-reconstruction downsampled>
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652# If the
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#potential-format-features potential format features>
--     of the sampler Y′CBCR conversion do not support
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT',
--     @xChromaOffset@ and @yChromaOffset@ /must/ not be
--     'Vulkan.Core11.Enums.ChromaLocation.CHROMA_LOCATION_MIDPOINT' if the
--     corresponding components are
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#textures-chroma-reconstruction downsampled>
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-components-02581# If the
--     format has a @_422@ or @_420@ suffix, then @components.g@ /must/ be
--     the
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#resources-image-views-identity-mappings identity swizzle>
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-components-02582# If the
--     format has a @_422@ or @_420@ suffix, then @components.a@ /must/ be
--     the
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#resources-image-views-identity-mappings identity swizzle>,
--     'Vulkan.Core10.Enums.ComponentSwizzle.COMPONENT_SWIZZLE_ONE', or
--     'Vulkan.Core10.Enums.ComponentSwizzle.COMPONENT_SWIZZLE_ZERO'
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-components-02583# If the
--     format has a @_422@ or @_420@ suffix, then @components.r@ /must/ be
--     the
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#resources-image-views-identity-mappings identity swizzle>
--     or 'Vulkan.Core10.Enums.ComponentSwizzle.COMPONENT_SWIZZLE_B'
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-components-02584# If the
--     format has a @_422@ or @_420@ suffix, then @components.b@ /must/ be
--     the
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#resources-image-views-identity-mappings identity swizzle>
--     or 'Vulkan.Core10.Enums.ComponentSwizzle.COMPONENT_SWIZZLE_R'
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-components-02585# If the
--     format has a @_422@ or @_420@ suffix, and if either @components.r@
--     or @components.b@ is the
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#resources-image-views-identity-mappings identity swizzle>,
--     both values /must/ be the identity swizzle
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-01655# If
--     @ycbcrModel@ is not
--     'Vulkan.Core11.Enums.SamplerYcbcrModelConversion.SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY',
--     then @components.r@, @components.g@, and @components.b@ /must/
--     correspond to components of the @format@; that is, @components.r@,
--     @components.g@, and @components.b@ /must/ not be
--     'Vulkan.Core10.Enums.ComponentSwizzle.COMPONENT_SWIZZLE_ZERO' or
--     'Vulkan.Core10.Enums.ComponentSwizzle.COMPONENT_SWIZZLE_ONE', and
--     /must/ not correspond to a component containing zero or one as a
--     consequence of
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#textures-conversion-to-rgba conversion to RGBA>
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-02748# If
--     @ycbcrRange@ is
--     'Vulkan.Core11.Enums.SamplerYcbcrRange.SAMPLER_YCBCR_RANGE_ITU_NARROW'
--     then the R, G and B components obtained by applying the @component@
--     swizzle to @format@ /must/ each have a bit-depth greater than or
--     equal to 8
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-forceExplicitReconstruction-01656#
--     If the
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#potential-format-features potential format features>
--     of the sampler Y′CBCR conversion do not support
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT'
--     @forceExplicitReconstruction@ /must/ be
--     'Vulkan.Core10.FundamentalTypes.FALSE'
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-01657# If the
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#potential-format-features potential format features>
--     of the sampler Y′CBCR conversion do not support
--     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT',
--     @chromaFilter@ /must/ not be
--     'Vulkan.Core10.Enums.Filter.FILTER_LINEAR'
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-pNext-09207# If the @pNext@
--     chain includes a
--     'Vulkan.Extensions.VK_QCOM_ycbcr_degamma.SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM'
--     structure, and if the
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#features-ycbcr-degamma ycbcrDegamma>
--     feature is not enabled, then
--     'Vulkan.Extensions.VK_QCOM_ycbcr_degamma.SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM'::@enableYDegamma@
--     /must/ be 'Vulkan.Core10.FundamentalTypes.FALSE'
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-pNext-09208# If the @pNext@
--     chain includes a
--     'Vulkan.Extensions.VK_QCOM_ycbcr_degamma.SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM'
--     structure, and if the
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#features-ycbcr-degamma ycbcrDegamma>
--     feature is not enabled, then
--     'Vulkan.Extensions.VK_QCOM_ycbcr_degamma.SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM'::@enableCbCrDegamma@
--     /must/ be 'Vulkan.Core10.FundamentalTypes.FALSE'
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-pNext-09209# If the @pNext@
--     chain includes a
--     'Vulkan.Extensions.VK_QCOM_ycbcr_degamma.SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM'
--     structure, @format@ /must/ be a format with 8-bit R, G, and B
--     components.
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-sType-sType# @sType@ /must/
--     be
--     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO'
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-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
--     'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ExternalFormatANDROID',
--     'Vulkan.Extensions.VK_QNX_external_memory_screen_buffer.ExternalFormatQNX',
--     or
--     'Vulkan.Extensions.VK_QCOM_ycbcr_degamma.SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM'
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-sType-unique# The @sType@
--     value of each struct in the @pNext@ chain /must/ be unique
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-format-parameter# @format@
--     /must/ be a valid 'Vulkan.Core10.Enums.Format.Format' value
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-parameter#
--     @ycbcrModel@ /must/ be a valid
--     'Vulkan.Core11.Enums.SamplerYcbcrModelConversion.SamplerYcbcrModelConversion'
--     value
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-parameter#
--     @ycbcrRange@ /must/ be a valid
--     'Vulkan.Core11.Enums.SamplerYcbcrRange.SamplerYcbcrRange' value
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-components-parameter#
--     @components@ /must/ be a valid
--     'Vulkan.Core10.ImageView.ComponentMapping' structure
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-parameter#
--     @xChromaOffset@ /must/ be a valid
--     'Vulkan.Core11.Enums.ChromaLocation.ChromaLocation' value
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-yChromaOffset-parameter#
--     @yChromaOffset@ /must/ be a valid
--     'Vulkan.Core11.Enums.ChromaLocation.ChromaLocation' value
--
-- -   #VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-parameter#
--     @chromaFilter@ /must/ be a valid 'Vulkan.Core10.Enums.Filter.Filter'
--     value
--
-- If @chromaFilter@ is 'Vulkan.Core10.Enums.Filter.FILTER_NEAREST', chroma
-- samples are reconstructed to luma component resolution using
-- nearest-neighbour sampling. Otherwise, chroma samples are reconstructed
-- using interpolation. More details can be found in
-- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#textures-sampler-YCbCr-conversion the description of sampler Y′CBCR conversion>
-- in the
-- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#textures Image Operations>
-- chapter.
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_1 VK_VERSION_1_1>,
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core11.Enums.ChromaLocation.ChromaLocation',
-- 'Vulkan.Core10.ImageView.ComponentMapping',
-- 'Vulkan.Core10.Enums.Filter.Filter',
-- 'Vulkan.Core10.Enums.Format.Format',
-- 'Vulkan.Core11.Enums.SamplerYcbcrModelConversion.SamplerYcbcrModelConversion',
-- 'Vulkan.Core11.Enums.SamplerYcbcrRange.SamplerYcbcrRange',
-- 'Vulkan.Core10.Enums.StructureType.StructureType',
-- 'createSamplerYcbcrConversion',
-- 'Vulkan.Extensions.VK_KHR_sampler_ycbcr_conversion.createSamplerYcbcrConversionKHR'
data SamplerYcbcrConversionCreateInfo (es :: [Type]) = SamplerYcbcrConversionCreateInfo
  { -- | @pNext@ is @NULL@ or a pointer to a structure extending this structure.
    forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Chain es
next :: Chain es
  , -- | @format@ is the format of the image from which color information will be
    -- retrieved.
    forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Format
format :: Format
  , -- | @ycbcrModel@ describes the color matrix for conversion between color
    -- models.
    forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> SamplerYcbcrModelConversion
ycbcrModel :: SamplerYcbcrModelConversion
  , -- | @ycbcrRange@ describes whether the encoded values have headroom and foot
    -- room, or whether the encoding uses the full numerical range.
    forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> SamplerYcbcrRange
ycbcrRange :: SamplerYcbcrRange
  , -- | @components@ applies a /swizzle/ based on
    -- 'Vulkan.Core10.Enums.ComponentSwizzle.ComponentSwizzle' enums prior to
    -- range expansion and color model conversion.
    forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> ComponentMapping
components :: ComponentMapping
  , -- | @xChromaOffset@ describes the
    -- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#textures-chroma-reconstruction sample location>
    -- associated with downsampled chroma components in the x dimension.
    -- @xChromaOffset@ has no effect for formats in which chroma components are
    -- not downsampled horizontally.
    forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> ChromaLocation
xChromaOffset :: ChromaLocation
  , -- | @yChromaOffset@ describes the
    -- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#textures-chroma-reconstruction sample location>
    -- associated with downsampled chroma components in the y dimension.
    -- @yChromaOffset@ has no effect for formats in which the chroma components
    -- are not downsampled vertically.
    forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> ChromaLocation
yChromaOffset :: ChromaLocation
  , -- | @chromaFilter@ is the filter for chroma reconstruction.
    forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Filter
chromaFilter :: Filter
  , -- | @forceExplicitReconstruction@ /can/ be used to ensure that
    -- reconstruction is done explicitly, if supported.
    forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Bool
forceExplicitReconstruction :: Bool
  }
  deriving (Typeable)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (SamplerYcbcrConversionCreateInfo (es :: [Type]))
#endif
deriving instance Show (Chain es) => Show (SamplerYcbcrConversionCreateInfo es)

instance Extensible SamplerYcbcrConversionCreateInfo where
  extensibleTypeName :: String
extensibleTypeName = String
"SamplerYcbcrConversionCreateInfo"
  setNext :: forall (ds :: [*]) (es :: [*]).
SamplerYcbcrConversionCreateInfo ds
-> Chain es -> SamplerYcbcrConversionCreateInfo es
setNext SamplerYcbcrConversionCreateInfo{Bool
Chain ds
Filter
Format
ComponentMapping
SamplerYcbcrRange
SamplerYcbcrModelConversion
ChromaLocation
forceExplicitReconstruction :: Bool
chromaFilter :: Filter
yChromaOffset :: ChromaLocation
xChromaOffset :: ChromaLocation
components :: ComponentMapping
ycbcrRange :: SamplerYcbcrRange
ycbcrModel :: SamplerYcbcrModelConversion
format :: Format
next :: Chain ds
$sel:forceExplicitReconstruction:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Bool
$sel:chromaFilter:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Filter
$sel:yChromaOffset:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> ChromaLocation
$sel:xChromaOffset:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> ChromaLocation
$sel:components:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> ComponentMapping
$sel:ycbcrRange:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> SamplerYcbcrRange
$sel:ycbcrModel:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> SamplerYcbcrModelConversion
$sel:format:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Format
$sel:next:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Chain es
..} Chain es
next' = SamplerYcbcrConversionCreateInfo{$sel:next:SamplerYcbcrConversionCreateInfo :: Chain es
next = Chain es
next', Bool
Filter
Format
ComponentMapping
SamplerYcbcrRange
SamplerYcbcrModelConversion
ChromaLocation
forceExplicitReconstruction :: Bool
chromaFilter :: Filter
yChromaOffset :: ChromaLocation
xChromaOffset :: ChromaLocation
components :: ComponentMapping
ycbcrRange :: SamplerYcbcrRange
ycbcrModel :: SamplerYcbcrModelConversion
format :: Format
$sel:forceExplicitReconstruction:SamplerYcbcrConversionCreateInfo :: Bool
$sel:chromaFilter:SamplerYcbcrConversionCreateInfo :: Filter
$sel:yChromaOffset:SamplerYcbcrConversionCreateInfo :: ChromaLocation
$sel:xChromaOffset:SamplerYcbcrConversionCreateInfo :: ChromaLocation
$sel:components:SamplerYcbcrConversionCreateInfo :: ComponentMapping
$sel:ycbcrRange:SamplerYcbcrConversionCreateInfo :: SamplerYcbcrRange
$sel:ycbcrModel:SamplerYcbcrConversionCreateInfo :: SamplerYcbcrModelConversion
$sel:format:SamplerYcbcrConversionCreateInfo :: Format
..}
  getNext :: forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Chain es
getNext SamplerYcbcrConversionCreateInfo{Bool
Chain es
Filter
Format
ComponentMapping
SamplerYcbcrRange
SamplerYcbcrModelConversion
ChromaLocation
forceExplicitReconstruction :: Bool
chromaFilter :: Filter
yChromaOffset :: ChromaLocation
xChromaOffset :: ChromaLocation
components :: ComponentMapping
ycbcrRange :: SamplerYcbcrRange
ycbcrModel :: SamplerYcbcrModelConversion
format :: Format
next :: Chain es
$sel:forceExplicitReconstruction:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Bool
$sel:chromaFilter:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Filter
$sel:yChromaOffset:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> ChromaLocation
$sel:xChromaOffset:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> ChromaLocation
$sel:components:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> ComponentMapping
$sel:ycbcrRange:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> SamplerYcbcrRange
$sel:ycbcrModel:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> SamplerYcbcrModelConversion
$sel:format:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Format
$sel:next:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Chain es
..} = Chain es
next
  extends :: forall e b proxy. Typeable e => proxy e -> (Extends SamplerYcbcrConversionCreateInfo e => b) -> Maybe b
  extends :: forall e b (proxy :: * -> *).
Typeable e =>
proxy e
-> (Extends SamplerYcbcrConversionCreateInfo e => b) -> Maybe b
extends proxy e
_ Extends SamplerYcbcrConversionCreateInfo e => b
f
    | Just e :~: SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM
Refl <- forall {k} (a :: k) (b :: k).
(Typeable a, Typeable b) =>
Maybe (a :~: b)
eqT @e @SamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM = forall a. a -> Maybe a
Just Extends SamplerYcbcrConversionCreateInfo e => b
f
    | Just e :~: ExternalFormatQNX
Refl <- forall {k} (a :: k) (b :: k).
(Typeable a, Typeable b) =>
Maybe (a :~: b)
eqT @e @ExternalFormatQNX = forall a. a -> Maybe a
Just Extends SamplerYcbcrConversionCreateInfo e => b
f
    | Just e :~: ExternalFormatANDROID
Refl <- forall {k} (a :: k) (b :: k).
(Typeable a, Typeable b) =>
Maybe (a :~: b)
eqT @e @ExternalFormatANDROID = forall a. a -> Maybe a
Just Extends SamplerYcbcrConversionCreateInfo e => b
f
    | Bool
otherwise = forall a. Maybe a
Nothing

instance ( Extendss SamplerYcbcrConversionCreateInfo es
         , PokeChain es ) => ToCStruct (SamplerYcbcrConversionCreateInfo es) where
  withCStruct :: forall b.
SamplerYcbcrConversionCreateInfo es
-> (Ptr (SamplerYcbcrConversionCreateInfo es) -> IO b) -> IO b
withCStruct SamplerYcbcrConversionCreateInfo es
x Ptr (SamplerYcbcrConversionCreateInfo es) -> IO b
f = forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
64 forall a b. (a -> b) -> a -> b
$ \Ptr (SamplerYcbcrConversionCreateInfo es)
p -> forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr (SamplerYcbcrConversionCreateInfo es)
p SamplerYcbcrConversionCreateInfo es
x (Ptr (SamplerYcbcrConversionCreateInfo es) -> IO b
f Ptr (SamplerYcbcrConversionCreateInfo es)
p)
  pokeCStruct :: forall b.
Ptr (SamplerYcbcrConversionCreateInfo es)
-> SamplerYcbcrConversionCreateInfo es -> IO b -> IO b
pokeCStruct Ptr (SamplerYcbcrConversionCreateInfo es)
p SamplerYcbcrConversionCreateInfo{Bool
Chain es
Filter
Format
ComponentMapping
SamplerYcbcrRange
SamplerYcbcrModelConversion
ChromaLocation
forceExplicitReconstruction :: Bool
chromaFilter :: Filter
yChromaOffset :: ChromaLocation
xChromaOffset :: ChromaLocation
components :: ComponentMapping
ycbcrRange :: SamplerYcbcrRange
ycbcrModel :: SamplerYcbcrModelConversion
format :: Format
next :: Chain es
$sel:forceExplicitReconstruction:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Bool
$sel:chromaFilter:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Filter
$sel:yChromaOffset:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> ChromaLocation
$sel:xChromaOffset:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> ChromaLocation
$sel:components:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> ComponentMapping
$sel:ycbcrRange:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> SamplerYcbcrRange
$sel:ycbcrModel:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]).
SamplerYcbcrConversionCreateInfo es -> SamplerYcbcrModelConversion
$sel:format:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Format
$sel:next:SamplerYcbcrConversionCreateInfo :: forall (es :: [*]). SamplerYcbcrConversionCreateInfo es -> Chain es
..} IO b
f = forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT forall a b. (a -> b) -> a -> b
$ do
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO)
    Ptr ()
pNext'' <- forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. Ptr a -> Ptr b
castPtr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ forall (es :: [*]) a.
PokeChain es =>
Chain es -> (Ptr (Chain es) -> IO a) -> IO a
withChain (Chain es
next)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) Ptr ()
pNext''
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Format)) (Format
format)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
20 :: Ptr SamplerYcbcrModelConversion)) (SamplerYcbcrModelConversion
ycbcrModel)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr SamplerYcbcrRange)) (SamplerYcbcrRange
ycbcrRange)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
28 :: Ptr ComponentMapping)) (ComponentMapping
components)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
44 :: Ptr ChromaLocation)) (ChromaLocation
xChromaOffset)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
48 :: Ptr ChromaLocation)) (ChromaLocation
yChromaOffset)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
52 :: Ptr Filter)) (Filter
chromaFilter)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
56 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
forceExplicitReconstruction))
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ IO b
f
  cStructSize :: Int
cStructSize = Int
64
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b. Ptr (SamplerYcbcrConversionCreateInfo es) -> IO b -> IO b
pokeZeroCStruct Ptr (SamplerYcbcrConversionCreateInfo es)
p IO b
f = forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT forall a b. (a -> b) -> a -> b
$ do
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO)
    Ptr ()
pNext' <- forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. Ptr a -> Ptr b
castPtr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ forall (es :: [*]) a.
PokeChain es =>
(Ptr (Chain es) -> IO a) -> IO a
withZeroChain @es
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) Ptr ()
pNext'
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Format)) (forall a. Zero a => a
zero)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
20 :: Ptr SamplerYcbcrModelConversion)) (forall a. Zero a => a
zero)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr SamplerYcbcrRange)) (forall a. Zero a => a
zero)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
28 :: Ptr ComponentMapping)) (forall a. Zero a => a
zero)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
44 :: Ptr ChromaLocation)) (forall a. Zero a => a
zero)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
48 :: Ptr ChromaLocation)) (forall a. Zero a => a
zero)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
52 :: Ptr Filter)) (forall a. Zero a => a
zero)
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
56 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (forall a. Zero a => a
zero))
    forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ IO b
f

instance ( Extendss SamplerYcbcrConversionCreateInfo es
         , PeekChain es ) => FromCStruct (SamplerYcbcrConversionCreateInfo es) where
  peekCStruct :: Ptr (SamplerYcbcrConversionCreateInfo es)
-> IO (SamplerYcbcrConversionCreateInfo es)
peekCStruct Ptr (SamplerYcbcrConversionCreateInfo es)
p = do
    Ptr ()
pNext <- forall a. Storable a => Ptr a -> IO a
peek @(Ptr ()) ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ())))
    Chain es
next <- forall (es :: [*]). PeekChain es => Ptr (Chain es) -> IO (Chain es)
peekChain (forall a b. Ptr a -> Ptr b
castPtr Ptr ()
pNext)
    Format
format <- forall a. Storable a => Ptr a -> IO a
peek @Format ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Format))
    SamplerYcbcrModelConversion
ycbcrModel <- forall a. Storable a => Ptr a -> IO a
peek @SamplerYcbcrModelConversion ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
20 :: Ptr SamplerYcbcrModelConversion))
    SamplerYcbcrRange
ycbcrRange <- forall a. Storable a => Ptr a -> IO a
peek @SamplerYcbcrRange ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr SamplerYcbcrRange))
    ComponentMapping
components <- forall a. FromCStruct a => Ptr a -> IO a
peekCStruct @ComponentMapping ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
28 :: Ptr ComponentMapping))
    ChromaLocation
xChromaOffset <- forall a. Storable a => Ptr a -> IO a
peek @ChromaLocation ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
44 :: Ptr ChromaLocation))
    ChromaLocation
yChromaOffset <- forall a. Storable a => Ptr a -> IO a
peek @ChromaLocation ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
48 :: Ptr ChromaLocation))
    Filter
chromaFilter <- forall a. Storable a => Ptr a -> IO a
peek @Filter ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
52 :: Ptr Filter))
    Bool32
forceExplicitReconstruction <- forall a. Storable a => Ptr a -> IO a
peek @Bool32 ((Ptr (SamplerYcbcrConversionCreateInfo es)
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
56 :: Ptr Bool32))
    forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (es :: [*]).
Chain es
-> Format
-> SamplerYcbcrModelConversion
-> SamplerYcbcrRange
-> ComponentMapping
-> ChromaLocation
-> ChromaLocation
-> Filter
-> Bool
-> SamplerYcbcrConversionCreateInfo es
SamplerYcbcrConversionCreateInfo
             Chain es
next
             Format
format
             SamplerYcbcrModelConversion
ycbcrModel
             SamplerYcbcrRange
ycbcrRange
             ComponentMapping
components
             ChromaLocation
xChromaOffset
             ChromaLocation
yChromaOffset
             Filter
chromaFilter
             (Bool32 -> Bool
bool32ToBool Bool32
forceExplicitReconstruction)

instance es ~ '[] => Zero (SamplerYcbcrConversionCreateInfo es) where
  zero :: SamplerYcbcrConversionCreateInfo es
zero = forall (es :: [*]).
Chain es
-> Format
-> SamplerYcbcrModelConversion
-> SamplerYcbcrRange
-> ComponentMapping
-> ChromaLocation
-> ChromaLocation
-> Filter
-> Bool
-> SamplerYcbcrConversionCreateInfo es
SamplerYcbcrConversionCreateInfo
           ()
           forall a. Zero a => a
zero
           forall a. Zero a => a
zero
           forall a. Zero a => a
zero
           forall a. Zero a => a
zero
           forall a. Zero a => a
zero
           forall a. Zero a => a
zero
           forall a. Zero a => a
zero
           forall a. Zero a => a
zero


-- | VkBindImagePlaneMemoryInfo - Structure specifying how to bind an image
-- plane to memory
--
-- == Valid Usage
--
-- -   #VUID-VkBindImagePlaneMemoryInfo-planeAspect-02283# If the image’s
--     @tiling@ is 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_LINEAR' or
--     'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_OPTIMAL', then
--     @planeAspect@ /must/ be a single valid
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#formats-planes-image-aspect multi-planar aspect mask>
--     bit
--
-- -   #VUID-VkBindImagePlaneMemoryInfo-planeAspect-02284# If the image’s
--     @tiling@ is
--     'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT',
--     then @planeAspect@ /must/ be a single valid /memory plane/ for the
--     image (that is, @aspectMask@ /must/ specify a plane index that is
--     less than the
--     'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.DrmFormatModifierPropertiesEXT'::@drmFormatModifierPlaneCount@
--     associated with the image’s @format@ and
--     'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.ImageDrmFormatModifierPropertiesEXT'::@drmFormatModifier@)
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-VkBindImagePlaneMemoryInfo-sType-sType# @sType@ /must/ be
--     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO'
--
-- -   #VUID-VkBindImagePlaneMemoryInfo-planeAspect-parameter#
--     @planeAspect@ /must/ be a valid
--     'Vulkan.Core10.Enums.ImageAspectFlagBits.ImageAspectFlagBits' value
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_1 VK_VERSION_1_1>,
-- 'Vulkan.Core10.Enums.ImageAspectFlagBits.ImageAspectFlagBits',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data BindImagePlaneMemoryInfo = BindImagePlaneMemoryInfo
  { -- | @planeAspect@ is a
    -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.ImageAspectFlagBits' value
    -- specifying the aspect of the disjoint image plane to bind.
    BindImagePlaneMemoryInfo -> ImageAspectFlagBits
planeAspect :: ImageAspectFlagBits }
  deriving (Typeable, BindImagePlaneMemoryInfo -> BindImagePlaneMemoryInfo -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: BindImagePlaneMemoryInfo -> BindImagePlaneMemoryInfo -> Bool
$c/= :: BindImagePlaneMemoryInfo -> BindImagePlaneMemoryInfo -> Bool
== :: BindImagePlaneMemoryInfo -> BindImagePlaneMemoryInfo -> Bool
$c== :: BindImagePlaneMemoryInfo -> BindImagePlaneMemoryInfo -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (BindImagePlaneMemoryInfo)
#endif
deriving instance Show BindImagePlaneMemoryInfo

instance ToCStruct BindImagePlaneMemoryInfo where
  withCStruct :: forall b.
BindImagePlaneMemoryInfo
-> (Ptr BindImagePlaneMemoryInfo -> IO b) -> IO b
withCStruct BindImagePlaneMemoryInfo
x Ptr BindImagePlaneMemoryInfo -> IO b
f = forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
24 forall a b. (a -> b) -> a -> b
$ \Ptr BindImagePlaneMemoryInfo
p -> forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr BindImagePlaneMemoryInfo
p BindImagePlaneMemoryInfo
x (Ptr BindImagePlaneMemoryInfo -> IO b
f Ptr BindImagePlaneMemoryInfo
p)
  pokeCStruct :: forall b.
Ptr BindImagePlaneMemoryInfo
-> BindImagePlaneMemoryInfo -> IO b -> IO b
pokeCStruct Ptr BindImagePlaneMemoryInfo
p BindImagePlaneMemoryInfo{ImageAspectFlagBits
planeAspect :: ImageAspectFlagBits
$sel:planeAspect:BindImagePlaneMemoryInfo :: BindImagePlaneMemoryInfo -> ImageAspectFlagBits
..} IO b
f = do
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr BindImagePlaneMemoryInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr BindImagePlaneMemoryInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (forall a. Ptr a
nullPtr)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr BindImagePlaneMemoryInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr ImageAspectFlagBits)) (ImageAspectFlagBits
planeAspect)
    IO b
f
  cStructSize :: Int
cStructSize = Int
24
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b. Ptr BindImagePlaneMemoryInfo -> IO b -> IO b
pokeZeroCStruct Ptr BindImagePlaneMemoryInfo
p IO b
f = do
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr BindImagePlaneMemoryInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr BindImagePlaneMemoryInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (forall a. Ptr a
nullPtr)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr BindImagePlaneMemoryInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr ImageAspectFlagBits)) (forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct BindImagePlaneMemoryInfo where
  peekCStruct :: Ptr BindImagePlaneMemoryInfo -> IO BindImagePlaneMemoryInfo
peekCStruct Ptr BindImagePlaneMemoryInfo
p = do
    ImageAspectFlagBits
planeAspect <- forall a. Storable a => Ptr a -> IO a
peek @ImageAspectFlagBits ((Ptr BindImagePlaneMemoryInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr ImageAspectFlagBits))
    forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ ImageAspectFlagBits -> BindImagePlaneMemoryInfo
BindImagePlaneMemoryInfo
             ImageAspectFlagBits
planeAspect

instance Storable BindImagePlaneMemoryInfo where
  sizeOf :: BindImagePlaneMemoryInfo -> Int
sizeOf ~BindImagePlaneMemoryInfo
_ = Int
24
  alignment :: BindImagePlaneMemoryInfo -> Int
alignment ~BindImagePlaneMemoryInfo
_ = Int
8
  peek :: Ptr BindImagePlaneMemoryInfo -> IO BindImagePlaneMemoryInfo
peek = forall a. FromCStruct a => Ptr a -> IO a
peekCStruct
  poke :: Ptr BindImagePlaneMemoryInfo -> BindImagePlaneMemoryInfo -> IO ()
poke Ptr BindImagePlaneMemoryInfo
ptr BindImagePlaneMemoryInfo
poked = forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr BindImagePlaneMemoryInfo
ptr BindImagePlaneMemoryInfo
poked (forall (f :: * -> *) a. Applicative f => a -> f a
pure ())

instance Zero BindImagePlaneMemoryInfo where
  zero :: BindImagePlaneMemoryInfo
zero = ImageAspectFlagBits -> BindImagePlaneMemoryInfo
BindImagePlaneMemoryInfo
           forall a. Zero a => a
zero


-- | VkImagePlaneMemoryRequirementsInfo - Structure specifying image plane
-- for memory requirements
--
-- == Valid Usage
--
-- -   #VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-02281# If the
--     image’s @tiling@ is
--     'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_LINEAR' or
--     'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_OPTIMAL', then
--     @planeAspect@ /must/ be a single valid
--     <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#formats-planes-image-aspect multi-planar aspect mask>
--     bit
--
-- -   #VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-02282# If the
--     image’s @tiling@ is
--     'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT',
--     then @planeAspect@ /must/ be a single valid /memory plane/ for the
--     image (that is, @aspectMask@ /must/ specify a plane index that is
--     less than the
--     'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.DrmFormatModifierPropertiesEXT'::@drmFormatModifierPlaneCount@
--     associated with the image’s @format@ and
--     'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.ImageDrmFormatModifierPropertiesEXT'::@drmFormatModifier@)
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-VkImagePlaneMemoryRequirementsInfo-sType-sType# @sType@ /must/
--     be
--     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO'
--
-- -   #VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-parameter#
--     @planeAspect@ /must/ be a valid
--     'Vulkan.Core10.Enums.ImageAspectFlagBits.ImageAspectFlagBits' value
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_1 VK_VERSION_1_1>,
-- 'Vulkan.Core10.Enums.ImageAspectFlagBits.ImageAspectFlagBits',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data ImagePlaneMemoryRequirementsInfo = ImagePlaneMemoryRequirementsInfo
  { -- | @planeAspect@ is a
    -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.ImageAspectFlagBits' value
    -- specifying the aspect corresponding to the image plane to query.
    ImagePlaneMemoryRequirementsInfo -> ImageAspectFlagBits
planeAspect :: ImageAspectFlagBits }
  deriving (Typeable, ImagePlaneMemoryRequirementsInfo
-> ImagePlaneMemoryRequirementsInfo -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ImagePlaneMemoryRequirementsInfo
-> ImagePlaneMemoryRequirementsInfo -> Bool
$c/= :: ImagePlaneMemoryRequirementsInfo
-> ImagePlaneMemoryRequirementsInfo -> Bool
== :: ImagePlaneMemoryRequirementsInfo
-> ImagePlaneMemoryRequirementsInfo -> Bool
$c== :: ImagePlaneMemoryRequirementsInfo
-> ImagePlaneMemoryRequirementsInfo -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ImagePlaneMemoryRequirementsInfo)
#endif
deriving instance Show ImagePlaneMemoryRequirementsInfo

instance ToCStruct ImagePlaneMemoryRequirementsInfo where
  withCStruct :: forall b.
ImagePlaneMemoryRequirementsInfo
-> (Ptr ImagePlaneMemoryRequirementsInfo -> IO b) -> IO b
withCStruct ImagePlaneMemoryRequirementsInfo
x Ptr ImagePlaneMemoryRequirementsInfo -> IO b
f = forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
24 forall a b. (a -> b) -> a -> b
$ \Ptr ImagePlaneMemoryRequirementsInfo
p -> forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr ImagePlaneMemoryRequirementsInfo
p ImagePlaneMemoryRequirementsInfo
x (Ptr ImagePlaneMemoryRequirementsInfo -> IO b
f Ptr ImagePlaneMemoryRequirementsInfo
p)
  pokeCStruct :: forall b.
Ptr ImagePlaneMemoryRequirementsInfo
-> ImagePlaneMemoryRequirementsInfo -> IO b -> IO b
pokeCStruct Ptr ImagePlaneMemoryRequirementsInfo
p ImagePlaneMemoryRequirementsInfo{ImageAspectFlagBits
planeAspect :: ImageAspectFlagBits
$sel:planeAspect:ImagePlaneMemoryRequirementsInfo :: ImagePlaneMemoryRequirementsInfo -> ImageAspectFlagBits
..} IO b
f = do
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr ImagePlaneMemoryRequirementsInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr ImagePlaneMemoryRequirementsInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (forall a. Ptr a
nullPtr)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr ImagePlaneMemoryRequirementsInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr ImageAspectFlagBits)) (ImageAspectFlagBits
planeAspect)
    IO b
f
  cStructSize :: Int
cStructSize = Int
24
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b. Ptr ImagePlaneMemoryRequirementsInfo -> IO b -> IO b
pokeZeroCStruct Ptr ImagePlaneMemoryRequirementsInfo
p IO b
f = do
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr ImagePlaneMemoryRequirementsInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr ImagePlaneMemoryRequirementsInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (forall a. Ptr a
nullPtr)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr ImagePlaneMemoryRequirementsInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr ImageAspectFlagBits)) (forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct ImagePlaneMemoryRequirementsInfo where
  peekCStruct :: Ptr ImagePlaneMemoryRequirementsInfo
-> IO ImagePlaneMemoryRequirementsInfo
peekCStruct Ptr ImagePlaneMemoryRequirementsInfo
p = do
    ImageAspectFlagBits
planeAspect <- forall a. Storable a => Ptr a -> IO a
peek @ImageAspectFlagBits ((Ptr ImagePlaneMemoryRequirementsInfo
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr ImageAspectFlagBits))
    forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ ImageAspectFlagBits -> ImagePlaneMemoryRequirementsInfo
ImagePlaneMemoryRequirementsInfo
             ImageAspectFlagBits
planeAspect

instance Storable ImagePlaneMemoryRequirementsInfo where
  sizeOf :: ImagePlaneMemoryRequirementsInfo -> Int
sizeOf ~ImagePlaneMemoryRequirementsInfo
_ = Int
24
  alignment :: ImagePlaneMemoryRequirementsInfo -> Int
alignment ~ImagePlaneMemoryRequirementsInfo
_ = Int
8
  peek :: Ptr ImagePlaneMemoryRequirementsInfo
-> IO ImagePlaneMemoryRequirementsInfo
peek = forall a. FromCStruct a => Ptr a -> IO a
peekCStruct
  poke :: Ptr ImagePlaneMemoryRequirementsInfo
-> ImagePlaneMemoryRequirementsInfo -> IO ()
poke Ptr ImagePlaneMemoryRequirementsInfo
ptr ImagePlaneMemoryRequirementsInfo
poked = forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr ImagePlaneMemoryRequirementsInfo
ptr ImagePlaneMemoryRequirementsInfo
poked (forall (f :: * -> *) a. Applicative f => a -> f a
pure ())

instance Zero ImagePlaneMemoryRequirementsInfo where
  zero :: ImagePlaneMemoryRequirementsInfo
zero = ImageAspectFlagBits -> ImagePlaneMemoryRequirementsInfo
ImagePlaneMemoryRequirementsInfo
           forall a. Zero a => a
zero


-- | VkPhysicalDeviceSamplerYcbcrConversionFeatures - Structure describing
-- Y′CBCR conversion features that can be supported by an implementation
--
-- = Members
--
-- This structure describes the following feature:
--
-- = Description
--
-- If the 'PhysicalDeviceSamplerYcbcrConversionFeatures' structure is
-- included in the @pNext@ chain of the
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2'
-- structure passed to
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceFeatures2',
-- it is filled in to indicate whether each corresponding feature is
-- supported. 'PhysicalDeviceSamplerYcbcrConversionFeatures' /can/ also be
-- used in the @pNext@ chain of 'Vulkan.Core10.Device.DeviceCreateInfo' to
-- selectively enable these features.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_sampler_ycbcr_conversion VK_KHR_sampler_ycbcr_conversion>,
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_1 VK_VERSION_1_1>,
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceSamplerYcbcrConversionFeatures = PhysicalDeviceSamplerYcbcrConversionFeatures
  { -- | #extension-features-samplerYcbcrConversion# @samplerYcbcrConversion@
    -- specifies whether the implementation supports
    -- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#samplers-YCbCr-conversion sampler Y′CBCR conversion>.
    -- If @samplerYcbcrConversion@ is 'Vulkan.Core10.FundamentalTypes.FALSE',
    -- sampler Y′CBCR conversion is not supported, and samplers using sampler
    -- Y′CBCR conversion /must/ not be used.
    PhysicalDeviceSamplerYcbcrConversionFeatures -> Bool
samplerYcbcrConversion :: Bool }
  deriving (Typeable, PhysicalDeviceSamplerYcbcrConversionFeatures
-> PhysicalDeviceSamplerYcbcrConversionFeatures -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PhysicalDeviceSamplerYcbcrConversionFeatures
-> PhysicalDeviceSamplerYcbcrConversionFeatures -> Bool
$c/= :: PhysicalDeviceSamplerYcbcrConversionFeatures
-> PhysicalDeviceSamplerYcbcrConversionFeatures -> Bool
== :: PhysicalDeviceSamplerYcbcrConversionFeatures
-> PhysicalDeviceSamplerYcbcrConversionFeatures -> Bool
$c== :: PhysicalDeviceSamplerYcbcrConversionFeatures
-> PhysicalDeviceSamplerYcbcrConversionFeatures -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceSamplerYcbcrConversionFeatures)
#endif
deriving instance Show PhysicalDeviceSamplerYcbcrConversionFeatures

instance ToCStruct PhysicalDeviceSamplerYcbcrConversionFeatures where
  withCStruct :: forall b.
PhysicalDeviceSamplerYcbcrConversionFeatures
-> (Ptr PhysicalDeviceSamplerYcbcrConversionFeatures -> IO b)
-> IO b
withCStruct PhysicalDeviceSamplerYcbcrConversionFeatures
x Ptr PhysicalDeviceSamplerYcbcrConversionFeatures -> IO b
f = forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
24 forall a b. (a -> b) -> a -> b
$ \Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
p -> forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
p PhysicalDeviceSamplerYcbcrConversionFeatures
x (Ptr PhysicalDeviceSamplerYcbcrConversionFeatures -> IO b
f Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
p)
  pokeCStruct :: forall b.
Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
-> PhysicalDeviceSamplerYcbcrConversionFeatures -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
p PhysicalDeviceSamplerYcbcrConversionFeatures{Bool
samplerYcbcrConversion :: Bool
$sel:samplerYcbcrConversion:PhysicalDeviceSamplerYcbcrConversionFeatures :: PhysicalDeviceSamplerYcbcrConversionFeatures -> Bool
..} IO b
f = do
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (forall a. Ptr a
nullPtr)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
samplerYcbcrConversion))
    IO b
f
  cStructSize :: Int
cStructSize = Int
24
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b.
Ptr PhysicalDeviceSamplerYcbcrConversionFeatures -> IO b -> IO b
pokeZeroCStruct Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
p IO b
f = do
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (forall a. Ptr a
nullPtr)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (forall a. Zero a => a
zero))
    IO b
f

instance FromCStruct PhysicalDeviceSamplerYcbcrConversionFeatures where
  peekCStruct :: Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
-> IO PhysicalDeviceSamplerYcbcrConversionFeatures
peekCStruct Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
p = do
    Bool32
samplerYcbcrConversion <- forall a. Storable a => Ptr a -> IO a
peek @Bool32 ((Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Bool32))
    forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Bool -> PhysicalDeviceSamplerYcbcrConversionFeatures
PhysicalDeviceSamplerYcbcrConversionFeatures
             (Bool32 -> Bool
bool32ToBool Bool32
samplerYcbcrConversion)

instance Storable PhysicalDeviceSamplerYcbcrConversionFeatures where
  sizeOf :: PhysicalDeviceSamplerYcbcrConversionFeatures -> Int
sizeOf ~PhysicalDeviceSamplerYcbcrConversionFeatures
_ = Int
24
  alignment :: PhysicalDeviceSamplerYcbcrConversionFeatures -> Int
alignment ~PhysicalDeviceSamplerYcbcrConversionFeatures
_ = Int
8
  peek :: Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
-> IO PhysicalDeviceSamplerYcbcrConversionFeatures
peek = forall a. FromCStruct a => Ptr a -> IO a
peekCStruct
  poke :: Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
-> PhysicalDeviceSamplerYcbcrConversionFeatures -> IO ()
poke Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
ptr PhysicalDeviceSamplerYcbcrConversionFeatures
poked = forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceSamplerYcbcrConversionFeatures
ptr PhysicalDeviceSamplerYcbcrConversionFeatures
poked (forall (f :: * -> *) a. Applicative f => a -> f a
pure ())

instance Zero PhysicalDeviceSamplerYcbcrConversionFeatures where
  zero :: PhysicalDeviceSamplerYcbcrConversionFeatures
zero = Bool -> PhysicalDeviceSamplerYcbcrConversionFeatures
PhysicalDeviceSamplerYcbcrConversionFeatures
           forall a. Zero a => a
zero


-- | VkSamplerYcbcrConversionImageFormatProperties - Structure specifying
-- combined image sampler descriptor count for multi-planar images
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_1 VK_VERSION_1_1>,
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data SamplerYcbcrConversionImageFormatProperties = SamplerYcbcrConversionImageFormatProperties
  { -- | @combinedImageSamplerDescriptorCount@ is the number of combined image
    -- sampler descriptors that the implementation uses to access the format.
    SamplerYcbcrConversionImageFormatProperties -> Word32
combinedImageSamplerDescriptorCount :: Word32 }
  deriving (Typeable, SamplerYcbcrConversionImageFormatProperties
-> SamplerYcbcrConversionImageFormatProperties -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SamplerYcbcrConversionImageFormatProperties
-> SamplerYcbcrConversionImageFormatProperties -> Bool
$c/= :: SamplerYcbcrConversionImageFormatProperties
-> SamplerYcbcrConversionImageFormatProperties -> Bool
== :: SamplerYcbcrConversionImageFormatProperties
-> SamplerYcbcrConversionImageFormatProperties -> Bool
$c== :: SamplerYcbcrConversionImageFormatProperties
-> SamplerYcbcrConversionImageFormatProperties -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (SamplerYcbcrConversionImageFormatProperties)
#endif
deriving instance Show SamplerYcbcrConversionImageFormatProperties

instance ToCStruct SamplerYcbcrConversionImageFormatProperties where
  withCStruct :: forall b.
SamplerYcbcrConversionImageFormatProperties
-> (Ptr SamplerYcbcrConversionImageFormatProperties -> IO b)
-> IO b
withCStruct SamplerYcbcrConversionImageFormatProperties
x Ptr SamplerYcbcrConversionImageFormatProperties -> IO b
f = forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
24 forall a b. (a -> b) -> a -> b
$ \Ptr SamplerYcbcrConversionImageFormatProperties
p -> forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr SamplerYcbcrConversionImageFormatProperties
p SamplerYcbcrConversionImageFormatProperties
x (Ptr SamplerYcbcrConversionImageFormatProperties -> IO b
f Ptr SamplerYcbcrConversionImageFormatProperties
p)
  pokeCStruct :: forall b.
Ptr SamplerYcbcrConversionImageFormatProperties
-> SamplerYcbcrConversionImageFormatProperties -> IO b -> IO b
pokeCStruct Ptr SamplerYcbcrConversionImageFormatProperties
p SamplerYcbcrConversionImageFormatProperties{Word32
combinedImageSamplerDescriptorCount :: Word32
$sel:combinedImageSamplerDescriptorCount:SamplerYcbcrConversionImageFormatProperties :: SamplerYcbcrConversionImageFormatProperties -> Word32
..} IO b
f = do
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SamplerYcbcrConversionImageFormatProperties
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SamplerYcbcrConversionImageFormatProperties
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (forall a. Ptr a
nullPtr)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SamplerYcbcrConversionImageFormatProperties
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Word32)) (Word32
combinedImageSamplerDescriptorCount)
    IO b
f
  cStructSize :: Int
cStructSize = Int
24
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b.
Ptr SamplerYcbcrConversionImageFormatProperties -> IO b -> IO b
pokeZeroCStruct Ptr SamplerYcbcrConversionImageFormatProperties
p IO b
f = do
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SamplerYcbcrConversionImageFormatProperties
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SamplerYcbcrConversionImageFormatProperties
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (forall a. Ptr a
nullPtr)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SamplerYcbcrConversionImageFormatProperties
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Word32)) (forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct SamplerYcbcrConversionImageFormatProperties where
  peekCStruct :: Ptr SamplerYcbcrConversionImageFormatProperties
-> IO SamplerYcbcrConversionImageFormatProperties
peekCStruct Ptr SamplerYcbcrConversionImageFormatProperties
p = do
    Word32
combinedImageSamplerDescriptorCount <- forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr SamplerYcbcrConversionImageFormatProperties
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Word32))
    forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Word32 -> SamplerYcbcrConversionImageFormatProperties
SamplerYcbcrConversionImageFormatProperties
             Word32
combinedImageSamplerDescriptorCount

instance Storable SamplerYcbcrConversionImageFormatProperties where
  sizeOf :: SamplerYcbcrConversionImageFormatProperties -> Int
sizeOf ~SamplerYcbcrConversionImageFormatProperties
_ = Int
24
  alignment :: SamplerYcbcrConversionImageFormatProperties -> Int
alignment ~SamplerYcbcrConversionImageFormatProperties
_ = Int
8
  peek :: Ptr SamplerYcbcrConversionImageFormatProperties
-> IO SamplerYcbcrConversionImageFormatProperties
peek = forall a. FromCStruct a => Ptr a -> IO a
peekCStruct
  poke :: Ptr SamplerYcbcrConversionImageFormatProperties
-> SamplerYcbcrConversionImageFormatProperties -> IO ()
poke Ptr SamplerYcbcrConversionImageFormatProperties
ptr SamplerYcbcrConversionImageFormatProperties
poked = forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr SamplerYcbcrConversionImageFormatProperties
ptr SamplerYcbcrConversionImageFormatProperties
poked (forall (f :: * -> *) a. Applicative f => a -> f a
pure ())

instance Zero SamplerYcbcrConversionImageFormatProperties where
  zero :: SamplerYcbcrConversionImageFormatProperties
zero = Word32 -> SamplerYcbcrConversionImageFormatProperties
SamplerYcbcrConversionImageFormatProperties
           forall a. Zero a => a
zero