{-# language CPP #-}
-- | = Name
--
-- VK_MESA_image_alignment_control - device extension
--
-- = VK_MESA_image_alignment_control
--
-- [__Name String__]
--     @VK_MESA_image_alignment_control@
--
-- [__Extension Type__]
--     Device extension
--
-- [__Registered Extension Number__]
--     576
--
-- [__Revision__]
--     1
--
-- [__Ratification Status__]
--     Not ratified
--
-- [__Extension and Version Dependencies__]
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_get_physical_device_properties2 VK_KHR_get_physical_device_properties2>
--     or
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#versions-1.1 Vulkan Version 1.1>
--
-- [__Special Use__]
--
--     -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#extendingvulkan-compatibility-specialuse D3D support>
--
-- [__Contact__]
--
--     -   Hans-Kristian Arntzen
--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?body=[VK_MESA_image_alignment_control] @HansKristian-Work%0A*Here describe the issue or question you have about the VK_MESA_image_alignment_control extension* >
--
-- == Other Extension Metadata
--
-- [__Last Modified Date__]
--     2024-05-03
--
-- [__IP Status__]
--     No known IP claims.
--
-- [__Contributors__]
--
--     -   Hans-Kristian Arntzen, Valve
--
-- == Description
--
-- This extension allows applications to request a narrower alignment for
-- images than an implementation would otherwise require. Some
-- implementations internally support multiple image layouts in
-- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_OPTIMAL', each with
-- different alignment requirements and performance trade-offs. In some API
-- layering use cases such as D3D12, it is beneficial to be able to control
-- the alignment, since certain alignments for placed resources are
-- guaranteed to be supported, and emulating that expectation requires
-- unnecessary padding of allocations.
--
-- 'ImageAlignmentControlCreateInfoMESA' /can/ be chained to
-- 'Vulkan.Core10.Image.ImageCreateInfo', requesting that the alignment is
-- no more than the provided alignment. If the requested alignment is not
-- supported for a given 'Vulkan.Core10.Image.ImageCreateInfo', a larger
-- alignment /may/ be returned.
--
-- While something similar could be achieved with
-- @VK_EXT_image_drm_format_modifier@ in theory, this is not the intended
-- way to use that extension. Format modifiers are generally used for
-- externally shareable images, and would not be platform portable. It is
-- also a cumbersome API to use just to lower the alignment.
--
-- == New Structures
--
-- -   Extending 'Vulkan.Core10.Image.ImageCreateInfo':
--
--     -   'ImageAlignmentControlCreateInfoMESA'
--
-- -   Extending
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2',
--     'Vulkan.Core10.Device.DeviceCreateInfo':
--
--     -   'PhysicalDeviceImageAlignmentControlFeaturesMESA'
--
-- -   Extending
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceProperties2':
--
--     -   'PhysicalDeviceImageAlignmentControlPropertiesMESA'
--
-- == New Enum Constants
--
-- -   'MESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME'
--
-- -   'MESA_IMAGE_ALIGNMENT_CONTROL_SPEC_VERSION'
--
-- -   Extending 'Vulkan.Core10.Enums.StructureType.StructureType':
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_IMAGE_ALIGNMENT_CONTROL_CREATE_INFO_MESA'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_FEATURES_MESA'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_PROPERTIES_MESA'
--
-- == Version History
--
-- -   Revision 1, 2024-04-05 (Hans-Kristian Arntzen)
--
--     -   Initial specification
--
-- == See Also
--
-- No cross-references are available
--
-- == Document Notes
--
-- For more information, see the
-- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VK_MESA_image_alignment_control Vulkan Specification>.
--
-- This page is a generated document. Fixes and changes should be made to
-- the generator scripts, not directly.
module Vulkan.Extensions.VK_MESA_image_alignment_control  ( PhysicalDeviceImageAlignmentControlFeaturesMESA(..)
                                                          , PhysicalDeviceImageAlignmentControlPropertiesMESA(..)
                                                          , ImageAlignmentControlCreateInfoMESA(..)
                                                          , MESA_IMAGE_ALIGNMENT_CONTROL_SPEC_VERSION
                                                          , pattern MESA_IMAGE_ALIGNMENT_CONTROL_SPEC_VERSION
                                                          , MESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME
                                                          , pattern MESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME
                                                          ) where

import Foreign.Marshal.Alloc (allocaBytes)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
import Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Zero (Zero(..))
import Data.String (IsString)
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 Foreign.Ptr (Ptr)
import Data.Word (Word32)
import Data.Kind (Type)
import Vulkan.Core10.FundamentalTypes (bool32ToBool)
import Vulkan.Core10.FundamentalTypes (boolToBool32)
import Vulkan.Core10.FundamentalTypes (Bool32)
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_IMAGE_ALIGNMENT_CONTROL_CREATE_INFO_MESA))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_FEATURES_MESA))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_PROPERTIES_MESA))
-- | VkPhysicalDeviceImageAlignmentControlFeaturesMESA - Structure describing
-- features supported by VK_MESA_image_alignment_control
--
-- = Members
--
-- This structure describes the following feature:
--
-- = Description
--
-- If the 'PhysicalDeviceImageAlignmentControlFeaturesMESA' 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. If the application wishes to use a
-- 'Vulkan.Core10.Handles.Device' with any features described by
-- 'PhysicalDeviceImageAlignmentControlFeaturesMESA', it /must/ add an
-- instance of the structure, with the desired feature members set to
-- 'Vulkan.Core10.FundamentalTypes.TRUE', to the @pNext@ chain of
-- 'Vulkan.Core10.Device.DeviceCreateInfo' when creating the
-- 'Vulkan.Core10.Handles.Device'.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_MESA_image_alignment_control VK_MESA_image_alignment_control>,
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceImageAlignmentControlFeaturesMESA = PhysicalDeviceImageAlignmentControlFeaturesMESA
  { -- | #features-imageAlignmentControl# @imageAlignmentControl@ specifies that
    -- 'ImageAlignmentControlCreateInfoMESA' /can/ be chained in
    -- 'Vulkan.Core10.Image.ImageCreateInfo'
    PhysicalDeviceImageAlignmentControlFeaturesMESA -> Bool
imageAlignmentControl :: Bool }
  deriving (Typeable, PhysicalDeviceImageAlignmentControlFeaturesMESA
-> PhysicalDeviceImageAlignmentControlFeaturesMESA -> Bool
(PhysicalDeviceImageAlignmentControlFeaturesMESA
 -> PhysicalDeviceImageAlignmentControlFeaturesMESA -> Bool)
-> (PhysicalDeviceImageAlignmentControlFeaturesMESA
    -> PhysicalDeviceImageAlignmentControlFeaturesMESA -> Bool)
-> Eq PhysicalDeviceImageAlignmentControlFeaturesMESA
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PhysicalDeviceImageAlignmentControlFeaturesMESA
-> PhysicalDeviceImageAlignmentControlFeaturesMESA -> Bool
== :: PhysicalDeviceImageAlignmentControlFeaturesMESA
-> PhysicalDeviceImageAlignmentControlFeaturesMESA -> Bool
$c/= :: PhysicalDeviceImageAlignmentControlFeaturesMESA
-> PhysicalDeviceImageAlignmentControlFeaturesMESA -> Bool
/= :: PhysicalDeviceImageAlignmentControlFeaturesMESA
-> PhysicalDeviceImageAlignmentControlFeaturesMESA -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceImageAlignmentControlFeaturesMESA)
#endif
deriving instance Show PhysicalDeviceImageAlignmentControlFeaturesMESA

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

