packages feed

vulkan-3.27: src/Vulkan/Extensions/VK_EXT_subpass_merge_feedback.hs

{-# language CPP #-}
-- | = Name
--
-- VK_EXT_subpass_merge_feedback - device extension
--
-- = VK_EXT_subpass_merge_feedback
--
-- [__Name String__]
--     @VK_EXT_subpass_merge_feedback@
--
-- [__Extension Type__]
--     Device extension
--
-- [__Registered Extension Number__]
--     459
--
-- [__Revision__]
--     2
--
-- [__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>
--
-- [__Contact__]
--
--     -   Ting Wei
--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?body=[VK_EXT_subpass_merge_feedback] @catweiting%0A*Here describe the issue or question you have about the VK_EXT_subpass_merge_feedback extension* >
--
-- [__Extension Proposal__]
--     <https://github.com/KhronosGroup/Vulkan-Docs/tree/main/proposals/VK_EXT_subpass_merge_feedback.adoc VK_EXT_subpass_merge_feedback>
--
-- == Other Extension Metadata
--
-- [__Last Modified Date__]
--     2022-05-24
--
-- [__IP Status__]
--     No known IP claims.
--
-- [__Contributors__]
--
--     -   Jan-Harald Fredriksen, Arm
--
--     -   Jorg Wagner, Arm
--
--     -   Ting Wei, Arm
--
-- == Description
--
-- This extension adds a mechanism to provide feedback to an application
-- about whether the subpasses specified on render pass creation are merged
-- by the implementation. Additionally, it provides a control to enable or
-- disable subpass merging in the render pass.
--
-- == New Structures
--
-- -   'RenderPassCreationFeedbackInfoEXT'
--
-- -   'RenderPassSubpassFeedbackInfoEXT'
--
-- -   Extending
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2',
--     'Vulkan.Core10.Device.DeviceCreateInfo':
--
--     -   'PhysicalDeviceSubpassMergeFeedbackFeaturesEXT'
--
-- -   Extending
--     'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.RenderPassCreateInfo2':
--
--     -   'RenderPassCreationFeedbackCreateInfoEXT'
--
-- -   Extending
--     'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.RenderPassCreateInfo2',
--     'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.SubpassDescription2':
--
--     -   'RenderPassCreationControlEXT'
--
-- -   Extending
--     'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.SubpassDescription2':
--
--     -   'RenderPassSubpassFeedbackCreateInfoEXT'
--
-- == New Enums
--
-- -   'SubpassMergeStatusEXT'
--
-- == New Enum Constants
--
-- -   'EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME'
--
-- -   'EXT_SUBPASS_MERGE_FEEDBACK_SPEC_VERSION'
--
-- -   Extending 'Vulkan.Core10.Enums.StructureType.StructureType':
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT'
--
-- == Version History
--
-- -   Revision 1, 2022-03-10
--
--     -   Initial draft.
--
-- -   Revision 2, 2022-05-24
--
--     -   Fix structextends and constness issues.
--
-- == 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_EXT_subpass_merge_feedback Vulkan Specification>.
--
-- This page is a generated document. Fixes and changes should be made to
-- the generator scripts, not directly.
module Vulkan.Extensions.VK_EXT_subpass_merge_feedback  ( RenderPassCreationControlEXT(..)
                                                        , RenderPassCreationFeedbackInfoEXT(..)
                                                        , RenderPassCreationFeedbackCreateInfoEXT(..)
                                                        , RenderPassSubpassFeedbackInfoEXT(..)
                                                        , RenderPassSubpassFeedbackCreateInfoEXT(..)
                                                        , PhysicalDeviceSubpassMergeFeedbackFeaturesEXT(..)
                                                        , SubpassMergeStatusEXT( SUBPASS_MERGE_STATUS_MERGED_EXT
                                                                               , SUBPASS_MERGE_STATUS_DISALLOWED_EXT
                                                                               , SUBPASS_MERGE_STATUS_NOT_MERGED_SIDE_EFFECTS_EXT
                                                                               , SUBPASS_MERGE_STATUS_NOT_MERGED_SAMPLES_MISMATCH_EXT
                                                                               , SUBPASS_MERGE_STATUS_NOT_MERGED_VIEWS_MISMATCH_EXT
                                                                               , SUBPASS_MERGE_STATUS_NOT_MERGED_ALIASING_EXT
                                                                               , SUBPASS_MERGE_STATUS_NOT_MERGED_DEPENDENCIES_EXT
                                                                               , SUBPASS_MERGE_STATUS_NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT
                                                                               , SUBPASS_MERGE_STATUS_NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT
                                                                               , SUBPASS_MERGE_STATUS_NOT_MERGED_INSUFFICIENT_STORAGE_EXT
                                                                               , SUBPASS_MERGE_STATUS_NOT_MERGED_DEPTH_STENCIL_COUNT_EXT
                                                                               , SUBPASS_MERGE_STATUS_NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT
                                                                               , SUBPASS_MERGE_STATUS_NOT_MERGED_SINGLE_SUBPASS_EXT
                                                                               , SUBPASS_MERGE_STATUS_NOT_MERGED_UNSPECIFIED_EXT
                                                                               , ..
                                                                               )
                                                        , EXT_SUBPASS_MERGE_FEEDBACK_SPEC_VERSION
                                                        , pattern EXT_SUBPASS_MERGE_FEEDBACK_SPEC_VERSION
                                                        , EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME
                                                        , pattern EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME
                                                        ) where

import Vulkan.CStruct.Utils (FixedArray)
import Vulkan.Internal.Utils (enumReadPrec)
import Vulkan.Internal.Utils (enumShowsPrec)
import Foreign.Marshal.Alloc (allocaBytes)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
import GHC.Show (showsPrec)
import Data.ByteString (packCString)
import Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Zero (Zero)
import Vulkan.Zero (Zero(..))
import Data.String (IsString)
import Data.Typeable (Typeable)
import Foreign.C.Types (CChar)
import Foreign.Storable (Storable)
import Foreign.Storable (Storable(peek))
import Foreign.Storable (Storable(poke))
import qualified Foreign.Storable (Storable(..))
import GHC.Generics (Generic)
import Data.Int (Int32)
import Foreign.Ptr (Ptr)
import GHC.Read (Read(readPrec))
import GHC.Show (Show(showsPrec))
import Data.Word (Word32)
import Data.ByteString (ByteString)
import Data.Kind (Type)
import Vulkan.Core10.FundamentalTypes (bool32ToBool)
import Vulkan.Core10.FundamentalTypes (boolToBool32)
import Vulkan.CStruct.Utils (lowerArrayPtr)
import Vulkan.CStruct.Utils (pokeFixedLengthNullTerminatedByteString)
import Vulkan.Core10.FundamentalTypes (Bool32)
import Vulkan.Core10.APIConstants (MAX_DESCRIPTION_SIZE)
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT))
-- | VkRenderPassCreationControlEXT - Control about the creation of render
-- pass or subpass
--
-- = Description
--
-- If a 'RenderPassCreationControlEXT' structure is included in the @pNext@
-- chain of
-- 'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.RenderPassCreateInfo2'
-- and its value of @disallowMerging@ is
-- 'Vulkan.Core10.FundamentalTypes.TRUE', the implementation will disable
-- subpass merging for the entire render pass. If a
-- 'RenderPassCreationControlEXT' structure is included in the @pNext@
-- chain of
-- 'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.SubpassDescription2'
-- and its value of @disallowMerging@ is
-- 'Vulkan.Core10.FundamentalTypes.TRUE', the implementation will disable
-- merging the described subpass with previous subpasses in the render
-- pass.
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structures>]
--
--     -   'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.RenderPassCreateInfo2'
--
--     -   'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.SubpassDescription2'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_subpass_merge_feedback VK_EXT_subpass_merge_feedback>,
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.RenderPassCreateInfo2',
-- 'Vulkan.Core10.Enums.StructureType.StructureType',
-- 'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.SubpassDescription2',
-- 'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.createRenderPass2'
data RenderPassCreationControlEXT = RenderPassCreationControlEXT
  { -- | @disallowMerging@ is a boolean value indicating whether subpass merging
    -- will be disabled.
    disallowMerging :: Bool }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (RenderPassCreationControlEXT)
