fir-0.1.0.0: src/SPIRV/Builtin.hs
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-|
Module: SPIRV.Builtin
Enumeration of SPIR-V built-in variables. Used both at the type-level and value-level.
See the SPIR-V specification, section 3.21 __BuiltIn__.
Refer to "FIR.BuiltIn" for usage in this library.
-}
module SPIRV.Builtin
( Builtin(..)
, readBuiltin
)
where
-- base
import Data.Word
( Word32 )
-- text-short
import Data.Text.Short
( ShortText )
-- fir
import Data.Binary.Class.Put
( Put(..) )
import Data.Type.Known
( Demotable(Demote), Known(known) )
--------------------------------------------------
data Builtin
= Position
| PointSize
--
| ClipDistance
| CullDistance
| VertexId
| InstanceId
| PrimitiveId
| InvocationId
| Layer
| ViewportIndex
| TessLevelOuter
| TessLevelInner
| TessCoord
| PatchVertices
| FragCoord
| PointCoord
| FrontFacing
| SampleId
| SamplePosition
| SampleMask
--
| FragDepth
| HelperInvocation
| NumWorkgroups
| WorkgroupSize
| WorkgroupId
| LocalInvocationId
| GlobalInvocationId
| LocalInvocationIndex
| WorkDim
| GlobalSize
| EnqueuedWorkgroupSize
| GlobalOffset
| GlobalLinearId
--
| SubgroupSize
| SubgroupMaxSize
| NumSubgroups
| NumEnqueuedSubgroups
| SubgroupId
| SubgroupLocalInvocationId
| VertexIndex
| InstanceIndex
--
| LaunchID
| LaunchSize
| WorldRayOrigin
| WorldRayDirection
| ObjectRayOrigin
| ObjectRayDirection
| RayTMin
| RayTMax
| InstanceCustomIndex
| ObjectToWorld
| WorldToObject
-- | HitT -- this only exists in the NV ray tracing extension, before it became an alias of RayTMax
| HitKind
| IncomingRayFlags
| RayGeometryIndex
deriving stock ( Show, Eq, Ord )
readBuiltin :: ShortText -> Maybe Builtin
readBuiltin "gl_Position" = Just Position
readBuiltin "gl_PointSize" = Just PointSize
readBuiltin "gl_ClipDistance" = Just ClipDistance
readBuiltin "gl_CullDistance" = Just CullDistance
readBuiltin "gl_VertexID" = Just VertexId
readBuiltin "gl_InstanceID" = Just InstanceId
readBuiltin "gl_PrimitiveID" = Just PrimitiveId
readBuiltin "gl_InvocationID" = Just InvocationId
readBuiltin "gl_Layer" = Just Layer
readBuiltin "gl_ViewportIndex" = Just ViewportIndex
readBuiltin "gl_TessLevelOuter" = Just TessLevelOuter
readBuiltin "gl_TessLevelInner" = Just TessLevelInner
readBuiltin "gl_TessCoord" = Just TessCoord
readBuiltin "gl_PatchVertices" = Just PatchVertices
readBuiltin "gl_FragCoord" = Just FragCoord
readBuiltin "gl_PointCoord" = Just PointCoord
readBuiltin "gl_FrontFacing" = Just FrontFacing
readBuiltin "gl_SampleID" = Just SampleId
readBuiltin "gl_SamplePosition" = Just SamplePosition
readBuiltin "gl_SampleMask" = Just SampleMask
readBuiltin "gl_FragDepth" = Just FragDepth
readBuiltin "gl_HelperInvocation" = Just HelperInvocation
readBuiltin "gl_NumWorkgroups" = Just NumWorkgroups
readBuiltin "gl_WorkgroupSize" = Just WorkgroupSize
readBuiltin "gl_WorkgroupID" = Just WorkgroupId
readBuiltin "gl_LocalInvocationID" = Just LocalInvocationId
readBuiltin "gl_GlobalInvocationID" = Just GlobalInvocationId
readBuiltin "gl_LocalInvocationIndex" = Just LocalInvocationIndex
readBuiltin "gl_WorkDim" = Just WorkDim
readBuiltin "gl_GlobalSize" = Just GlobalSize
readBuiltin "gl_EnqueuedWorkgroupSize" = Just EnqueuedWorkgroupSize
readBuiltin "gl_GlobalOffset" = Just GlobalOffset
readBuiltin "gl_GlobalLinearID" = Just GlobalLinearId
readBuiltin "gl_SubgroupSize" = Just SubgroupSize
readBuiltin "gl_SubgroupMaxSize" = Just SubgroupMaxSize
readBuiltin "gl_NumSubgroups" = Just NumSubgroups
readBuiltin "gl_NumEnqueuedSubgroups" = Just NumEnqueuedSubgroups
readBuiltin "gl_SubgroupID" = Just SubgroupId
readBuiltin "gl_SubgroupInvocationID" = Just SubgroupLocalInvocationId
readBuiltin "gl_VertexIndex" = Just VertexIndex
readBuiltin "gl_InstanceIndex" = Just InstanceIndex
readBuiltin "cl_WorkDim" = Just WorkDim
readBuiltin "cl_GlobalSize" = Just GlobalSize
readBuiltin "cl_GlobalInvocationID" = Just GlobalInvocationId
readBuiltin "cl_LocalInvocationID" = Just LocalInvocationId
readBuiltin "cl_NumWorkgroups" = Just NumWorkgroups
readBuiltin "cl_WorkgroupID" = Just WorkgroupId
readBuiltin "cl_GlobalOffset" = Just GlobalOffset
readBuiltin "cl_GlobalLinearID" = Just GlobalLinearId
readBuiltin "gl_LaunchID" = Just LaunchID
readBuiltin "gl_LaunchSize" = Just LaunchSize
readBuiltin "gl_WorldRayOrigin" = Just WorldRayOrigin
readBuiltin "gl_WorldRayDirection" = Just WorldRayDirection
readBuiltin "gl_ObjectRayOrigin" = Just ObjectRayOrigin
readBuiltin "gl_ObjectRayDirection" = Just ObjectRayDirection
readBuiltin "gl_RayTMin" = Just RayTMin
readBuiltin "gl_RayTMax" = Just RayTMax
readBuiltin "gl_InstanceCustomIndex" = Just InstanceCustomIndex
readBuiltin "gl_ObjectToWorld" = Just ObjectToWorld
readBuiltin "gl_WorldToObject" = Just WorldToObject
readBuiltin "gl_HitT" = Just RayTMax -- NOT "HitT" which only exists in the NV extension
readBuiltin "gl_HitKind" = Just HitKind
readBuiltin "gl_IncomingRayFlags" = Just IncomingRayFlags
readBuiltin "gl_RayGeometryIndex" = Just RayGeometryIndex
readBuiltin _ = Nothing
instance Put Builtin where
wordCount _ = 1
put Position = put @Word32 0
put PointSize = put @Word32 1
--
put ClipDistance = put @Word32 3
put CullDistance = put @Word32 4
put VertexId = put @Word32 5
put InstanceId = put @Word32 6
put PrimitiveId = put @Word32 7
put InvocationId = put @Word32 8
put Layer = put @Word32 9
put ViewportIndex = put @Word32 10
put TessLevelOuter = put @Word32 11
put TessLevelInner = put @Word32 12
put TessCoord = put @Word32 13
put PatchVertices = put @Word32 14
put FragCoord = put @Word32 15
put PointCoord = put @Word32 16
put FrontFacing = put @Word32 17
put SampleId = put @Word32 18
put SamplePosition = put @Word32 19
put SampleMask = put @Word32 20
--
put FragDepth = put @Word32 22
put HelperInvocation = put @Word32 23
put NumWorkgroups = put @Word32 24
put WorkgroupSize = put @Word32 25
put WorkgroupId = put @Word32 26
put LocalInvocationId = put @Word32 27
put GlobalInvocationId = put @Word32 28
put LocalInvocationIndex = put @Word32 29
put WorkDim = put @Word32 30
put GlobalSize = put @Word32 31
put EnqueuedWorkgroupSize = put @Word32 32
put GlobalOffset = put @Word32 33
put GlobalLinearId = put @Word32 34
--
put SubgroupSize = put @Word32 36
put SubgroupMaxSize = put @Word32 37
put NumSubgroups = put @Word32 38
put NumEnqueuedSubgroups = put @Word32 39
put SubgroupId = put @Word32 40
put SubgroupLocalInvocationId = put @Word32 41
put VertexIndex = put @Word32 42
put InstanceIndex = put @Word32 43
--
put LaunchID = put @Word32 5319
put LaunchSize = put @Word32 5320
put WorldRayOrigin = put @Word32 5321
put WorldRayDirection = put @Word32 5322
put ObjectRayOrigin = put @Word32 5323
put ObjectRayDirection = put @Word32 5324
put RayTMin = put @Word32 5325
put RayTMax = put @Word32 5326
put InstanceCustomIndex = put @Word32 5327
put ObjectToWorld = put @Word32 5330
put WorldToObject = put @Word32 5331
--put HitT = put @Word32 5332
put HitKind = put @Word32 5333
put IncomingRayFlags = put @Word32 5351
put RayGeometryIndex = put @Word32 5352
instance Demotable Builtin where
type Demote Builtin = Builtin
instance Known Builtin Position where
known = Position
instance Known Builtin PointSize where
known = PointSize
instance Known Builtin ClipDistance where
known = ClipDistance
instance Known Builtin CullDistance where
known = CullDistance
instance Known Builtin VertexId where
known = VertexId
instance Known Builtin InstanceId where
known = InstanceId
instance Known Builtin PrimitiveId where
known = PrimitiveId
instance Known Builtin InvocationId where
known = InvocationId
instance Known Builtin Layer where
known = Layer
instance Known Builtin ViewportIndex where
known = ViewportIndex
instance Known Builtin TessLevelOuter where
known = TessLevelOuter
instance Known Builtin TessLevelInner where
known = TessLevelInner
instance Known Builtin TessCoord where
known = TessCoord
instance Known Builtin PatchVertices where
known = PatchVertices
instance Known Builtin FragCoord where
known = FragCoord
instance Known Builtin PointCoord where
known = PointCoord
instance Known Builtin FrontFacing where
known = FrontFacing
instance Known Builtin SampleId where
known = SampleId
instance Known Builtin SamplePosition where
known = SamplePosition
instance Known Builtin SampleMask where
known = SampleMask
instance Known Builtin FragDepth where
known = FragDepth
instance Known Builtin HelperInvocation where
known = HelperInvocation
instance Known Builtin NumWorkgroups where
known = NumWorkgroups
instance Known Builtin WorkgroupSize where
known = WorkgroupSize
instance Known Builtin WorkgroupId where
known = WorkgroupId
instance Known Builtin LocalInvocationId where
known = LocalInvocationId
instance Known Builtin GlobalInvocationId where
known = GlobalInvocationId
instance Known Builtin LocalInvocationIndex where
known = LocalInvocationIndex
instance Known Builtin WorkDim where
known = WorkDim
instance Known Builtin GlobalSize where
known = GlobalSize
instance Known Builtin EnqueuedWorkgroupSize where
known = EnqueuedWorkgroupSize
instance Known Builtin GlobalOffset where
known = GlobalOffset
instance Known Builtin GlobalLinearId where
known = GlobalLinearId
instance Known Builtin SubgroupSize where
known = SubgroupSize
instance Known Builtin SubgroupMaxSize where
known = SubgroupMaxSize
instance Known Builtin NumSubgroups where
known = NumSubgroups
instance Known Builtin NumEnqueuedSubgroups where
known = NumEnqueuedSubgroups
instance Known Builtin SubgroupId where
known = SubgroupId
instance Known Builtin SubgroupLocalInvocationId where
known = SubgroupLocalInvocationId
instance Known Builtin VertexIndex where
known = VertexIndex
instance Known Builtin InstanceIndex where
known = InstanceIndex
instance Known Builtin LaunchID where
known = LaunchID
instance Known Builtin LaunchSize where
known = LaunchSize
instance Known Builtin WorldRayOrigin where
known = WorldRayOrigin
instance Known Builtin WorldRayDirection where
known = WorldRayDirection
instance Known Builtin ObjectRayOrigin where
known = ObjectRayOrigin
instance Known Builtin ObjectRayDirection where
known = ObjectRayDirection
instance Known Builtin RayTMin where
known = RayTMin
instance Known Builtin RayTMax where
known = RayTMax
instance Known Builtin InstanceCustomIndex where
known = InstanceCustomIndex
instance Known Builtin ObjectToWorld where
known = ObjectToWorld
instance Known Builtin WorldToObject where
known = WorldToObject
--instance Known Builtin HitT where
-- known = HitT
instance Known Builtin HitKind where
known = HitKind
instance Known Builtin IncomingRayFlags where
known = IncomingRayFlags
instance Known Builtin RayGeometryIndex where
known = RayGeometryIndex