{-# language CPP #-}
-- | = Name
--
-- VK_KHR_vertex_attribute_divisor - device extension
--
-- == VK_KHR_vertex_attribute_divisor
--
-- [__Name String__]
--     @VK_KHR_vertex_attribute_divisor@
--
-- [__Extension Type__]
--     Device extension
--
-- [__Registered Extension Number__]
--     526
--
-- [__Revision__]
--     1
--
-- [__Ratification Status__]
--     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 Version 1.1>
--
-- [__Contact__]
--
--     -   Shahbaz Youssefi
--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?body=[VK_KHR_vertex_attribute_divisor] @syoussefi%0A*Here describe the issue or question you have about the VK_KHR_vertex_attribute_divisor extension* >
--
-- [__Extension Proposal__]
--     <https://github.com/KhronosGroup/Vulkan-Docs/tree/main/proposals/VK_KHR_vertex_attribute_divisor.adoc VK_KHR_vertex_attribute_divisor>
--
-- == Other Extension Metadata
--
-- [__Last Modified Date__]
--     2023-09-20
--
-- [__IP Status__]
--     No known IP claims.
--
-- [__Contributors__]
--
--     -   Shahbaz Youssefi, Google
--
--     -   Contributors to @VK_EXT_vertex_attribute_divisor@
--
-- == Description
--
-- This extension is based on the @VK_EXT_vertex_attribute_divisor@
-- extension. The only difference is the new property
-- @supportsNonZeroFirstInstance@, which indicates support for non-zero
-- values in @firstInstance@. This allows the extension to be supported on
-- implementations that have traditionally only supported OpenGL ES.
--
-- == New Structures
--
-- -   'VertexInputBindingDivisorDescriptionKHR'
--
-- -   Extending
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2',
--     'Vulkan.Core10.Device.DeviceCreateInfo':
--
--     -   'PhysicalDeviceVertexAttributeDivisorFeaturesKHR'
--
-- -   Extending
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceProperties2':
--
--     -   'PhysicalDeviceVertexAttributeDivisorPropertiesKHR'
--
-- -   Extending
--     'Vulkan.Core10.Pipeline.PipelineVertexInputStateCreateInfo':
--
--     -   'PipelineVertexInputDivisorStateCreateInfoKHR'
--
-- == New Enum Constants
--
-- -   'KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME'
--
-- -   'KHR_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION'
--
-- -   Extending 'Vulkan.Core10.Enums.StructureType.StructureType':
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_KHR'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR'
--
-- == Version History
--
-- -   Revision 1, 2023-09-20 (Shahbaz Youssefi)
--
--     -   First Version, based on @VK_EXT_vertex_attribute_divisor@
--
-- == See Also
--
-- 'PhysicalDeviceVertexAttributeDivisorFeaturesKHR',
-- 'PhysicalDeviceVertexAttributeDivisorPropertiesKHR',
-- 'PipelineVertexInputDivisorStateCreateInfoKHR',
-- 'VertexInputBindingDivisorDescriptionKHR'
--
-- == Document Notes
--
-- For more information, see the
-- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VK_KHR_vertex_attribute_divisor Vulkan Specification>
--
-- This page is a generated document. Fixes and changes should be made to
-- the generator scripts, not directly.
module Vulkan.Extensions.VK_KHR_vertex_attribute_divisor  ( VertexInputBindingDivisorDescriptionKHR(..)
                                                          , PipelineVertexInputDivisorStateCreateInfoKHR(..)
                                                          , PhysicalDeviceVertexAttributeDivisorPropertiesKHR(..)
                                                          , PhysicalDeviceVertexAttributeDivisorFeaturesKHR(..)
                                                          , KHR_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION
                                                          , pattern KHR_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION
                                                          , KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME
                                                          , pattern KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME
                                                          ) where

import Foreign.Marshal.Alloc (allocaBytes)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Cont (evalContT)
import Data.Vector (generateM)
import qualified Data.Vector (imapM_)
import qualified Data.Vector (length)
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 Control.Monad.Trans.Cont (ContT(..))
import Data.Vector (Vector)
import Vulkan.CStruct.Utils (advancePtrBytes)
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_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_KHR))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR))
-- | VkVertexInputBindingDivisorDescriptionKHR - Structure specifying a
-- divisor used in instanced rendering
--
-- = Description
--
-- If this structure is not used to define a divisor value for an
-- attribute, then the divisor has a logical default value of 1.
--
-- == Valid Usage
--
-- -   #VUID-VkVertexInputBindingDivisorDescriptionKHR-binding-01869#
--     @binding@ /must/ be less than
--     'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxVertexInputBindings@
--
-- -   #VUID-VkVertexInputBindingDivisorDescriptionKHR-vertexAttributeInstanceRateZeroDivisor-02228#
--     If the @vertexAttributeInstanceRateZeroDivisor@ feature is not
--     enabled, @divisor@ /must/ not be @0@
--
-- -   #VUID-VkVertexInputBindingDivisorDescriptionKHR-vertexAttributeInstanceRateDivisor-02229#
--     If the @vertexAttributeInstanceRateDivisor@ feature is not enabled,
--     @divisor@ /must/ be @1@
--
-- -   #VUID-VkVertexInputBindingDivisorDescriptionKHR-divisor-01870#
--     @divisor@ /must/ be a value between @0@ and
--     'PhysicalDeviceVertexAttributeDivisorPropertiesKHR'::@maxVertexAttribDivisor@,
--     inclusive
--
-- -   #VUID-VkVertexInputBindingDivisorDescriptionKHR-inputRate-01871#
--     'Vulkan.Core10.Pipeline.VertexInputBindingDescription'::@inputRate@
--     /must/ be of type
--     'Vulkan.Core10.Enums.VertexInputRate.VERTEX_INPUT_RATE_INSTANCE' for
--     this @binding@
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_vertex_attribute_divisor VK_EXT_vertex_attribute_divisor>,
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_vertex_attribute_divisor VK_KHR_vertex_attribute_divisor>,
-- 'PipelineVertexInputDivisorStateCreateInfoKHR'
data VertexInputBindingDivisorDescriptionKHR = VertexInputBindingDivisorDescriptionKHR
  { -- | @binding@ is the binding number for which the divisor is specified.
    VertexInputBindingDivisorDescriptionKHR -> Word32
binding :: Word32
  , -- | @divisor@ is the number of successive instances that will use the same
    -- value of the vertex attribute when instanced rendering is enabled. For
    -- example, if the divisor is N, the same vertex attribute will be applied
    -- to N successive instances before moving on to the next vertex attribute.
    -- The maximum value of @divisor@ is implementation-dependent and can be
    -- queried using
    -- 'PhysicalDeviceVertexAttributeDivisorPropertiesKHR'::@maxVertexAttribDivisor@.
    -- A value of @0@ /can/ be used for the divisor if the
    -- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#features-vertexAttributeInstanceRateZeroDivisor vertexAttributeInstanceRateZeroDivisor>
    -- feature is enabled. In this case, the same vertex attribute will be
    -- applied to all instances.
    VertexInputBindingDivisorDescriptionKHR -> Word32
divisor :: Word32
  }
  deriving (Typeable, VertexInputBindingDivisorDescriptionKHR
-> VertexInputBindingDivisorDescriptionKHR -> Bool
(VertexInputBindingDivisorDescriptionKHR
 -> VertexInputBindingDivisorDescriptionKHR -> Bool)
-> (VertexInputBindingDivisorDescriptionKHR
    -> VertexInputBindingDivisorDescriptionKHR -> Bool)
-> Eq VertexInputBindingDivisorDescriptionKHR
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: VertexInputBindingDivisorDescriptionKHR
-> VertexInputBindingDivisorDescriptionKHR -> Bool
== :: VertexInputBindingDivisorDescriptionKHR
-> VertexInputBindingDivisorDescriptionKHR -> Bool
$c/= :: VertexInputBindingDivisorDescriptionKHR
-> VertexInputBindingDivisorDescriptionKHR -> Bool
/= :: VertexInputBindingDivisorDescriptionKHR
-> VertexInputBindingDivisorDescriptionKHR -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (VertexInputBindingDivisorDescriptionKHR)
#endif
deriving instance Show VertexInputBindingDivisorDescriptionKHR

instance ToCStruct VertexInputBindingDivisorDescriptionKHR where
  withCStruct :: forall b.
VertexInputBindingDivisorDescriptionKHR
-> (Ptr VertexInputBindingDivisorDescriptionKHR -> IO b) -> IO b
withCStruct VertexInputBindingDivisorDescriptionKHR
x Ptr VertexInputBindingDivisorDescriptionKHR -> IO b
f = Int
-> (Ptr VertexInputBindingDivisorDescriptionKHR -> IO b) -> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
8 ((Ptr VertexInputBindingDivisorDescriptionKHR -> IO b) -> IO b)
-> (Ptr VertexInputBindingDivisorDescriptionKHR -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr VertexInputBindingDivisorDescriptionKHR
p -> Ptr VertexInputBindingDivisorDescriptionKHR
-> VertexInputBindingDivisorDescriptionKHR -> IO b -> IO b
forall b.
Ptr VertexInputBindingDivisorDescriptionKHR
-> VertexInputBindingDivisorDescriptionKHR -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr VertexInputBindingDivisorDescriptionKHR
p VertexInputBindingDivisorDescriptionKHR
x (Ptr VertexInputBindingDivisorDescriptionKHR -> IO b
f Ptr VertexInputBindingDivisorDescriptionKHR
p)
  pokeCStruct :: forall b.
Ptr VertexInputBindingDivisorDescriptionKHR
-> VertexInputBindingDivisorDescriptionKHR -> IO b -> IO b
pokeCStruct Ptr VertexInputBindingDivisorDescriptionKHR
p VertexInputBindingDivisorDescriptionKHR{Word32
$sel:binding:VertexInputBindingDivisorDescriptionKHR :: VertexInputBindingDivisorDescriptionKHR -> Word32
$sel:divisor:VertexInputBindingDivisorDescriptionKHR :: VertexInputBindingDivisorDescriptionKHR -> Word32
binding :: Word32
divisor :: Word32
..} IO b
f = do
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr VertexInputBindingDivisorDescriptionKHR
p Ptr VertexInputBindingDivisorDescriptionKHR -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr Word32)) (Word32
binding)
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr VertexInputBindingDivisorDescriptionKHR
p Ptr VertexInputBindingDivisorDescriptionKHR -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4 :: Ptr Word32)) (Word32
divisor)
    IO b