#endif
deriving instance Show RenderPassCreationControlEXT

instance ToCStruct RenderPassCreationControlEXT where
  withCStruct x f = allocaBytes 24 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p RenderPassCreationControlEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr Bool32)) (boolToBool32 (disallowMerging))
    f
  cStructSize = 24
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr Bool32)) (boolToBool32 (zero))
    f

instance FromCStruct RenderPassCreationControlEXT where
  peekCStruct p = do
    disallowMerging <- peek @Bool32 ((p `plusPtr` 16 :: Ptr Bool32))
    pure $ RenderPassCreationControlEXT
             (bool32ToBool disallowMerging)

instance Storable RenderPassCreationControlEXT where
  sizeOf ~_ = 24
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero RenderPassCreationControlEXT where
  zero = RenderPassCreationControlEXT
           zero


-- | VkRenderPassCreationFeedbackInfoEXT - Feedback about the creation of a
-- render pass
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_subpass_merge_feedback VK_EXT_subpass_merge_feedback>,
-- 'RenderPassCreationFeedbackCreateInfoEXT'
data RenderPassCreationFeedbackInfoEXT = RenderPassCreationFeedbackInfoEXT
  { -- | @postMergeSubpassCount@ is the subpass count after merge.
    postMergeSubpassCount :: Word32 }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (RenderPassCreationFeedbackInfoEXT)
