{-# language CPP #-}
module Vulkan.Extensions.VK_KHR_shader_clock  ( PhysicalDeviceShaderClockFeaturesKHR(..)
                                              , KHR_SHADER_CLOCK_SPEC_VERSION
                                              , pattern KHR_SHADER_CLOCK_SPEC_VERSION
                                              , KHR_SHADER_CLOCK_EXTENSION_NAME
                                              , pattern KHR_SHADER_CLOCK_EXTENSION_NAME
                                              ) where

import Foreign.Marshal.Alloc (allocaBytesAligned)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
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.Kind (Type)
import Vulkan.Core10.FundamentalTypes (bool32ToBool)
import Vulkan.Core10.FundamentalTypes (boolToBool32)
import Vulkan.Core10.FundamentalTypes (Bool32)
import Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Zero (Zero(..))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR))
-- | VkPhysicalDeviceShaderClockFeaturesKHR - Structure describing features
-- supported by VK_KHR_shader_clock
--
-- = Description
--
-- If the 'PhysicalDeviceShaderClockFeaturesKHR' structure is included in
-- the @pNext@ chain of
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2',
-- it is filled with values indicating whether each feature is supported.
-- 'PhysicalDeviceShaderClockFeaturesKHR' can also be included in the
-- @pNext@ chain of 'Vulkan.Core10.Device.DeviceCreateInfo' to enable the
-- features.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceShaderClockFeaturesKHR = PhysicalDeviceShaderClockFeaturesKHR
  { -- | @shaderSubgroupClock@ indicates whether shaders /can/ perform @Subgroup@
    -- scoped clock reads.
    PhysicalDeviceShaderClockFeaturesKHR -> Bool
shaderSubgroupClock :: Bool
  , -- | @shaderDeviceClock@ indicates whether shaders /can/ perform
    -- 'Vulkan.Core10.Handles.Device' scoped clock reads.
    PhysicalDeviceShaderClockFeaturesKHR -> Bool
shaderDeviceClock :: Bool
  }
  deriving (Typeable, PhysicalDeviceShaderClockFeaturesKHR
-> PhysicalDeviceShaderClockFeaturesKHR -> Bool
(PhysicalDeviceShaderClockFeaturesKHR
 -> PhysicalDeviceShaderClockFeaturesKHR -> Bool)
-> (PhysicalDeviceShaderClockFeaturesKHR
    -> PhysicalDeviceShaderClockFeaturesKHR -> Bool)
-> Eq PhysicalDeviceShaderClockFeaturesKHR
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PhysicalDeviceShaderClockFeaturesKHR
-> PhysicalDeviceShaderClockFeaturesKHR -> Bool
$c/= :: PhysicalDeviceShaderClockFeaturesKHR
-> PhysicalDeviceShaderClockFeaturesKHR -> Bool
== :: PhysicalDeviceShaderClockFeaturesKHR
-> PhysicalDeviceShaderClockFeaturesKHR -> Bool
$c== :: PhysicalDeviceShaderClockFeaturesKHR
-> PhysicalDeviceShaderClockFeaturesKHR -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceShaderClockFeaturesKHR)
#endif
deriving instance Show PhysicalDeviceShaderClockFeaturesKHR

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

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

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

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


type KHR_SHADER_CLOCK_SPEC_VERSION = 1

-- No documentation found for TopLevel "VK_KHR_SHADER_CLOCK_SPEC_VERSION"
pattern KHR_SHADER_CLOCK_SPEC_VERSION :: forall a . Integral a => a
pattern $bKHR_SHADER_CLOCK_SPEC_VERSION :: a
$mKHR_SHADER_CLOCK_SPEC_VERSION :: forall r a. Integral a => a -> (Void# -> r) -> (Void# -> r) -> r
KHR_SHADER_CLOCK_SPEC_VERSION = 1


type KHR_SHADER_CLOCK_EXTENSION_NAME = "VK_KHR_shader_clock"

-- No documentation found for TopLevel "VK_KHR_SHADER_CLOCK_EXTENSION_NAME"
pattern KHR_SHADER_CLOCK_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern $bKHR_SHADER_CLOCK_EXTENSION_NAME :: a
$mKHR_SHADER_CLOCK_EXTENSION_NAME :: forall r a.
(Eq a, IsString a) =>
a -> (Void# -> r) -> (Void# -> r) -> r
KHR_SHADER_CLOCK_EXTENSION_NAME = "VK_KHR_shader_clock"