content: module LambdaCube.Language.Sampler where
  
  import Data.Int
  
  import LambdaCube.Core.Type
  import LambdaCube.Language.ReifyType
  
  {-
  -- shadow samplers
  type Sampler1DShadow        = Sampler DIM1 Z Depth          Mip                         Shadow
  type Sampler2DShadow        = Sampler DIM2 Z Depth          Mip                         Shadow
  type SamplerCubeShadow      = Sampler DIM2 C Depth          Mip                 Array   Shadow
  type Sampler1DArrayShadow   = Sampler DIM1 A Depth          Mip                 Array   Shadow
  type Sampler2DArrayShadow   = Sampler DIM2 A Depth          Mip                 Array   Shadow
  type Sampler2DRectShadow    = Sampler Rect Z Depth          NoMip                       Shadow
  
  -- float,int,word samplers
  type Sampler1D              = Sampler DIM1 Z Float          Mip     Regular
  type Sampler2D              = Sampler DIM2 Z Float          Mip     Regular
  type Sampler3D              = Sampler DIM3 Z Float          Mip     Regular
  type SamplerCube            = Sampler DIM2 C Float          Mip     Regular     Array
  type Sampler1DArray         = Sampler DIM1 A Float          Mip     Regular     Array
  type Sampler2DArray         = Sampler DIM2 A Float          Mip     Regular     Array
  type Sampler2DRect          = Sampler Rect Z Float          NoMip   Regular
  
  type Sampler2DMS            = Sampler DIM2 Z FloatMS        NoMip                       -- from previous render pass only
  type Sampler2DMSArray       = Sampler DIM2 A FloatMS        NoMip               Array   -- from previous render pass only
  type SamplerBuffer          = Sampler DIM1 Z BufferFloat    NoMip
  -}
  
  type GSampler1D t ar        = Sampler Tex1D SingleTex t ar
  type GSampler2D t ar        = Sampler Tex2D SingleTex t ar
  type GSampler3D t ar        = Sampler Tex3D SingleTex t ar
  type GSamplerCube t ar      = Sampler Tex2D CubeTex t ar
  type GSampler1DArray t ar   = Sampler Tex1D ArrayTex t ar
  type GSampler2DArray t ar   = Sampler Tex2D ArrayTex t ar
  type GSampler2DRect t ar    = Sampler TexRect SingleTex t ar
  
  type family TexelRepr sampler
  type instance TexelRepr (Sampler dim arr (v t) Red)     = t
  type instance TexelRepr (Sampler dim arr (v t) RG)      = V2 t
  type instance TexelRepr (Sampler dim arr (v t) RGB)     = V3 t
  type instance TexelRepr (Sampler dim arr (v t) RGBA)    = V4 t
  
  -- shadow samplers
  type Sampler1DShadow        = GSampler1D        (Shadow Float) Red
  type Sampler2DShadow        = GSampler2D        (Shadow Float) Red
  type SamplerCubeShadow      = GSamplerCube      (Shadow Float) Red
  type Sampler1DArrayShadow   = GSampler1DArray   (Shadow Float) Red
  type Sampler2DArrayShadow   = GSampler2DArray   (Shadow Float) Red
  type Sampler2DRectShadow    = GSampler2DRect    (Shadow Float) Red
  
  -- float samplers
  type  Sampler1D t ar        = GSampler1D        (Regular t) ar
  type  Sampler2D t ar        = GSampler2D        (Regular t) ar
  type  Sampler3D t ar        = GSampler3D        (Regular t) ar
  type  SamplerCube t ar      = GSamplerCube      (Regular t) ar
  type  Sampler1DArray t ar   = GSampler1DArray   (Regular t) ar
  type  Sampler2DArray t ar   = GSampler2DArray   (Regular t) ar
  type  Sampler2DRect t ar    = GSampler2DRect    (Regular t) ar
  type  Sampler2DMS t ar      = GSampler2D        (MultiSample t) ar
  type  Sampler2DMSArray t ar = GSampler2DArray   (MultiSample t) ar
  type  SamplerBuffer t ar    = GSampler1D        (Buffer t) ar
  
  -- brute force
  -- arity problem: lod
  -- restriction: NONE
  class IsTextureSize sampler lod size | sampler -> lod size
  instance IsTextureSize  (Sampler1D t ar)           Int32   Int32
  instance IsTextureSize  (Sampler1DArray t ar)      Int32   V2I
  instance IsTextureSize  (Sampler2D t ar)           Int32   V2I
  instance IsTextureSize  (Sampler2DArray t ar)      Int32   V3I
  instance IsTextureSize  (Sampler2DMS t ar)         ()      V2I
  instance IsTextureSize  (Sampler2DMSArray t ar)    ()      V3I
  instance IsTextureSize  (Sampler2DRect t ar)       ()      V2I
  instance IsTextureSize  (Sampler3D t ar)           Int32   V3I
  instance IsTextureSize  (SamplerCube t ar)         Int32   V2I
  instance IsTextureSize  (SamplerBuffer t ar)       ()      Int32
  instance IsTextureSize  Sampler1DArrayShadow       Int32   V2I
  instance IsTextureSize  Sampler1DShadow            Int32   Int32
  instance IsTextureSize  Sampler2DArrayShadow       Int32   V3I
  instance IsTextureSize  Sampler2DRectShadow        ()      V2I
  instance IsTextureSize  Sampler2DShadow            Int32   V2I
  instance IsTextureSize  SamplerCubeShadow          Int32   V2I
  
  -- arity problem: bias
  -- restriction: Regular union Shadow
  class IsTexture sampler coord bias | sampler -> coord bias
  instance IsTexture  (Sampler1D t ar)               Float   Float
  instance IsTexture  (Sampler1DArray t ar)          V2F     Float
  instance IsTexture  (Sampler2D t ar)               V2F     Float
  instance IsTexture  (Sampler2DArray t ar)          V3F     Float
  instance IsTexture  (Sampler2DRect t ar)           V2F     ()   
  instance IsTexture  (Sampler3D t ar)               V3F     Float
  instance IsTexture  (SamplerCube t ar)             V3F     Float
  instance IsTexture  Sampler1DShadow                V3F     Float
  instance IsTexture  Sampler1DArrayShadow           V3F     Float
  instance IsTexture  Sampler2DShadow                V3F     Float
  instance IsTexture  Sampler2DArrayShadow           V4F     ()   
  instance IsTexture  Sampler2DRectShadow            V3F     ()   
  instance IsTexture  SamplerCubeShadow              V4F     Float
  
  -- arity problem: bias
  -- restriction: (Regular union Shadow) exclude Array
  class IsTextureProj sampler coord bias | sampler coord -> bias
  instance IsTextureProj  (Sampler1D t ar)           V2F     Float
  instance IsTextureProj  (Sampler1D t ar)           V4F     Float
  instance IsTextureProj  (Sampler2D t ar)           V3F     Float
  instance IsTextureProj  (Sampler2D t ar)           V4F     Float
  instance IsTextureProj  (Sampler2DRect t ar)       V3F     ()   
  instance IsTextureProj  (Sampler2DRect t ar)       V4F     ()   
  instance IsTextureProj  (Sampler3D t ar)           V4F     Float
  instance IsTextureProj  Sampler1DShadow            V4F     Float
  instance IsTextureProj  Sampler2DRectShadow        V4F     ()   
  instance IsTextureProj  Sampler2DShadow            V4F     Float
  
  -- arity ok
  -- restriction: ((Regular union Shadow) intersection Mip) exclude (2D Shadow Array)
  class IsTextureLod sampler coord lod | sampler -> coord lod
  instance IsTextureLod  (Sampler1D t ar)            Float   Float
  instance IsTextureLod  (Sampler1DArray t ar)       V2F     Float
  instance IsTextureLod  (Sampler2D t ar)            V2F     Float
  instance IsTextureLod  (Sampler2DArray t ar)       V3F     Float
  instance IsTextureLod  (Sampler3D t ar)            V3F     Float
  instance IsTextureLod  (SamplerCube t ar)          V3F     Float
  instance IsTextureLod  Sampler1DShadow             V3F     Float
  instance IsTextureLod  Sampler1DArrayShadow        V3F     Float
  instance IsTextureLod  Sampler2DShadow             V3F     Float
  
  -- arity problem: bias
  -- restriction: (Regular union Shadow) excluding (Cube, 2D Shadow Array)
  class IsTextureOffset sampler coord offset bias | sampler -> coord offset bias
  instance IsTextureOffset  (Sampler1D t ar)         Float   Int32   Float
  instance IsTextureOffset  (Sampler1DArray t ar)    V2F     Int32   Float
  instance IsTextureOffset  (Sampler2D t ar)         V2F     V2I     Float
  instance IsTextureOffset  (Sampler2DArray t ar)    V3F     V2I     Float
  instance IsTextureOffset  (Sampler2DRect t ar)     V2F     V2I     ()   
  instance IsTextureOffset  (Sampler3D t ar)         V3F     V3I     Float
  instance IsTextureOffset  Sampler1DShadow          V3F     Int32   Float
  instance IsTextureOffset  Sampler1DArrayShadow     V3F     Int32   Float
  instance IsTextureOffset  Sampler2DShadow          V3F     V2I     Float
  instance IsTextureOffset  Sampler2DRectShadow      V3F     V2I     ()   
  
  -- arity problem: lod, sample
  class IsTexelFetch sampler coord lod | sampler -> coord lod
  instance IsTexelFetch  (Sampler1D t ar)            Int32   Int32
  instance IsTexelFetch  (Sampler1DArray t ar)       V2I     Int32
  instance IsTexelFetch  (Sampler2D t ar)            V2I     Int32
  instance IsTexelFetch  (Sampler2DArray t ar)       V3I     Int32
  instance IsTexelFetch  (Sampler2DMS t ar)          V2I     Int32
  instance IsTexelFetch  (Sampler2DMSArray t ar)     V3I     Int32
  instance IsTexelFetch  (Sampler2DRect t ar)        V2I     ()   
  instance IsTexelFetch  (Sampler3D t ar)            V3I     Int32
  instance IsTexelFetch  (SamplerBuffer t ar)        Int32   ()   
  
  -- arity problem: lod
  class IsTexelFetchOffset sampler coord lod offset | sampler -> coord lod offset
  instance IsTexelFetchOffset  (Sampler1D t ar)      Int32   Int32   Int32
  instance IsTexelFetchOffset  (Sampler1DArray t ar) V2I     Int32   Int32
  instance IsTexelFetchOffset  (Sampler2D t ar)      V2I     Int32   V2I  
  instance IsTexelFetchOffset  (Sampler2DArray t ar) V3I     Int32   V2I  
  instance IsTexelFetchOffset  (Sampler2DRect t ar)  V2I     ()      V2I  
  instance IsTexelFetchOffset  (Sampler3D t ar)      V3I     Int32   V3I  
  
  -- arity problem: bias
  class IsTextureProjOffset sampler coord offset bias | sampler coord -> offset bias
  instance IsTextureProjOffset  (Sampler1D t ar)      V2F     Int32   Float
  instance IsTextureProjOffset  (Sampler1D t ar)      V4F     Int32   Float
  instance IsTextureProjOffset  (Sampler2D t ar)      V3F     V2I     Float
  instance IsTextureProjOffset  (Sampler2D t ar)      V4F     V2I     Float
  instance IsTextureProjOffset  (Sampler3D t ar)      V4F     V3I     Float
  instance IsTextureProjOffset  (Sampler2DRect t ar)  V3F     V2I     ()   
  instance IsTextureProjOffset  (Sampler2DRect t ar)  V4F     V2I     ()   
  instance IsTextureProjOffset  Sampler1DShadow       V4F     Int32   Float
  instance IsTextureProjOffset  Sampler2DShadow       V4F     V2I     Float
  instance IsTextureProjOffset  Sampler2DRectShadow   V4F     V2I     Float
  
  -- arity ok
  class IsTextureLodOffset sampler coord lod offset | sampler -> coord lod offset
  instance IsTextureLodOffset  (Sampler1D t ar)       Float   Float   Int32
  instance IsTextureLodOffset  (Sampler1DArray t ar)  V2F     Float   Int32
  instance IsTextureLodOffset  (Sampler2D t ar)       V2F     Float   V2I  
  instance IsTextureLodOffset  (Sampler2DArray t ar)  V3F     Float   V2I  
  instance IsTextureLodOffset  (Sampler3D t ar)       V3F     Float   V3I  
  instance IsTextureLodOffset  Sampler1DShadow        V3F     Float   Int32
  instance IsTextureLodOffset  Sampler1DArrayShadow   V3F     Float   Int32
  instance IsTextureLodOffset  Sampler2DShadow        V3F     Float   V2I  
  
  -- arity ok
  class IsTextureProjLod sampler coord lod | sampler coord -> lod
  instance IsTextureProjLod  (Sampler1D t ar)         V2F     Float
  instance IsTextureProjLod  (Sampler1D t ar)         V4F     Float
  instance IsTextureProjLod  (Sampler2D t ar)         V3F     Float
  instance IsTextureProjLod  (Sampler2D t ar)         V4F     Float
  instance IsTextureProjLod  (Sampler3D t ar)         V4F     Float
  instance IsTextureProjLod  Sampler1DShadow          V4F     Float
  instance IsTextureProjLod  Sampler2DShadow          V4F     Float
  
  -- arity ok
  class IsTextureProjLodOffset sampler coord lod offset | sampler coord -> lod offset
  instance IsTextureProjLodOffset  (Sampler1D t ar)   V2F     Float   Int32
  instance IsTextureProjLodOffset  (Sampler1D t ar)   V4F     Float   Int32
  instance IsTextureProjLodOffset  (Sampler2D t ar)   V3F     Float   V2I  
  instance IsTextureProjLodOffset  (Sampler2D t ar)   V4F     Float   V2I  
  instance IsTextureProjLodOffset  (Sampler3D t ar)   V4F     Float   V3I  
  instance IsTextureProjLodOffset  Sampler1DShadow    V4F     Float   Int32
  instance IsTextureProjLodOffset  Sampler2DShadow    V4F     Float   V2F  
  
  -- arity ok
  class IsTextureGrad sampler coord dx dy | sampler -> coord dx dy
  instance IsTextureGrad  (Sampler1D t ar)            Float   Float   Float
  instance IsTextureGrad  (Sampler1DArray t ar)       V2F     Float   Float
  instance IsTextureGrad  (Sampler2D t ar)            V2F     V2F     V2F  
  instance IsTextureGrad  (Sampler2DArray t ar)       V3F     V2F     V2F  
  instance IsTextureGrad  (Sampler2DRect t ar)        V2F     V2F     V2F  
  instance IsTextureGrad  (Sampler3D t ar)            V3F     V3F     V3F  
  instance IsTextureGrad  (SamplerCube t ar)          V3F     V3F     V3F  
  instance IsTextureGrad  Sampler1DArrayShadow        V3F     Float   Float
  instance IsTextureGrad  Sampler1DShadow             V3F     Float   Float
  instance IsTextureGrad  Sampler2DArrayShadow        V4F     V2F     V2F  
  instance IsTextureGrad  Sampler2DRectShadow         V3F     V2F     V2F  
  instance IsTextureGrad  Sampler2DShadow             V3F     V2F     V2F  
  instance IsTextureGrad  SamplerCubeShadow           V4F     V3F     V3F  
  
  -- arity ok
  class IsTextureGradOffset sampler coord dx dy offset | sampler -> coord dx dy offset
  instance IsTextureGradOffset  (Sampler1D t ar)      Float   Float   Float   Int32
  instance IsTextureGradOffset  (Sampler1DArray t ar) V2F     Float   Float   Int32
  instance IsTextureGradOffset  (Sampler2D t ar)      V2F     V2F     V2F     V2I  
  instance IsTextureGradOffset  (Sampler2DArray t ar) V3F     V2F     V2F     V2I  
  instance IsTextureGradOffset  (Sampler2DRect t ar)  V2F     V2F     V2F     V2I  
  instance IsTextureGradOffset  (Sampler3D t ar)      V3F     V3F     V3F     V3I  
  instance IsTextureGradOffset  Sampler1DArrayShadow  V3F     Float   Float   Int32
  instance IsTextureGradOffset  Sampler1DShadow       V3F     Float   Float   Int32
  instance IsTextureGradOffset  Sampler2DArrayShadow  V4F     V2F     V2F     V2I  
  instance IsTextureGradOffset  Sampler2DRectShadow   V3F     V2F     V2F     V2I  
  instance IsTextureGradOffset  Sampler2DShadow       V3F     V2F     V2F     V2I  
  
  -- arity ok
  class IsTextureProjGrad sampler coord dx dy | sampler coord -> dx dy
  instance IsTextureProjGrad  (Sampler1D t ar)        V2F     Float   Float
  instance IsTextureProjGrad  (Sampler1D t ar)        V4F     Float   Float
  instance IsTextureProjGrad  (Sampler2D t ar)        V3F     V2F     V2F  
  instance IsTextureProjGrad  (Sampler2D t ar)        V4F     V2F     V2F  
  instance IsTextureProjGrad  (Sampler2DRect t ar)    V3F     V2F     V2F  
  instance IsTextureProjGrad  (Sampler2DRect t ar)    V4F     V2F     V2F  
  instance IsTextureProjGrad  (Sampler3D t ar)        V4F     V3F     V3F  
  instance IsTextureProjGrad  Sampler1DShadow         V4F     Float   Float
  instance IsTextureProjGrad  Sampler2DRectShadow     V4F     V2F     V2F  
  instance IsTextureProjGrad  Sampler2DShadow         V4F     V2F     V2F  
  
  -- arity ok
  class IsTextureProjGradOffset sampler coord dx dy offset | sampler coord -> dx dy offset
  instance IsTextureProjGradOffset  (Sampler1D t ar)      V2F     Float   Float   Int32
  instance IsTextureProjGradOffset  (Sampler1D t ar)      V4F     Float   Float   Int32
  instance IsTextureProjGradOffset  (Sampler2D t ar)      V3F     V2F     V2F     V2I  
  instance IsTextureProjGradOffset  (Sampler2D t ar)      V4F     V2F     V2F     V2I  
  instance IsTextureProjGradOffset  (Sampler2DRect t ar)  V3F     V2F     V2F     V2I  
  instance IsTextureProjGradOffset  (Sampler2DRect t ar)  V4F     V2F     V2F     V2I  
  instance IsTextureProjGradOffset  (Sampler3D t ar)      V4F     V3F     V3F     V3I  
  instance IsTextureProjGradOffset  Sampler1DShadow       V4F     Float   Float   Int32
  instance IsTextureProjGradOffset  Sampler2DRectShadow   V4F     V2F     V2F     V2I  
  instance IsTextureProjGradOffset  Sampler2DShadow       V4F     V2F     V2F     V2I  
  