{-# language CPP #-}
-- No documentation found for Chapter "Promoted_From_VK_KHR_shader_float16_int8"
module Vulkan.Core12.Promoted_From_VK_KHR_shader_float16_int8  ( PhysicalDeviceShaderFloat16Int8Features(..)
                                                               , StructureType(..)
                                                               ) 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.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.Core10.Enums.StructureType (StructureType)
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES))
import Vulkan.Core10.Enums.StructureType (StructureType(..))
-- | VkPhysicalDeviceShaderFloat16Int8Features - Structure describing
-- features supported by VK_KHR_shader_float16_int8
--
-- = Members
--
-- This structure describes the following features:
--
-- = Description
--
-- If the 'PhysicalDeviceShaderFloat16Int8Features' 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. 'PhysicalDeviceShaderFloat16Int8Features' /can/ also be used
-- in the @pNext@ chain of 'Vulkan.Core10.Device.DeviceCreateInfo' to
-- selectively enable these features.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_shader_float16_int8 VK_KHR_shader_float16_int8>,
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VERSION_1_2 VK_VERSION_1_2>,
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceShaderFloat16Int8Features = PhysicalDeviceShaderFloat16Int8Features
  { -- | #extension-features-shaderFloat16# @shaderFloat16@ indicates whether
    -- 16-bit floats (halfs) are supported in shader code. This also indicates
    -- whether shader modules /can/ declare the @Float16@ capability. However,
    -- this only enables a subset of the storage classes that SPIR-V allows for
    -- the @Float16@ SPIR-V capability: Declaring and using 16-bit floats in
    -- the @Private@, @Workgroup@ (for non-Block variables), and @Function@
    -- storage classes is enabled, while declaring them in the interface
    -- storage classes (e.g., @UniformConstant@, @Uniform@, @StorageBuffer@,
    -- @Input@, @Output@, and @PushConstant@) is not enabled.
    PhysicalDeviceShaderFloat16Int8Features -> Bool
shaderFloat16 :: Bool
  , -- | #extension-features-shaderInt8# @shaderInt8@ indicates whether 8-bit
    -- integers (signed and unsigned) are supported in shader code. This also
    -- indicates whether shader modules /can/ declare the @Int8@ capability.
    -- However, this only enables a subset of the storage classes that SPIR-V
    -- allows for the @Int8@ SPIR-V capability: Declaring and using 8-bit
    -- integers in the @Private@, @Workgroup@ (for non-Block variables), and
    -- @Function@ storage classes is enabled, while declaring them in the
    -- interface storage classes (e.g., @UniformConstant@, @Uniform@,
    -- @StorageBuffer@, @Input@, @Output@, and @PushConstant@) is not enabled.
    PhysicalDeviceShaderFloat16Int8Features -> Bool
shaderInt8 :: Bool
  }
  deriving (Typeable, PhysicalDeviceShaderFloat16Int8Features
-> PhysicalDeviceShaderFloat16Int8Features -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PhysicalDeviceShaderFloat16Int8Features
-> PhysicalDeviceShaderFloat16Int8Features -> Bool
$c/= :: PhysicalDeviceShaderFloat16Int8Features
-> PhysicalDeviceShaderFloat16Int8Features -> Bool
== :: PhysicalDeviceShaderFloat16Int8Features
-> PhysicalDeviceShaderFloat16Int8Features -> Bool
$c== :: PhysicalDeviceShaderFloat16Int8Features
-> PhysicalDeviceShaderFloat16Int8Features -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceShaderFloat16Int8Features)
#endif
deriving instance Show PhysicalDeviceShaderFloat16Int8Features

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

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

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

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