#endif
deriving instance Show RenderPassCreationFeedbackInfoEXT

instance ToCStruct RenderPassCreationFeedbackInfoEXT where
  withCStruct x f = allocaBytes 4 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p RenderPassCreationFeedbackInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr Word32)) (postMergeSubpassCount)
    f
  cStructSize = 4
  cStructAlignment = 4
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr Word32)) (zero)
    f

instance FromCStruct RenderPassCreationFeedbackInfoEXT where
  peekCStruct p = do
    postMergeSubpassCount <- peek @Word32 ((p `plusPtr` 0 :: Ptr Word32))
    pure $ RenderPassCreationFeedbackInfoEXT
             postMergeSubpassCount

instance Storable RenderPassCreationFeedbackInfoEXT where
  sizeOf ~_ = 4
  alignment ~_ = 4
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero RenderPassCreationFeedbackInfoEXT where
  zero = RenderPassCreationFeedbackInfoEXT
           zero


-- | VkRenderPassCreationFeedbackCreateInfoEXT - Request feedback about the
-- creation of render pass
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structure>]
--
--     -   'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.RenderPassCreateInfo2'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_subpass_merge_feedback VK_EXT_subpass_merge_feedback>,
-- 'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.RenderPassCreateInfo2',
-- 'RenderPassCreationControlEXT', 'RenderPassCreationFeedbackInfoEXT',
-- 'Vulkan.Core10.Enums.StructureType.StructureType',
-- 'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.createRenderPass2'
data RenderPassCreationFeedbackCreateInfoEXT = RenderPassCreationFeedbackCreateInfoEXT
  { -- | @pRenderPassFeedback@ is a pointer to a
    -- 'RenderPassCreationFeedbackInfoEXT' structure in which feedback is
    -- returned.
    --
    -- #VUID-VkRenderPassCreationFeedbackCreateInfoEXT-pRenderPassFeedback-parameter#
    -- @pRenderPassFeedback@ /must/ be a valid pointer to a
    -- 'RenderPassCreationFeedbackInfoEXT' structure
    renderPassFeedback :: Ptr RenderPassCreationFeedbackInfoEXT }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (RenderPassCreationFeedbackCreateInfoEXT)
#endif
deriving instance Show RenderPassCreationFeedbackCreateInfoEXT

instance ToCStruct RenderPassCreationFeedbackCreateInfoEXT where
  withCStruct x f = allocaBytes 24 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p RenderPassCreationFeedbackCreateInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr (Ptr RenderPassCreationFeedbackInfoEXT))) (renderPassFeedback)
    f
  cStructSize = 24
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr (Ptr RenderPassCreationFeedbackInfoEXT))) (zero)
    f