f
  cStructSize :: Int
cStructSize = Int
8
  cStructAlignment :: Int
cStructAlignment = Int
4
  pokeZeroCStruct :: forall b.
Ptr VertexInputBindingDivisorDescriptionKHR -> IO b -> IO b
pokeZeroCStruct Ptr VertexInputBindingDivisorDescriptionKHR
p IO b
f = do
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr VertexInputBindingDivisorDescriptionKHR
p Ptr VertexInputBindingDivisorDescriptionKHR -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr Word32)) (Word32
forall a. Zero a => a
zero)
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr VertexInputBindingDivisorDescriptionKHR
p Ptr VertexInputBindingDivisorDescriptionKHR -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4 :: Ptr Word32)) (Word32
forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct VertexInputBindingDivisorDescriptionKHR where
  peekCStruct :: Ptr VertexInputBindingDivisorDescriptionKHR
-> IO VertexInputBindingDivisorDescriptionKHR
peekCStruct Ptr VertexInputBindingDivisorDescriptionKHR
p = do
    Word32
binding <- forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr VertexInputBindingDivisorDescriptionKHR
p Ptr VertexInputBindingDivisorDescriptionKHR -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr Word32))
    Word32
divisor <- forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr VertexInputBindingDivisorDescriptionKHR
p Ptr VertexInputBindingDivisorDescriptionKHR -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4 :: Ptr Word32))
    VertexInputBindingDivisorDescriptionKHR