instance FromCStruct PhysicalDeviceImageAlignmentControlFeaturesMESA where
  peekCStruct :: Ptr PhysicalDeviceImageAlignmentControlFeaturesMESA
-> IO PhysicalDeviceImageAlignmentControlFeaturesMESA
peekCStruct Ptr PhysicalDeviceImageAlignmentControlFeaturesMESA
p = do
    imageAlignmentControl <- forall a. Storable a => Ptr a -> IO a
peek @Bool32 ((Ptr PhysicalDeviceImageAlignmentControlFeaturesMESA
p Ptr PhysicalDeviceImageAlignmentControlFeaturesMESA
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Bool32))
    pure $ PhysicalDeviceImageAlignmentControlFeaturesMESA
             (bool32ToBool imageAlignmentControl)

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

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


-- | VkPhysicalDeviceImageAlignmentControlPropertiesMESA - Structure
-- describing supported image alignments for a physical device
--
-- = Members
--
-- The members of the 'PhysicalDeviceImageAlignmentControlPropertiesMESA'
-- structure describe the following:
--
-- = Description
--
-- If the 'PhysicalDeviceImageAlignmentControlPropertiesMESA' structure is
-- included in the @pNext@ chain of the
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceProperties2'
-- structure passed to
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceProperties2',
-- it is filled in with each corresponding implementation-dependent
-- property.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_MESA_image_alignment_control VK_MESA_image_alignment_control>,
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceImageAlignmentControlPropertiesMESA = PhysicalDeviceImageAlignmentControlPropertiesMESA
  { -- | #limits-supportedImageAlignmentMask# @supportedImageAlignmentMask@ is a
    -- bitwise-or of all potentially supported image alignments for a given
    -- physical device when using
    -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_OPTIMAL'. If a given
    -- alignment is supported, the application /can/ request an image to have
    -- that alignment. A given set of image creation parameters /may/ support a
    -- subset of these alignments. To determine if a particular alignment is
    -- supported for a given set of image creation parameters, check
    -- 'Vulkan.Core10.MemoryManagement.MemoryRequirements'::@alignment@ after
    -- chaining in 'ImageAlignmentControlCreateInfoMESA'.
    PhysicalDeviceImageAlignmentControlPropertiesMESA -> Word32
supportedImageAlignmentMask :: Word32 }
  deriving (Typeable, PhysicalDeviceImageAlignmentControlPropertiesMESA
-> PhysicalDeviceImageAlignmentControlPropertiesMESA -> Bool
(PhysicalDeviceImageAlignmentControlPropertiesMESA
 -> PhysicalDeviceImageAlignmentControlPropertiesMESA -> Bool)
-> (PhysicalDeviceImageAlignmentControlPropertiesMESA
    -> PhysicalDeviceImageAlignmentControlPropertiesMESA -> Bool)
-> Eq PhysicalDeviceImageAlignmentControlPropertiesMESA
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PhysicalDeviceImageAlignmentControlPropertiesMESA
-> PhysicalDeviceImageAlignmentControlPropertiesMESA -> Bool
== :: PhysicalDeviceImageAlignmentControlPropertiesMESA
-> PhysicalDeviceImageAlignmentControlPropertiesMESA -> Bool
$c/= :: PhysicalDeviceImageAlignmentControlPropertiesMESA
-> PhysicalDeviceImageAlignmentControlPropertiesMESA -> Bool
/= :: PhysicalDeviceImageAlignmentControlPropertiesMESA
-> PhysicalDeviceImageAlignmentControlPropertiesMESA -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceImageAlignmentControlPropertiesMESA)
#endif
deriving instance Show PhysicalDeviceImageAlignmentControlPropertiesMESA

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

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

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

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