instance FromCStruct RenderPassCreationFeedbackCreateInfoEXT where
  peekCStruct p = do
    pRenderPassFeedback <- peek @(Ptr RenderPassCreationFeedbackInfoEXT) ((p `plusPtr` 16 :: Ptr (Ptr RenderPassCreationFeedbackInfoEXT)))
    pure $ RenderPassCreationFeedbackCreateInfoEXT
             pRenderPassFeedback

instance Storable RenderPassCreationFeedbackCreateInfoEXT where
  sizeOf ~_ = 24
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero RenderPassCreationFeedbackCreateInfoEXT where
  zero = RenderPassCreationFeedbackCreateInfoEXT
           zero


-- | VkRenderPassSubpassFeedbackInfoEXT - Feedback about the creation of
-- subpass
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_subpass_merge_feedback VK_EXT_subpass_merge_feedback>,
-- 'RenderPassSubpassFeedbackCreateInfoEXT', 'SubpassMergeStatusEXT'
data RenderPassSubpassFeedbackInfoEXT = RenderPassSubpassFeedbackInfoEXT
  { -- | @subpassMergeStatus@ is a 'SubpassMergeStatusEXT' value specifying
    -- information about whether the subpass is merged with the previous
    -- subpass and the reason why it is not merged.
    subpassMergeStatus :: SubpassMergeStatusEXT
  , -- | @description@ is an array of
    -- 'Vulkan.Core10.APIConstants.MAX_DESCRIPTION_SIZE' @char@ containing a
    -- null-terminated UTF-8 string which provides additional details.
    description :: ByteString
  , -- | @postMergeIndex@ is the subpass index after the subpass merging.
    postMergeIndex :: Word32
  }
  deriving (Typeable)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (RenderPassSubpassFeedbackInfoEXT)
#endif
deriving instance Show RenderPassSubpassFeedbackInfoEXT

instance ToCStruct RenderPassSubpassFeedbackInfoEXT where
  withCStruct x f = allocaBytes 264 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p RenderPassSubpassFeedbackInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr SubpassMergeStatusEXT)) (subpassMergeStatus)
    pokeFixedLengthNullTerminatedByteString ((p `plusPtr` 4 :: Ptr (FixedArray MAX_DESCRIPTION_SIZE CChar))) (description)
    poke ((p `plusPtr` 260 :: Ptr Word32)) (postMergeIndex)
    f
  cStructSize = 264
  cStructAlignment = 4
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr SubpassMergeStatusEXT)) (zero)
    pokeFixedLengthNullTerminatedByteString ((p `plusPtr` 4 :: Ptr (FixedArray MAX_DESCRIPTION_SIZE CChar))) (mempty)
    poke ((p `plusPtr` 260 :: Ptr Word32)) (zero)
    f

instance FromCStruct RenderPassSubpassFeedbackInfoEXT where
  peekCStruct p = do
    subpassMergeStatus <- peek @SubpassMergeStatusEXT ((p `plusPtr` 0 :: Ptr SubpassMergeStatusEXT))
    description <- packCString (lowerArrayPtr ((p `plusPtr` 4 :: Ptr (FixedArray MAX_DESCRIPTION_SIZE CChar))))
    postMergeIndex <- peek @Word32 ((p `plusPtr` 260 :: Ptr Word32))
    pure $ RenderPassSubpassFeedbackInfoEXT
             subpassMergeStatus description postMergeIndex

instance Storable RenderPassSubpassFeedbackInfoEXT where
  sizeOf ~_ = 264
  alignment ~_ = 4
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero RenderPassSubpassFeedbackInfoEXT where
  zero = RenderPassSubpassFeedbackInfoEXT
           zero
           mempty
           zero