-> IO VertexInputBindingDivisorDescriptionKHR
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (VertexInputBindingDivisorDescriptionKHR
 -> IO VertexInputBindingDivisorDescriptionKHR)
-> VertexInputBindingDivisorDescriptionKHR
-> IO VertexInputBindingDivisorDescriptionKHR
forall a b. (a -> b) -> a -> b
$ Word32 -> Word32 -> VertexInputBindingDivisorDescriptionKHR
VertexInputBindingDivisorDescriptionKHR
             Word32
binding Word32
divisor

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

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


-- | VkPipelineVertexInputDivisorStateCreateInfoKHR - Structure specifying
-- vertex attributes assignment during instanced rendering
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_vertex_attribute_divisor VK_EXT_vertex_attribute_divisor>,
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_vertex_attribute_divisor VK_KHR_vertex_attribute_divisor>,
-- 'Vulkan.Core10.Enums.StructureType.StructureType',
-- 'VertexInputBindingDivisorDescriptionKHR'
data PipelineVertexInputDivisorStateCreateInfoKHR = PipelineVertexInputDivisorStateCreateInfoKHR
  { -- | @pVertexBindingDivisors@ is a pointer to an array of
    -- 'VertexInputBindingDivisorDescriptionKHR' structures specifying the
    -- divisor value for each binding.
    --
    -- #VUID-VkPipelineVertexInputDivisorStateCreateInfoKHR-pVertexBindingDivisors-parameter#
    -- @pVertexBindingDivisors@ /must/ be a valid pointer to an array of
    -- @vertexBindingDivisorCount@ 'VertexInputBindingDivisorDescriptionKHR'
    -- structures
    PipelineVertexInputDivisorStateCreateInfoKHR
-> Vector VertexInputBindingDivisorDescriptionKHR
vertexBindingDivisors :: Vector VertexInputBindingDivisorDescriptionKHR }
  deriving (Typeable)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PipelineVertexInputDivisorStateCreateInfoKHR)
