{-# language Strict #-}
{-# language CPP #-}
{-# language GeneralizedNewtypeDeriving #-}
{-# language PatternSynonyms #-}
{-# language DuplicateRecordFields #-}

module Graphics.Vulkan.Core11.Promoted_From_VK_KHR_subgroup
  ( VkSubgroupFeatureFlagBits(..)
  , pattern VK_SUBGROUP_FEATURE_BASIC_BIT
  , pattern VK_SUBGROUP_FEATURE_VOTE_BIT
  , pattern VK_SUBGROUP_FEATURE_ARITHMETIC_BIT
  , pattern VK_SUBGROUP_FEATURE_BALLOT_BIT
  , pattern VK_SUBGROUP_FEATURE_SHUFFLE_BIT
  , pattern VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT
  , pattern VK_SUBGROUP_FEATURE_CLUSTERED_BIT
  , pattern VK_SUBGROUP_FEATURE_QUAD_BIT
  , pattern VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES
  , VkPhysicalDeviceSubgroupProperties(..)
  , VkSubgroupFeatureFlags
  ) where

import Data.Bits
  ( Bits
  , FiniteBits
  )
import Data.Word
  ( Word32
  )
import Foreign.Ptr
  ( plusPtr
  , Ptr
  )
import Foreign.Storable
  ( Storable(..)
  , Storable
  )
import GHC.Read
  ( expectP
  , choose
  )
import Text.ParserCombinators.ReadPrec
  ( (+++)
  , prec
  , step
  )
import Text.Read
  ( Read(..)
  , parens
  )
import Text.Read.Lex
  ( Lexeme(Ident)
  )


import Graphics.Vulkan.Core10.Core
  ( VkBool32(..)
  , VkStructureType(..)
  , VkFlags
  )
import Graphics.Vulkan.Core10.PipelineLayout
  ( VkShaderStageFlags
  )


-- ** VkSubgroupFeatureFlagBits

-- | VkSubgroupFeatureFlagBits - Enum describing what subgroup operations are
-- supported
--
-- = See Also
--
-- 'VkSubgroupFeatureFlags'
newtype VkSubgroupFeatureFlagBits = VkSubgroupFeatureFlagBits VkFlags
  deriving (Eq, Ord, Storable, Bits, FiniteBits)

instance Show VkSubgroupFeatureFlagBits where
  showsPrec _ VK_SUBGROUP_FEATURE_BASIC_BIT = showString "VK_SUBGROUP_FEATURE_BASIC_BIT"
  showsPrec _ VK_SUBGROUP_FEATURE_VOTE_BIT = showString "VK_SUBGROUP_FEATURE_VOTE_BIT"
  showsPrec _ VK_SUBGROUP_FEATURE_ARITHMETIC_BIT = showString "VK_SUBGROUP_FEATURE_ARITHMETIC_BIT"
  showsPrec _ VK_SUBGROUP_FEATURE_BALLOT_BIT = showString "VK_SUBGROUP_FEATURE_BALLOT_BIT"
  showsPrec _ VK_SUBGROUP_FEATURE_SHUFFLE_BIT = showString "VK_SUBGROUP_FEATURE_SHUFFLE_BIT"
  showsPrec _ VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT = showString "VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT"
  showsPrec _ VK_SUBGROUP_FEATURE_CLUSTERED_BIT = showString "VK_SUBGROUP_FEATURE_CLUSTERED_BIT"
  showsPrec _ VK_SUBGROUP_FEATURE_QUAD_BIT = showString "VK_SUBGROUP_FEATURE_QUAD_BIT"
  -- The following values are from extensions, the patterns themselves are exported from the extension modules
  showsPrec _ (VkSubgroupFeatureFlagBits 0x00000100) = showString "VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV"
  showsPrec p (VkSubgroupFeatureFlagBits x) = showParen (p >= 11) (showString "VkSubgroupFeatureFlagBits " . showsPrec 11 x)

instance Read VkSubgroupFeatureFlagBits where
  readPrec = parens ( choose [ ("VK_SUBGROUP_FEATURE_BASIC_BIT",            pure VK_SUBGROUP_FEATURE_BASIC_BIT)
                             , ("VK_SUBGROUP_FEATURE_VOTE_BIT",             pure VK_SUBGROUP_FEATURE_VOTE_BIT)
                             , ("VK_SUBGROUP_FEATURE_ARITHMETIC_BIT",       pure VK_SUBGROUP_FEATURE_ARITHMETIC_BIT)
                             , ("VK_SUBGROUP_FEATURE_BALLOT_BIT",           pure VK_SUBGROUP_FEATURE_BALLOT_BIT)
                             , ("VK_SUBGROUP_FEATURE_SHUFFLE_BIT",          pure VK_SUBGROUP_FEATURE_SHUFFLE_BIT)
                             , ("VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT", pure VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT)
                             , ("VK_SUBGROUP_FEATURE_CLUSTERED_BIT",        pure VK_SUBGROUP_FEATURE_CLUSTERED_BIT)
                             , ("VK_SUBGROUP_FEATURE_QUAD_BIT",             pure VK_SUBGROUP_FEATURE_QUAD_BIT)
                             , -- The following values are from extensions, the patterns themselves are exported from the extension modules
                               ("VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV", pure (VkSubgroupFeatureFlagBits 0x00000100))
                             ] +++
                      prec 10 (do
                        expectP (Ident "VkSubgroupFeatureFlagBits")
                        v <- step readPrec
                        pure (VkSubgroupFeatureFlagBits v)
                        )
                    )

-- | @VK_SUBGROUP_FEATURE_BASIC_BIT@ specifies the device will accept SPIR-V
-- shader modules that contain the @GroupNonUniform@ capability.
pattern VK_SUBGROUP_FEATURE_BASIC_BIT :: VkSubgroupFeatureFlagBits
pattern VK_SUBGROUP_FEATURE_BASIC_BIT = VkSubgroupFeatureFlagBits 0x00000001

-- | @VK_SUBGROUP_FEATURE_VOTE_BIT@ specifies the device will accept SPIR-V
-- shader modules that contain the @GroupNonUniformVote@ capability.
pattern VK_SUBGROUP_FEATURE_VOTE_BIT :: VkSubgroupFeatureFlagBits
pattern VK_SUBGROUP_FEATURE_VOTE_BIT = VkSubgroupFeatureFlagBits 0x00000002

-- | @VK_SUBGROUP_FEATURE_ARITHMETIC_BIT@ specifies the device will accept
-- SPIR-V shader modules that contain the @GroupNonUniformArithmetic@
-- capability.
pattern VK_SUBGROUP_FEATURE_ARITHMETIC_BIT :: VkSubgroupFeatureFlagBits
pattern VK_SUBGROUP_FEATURE_ARITHMETIC_BIT = VkSubgroupFeatureFlagBits 0x00000004

-- | @VK_SUBGROUP_FEATURE_BALLOT_BIT@ specifies the device will accept SPIR-V
-- shader modules that contain the @GroupNonUniformBallot@ capability.
pattern VK_SUBGROUP_FEATURE_BALLOT_BIT :: VkSubgroupFeatureFlagBits
pattern VK_SUBGROUP_FEATURE_BALLOT_BIT = VkSubgroupFeatureFlagBits 0x00000008

-- | @VK_SUBGROUP_FEATURE_SHUFFLE_BIT@ specifies the device will accept
-- SPIR-V shader modules that contain the @GroupNonUniformShuffle@
-- capability.
pattern VK_SUBGROUP_FEATURE_SHUFFLE_BIT :: VkSubgroupFeatureFlagBits
pattern VK_SUBGROUP_FEATURE_SHUFFLE_BIT = VkSubgroupFeatureFlagBits 0x00000010

-- | @VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT@ specifies the device will
-- accept SPIR-V shader modules that contain the
-- @GroupNonUniformShuffleRelative@ capability.
pattern VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT :: VkSubgroupFeatureFlagBits
pattern VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT = VkSubgroupFeatureFlagBits 0x00000020

-- | @VK_SUBGROUP_FEATURE_CLUSTERED_BIT@ specifies the device will accept
-- SPIR-V shader modules that contain the @GroupNonUniformClustered@
-- capability.
pattern VK_SUBGROUP_FEATURE_CLUSTERED_BIT :: VkSubgroupFeatureFlagBits
pattern VK_SUBGROUP_FEATURE_CLUSTERED_BIT = VkSubgroupFeatureFlagBits 0x00000040

-- | @VK_SUBGROUP_FEATURE_QUAD_BIT@ specifies the device will accept SPIR-V
-- shader modules that contain the @GroupNonUniformQuad@ capability.
pattern VK_SUBGROUP_FEATURE_QUAD_BIT :: VkSubgroupFeatureFlagBits
pattern VK_SUBGROUP_FEATURE_QUAD_BIT = VkSubgroupFeatureFlagBits 0x00000080
-- No documentation found for Nested "VkStructureType" "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES"
pattern VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES :: VkStructureType
pattern VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES = VkStructureType 1000094000
-- | VkPhysicalDeviceSubgroupProperties - Structure describing subgroup
-- support for an implementation
--
-- = Members
--
-- The members of the @VkPhysicalDeviceSubgroupProperties@ structure
-- describe the following implementation-dependent limits:
--
-- = Description
--
-- -   @sType@ is the type of this structure.
--
-- -   @pNext@ is @NULL@ or a pointer to an extension-specific structure.
--
-- -   @subgroupSize@ is the number of invocations in each subgroup. This
--     will match any
--     [@SubgroupSize@](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#interfaces-builtin-variables-sgs)
--     decorated variable used in any shader module created on this device.
--     @subgroupSize@ is at least 1 if any of the physical device’s queues
--     support @VK_QUEUE_GRAPHICS_BIT@ or @VK_QUEUE_COMPUTE_BIT@.
--
-- -   @supportedStages@ is a bitfield of
--     'Graphics.Vulkan.Core10.Pipeline.VkShaderStageFlagBits' describing
--     the shader stages that subgroup operations are supported in.
--     @supportedStages@ will have the @VK_SHADER_STAGE_COMPUTE_BIT@ bit
--     set if any of any of the physical device’s queues support
--     @VK_QUEUE_COMPUTE_BIT@.
--
-- -   @supportedOperations@ is a bitmask of 'VkSubgroupFeatureFlagBits'
--     specifying the sets of subgroup operations supported on this device.
--     @supportedOperations@ will have the @VK_SUBGROUP_FEATURE_BASIC_BIT@
--     bit set if any of the physical device’s queues support
--     @VK_QUEUE_GRAPHICS_BIT@ or @VK_QUEUE_COMPUTE_BIT@.
--
-- -   @quadOperationsInAllStages@ is a boolean that specifies whether
--     [quad subgroup
--     operations](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#features-features-subgroup-quad)
--     are available in all stages, or are restricted to fragment and
--     compute stages.
--
-- == Valid Usage (Implicit)
--
-- -   @sType@ /must/ be
--     @VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES@
--
-- If the @VkPhysicalDeviceSubgroupProperties@ structure is included in the
-- @pNext@ chain of
-- 'Graphics.Vulkan.Core11.Promoted_from_VK_KHR_get_physical_device_properties2.VkPhysicalDeviceProperties2',
-- it is filled with the implementation-dependent limits.
--
-- = See Also
--
-- @VkBool32@, 'Graphics.Vulkan.Core10.PipelineLayout.VkShaderStageFlags',
-- 'Graphics.Vulkan.Core10.Core.VkStructureType', 'VkSubgroupFeatureFlags'
data VkPhysicalDeviceSubgroupProperties = VkPhysicalDeviceSubgroupProperties
  { -- No documentation found for Nested "VkPhysicalDeviceSubgroupProperties" "sType"
  vkSType :: VkStructureType
  , -- No documentation found for Nested "VkPhysicalDeviceSubgroupProperties" "pNext"
  vkPNext :: Ptr ()
  , -- No documentation found for Nested "VkPhysicalDeviceSubgroupProperties" "subgroupSize"
  vkSubgroupSize :: Word32
  , -- No documentation found for Nested "VkPhysicalDeviceSubgroupProperties" "supportedStages"
  vkSupportedStages :: VkShaderStageFlags
  , -- No documentation found for Nested "VkPhysicalDeviceSubgroupProperties" "supportedOperations"
  vkSupportedOperations :: VkSubgroupFeatureFlags
  , -- No documentation found for Nested "VkPhysicalDeviceSubgroupProperties" "quadOperationsInAllStages"
  vkQuadOperationsInAllStages :: VkBool32
  }
  deriving (Eq, Show)

instance Storable VkPhysicalDeviceSubgroupProperties where
  sizeOf ~_ = 32
  alignment ~_ = 8
  peek ptr = VkPhysicalDeviceSubgroupProperties <$> peek (ptr `plusPtr` 0)
                                                <*> peek (ptr `plusPtr` 8)
                                                <*> peek (ptr `plusPtr` 16)
                                                <*> peek (ptr `plusPtr` 20)
                                                <*> peek (ptr `plusPtr` 24)
                                                <*> peek (ptr `plusPtr` 28)
  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPhysicalDeviceSubgroupProperties))
                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPhysicalDeviceSubgroupProperties))
                *> poke (ptr `plusPtr` 16) (vkSubgroupSize (poked :: VkPhysicalDeviceSubgroupProperties))
                *> poke (ptr `plusPtr` 20) (vkSupportedStages (poked :: VkPhysicalDeviceSubgroupProperties))
                *> poke (ptr `plusPtr` 24) (vkSupportedOperations (poked :: VkPhysicalDeviceSubgroupProperties))
                *> poke (ptr `plusPtr` 28) (vkQuadOperationsInAllStages (poked :: VkPhysicalDeviceSubgroupProperties))
-- | VkSubgroupFeatureFlags - Bitmask of VkSubgroupFeatureFlagBits
--
-- = Description
--
-- @VkSubgroupFeatureFlags@ is a bitmask type for setting a mask of zero or
-- more 'VkSubgroupFeatureFlagBits'.
--
-- = See Also
--
-- 'VkPhysicalDeviceSubgroupProperties', 'VkSubgroupFeatureFlagBits'
type VkSubgroupFeatureFlags = VkSubgroupFeatureFlagBits