-- | VkRenderPassSubpassFeedbackCreateInfoEXT - Request for feedback about
-- the creation of subpass
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structure>]
--
--     -   'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.SubpassDescription2'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_subpass_merge_feedback VK_EXT_subpass_merge_feedback>,
-- 'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.RenderPassCreateInfo2',
-- 'RenderPassCreationControlEXT', 'RenderPassSubpassFeedbackInfoEXT',
-- 'Vulkan.Core10.Enums.StructureType.StructureType',
-- 'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.SubpassDescription2',
-- 'Vulkan.Core12.Promoted_From_VK_KHR_create_renderpass2.createRenderPass2'
data RenderPassSubpassFeedbackCreateInfoEXT = RenderPassSubpassFeedbackCreateInfoEXT
  { -- | @pSubpassFeedback@ is a pointer to a 'RenderPassSubpassFeedbackInfoEXT'
    -- structure in which feedback is returned.
    --
    -- #VUID-VkRenderPassSubpassFeedbackCreateInfoEXT-pSubpassFeedback-parameter#
    -- @pSubpassFeedback@ /must/ be a valid pointer to a
    -- 'RenderPassSubpassFeedbackInfoEXT' structure
    subpassFeedback :: Ptr RenderPassSubpassFeedbackInfoEXT }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (RenderPassSubpassFeedbackCreateInfoEXT)
#endif
deriving instance Show RenderPassSubpassFeedbackCreateInfoEXT

instance ToCStruct RenderPassSubpassFeedbackCreateInfoEXT where
  withCStruct x f = allocaBytes 24 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p RenderPassSubpassFeedbackCreateInfoEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr (Ptr RenderPassSubpassFeedbackInfoEXT))) (subpassFeedback)
    f
  cStructSize = 24
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr (Ptr RenderPassSubpassFeedbackInfoEXT))) (zero)
    f

instance FromCStruct RenderPassSubpassFeedbackCreateInfoEXT where
  peekCStruct p = do
    pSubpassFeedback <- peek @(Ptr RenderPassSubpassFeedbackInfoEXT) ((p `plusPtr` 16 :: Ptr (Ptr RenderPassSubpassFeedbackInfoEXT)))
    pure $ RenderPassSubpassFeedbackCreateInfoEXT
             pSubpassFeedback

instance Storable RenderPassSubpassFeedbackCreateInfoEXT where
  sizeOf ~_ = 24
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero RenderPassSubpassFeedbackCreateInfoEXT where
  zero = RenderPassSubpassFeedbackCreateInfoEXT
           zero


-- | VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT - Structure describing
-- whether subpass merging feedback can be supported by the implementation
--
-- = Members
--
-- This structure describes the following feature:
--
-- = Description
--
-- If the 'PhysicalDeviceSubpassMergeFeedbackFeaturesEXT' 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
-- 'PhysicalDeviceSubpassMergeFeedbackFeaturesEXT', 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'.
--
-- == Structure Chaining
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-validusage-pNext Extends the structures>]
--
--     -   'Vulkan.Core10.Device.DeviceCreateInfo'
--
--     -   'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_subpass_merge_feedback VK_EXT_subpass_merge_feedback>,
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceSubpassMergeFeedbackFeaturesEXT = PhysicalDeviceSubpassMergeFeedbackFeaturesEXT
  { -- | #features-subpassMergeFeedback# @subpassMergeFeedback@ indicates whether
    -- the implementation supports feedback of subpass merging.
    subpassMergeFeedback :: Bool }
  deriving (Typeable, Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceSubpassMergeFeedbackFeaturesEXT)
#endif
deriving instance Show PhysicalDeviceSubpassMergeFeedbackFeaturesEXT

instance ToCStruct PhysicalDeviceSubpassMergeFeedbackFeaturesEXT where
  withCStruct x f = allocaBytes 24 $ \p -> pokeCStruct p x (f p)
  pokeCStruct p PhysicalDeviceSubpassMergeFeedbackFeaturesEXT{..} f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr Bool32)) (boolToBool32 (subpassMergeFeedback))
    f
  cStructSize = 24
  cStructAlignment = 8
  pokeZeroCStruct p f = do
    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT)
    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
    poke ((p `plusPtr` 16 :: Ptr Bool32)) (boolToBool32 (zero))
    f

instance FromCStruct PhysicalDeviceSubpassMergeFeedbackFeaturesEXT where
  peekCStruct p = do
    subpassMergeFeedback <- peek @Bool32 ((p `plusPtr` 16 :: Ptr Bool32))
    pure $ PhysicalDeviceSubpassMergeFeedbackFeaturesEXT
             (bool32ToBool subpassMergeFeedback)

