packages feed

vulkan-3.21: 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
--
-- [__Extension and Version Dependencies__]
--
--     -   Requires support for Vulkan 1.0
--
-- [__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
--
-- 'PhysicalDeviceSubpassMergeFeedbackFeaturesEXT',
-- 'RenderPassCreationControlEXT',
-- 'RenderPassCreationFeedbackCreateInfoEXT',
-- 'RenderPassCreationFeedbackInfoEXT',
-- 'RenderPassSubpassFeedbackCreateInfoEXT',
-- 'RenderPassSubpassFeedbackInfoEXT', 'SubpassMergeStatusEXT'
--
-- == Document Notes
--
-- For more information, see the
-- <https://registry.khronos.org/vulkan/specs/1.3-extensions/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.
--
-- == Valid Usage (Implicit)
--
-- = 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
--
-- == Valid Usage (Implicit)
--
-- = 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 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
--
-- == Valid Usage (Implicit)
--
-- = 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. 'PhysicalDeviceSubpassMergeFeedbackFeaturesEXT' /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_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
--
-- = 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)

-- | 'SUBPASS_MERGE_STATUS_MERGED_EXT' specifies the subpass is merged with a
-- previous subpass.
pattern SUBPASS_MERGE_STATUS_MERGED_EXT                              = SubpassMergeStatusEXT 0
-- | 'SUBPASS_MERGE_STATUS_DISALLOWED_EXT' specifies the subpass is
-- disallowed to merge with previous subpass. 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.
pattern SUBPASS_MERGE_STATUS_DISALLOWED_EXT                          = SubpassMergeStatusEXT 1
-- | 'SUBPASS_MERGE_STATUS_NOT_MERGED_SIDE_EFFECTS_EXT' specifies the subpass
-- is not merged because it contains side effects.
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_SIDE_EFFECTS_EXT             = SubpassMergeStatusEXT 2
-- | 'SUBPASS_MERGE_STATUS_NOT_MERGED_SAMPLES_MISMATCH_EXT' specifies the
-- subpass is not merged because sample count is not compatible with
-- previous subpass.
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_SAMPLES_MISMATCH_EXT         = SubpassMergeStatusEXT 3
-- | 'SUBPASS_MERGE_STATUS_NOT_MERGED_VIEWS_MISMATCH_EXT' specifies the
-- subpass is not merged because view masks do not match with previous
-- subpass.
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_VIEWS_MISMATCH_EXT           = SubpassMergeStatusEXT 4
-- | 'SUBPASS_MERGE_STATUS_NOT_MERGED_ALIASING_EXT' specifies the subpass is
-- not merged because of attachments aliasing between them.
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_ALIASING_EXT                 = SubpassMergeStatusEXT 5
-- | 'SUBPASS_MERGE_STATUS_NOT_MERGED_DEPENDENCIES_EXT' specifies the subpass
-- is not merged because subpass dependencies do not allow merging.
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_DEPENDENCIES_EXT             = SubpassMergeStatusEXT 6
-- | 'SUBPASS_MERGE_STATUS_NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT'
-- specifies the subpass is not merged because input attachment is not a
-- color attachment from previous subpass or the formats are incompatible.
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT = SubpassMergeStatusEXT 7
-- | 'SUBPASS_MERGE_STATUS_NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT' specifies the
-- subpass is not merged because of too many attachments.
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT     = SubpassMergeStatusEXT 8
-- | 'SUBPASS_MERGE_STATUS_NOT_MERGED_INSUFFICIENT_STORAGE_EXT' specifies the
-- subpass is not merged because of insufficient memory.
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_INSUFFICIENT_STORAGE_EXT     = SubpassMergeStatusEXT 9
-- | 'SUBPASS_MERGE_STATUS_NOT_MERGED_DEPTH_STENCIL_COUNT_EXT' specifies the
-- subpass is not merged because of too many depth\/stencil attachments.
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_DEPTH_STENCIL_COUNT_EXT      = SubpassMergeStatusEXT 10
-- | 'SUBPASS_MERGE_STATUS_NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT' specifies
-- the subpass is not merged because a resolve attachment is reused as an
-- input attachment in a subsequent subpass.
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT = SubpassMergeStatusEXT 11
-- | 'SUBPASS_MERGE_STATUS_NOT_MERGED_SINGLE_SUBPASS_EXT' specifies the
-- subpass is not merged because the render pass has only one subpass.
pattern SUBPASS_MERGE_STATUS_NOT_MERGED_SINGLE_SUBPASS_EXT           = SubpassMergeStatusEXT 12
-- | 'SUBPASS_MERGE_STATUS_NOT_MERGED_UNSPECIFIED_EXT' specifies other
-- reasons why subpass is not merged. It is also the recommended default
-- value that should be reported when a subpass is not merged and when no
-- other value is appropriate.
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"