#endif
deriving instance Show PipelineVertexInputDivisorStateCreateInfoKHR

instance ToCStruct PipelineVertexInputDivisorStateCreateInfoKHR where
  withCStruct :: forall b.
PipelineVertexInputDivisorStateCreateInfoKHR
-> (Ptr PipelineVertexInputDivisorStateCreateInfoKHR -> IO b)
-> IO b
withCStruct PipelineVertexInputDivisorStateCreateInfoKHR
x Ptr PipelineVertexInputDivisorStateCreateInfoKHR -> IO b
f = Int
-> (Ptr PipelineVertexInputDivisorStateCreateInfoKHR -> IO b)
-> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
32 ((Ptr PipelineVertexInputDivisorStateCreateInfoKHR -> IO b)
 -> IO b)
-> (Ptr PipelineVertexInputDivisorStateCreateInfoKHR -> IO b)
-> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr PipelineVertexInputDivisorStateCreateInfoKHR
p -> Ptr PipelineVertexInputDivisorStateCreateInfoKHR
-> PipelineVertexInputDivisorStateCreateInfoKHR -> IO b -> IO b
forall b.
Ptr PipelineVertexInputDivisorStateCreateInfoKHR
-> PipelineVertexInputDivisorStateCreateInfoKHR -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PipelineVertexInputDivisorStateCreateInfoKHR
p PipelineVertexInputDivisorStateCreateInfoKHR
x (Ptr PipelineVertexInputDivisorStateCreateInfoKHR -> IO b
f Ptr PipelineVertexInputDivisorStateCreateInfoKHR
p)
  pokeCStruct :: forall b.