instance Storable PhysicalDeviceSubpassMergeFeedbackFeaturesEXT where
  sizeOf ~_ = 24
  alignment ~_ = 8
  peek = peekCStruct
  poke ptr poked = pokeCStruct ptr poked (pure ())

instance Zero PhysicalDeviceSubpassMergeFeedbackFeaturesEXT where
  zero = PhysicalDeviceSubpassMergeFeedbackFeaturesEXT
           zero


-- | VkSubpassMergeStatusEXT - Specify a subpass merging status
--
-- = Description
--
-- -   'SUBPASS_MERGE_STATUS_MERGED_EXT' specifies that the subpass is
--     merged with a previous subpass.
--
-- -   'SUBPASS_MERGE_STATUS_DISALLOWED_EXT' specifies that the subpass is
--     not merged because merging was disabled using
--     'RenderPassCreationControlEXT'. If the render pass does not allow
--     subpass merging, then all subpass statuses are set to this value. If
--     a subpass description does not allow subpass merging, then only that
--     subpass’s status is set to this value.
--
-- -   'SUBPASS_MERGE_STATUS_NOT_MERGED_SIDE_EFFECTS_EXT' specifies that
--     the subpass is not merged because it contains side effects.
--
-- -   'SUBPASS_MERGE_STATUS_NOT_MERGED_SAMPLES_MISMATCH_EXT' specifies
--     that the subpass is not merged because sample count is not
--     compatible with the previous subpass.
--
-- -   'SUBPASS_MERGE_STATUS_NOT_MERGED_VIEWS_MISMATCH_EXT' specifies that
--     the subpass is not merged because view masks do not match with
--     previous subpass.
--
-- -   'SUBPASS_MERGE_STATUS_NOT_MERGED_ALIASING_EXT' specifies that the
--     subpass is not merged because of attachments aliasing between them.
--
-- -   'SUBPASS_MERGE_STATUS_NOT_MERGED_DEPENDENCIES_EXT' specifies that
--     the subpass is not merged because subpass dependencies do not allow
--     merging.
--
-- -   'SUBPASS_MERGE_STATUS_NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT'
--     specifies that the subpass is not merged because input attachment is
--     not a color attachment from previous subpass or the formats are
--     incompatible.
--
-- -   'SUBPASS_MERGE_STATUS_NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT' specifies
--     that the subpass is not merged because of too many attachments.
--
-- -   'SUBPASS_MERGE_STATUS_NOT_MERGED_INSUFFICIENT_STORAGE_EXT' specifies
--     that the subpass is not merged because of insufficient memory.
--
-- -   'SUBPASS_MERGE_STATUS_NOT_MERGED_DEPTH_STENCIL_COUNT_EXT' specifies
--     that the subpass is not merged because of too many depth\/stencil
--     attachments.
--
-- -   'SUBPASS_MERGE_STATUS_NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT'
--     specifies that the subpass is not merged because a resolve
--     attachment is reused as an input attachment in a subsequent subpass.
--
-- -   'SUBPASS_MERGE_STATUS_NOT_MERGED_SINGLE_SUBPASS_EXT' specifies that
--     the subpass is not merged because the render pass has only one
--     subpass.
--
-- -   'SUBPASS_MERGE_STATUS_NOT_MERGED_UNSPECIFIED_EXT' specifies that the
--     subpass is not merged for unspecified reasons. Implementations
--     /should/ return this value when no other 'SubpassMergeStatusEXT'
--     value is appropriate.
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_subpass_merge_feedback VK_EXT_subpass_merge_feedback>,
-- 'RenderPassSubpassFeedbackInfoEXT'
newtype SubpassMergeStatusEXT = SubpassMergeStatusEXT Int32
  deriving newtype (Eq, Ord, Storable, Zero)

-- No documentation found for Nested "VkSubpassMergeStatusEXT" "VK_SUBPASS_MERGE_STATUS_MERGED_EXT"
pattern SUBPASS_MERGE_STATUS_MERGED_EXT = SubpassMergeStatusEXT 0

-- No documentation found for Nested "VkSubpassMergeStatusEXT" "VK_SUBPASS_MERGE_STATUS_DISALLOWED_EXT"
pattern SUBPASS_MERGE_STATUS_DISALLOWED_EXT = SubpassMergeStatusEXT 1

