packages feed

fir-0.1.0.0: src/SPIRV/Decoration.hs

{-# LANGUAGE AllowAmbiguousTypes   #-}
{-# LANGUAGE DataKinds             #-}
{-# LANGUAGE DerivingStrategies    #-}
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds             #-}
{-# LANGUAGE ScopedTypeVariables   #-}
{-# LANGUAGE TypeApplications      #-}
{-# LANGUAGE TypeFamilies          #-}
{-# LANGUAGE TypeOperators         #-}

{-|
Module: SPIRV.Decoration

This module enumerates SPIR-V decorations. Used both at the type-level and term-level.

See SPIR-V specification §3.20 __Decoration__.

In this library, decorations are usually provided as part of a top-level definition specifying an interface
for a SPIR-V module. See "FIR.Definition".

-}

module SPIRV.Decoration
  ( Decoration(..)
  , Decorations
  )
  where

-- base
import Data.Word
  ( Word32 )
import GHC.TypeLits
  ( Nat )

-- containers
import Data.Set
  ( Set )

-- fir
import Data.Binary.Class.Put
  ( Put(..) )
import Data.Type.Known
  ( Demotable(Demote), Known(known), knownValue )
import qualified SPIRV.Builtin as Builtin

--------------------------------------------------

data Decoration a
  = RelaxedPrecision
  | SpecId a
  | Block
  --   | BufferBlock -- deprecated
  | RowMajor
  | ColMajor
  | ArrayStride  a
  | MatrixStride a
  | GLSLShared
  | GLSLPacked
  | CPacked
  | Builtin Builtin.Builtin
  -- no 12
  | NoPerspective
  | Flat
  | Patch
  | Centroid
  | Sample
  | Invariant
  | Restrict
  | Aliased
  | Volatile
  | Constant
  | Coherent
  | NonWritable
  | NonReadable
  | DynamicallyUniform -- simply called 'Uniform' in the SPIR-V spec
  -- no 27
  | SaturatedConversion
  | Stream        a
  | Location      a
  | Component     a
  | Index         a
  | Binding       a
  | DescriptorSet a
  | Offset        a
  | XfbBuffer     a
  | XfbStride     a
  -- | FuncParamAttr Attribute
  -- | FPRoundingMode RoundingMode
  -- | FPFastMathMode FastMathMode
  -- | LinkageAttributes Word32 LinkageType
  | NoContraction
  | InputAttachmentIndex a
  | Alignment a
  deriving stock ( Show, Eq, Ord )

type Decorations = Set (Decoration Word32)

instance Put (Decoration Word32) where
  put RelaxedPrecision         = put @Word32  0
  put (SpecId i)               = put @Word32  1 *> put i
  put Block                    = put @Word32  2
  --put BufferBlock              = put @Word32  3
  put RowMajor                 = put @Word32  4
  put ColMajor                 = put @Word32  5
  put (ArrayStride  i)         = put @Word32  6 *> put i
  put (MatrixStride i)         = put @Word32  7 *> put i
  put GLSLShared               = put @Word32  8
  put GLSLPacked               = put @Word32  9
  put CPacked                  = put @Word32 10
  put (Builtin builtin)        = put @Word32 11 *> put builtin
  --
  put NoPerspective            = put @Word32 13
  put Flat                     = put @Word32 14
  put Patch                    = put @Word32 15
  put Centroid                 = put @Word32 16
  put Sample                   = put @Word32 17
  put Invariant                = put @Word32 18
  put Restrict                 = put @Word32 19
  put Aliased                  = put @Word32 20
  put Volatile                 = put @Word32 21
  put Constant                 = put @Word32 22
  put Coherent                 = put @Word32 23
  put NonWritable              = put @Word32 24
  put NonReadable              = put @Word32 25
  put DynamicallyUniform       = put @Word32 26
  --
  put SaturatedConversion      = put @Word32 28
  put (Stream               i) = put @Word32 29 *> put i
  put (Location             i) = put @Word32 30 *> put i
  put (Component            i) = put @Word32 31 *> put i
  put (Index                i) = put @Word32 32 *> put i
  put (Binding              i) = put @Word32 33 *> put i
  put (DescriptorSet        i) = put @Word32 34 *> put i
  put (Offset               i) = put @Word32 35 *> put i
  put (XfbBuffer            i) = put @Word32 36 *> put i
  put (XfbStride            i) = put @Word32 37 *> put i
  --
  --
  --
  --
  put NoContraction            = put @Word32 42
  put (InputAttachmentIndex i) = put @Word32 43 *> put i
  put (Alignment            i) = put @Word32 44 *> put i

  wordCount (SpecId               _) = 2
  wordCount (ArrayStride          _) = 2
  wordCount (MatrixStride         _) = 2
  wordCount (Builtin              _) = 2
  wordCount (Stream               _) = 2
  wordCount (Location             _) = 2
  wordCount (Component            _) = 2
  wordCount (Index                _) = 2
  wordCount (Binding              _) = 2
  wordCount (DescriptorSet        _) = 2
  wordCount (Offset               _) = 2
  wordCount (XfbBuffer            _) = 2
  wordCount (XfbStride            _) = 2
  wordCount (InputAttachmentIndex _) = 2
  wordCount (Alignment            _) = 2
  wordCount _ = 1

instance Demotable (Decoration Nat) where
  type Demote (Decoration Nat) = Decoration Word32

instance Known (Decoration Nat) RelaxedPrecision where
  known = RelaxedPrecision
instance Known Nat i => Known (Decoration Nat) (SpecId i) where
  known = SpecId ( knownValue @i )
instance Known (Decoration Nat) Block where
  known = Block
--instance Known (Decoration Nat) BufferBlock where
--  known = BufferBlock
instance Known (Decoration Nat) RowMajor where
  known = RowMajor
instance Known (Decoration Nat) ColMajor where
  known = ColMajor
instance Known Nat i => Known (Decoration Nat) (ArrayStride i) where
  known = ArrayStride ( knownValue @i )
instance Known Nat i => Known (Decoration Nat) (MatrixStride i) where
  known = MatrixStride ( knownValue @i )
instance Known (Decoration Nat) GLSLShared where
  known = GLSLShared
instance Known (Decoration Nat) GLSLPacked where
  known = GLSLPacked
instance Known (Decoration Nat) CPacked where
  known = CPacked
instance Known Builtin.Builtin builtin => Known (Decoration Nat) (Builtin builtin) where
  known = Builtin ( knownValue @builtin )
instance Known (Decoration Nat) NoPerspective where
  known = NoPerspective
instance Known (Decoration Nat) Flat where
  known = Flat
instance Known (Decoration Nat) Patch where
  known = Patch
instance Known (Decoration Nat) Centroid where
  known = Centroid
instance Known (Decoration Nat) Sample where
  known = Sample
instance Known (Decoration Nat) Invariant where
  known = Invariant
instance Known (Decoration Nat) Restrict where
  known = Restrict
instance Known (Decoration Nat) Aliased where
  known = Aliased
instance Known (Decoration Nat) Volatile where
  known = Volatile
instance Known (Decoration Nat) Constant where
  known = Constant
instance Known (Decoration Nat) Coherent where
  known = Coherent
instance Known (Decoration Nat) NonWritable where
  known = NonWritable
instance Known (Decoration Nat) NonReadable where
  known = NonReadable
instance Known (Decoration Nat) DynamicallyUniform where
  known = DynamicallyUniform
instance Known (Decoration Nat) SaturatedConversion where
  known = SaturatedConversion
instance Known Nat i => Known (Decoration Nat) (Stream i) where
  known = Stream ( knownValue @i )
instance Known Nat i => Known (Decoration Nat) (Location i) where
  known = Location ( knownValue @i )
instance Known Nat i => Known (Decoration Nat) (Component i) where
  known = Component ( knownValue @i )
instance Known Nat i => Known (Decoration Nat) (Index i) where
  known = Index ( knownValue @i )
instance Known Nat i => Known (Decoration Nat) (Binding i) where
  known = Binding ( knownValue @i )
instance Known Nat i => Known (Decoration Nat) (DescriptorSet i) where
  known = DescriptorSet ( knownValue @i )
instance Known Nat i => Known (Decoration Nat) (Offset i) where
  known = Offset ( knownValue @i )
instance Known Nat i => Known (Decoration Nat) (XfbBuffer i) where
  known = XfbBuffer ( knownValue @i )
instance Known Nat i => Known (Decoration Nat) (XfbStride i) where
  known = XfbStride ( knownValue @i )
instance Known (Decoration Nat) NoContraction where
  known = NoContraction
instance Known Nat i => Known (Decoration Nat) (InputAttachmentIndex i) where
  known = InputAttachmentIndex ( knownValue @i )
instance Known Nat i => Known (Decoration Nat) (Alignment i) where
  known = Alignment ( knownValue @i )