Ptr PipelineVertexInputDivisorStateCreateInfoKHR
-> PipelineVertexInputDivisorStateCreateInfoKHR -> IO b -> IO b
pokeCStruct Ptr PipelineVertexInputDivisorStateCreateInfoKHR
p PipelineVertexInputDivisorStateCreateInfoKHR{Vector VertexInputBindingDivisorDescriptionKHR
$sel:vertexBindingDivisors:PipelineVertexInputDivisorStateCreateInfoKHR :: PipelineVertexInputDivisorStateCreateInfoKHR
-> Vector VertexInputBindingDivisorDescriptionKHR
vertexBindingDivisors :: Vector VertexInputBindingDivisorDescriptionKHR
..} IO b
f = ContT b IO b -> IO b
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT b IO b -> IO b) -> ContT b IO b -> IO b
forall a b. (a -> b) -> a -> b
$ do
    IO () -> ContT b IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT b m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineVertexInputDivisorStateCreateInfoKHR
p Ptr PipelineVertexInputDivisorStateCreateInfoKHR
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR)
    IO () -> ContT b IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT b m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineVertexInputDivisorStateCreateInfoKHR
p Ptr PipelineVertexInputDivisorStateCreateInfoKHR
-> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    IO () -> ContT b IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT b m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineVertexInputDivisorStateCreateInfoKHR
p Ptr PipelineVertexInputDivisorStateCreateInfoKHR
-> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Word32)) ((Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Vector VertexInputBindingDivisorDescriptionKHR -> Int
forall a. Vector a -> Int
Data.Vector.length (Vector VertexInputBindingDivisorDescriptionKHR -> Int)
-> Vector VertexInputBindingDivisorDescriptionKHR -> Int
forall a b. (a -> b) -> a -> b
$ (Vector VertexInputBindingDivisorDescriptionKHR
vertexBindingDivisors)) :: Word32))
    Ptr VertexInputBindingDivisorDescriptionKHR
pPVertexBindingDivisors' <- ((Ptr VertexInputBindingDivisorDescriptionKHR -> IO b) -> IO b)
-> ContT b IO (Ptr VertexInputBindingDivisorDescriptionKHR)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr VertexInputBindingDivisorDescriptionKHR -> IO b) -> IO b)
 -> ContT b IO (Ptr VertexInputBindingDivisorDescriptionKHR))
-> ((Ptr VertexInputBindingDivisorDescriptionKHR -> IO b) -> IO b)
-> ContT b IO (Ptr VertexInputBindingDivisorDescriptionKHR)
forall a b. (a -> b) -> a -> b
$ forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes @VertexInputBindingDivisorDescriptionKHR ((Vector VertexInputBindingDivisorDescriptionKHR -> Int
forall a. Vector a -> Int
Data.Vector.length (Vector VertexInputBindingDivisorDescriptionKHR
vertexBindingDivisors)) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
8)
    IO () -> ContT b IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT b m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ (Int -> VertexInputBindingDivisorDescriptionKHR -> IO ())
-> Vector VertexInputBindingDivisorDescriptionKHR -> IO ()
forall (m :: * -> *) a b.
Monad m =>
(Int -> a -> m b) -> Vector a -> m ()
Data.Vector.imapM_ (\Int
i VertexInputBindingDivisorDescriptionKHR
e -> Ptr VertexInputBindingDivisorDescriptionKHR
-> VertexInputBindingDivisorDescriptionKHR -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr VertexInputBindingDivisorDescriptionKHR
pPVertexBindingDivisors' Ptr VertexInputBindingDivisorDescriptionKHR
-> Int -> Ptr VertexInputBindingDivisorDescriptionKHR
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr VertexInputBindingDivisorDescriptionKHR) (VertexInputBindingDivisorDescriptionKHR
e)) (Vector VertexInputBindingDivisorDescriptionKHR
vertexBindingDivisors)
    IO () -> ContT b IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT b m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr (Ptr VertexInputBindingDivisorDescriptionKHR)
-> Ptr VertexInputBindingDivisorDescriptionKHR -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineVertexInputDivisorStateCreateInfoKHR
p Ptr PipelineVertexInputDivisorStateCreateInfoKHR
-> Int -> Ptr (Ptr VertexInputBindingDivisorDescriptionKHR)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr (Ptr VertexInputBindingDivisorDescriptionKHR))) (Ptr VertexInputBindingDivisorDescriptionKHR
pPVertexBindingDivisors')
    IO b -> ContT b IO b
forall (m :: * -> *) a. Monad m => m a -> ContT b m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO b -> ContT b IO b) -> IO b -> ContT b IO b
forall a b. (a -> b) -> a -> b
$ IO b
f
  cStructSize :: Int
