{-# language CPP #-}
-- | = Name
--
-- VK_KHR_internally_synchronized_queues - device extension
--
-- = VK_KHR_internally_synchronized_queues
--
-- [__Name String__]
--     @VK_KHR_internally_synchronized_queues@
--
-- [__Extension Type__]
--     Device extension
--
-- [__Registered Extension Number__]
--     505
--
-- [__Revision__]
--     1
--
-- [__Ratification Status__]
--     Ratified
--
-- [__Extension and Version Dependencies__]
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#versions-1.1 Vulkan Version 1.1>
--
-- [__Contact__]
--
--     -   Shahbaz Youssefi
--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?body=[VK_KHR_internally_synchronized_queues] @syoussefi%0A*Here describe the issue or question you have about the VK_KHR_internally_synchronized_queues extension* >
--
-- [__Extension Proposal__]
--     <https://github.com/KhronosGroup/Vulkan-Docs/tree/main/proposals/VK_KHR_internally_synchronized_queues.adoc VK_KHR_internally_synchronized_queues>
--
-- == Other Extension Metadata
--
-- [__Last Modified Date__]
--     2025-02-04
--
-- [__Contributors__]
--
--     -   Shahbaz Youssefi, Google
--
--     -   Daniel Rakos, RasterGrid
--
--     -   Jeff Bolz, Nvidia
--
--     -   Hans-Kristian Arntzen, Valve
--
-- == Description
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_internally_synchronized_queues VK_KHR_internally_synchronized_queues>
-- allows queues to opt into being internally synchronized via the
-- 'Vulkan.Core10.Enums.DeviceQueueCreateFlagBits.DEVICE_QUEUE_CREATE_INTERNALLY_SYNCHRONIZED_BIT_KHR'
-- flag.
--
-- == New Structures
--
-- -   Extending
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2',
--     'Vulkan.Core10.Device.DeviceCreateInfo':
--
--     -   'PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR'
--
-- == New Enum Constants
--
-- -   'KHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME'
--
-- -   'KHR_INTERNALLY_SYNCHRONIZED_QUEUES_SPEC_VERSION'
--
-- -   Extending
--     'Vulkan.Core10.Enums.DeviceQueueCreateFlagBits.DeviceQueueCreateFlagBits':
--
--     -   'Vulkan.Core10.Enums.DeviceQueueCreateFlagBits.DEVICE_QUEUE_CREATE_INTERNALLY_SYNCHRONIZED_BIT_KHR'
--
-- -   Extending 'Vulkan.Core10.Enums.StructureType.StructureType':
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_INTERNALLY_SYNCHRONIZED_QUEUES_FEATURES_KHR'
--
-- == Issues
--
-- None.
--
-- == Version History
--
-- -   Revision 0, 2025-01-07 (Daniel Rakos)
--
--     -   Initial proposal
--
-- -   Revision 1, 2025-02-04 (Shahbaz Youssefi)
--
--     -   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_internally_synchronized_queues 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_internally_synchronized_queues  ( PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR(..)
                                                                , KHR_INTERNALLY_SYNCHRONIZED_QUEUES_SPEC_VERSION
                                                                , pattern KHR_INTERNALLY_SYNCHRONIZED_QUEUES_SPEC_VERSION
                                                                , KHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME
                                                                , pattern KHR_INTERNALLY_SYNCHRONIZED_QUEUES_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_INTERNALLY_SYNCHRONIZED_QUEUES_FEATURES_KHR))
-- | VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR - Structure
-- indicating support for queues that are internally synchronized
--
-- = Members
--
-- This structure describes the following feature:
--
-- = Description
--
-- If the 'PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR' 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
-- 'PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR', 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_internally_synchronized_queues VK_KHR_internally_synchronized_queues>,
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR = PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR
  { -- | #features-internallySynchronizedQueues# @internallySynchronizedQueues@
    -- indicates that
    -- 'Vulkan.Core10.Enums.DeviceQueueCreateFlagBits.DEVICE_QUEUE_CREATE_INTERNALLY_SYNCHRONIZED_BIT_KHR'
    -- can be used to make queues internally synchronized.
    PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR -> Bool
internallySynchronizedQueues :: Bool }
  deriving (Typeable, PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR
-> PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR -> Bool
(PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR
 -> PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR -> Bool)
-> (PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR
    -> PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR -> Bool)
-> Eq PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR
-> PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR -> Bool
== :: PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR
-> PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR -> Bool
$c/= :: PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR
-> PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR -> Bool
/= :: PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR
-> PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR)
#endif
deriving instance Show PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR

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

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

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


type KHR_INTERNALLY_SYNCHRONIZED_QUEUES_SPEC_VERSION = 1

-- No documentation found for TopLevel "VK_KHR_INTERNALLY_SYNCHRONIZED_QUEUES_SPEC_VERSION"
pattern KHR_INTERNALLY_SYNCHRONIZED_QUEUES_SPEC_VERSION :: forall a . Integral a => a
pattern $mKHR_INTERNALLY_SYNCHRONIZED_QUEUES_SPEC_VERSION :: forall {r} {a}.
Integral a =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
$bKHR_INTERNALLY_SYNCHRONIZED_QUEUES_SPEC_VERSION :: forall a. Integral a => a
KHR_INTERNALLY_SYNCHRONIZED_QUEUES_SPEC_VERSION = 1


type KHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME = "VK_KHR_internally_synchronized_queues"

-- No documentation found for TopLevel "VK_KHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME"
pattern KHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern $mKHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME :: forall {r} {a}.
(Eq a, IsString a) =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
$bKHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME :: forall a. (Eq a, IsString a) => a
KHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME = "VK_KHR_internally_synchronized_queues"