-- No documentation found for Nested "VkSubpassMergeStatusEXT" "VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SIDE_EFFECTS_EXT"
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_SIDE_EFFECTS_EXT = SubpassMergeStatusEXT 2

-- No documentation found for Nested "VkSubpassMergeStatusEXT" "VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SAMPLES_MISMATCH_EXT"
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_SAMPLES_MISMATCH_EXT = SubpassMergeStatusEXT 3

-- No documentation found for Nested "VkSubpassMergeStatusEXT" "VK_SUBPASS_MERGE_STATUS_NOT_MERGED_VIEWS_MISMATCH_EXT"
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_VIEWS_MISMATCH_EXT = SubpassMergeStatusEXT 4

-- No documentation found for Nested "VkSubpassMergeStatusEXT" "VK_SUBPASS_MERGE_STATUS_NOT_MERGED_ALIASING_EXT"
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_ALIASING_EXT = SubpassMergeStatusEXT 5

-- No documentation found for Nested "VkSubpassMergeStatusEXT" "VK_SUBPASS_MERGE_STATUS_NOT_MERGED_DEPENDENCIES_EXT"
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_DEPENDENCIES_EXT = SubpassMergeStatusEXT 6

-- No documentation found for Nested "VkSubpassMergeStatusEXT" "VK_SUBPASS_MERGE_STATUS_NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT"
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT = SubpassMergeStatusEXT 7

-- No documentation found for Nested "VkSubpassMergeStatusEXT" "VK_SUBPASS_MERGE_STATUS_NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT"
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT = SubpassMergeStatusEXT 8

-- No documentation found for Nested "VkSubpassMergeStatusEXT" "VK_SUBPASS_MERGE_STATUS_NOT_MERGED_INSUFFICIENT_STORAGE_EXT"
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_INSUFFICIENT_STORAGE_EXT = SubpassMergeStatusEXT 9

-- No documentation found for Nested "VkSubpassMergeStatusEXT" "VK_SUBPASS_MERGE_STATUS_NOT_MERGED_DEPTH_STENCIL_COUNT_EXT"
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_DEPTH_STENCIL_COUNT_EXT = SubpassMergeStatusEXT 10

-- No documentation found for Nested "VkSubpassMergeStatusEXT" "VK_SUBPASS_MERGE_STATUS_NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT"
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT = SubpassMergeStatusEXT 11

-- No documentation found for Nested "VkSubpassMergeStatusEXT" "VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SINGLE_SUBPASS_EXT"
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_SINGLE_SUBPASS_EXT = SubpassMergeStatusEXT 12

-- No documentation found for Nested "VkSubpassMergeStatusEXT" "VK_SUBPASS_MERGE_STATUS_NOT_MERGED_UNSPECIFIED_EXT"
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_UNSPECIFIED_EXT = SubpassMergeStatusEXT 13