cStructSize = Int
32
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b.
Ptr PipelineVertexInputDivisorStateCreateInfoKHR -> IO b -> IO b
pokeZeroCStruct Ptr PipelineVertexInputDivisorStateCreateInfoKHR
p IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineVertexInputDivisorStateCreateInfoKHR
p Ptr PipelineVertexInputDivisorStateCreateInfoKHR
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PipelineVertexInputDivisorStateCreateInfoKHR
p Ptr PipelineVertexInputDivisorStateCreateInfoKHR
-> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    IO b
f

instance FromCStruct PipelineVertexInputDivisorStateCreateInfoKHR where
  peekCStruct :: Ptr PipelineVertexInputDivisorStateCreateInfoKHR
-> IO PipelineVertexInputDivisorStateCreateInfoKHR
peekCStruct Ptr PipelineVertexInputDivisorStateCreateInfoKHR
p = do
    Word32
vertexBindingDivisorCount <- forall a. Storable a => Ptr a -> IO a
peek @Word32 ((Ptr PipelineVertexInputDivisorStateCreateInfoKHR
p Ptr PipelineVertexInputDivisorStateCreateInfoKHR
-> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Word32))
    Ptr VertexInputBindingDivisorDescriptionKHR
pVertexBindingDivisors <- forall a. Storable a => Ptr a -> IO a
peek @(Ptr VertexInputBindingDivisorDescriptionKHR) ((Ptr PipelineVertexInputDivisorStateCreateInfoKHR
p Ptr PipelineVertexInputDivisorStateCreateInfoKHR
-> Int -> Ptr (Ptr VertexInputBindingDivisorDescriptionKHR)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24 :: Ptr (Ptr VertexInputBindingDivisorDescriptionKHR)))
    Vector VertexInputBindingDivisorDescriptionKHR
