{-# language CPP #-}
-- | = Name
--
-- VK_KHR_shader_relaxed_extended_instruction - device extension
--
-- = VK_KHR_shader_relaxed_extended_instruction
--
-- [__Name String__]
--     @VK_KHR_shader_relaxed_extended_instruction@
--
-- [__Extension Type__]
--     Device extension
--
-- [__Registered Extension Number__]
--     559
--
-- [__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 Vulkan Version 1.1>
--
-- [__SPIR-V Dependencies__]
--
--     -   <https://htmlpreview.github.io/?https://github.com/KhronosGroup/SPIRV-Registry/blob/master/extensions/KHR/SPV_KHR_relaxed_extended_instruction.html SPV_KHR_relaxed_extended_instruction>
--
-- [__Contact__]
--
--     -   Nathan Gauër
--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?body=[VK_KHR_shader_relaxed_extended_instruction] @Keenuts%0A*Here describe the issue or question you have about the VK_KHR_shader_relaxed_extended_instruction extension* >
--
-- [__Extension Proposal__]
--     <https://github.com/KhronosGroup/Vulkan-Docs/tree/main/proposals/VK_KHR_shader_relaxed_extended_instruction.adoc VK_KHR_shader_relaxed_extended_instruction>
--
-- == Other Extension Metadata
--
-- [__Last Modified Date__]
--     2024-01-24
--
-- [__IP Status__]
--     No known IP claims.
--
-- [__Contributors__]
--
--     -   Alan Baker, Google LLC
--
--     -   Nathan Gauër, Google LLC
--
-- == Description
--
-- This extension allows the use of the
-- @SPV_KHR_relaxed_extended_instruction@ extension in SPIR-V shader
-- modules.
--
-- It adds a new SPIR-V instruction, which allows some usage of forward
-- references in non-semantic instruction sets. This extensions interacts
-- with the @SPV_KHR_non_semantic_info@ extension, hence with
-- @VK_KHR_shader_non_semantic_info@.
--
-- == New Structures
--
-- -   Extending
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2',
--     'Vulkan.Core10.Device.DeviceCreateInfo':
--
--     -   'PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR'
--
-- == New Enum Constants
--
-- -   'KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME'
--
-- -   'KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_SPEC_VERSION'
--
-- -   Extending 'Vulkan.Core10.Enums.StructureType.StructureType':
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR'
--
-- == Version History
--
-- -   Revision 1, 2024-01-24 (Nathan Gauër)
--
--     -   Initial revision
--
-- == 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_KHR_shader_relaxed_extended_instruction 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_shader_relaxed_extended_instruction  ( PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR(..)
                                                                     , KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_SPEC_VERSION
                                                                     , pattern KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_SPEC_VERSION
                                                                     , KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME
                                                                     , pattern KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_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.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_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR))
-- | VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR - Structure
-- describing support for VK_KHR_shader_relaxed_extended_instruction an
-- implementation
--
-- = Members
--
-- This structure describes the following feature:
--
-- = Description
--
-- If the 'PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR'
-- 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
-- 'PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR', 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_KHR_shader_relaxed_extended_instruction VK_KHR_shader_relaxed_extended_instruction>,
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR = PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
  { -- | #features-shaderRelaxedExtendedInstruction#
    -- @shaderRelaxedExtendedInstruction@ specifies whether the implementation
    -- supports SPIR-V modules that use the
    -- @SPV_KHR_relaxed_extended_instruction@ extension.
    PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR -> Bool
shaderRelaxedExtendedInstruction :: Bool }
  deriving (Typeable, PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> Bool
(PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
 -> PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
 -> Bool)
-> (PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
    -> PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
    -> Bool)
-> Eq PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> Bool
== :: PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> Bool
$c/= :: PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> Bool
/= :: PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR)
#endif
deriving instance Show PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR

instance ToCStruct PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR where
  withCStruct :: forall b.
PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> (Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
    -> IO b)
-> IO b
withCStruct PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
x Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> IO b
f = Int
-> (Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
    -> IO b)
-> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
24 ((Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
  -> IO b)
 -> IO b)
-> (Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
    -> IO b)
-> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
p -> Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> IO b
-> IO b
forall b.
Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> IO b
-> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
p PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
x (Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> IO b
f Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
p)
  pokeCStruct :: forall b.
Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> IO b
-> IO b
pokeCStruct Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
p PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR{Bool
shaderRelaxedExtendedInstruction :: PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR -> Bool
shaderRelaxedExtendedInstruction :: Bool
..} IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
p Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
p Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> 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 PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
p Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
shaderRelaxedExtendedInstruction))
    IO b
f
  cStructSize :: Int
cStructSize = Int
24
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b.
Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> IO b -> IO b
pokeZeroCStruct Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
p IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
p Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
p Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> 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 PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
p Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> 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 PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR where
  peekCStruct :: Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> IO PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
peekCStruct Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
p = do
    shaderRelaxedExtendedInstruction <- forall a. Storable a => Ptr a -> IO a
peek @Bool32 ((Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
p Ptr PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
-> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Bool32))
    pure $ PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR
             (bool32ToBool shaderRelaxedExtendedInstruction)

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

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


type KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_SPEC_VERSION = 1

-- No documentation found for TopLevel "VK_KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_SPEC_VERSION"
pattern KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_SPEC_VERSION :: forall a . Integral a => a
pattern $mKHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_SPEC_VERSION :: forall {r} {a}.
Integral a =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
$bKHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_SPEC_VERSION :: forall a. Integral a => a
KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_SPEC_VERSION = 1


type KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME = "VK_KHR_shader_relaxed_extended_instruction"

-- No documentation found for TopLevel "VK_KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME"
pattern KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern $mKHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME :: forall {r} {a}.
(Eq a, IsString a) =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
$bKHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME :: forall a. (Eq a, IsString a) => a
KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME = "VK_KHR_shader_relaxed_extended_instruction"