-- | VkImageAlignmentControlCreateInfoMESA - Specify image alignment
--
-- = Description
--
-- If @maximumRequestedAlignment@ is not 0, the implementation /should/
-- choose an image memory layout that requires an alignment no larger than
-- @maximumRequestedAlignment@ as reported in
-- 'Vulkan.Core10.MemoryManagement.MemoryRequirements'::@alignment@. If
-- such a layout does not exist for the given image creation parameters,
-- the implementation /should/ return the smallest alignment which is
-- supported in 'Vulkan.Core10.MemoryManagement.MemoryRequirements'.
--
-- If an implementation needs to disable image compression for
-- @maximumRequestedAlignment@ to be honored - where a larger alignment
-- would enable image compression - the implementation /should/ not use
-- @maximumRequestedAlignment@, and /should/ return the smallest alignment
-- which does not compromise compression. If the
-- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-imageCompressionControl imageCompressionControl>
-- feature is enabled, the application /can/ chain a
-- 'Vulkan.Extensions.VK_EXT_image_compression_control.ImageCompressionControlEXT'
-- with
-- 'Vulkan.Extensions.VK_EXT_image_compression_control.IMAGE_COMPRESSION_DISABLED_EXT'.
-- In this case, image compression considerations /should/ not apply when
-- implementation decides alignment.
--
-- == Valid Usage
--
-- -   #VUID-VkImageAlignmentControlCreateInfoMESA-maximumRequestedAlignment-09655#
--     If @maximumRequestedAlignment@ is not 0, @maximumRequestedAlignment@
--     /must/ be a power of two
--
-- -   #VUID-VkImageAlignmentControlCreateInfoMESA-maximumRequestedAlignment-09656#
--     If @maximumRequestedAlignment@ is not 0, the bitwise-and of
--     @maximumRequestedAlignment@ and
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#limits-supportedImageAlignmentMask supportedImageAlignmentMask>
--     /must/ be non-zero
--
-- -   #VUID-VkImageAlignmentControlCreateInfoMESA-imageAlignmentControl-09657#
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-imageAlignmentControl imageAlignmentControl>
--     /must/ be enabled
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-VkImageAlignmentControlCreateInfoMESA-sType-sType# @sType@
--     /must/ be
--     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_IMAGE_ALIGNMENT_CONTROL_CREATE_INFO_MESA'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_MESA_image_alignment_control VK_MESA_image_alignment_control>,
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data ImageAlignmentControlCreateInfoMESA = ImageAlignmentControlCreateInfoMESA
  { -- | @maximumRequestedAlignment@ specifies the maximum alignment for the
    -- image.
    ImageAlignmentControlCreateInfoMESA -> Word32
maximumRequestedAlignment :: Word32 }
  deriving (Typeable, ImageAlignmentControlCreateInfoMESA
-> ImageAlignmentControlCreateInfoMESA -> Bool
(ImageAlignmentControlCreateInfoMESA
 -> ImageAlignmentControlCreateInfoMESA -> Bool)
-> (ImageAlignmentControlCreateInfoMESA
    -> ImageAlignmentControlCreateInfoMESA -> Bool)
-> Eq ImageAlignmentControlCreateInfoMESA
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ImageAlignmentControlCreateInfoMESA
-> ImageAlignmentControlCreateInfoMESA -> Bool
== :: ImageAlignmentControlCreateInfoMESA
-> ImageAlignmentControlCreateInfoMESA -> Bool
$c/= :: ImageAlignmentControlCreateInfoMESA
-> ImageAlignmentControlCreateInfoMESA -> Bool
/= :: ImageAlignmentControlCreateInfoMESA
-> ImageAlignmentControlCreateInfoMESA -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ImageAlignmentControlCreateInfoMESA)
#endif
deriving instance Show ImageAlignmentControlCreateInfoMESA

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

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

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

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


type MESA_IMAGE_ALIGNMENT_CONTROL_SPEC_VERSION = 1

-- No documentation found for TopLevel "VK_MESA_IMAGE_ALIGNMENT_CONTROL_SPEC_VERSION"
pattern MESA_IMAGE_ALIGNMENT_CONTROL_SPEC_VERSION :: forall a . Integral a => a
pattern $mMESA_IMAGE_ALIGNMENT_CONTROL_SPEC_VERSION :: forall {r} {a}.
Integral a =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
$bMESA_IMAGE_ALIGNMENT_CONTROL_SPEC_VERSION :: forall a. Integral a => a
MESA_IMAGE_ALIGNMENT_CONTROL_SPEC_VERSION = 1


type MESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME = "VK_MESA_image_alignment_control"

-- No documentation found for TopLevel "VK_MESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME"
pattern MESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern $mMESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME :: forall {r} {a}.
(Eq a, IsString a) =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
$bMESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME :: forall a. (Eq a, IsString a) => a
MESA_IMAGE_ALIGNMENT_CONTROL_EXTENSION_NAME = "VK_MESA_image_alignment_control"