pVertexBindingDivisors' <- Int
-> (Int -> IO VertexInputBindingDivisorDescriptionKHR)
-> IO (Vector VertexInputBindingDivisorDescriptionKHR)
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> m a) -> m (Vector a)
generateM (Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
vertexBindingDivisorCount) (\Int
i -> forall a. FromCStruct a => Ptr a -> IO a
peekCStruct @VertexInputBindingDivisorDescriptionKHR ((Ptr VertexInputBindingDivisorDescriptionKHR
pVertexBindingDivisors Ptr VertexInputBindingDivisorDescriptionKHR
-> Int -> Ptr VertexInputBindingDivisorDescriptionKHR
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` (Int
8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr VertexInputBindingDivisorDescriptionKHR)))
    PipelineVertexInputDivisorStateCreateInfoKHR
-> IO PipelineVertexInputDivisorStateCreateInfoKHR
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (PipelineVertexInputDivisorStateCreateInfoKHR
 -> IO PipelineVertexInputDivisorStateCreateInfoKHR)
-> PipelineVertexInputDivisorStateCreateInfoKHR
-> IO PipelineVertexInputDivisorStateCreateInfoKHR
forall a b. (a -> b) -> a -> b
$ Vector VertexInputBindingDivisorDescriptionKHR
-> PipelineVertexInputDivisorStateCreateInfoKHR
PipelineVertexInputDivisorStateCreateInfoKHR
             Vector VertexInputBindingDivisorDescriptionKHR
pVertexBindingDivisors'

instance Zero PipelineVertexInputDivisorStateCreateInfoKHR where
  zero :: PipelineVertexInputDivisorStateCreateInfoKHR
zero = Vector VertexInputBindingDivisorDescriptionKHR
-> PipelineVertexInputDivisorStateCreateInfoKHR
PipelineVertexInputDivisorStateCreateInfoKHR
           Vector VertexInputBindingDivisorDescriptionKHR
forall a. Monoid a => a
mempty


-- | VkPhysicalDeviceVertexAttributeDivisorPropertiesKHR - Structure
-- describing max value of vertex attribute divisor that can be supported
-- by an implementation
--
-- = Description
--
-- If the 'PhysicalDeviceVertexAttributeDivisorPropertiesKHR' 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_KHR_vertex_attribute_divisor VK_KHR_vertex_attribute_divisor>,
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceVertexAttributeDivisorPropertiesKHR = PhysicalDeviceVertexAttributeDivisorPropertiesKHR
  { -- | #limits-maxVertexAttribDivisor# @maxVertexAttribDivisor@ is the maximum
    -- value of the number of instances that will repeat the value of vertex
    -- attribute data when instanced rendering is enabled.
    PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> Word32
maxVertexAttribDivisor :: Word32
  , -- | #limits-supportsNonZeroFirstInstance# @supportsNonZeroFirstInstance@
    -- specifies whether a non-zero value for the @firstInstance@ parameter of
    -- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#drawing drawing commands>
    -- is supported when 'VertexInputBindingDivisorDescriptionKHR'::@divisor@
    -- is not @1@.
    PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> Bool
supportsNonZeroFirstInstance :: Bool
  }
  deriving (Typeable, PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> Bool
(PhysicalDeviceVertexAttributeDivisorPropertiesKHR
 -> PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> Bool)
-> (PhysicalDeviceVertexAttributeDivisorPropertiesKHR
    -> PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> Bool)
-> Eq PhysicalDeviceVertexAttributeDivisorPropertiesKHR
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> Bool
== :: PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> Bool
$c/= :: PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> Bool
/= :: PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceVertexAttributeDivisorPropertiesKHR)
#endif
deriving instance Show PhysicalDeviceVertexAttributeDivisorPropertiesKHR

instance ToCStruct PhysicalDeviceVertexAttributeDivisorPropertiesKHR where
  withCStruct :: forall b.
PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> (Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> IO b)
-> IO b
withCStruct PhysicalDeviceVertexAttributeDivisorPropertiesKHR
x Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> IO b
f = Int
-> (Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> IO b)
-> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
24 ((Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> IO b)
 -> IO b)
-> (Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> IO b)
-> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
p -> Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> IO b
-> IO b
forall b.
Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> IO b
-> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
p PhysicalDeviceVertexAttributeDivisorPropertiesKHR
x (Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> IO b
f Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
p)
  pokeCStruct :: forall b.
Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> IO b
-> IO b
pokeCStruct Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
p PhysicalDeviceVertexAttributeDivisorPropertiesKHR{Bool
Word32
$sel:maxVertexAttribDivisor:PhysicalDeviceVertexAttributeDivisorPropertiesKHR :: PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> Word32
$sel:supportsNonZeroFirstInstance:PhysicalDeviceVertexAttributeDivisorPropertiesKHR :: PhysicalDeviceVertexAttributeDivisorPropertiesKHR -> Bool
maxVertexAttribDivisor :: Word32
supportsNonZeroFirstInstance :: Bool
..} IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_KHR)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> 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 PhysicalDeviceVertexAttributeDivisorPropertiesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Word32)) (Word32
maxVertexAttribDivisor)
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
20 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
supportsNonZeroFirstInstance))
    IO b
f
  cStructSize :: Int
cStructSize = Int
24
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b.
Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> IO b -> IO b
pokeZeroCStruct Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
p IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_KHR)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> 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 PhysicalDeviceVertexAttributeDivisorPropertiesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Word32)) (Word32
forall a. Zero a => a
zero)
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorPropertiesKHR
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
20 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
forall a. Zero a => a
zero))
    IO b
f

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

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

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


-- | VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR - Structure describing
-- if fetching of vertex attribute may be repeated for instanced rendering
--
-- = Members
--
-- This structure describes the following features:
--
-- = Description
--
-- If the 'PhysicalDeviceVertexAttributeDivisorFeaturesKHR' 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. 'PhysicalDeviceVertexAttributeDivisorFeaturesKHR' /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_EXT_vertex_attribute_divisor VK_EXT_vertex_attribute_divisor>,
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_vertex_attribute_divisor VK_KHR_vertex_attribute_divisor>,
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceVertexAttributeDivisorFeaturesKHR = PhysicalDeviceVertexAttributeDivisorFeaturesKHR
  { -- | #features-vertexAttributeInstanceRateDivisor#
    -- @vertexAttributeInstanceRateDivisor@ specifies whether vertex attribute
    -- fetching may be repeated in the case of instanced rendering.
    PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> Bool
vertexAttributeInstanceRateDivisor :: Bool
  , -- | #features-vertexAttributeInstanceRateZeroDivisor#
    -- @vertexAttributeInstanceRateZeroDivisor@ specifies whether a zero value
    -- for
    -- 'Vulkan.Extensions.VK_EXT_vertex_attribute_divisor.VertexInputBindingDivisorDescriptionEXT'::@divisor@
    -- is supported.
    PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> Bool
vertexAttributeInstanceRateZeroDivisor :: Bool
  }
  deriving (Typeable, PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> Bool
(PhysicalDeviceVertexAttributeDivisorFeaturesKHR
 -> PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> Bool)
-> (PhysicalDeviceVertexAttributeDivisorFeaturesKHR
    -> PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> Bool)
-> Eq PhysicalDeviceVertexAttributeDivisorFeaturesKHR
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> Bool
== :: PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> Bool
$c/= :: PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> Bool
/= :: PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceVertexAttributeDivisorFeaturesKHR)
#endif
deriving instance Show PhysicalDeviceVertexAttributeDivisorFeaturesKHR

instance ToCStruct PhysicalDeviceVertexAttributeDivisorFeaturesKHR where
  withCStruct :: forall b.
PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> (Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> IO b)
-> IO b
withCStruct PhysicalDeviceVertexAttributeDivisorFeaturesKHR
x Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> IO b
f = Int
-> (Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> IO b)
-> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
24 ((Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> IO b)
 -> IO b)
-> (Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> IO b)
-> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
p -> Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> IO b -> IO b
forall b.
Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
p PhysicalDeviceVertexAttributeDivisorFeaturesKHR
x (Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> IO b
f Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
p)
  pokeCStruct :: forall b.
Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
p PhysicalDeviceVertexAttributeDivisorFeaturesKHR{Bool
$sel:vertexAttributeInstanceRateDivisor:PhysicalDeviceVertexAttributeDivisorFeaturesKHR :: PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> Bool
$sel:vertexAttributeInstanceRateZeroDivisor:PhysicalDeviceVertexAttributeDivisorFeaturesKHR :: PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> Bool
vertexAttributeInstanceRateDivisor :: Bool
vertexAttributeInstanceRateZeroDivisor :: Bool
..} IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> 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 PhysicalDeviceVertexAttributeDivisorFeaturesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
vertexAttributeInstanceRateDivisor))
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
20 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
vertexAttributeInstanceRateZeroDivisor))
    IO b
f
  cStructSize :: Int
cStructSize = Int
24
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b.
Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR -> IO b -> IO b
pokeZeroCStruct Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
p IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> 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 PhysicalDeviceVertexAttributeDivisorFeaturesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> 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))
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
p Ptr PhysicalDeviceVertexAttributeDivisorFeaturesKHR
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
20 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
forall a. Zero a => a
zero))
    IO b
f

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

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

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


type KHR_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION = 1

-- No documentation found for TopLevel "VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION"
pattern KHR_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION :: forall a . Integral a => a
pattern $bKHR_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION :: forall a. Integral a => a
$mKHR_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION :: forall {r} {a}.
Integral a =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
KHR_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION = 1


type KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME = "VK_KHR_vertex_attribute_divisor"

-- No documentation found for TopLevel "VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME"
pattern KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern $bKHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME :: forall a. (Eq a, IsString a) => a
$mKHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME :: forall {r} {a}.
(Eq a, IsString a) =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME = "VK_KHR_vertex_attribute_divisor"