{-# COMPLETE
  SUBPASS_MERGE_STATUS_MERGED_EXT
  , SUBPASS_MERGE_STATUS_DISALLOWED_EXT
  , SUBPASS_MERGE_STATUS_NOT_MERGED_SIDE_EFFECTS_EXT
  , SUBPASS_MERGE_STATUS_NOT_MERGED_SAMPLES_MISMATCH_EXT
  , SUBPASS_MERGE_STATUS_NOT_MERGED_VIEWS_MISMATCH_EXT
  , SUBPASS_MERGE_STATUS_NOT_MERGED_ALIASING_EXT
  , SUBPASS_MERGE_STATUS_NOT_MERGED_DEPENDENCIES_EXT
  , SUBPASS_MERGE_STATUS_NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT
  , SUBPASS_MERGE_STATUS_NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT
  , SUBPASS_MERGE_STATUS_NOT_MERGED_INSUFFICIENT_STORAGE_EXT
  , SUBPASS_MERGE_STATUS_NOT_MERGED_DEPTH_STENCIL_COUNT_EXT
  , SUBPASS_MERGE_STATUS_NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT
  , SUBPASS_MERGE_STATUS_NOT_MERGED_SINGLE_SUBPASS_EXT
  , SUBPASS_MERGE_STATUS_NOT_MERGED_UNSPECIFIED_EXT ::
    SubpassMergeStatusEXT
  #-}

conNameSubpassMergeStatusEXT :: String
conNameSubpassMergeStatusEXT = "SubpassMergeStatusEXT"

enumPrefixSubpassMergeStatusEXT :: String
enumPrefixSubpassMergeStatusEXT = "SUBPASS_MERGE_STATUS_"

showTableSubpassMergeStatusEXT :: [(SubpassMergeStatusEXT, String)]
showTableSubpassMergeStatusEXT =
  [
    ( SUBPASS_MERGE_STATUS_MERGED_EXT
    , "MERGED_EXT"
    )
  ,
    ( SUBPASS_MERGE_STATUS_DISALLOWED_EXT
    , "DISALLOWED_EXT"
    )
  ,
    ( SUBPASS_MERGE_STATUS_NOT_MERGED_SIDE_EFFECTS_EXT
    , "NOT_MERGED_SIDE_EFFECTS_EXT"
    )
  ,
    ( SUBPASS_MERGE_STATUS_NOT_MERGED_SAMPLES_MISMATCH_EXT
    , "NOT_MERGED_SAMPLES_MISMATCH_EXT"
    )
  ,
    ( SUBPASS_MERGE_STATUS_NOT_MERGED_VIEWS_MISMATCH_EXT
    , "NOT_MERGED_VIEWS_MISMATCH_EXT"
    )
  ,
    ( SUBPASS_MERGE_STATUS_NOT_MERGED_ALIASING_EXT
    , "NOT_MERGED_ALIASING_EXT"
    )
  ,
    ( SUBPASS_MERGE_STATUS_NOT_MERGED_DEPENDENCIES_EXT
    , "NOT_MERGED_DEPENDENCIES_EXT"
    )
  ,
    ( SUBPASS_MERGE_STATUS_NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT
    , "NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT"
    )
  ,
    ( SUBPASS_MERGE_STATUS_NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT
    , "NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT"
    )
  ,
    ( SUBPASS_MERGE_STATUS_NOT_MERGED_INSUFFICIENT_STORAGE_EXT
    , "NOT_MERGED_INSUFFICIENT_STORAGE_EXT"
    )
  ,
    ( SUBPASS_MERGE_STATUS_NOT_MERGED_DEPTH_STENCIL_COUNT_EXT
    , "NOT_MERGED_DEPTH_STENCIL_COUNT_EXT"
    )
  ,
    ( SUBPASS_MERGE_STATUS_NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT
    , "NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT"
    )
  ,
    ( SUBPASS_MERGE_STATUS_NOT_MERGED_SINGLE_SUBPASS_EXT
    , "NOT_MERGED_SINGLE_SUBPASS_EXT"
    )
  ,
    ( SUBPASS_MERGE_STATUS_NOT_MERGED_UNSPECIFIED_EXT
    , "NOT_MERGED_UNSPECIFIED_EXT"
    )
  ]

instance Show SubpassMergeStatusEXT where
  showsPrec =
    enumShowsPrec
      enumPrefixSubpassMergeStatusEXT
      showTableSubpassMergeStatusEXT
      conNameSubpassMergeStatusEXT
      (\(SubpassMergeStatusEXT x) -> x)
      (showsPrec 11)

instance Read SubpassMergeStatusEXT where
  readPrec =
    enumReadPrec
      enumPrefixSubpassMergeStatusEXT
      showTableSubpassMergeStatusEXT
      conNameSubpassMergeStatusEXT
      SubpassMergeStatusEXT

type EXT_SUBPASS_MERGE_FEEDBACK_SPEC_VERSION = 2

-- No documentation found for TopLevel "VK_EXT_SUBPASS_MERGE_FEEDBACK_SPEC_VERSION"
pattern EXT_SUBPASS_MERGE_FEEDBACK_SPEC_VERSION :: forall a . Integral a => a
pattern EXT_SUBPASS_MERGE_FEEDBACK_SPEC_VERSION = 2


type EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME = "VK_EXT_subpass_merge_feedback"

-- No documentation found for TopLevel "VK_EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME"
pattern EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME = "VK_EXT_subpass_merge_feedback"