diff options
| author | Yong He <yonghe@outlook.com> | 2025-01-17 14:37:27 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-17 14:37:27 -0800 |
| commit | fc77070fdc9bfa599e8d66b21743778de3011e53 (patch) | |
| tree | a9a0983bd704b0e760ae94d5330a74bc72f1154f /source | |
| parent | 3ff257816fc8f376d9bee76378a690757f8b5377 (diff) | |
Refactor _Texture to constrain on texel types. (#6115)
* Refactor _Texture to constrain on texel types.
* Fix tests.
* Fix.
* Disable glsl texture test because rhi can't run it correctly.
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/glsl.meta.slang | 513 | ||||
| -rw-r--r-- | source/slang/hlsl.meta.slang | 298 | ||||
| -rw-r--r-- | source/slang/slang-check-inheritance.cpp | 4 | ||||
| -rw-r--r-- | source/slang/slang-emit-cpp.cpp | 5 | ||||
| -rw-r--r-- | source/slang/slang-ir-peephole.cpp | 2 |
5 files changed, 461 insertions, 361 deletions
diff --git a/source/slang/glsl.meta.slang b/source/slang/glsl.meta.slang index ba26b5d84..1b44c7825 100644 --- a/source/slang/glsl.meta.slang +++ b/source/slang/glsl.meta.slang @@ -1354,6 +1354,9 @@ public vector<bool,N> not(vector<bool,N> x) return !x; } +__intrinsic_op(vectorReshape) +vector<T,N> __vectorReshape2<T, let N : int, U>(U vin); + // // Section 8.9.1. Texture Query Functions // @@ -1472,7 +1475,7 @@ public typealias sampler2DMSArray = Sampler2DMSArray<float4>; public typealias isampler2DMSArray = Sampler2DMSArray<int4>; public typealias usampler2DMSArray = Sampler2DMSArray<uint4>; -__generic<T=float4, let sampleCount:int=0, let format:int=0> +__generic<T:ITexelElement=float4, let sampleCount:int=0, let format:int=0> public typealias Sampler2DRect = _Texture<T, __Shape2D, 0, 0, sampleCount, 0, 0, 1, format>; public typealias sampler2DRect = Sampler2DRect<float4>; public typealias isampler2DRect = Sampler2DRect<int4>; @@ -1491,7 +1494,7 @@ public typealias sampler2DRectShadow = _Texture< format >; -__generic<T, let format:int=0> +__generic<T:ITexelElement, let format:int=0> public typealias SamplerBuffer = _Texture< T, __ShapeBuffer, @@ -1512,10 +1515,10 @@ public typealias usamplerBuffer = SamplerBuffer<uint4>; // textureSize // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_size)] -public int textureSize(Sampler1D<vector<T,N>> sampler, int lod) +public int textureSize(Sampler1D<T> sampler, int lod) { int result; int numberOfLevels; @@ -1523,10 +1526,10 @@ public int textureSize(Sampler1D<vector<T,N>> sampler, int lod) return result; } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_size)] -public ivec2 textureSize(Sampler2D<vector<T,N>> sampler, int lod) +public ivec2 textureSize(Sampler2D<T> sampler, int lod) { vector<int,2> result; int numberOfLevels; @@ -1534,10 +1537,10 @@ public ivec2 textureSize(Sampler2D<vector<T,N>> sampler, int lod) return result; } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_size)] -public ivec3 textureSize(Sampler3D<vector<T,N>> sampler, int lod) +public ivec3 textureSize(Sampler3D<T> sampler, int lod) { vector<int,3> result; int numberOfLevels; @@ -1545,10 +1548,10 @@ public ivec3 textureSize(Sampler3D<vector<T,N>> sampler, int lod) return result; } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_size)] -public ivec2 textureSize(SamplerCube<vector<T,N>> sampler, int lod) +public ivec2 textureSize(SamplerCube<T> sampler, int lod) { vector<int,2> result; int numberOfLevels; @@ -1587,9 +1590,9 @@ public ivec2 textureSize(samplerCubeShadow sampler, int lod) } [require(glsl_hlsl_spirv, texture_size)] -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] -public ivec3 textureSize(SamplerCubeArray<vector<T,N>> sampler, int lod) +public ivec3 textureSize(SamplerCubeArray<T> sampler, int lod) { vector<int,3> result; int numberOfLevels; @@ -1608,9 +1611,9 @@ public ivec3 textureSize(samplerCubeArrayShadow sampler, int lod) } [require(glsl_hlsl_spirv, texture_size)] -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] -public ivec2 textureSize(Sampler2DRect<vector<T,N>> sampler) +public ivec2 textureSize(Sampler2DRect<T> sampler) { vector<int,2> result; int numberOfLevels; @@ -1629,9 +1632,9 @@ public ivec2 textureSize(sampler2DRectShadow sampler) } [require(glsl_hlsl_spirv, texture_size)] -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] -public ivec2 textureSize(Sampler1DArray<vector<T,N>> sampler, int lod) +public ivec2 textureSize(Sampler1DArray<T> sampler, int lod) { vector<int,2> result; int numberOfLevels; @@ -1650,9 +1653,9 @@ public ivec2 textureSize(sampler1DArrayShadow sampler, int lod) } [require(glsl_hlsl_spirv, texture_size)] -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] -public ivec3 textureSize(Sampler2DArray<vector<T,N>> sampler, int lod) +public ivec3 textureSize(Sampler2DArray<T> sampler, int lod) { vector<int,3> result; int numberOfLevels; @@ -1671,9 +1674,9 @@ public ivec3 textureSize(sampler2DArrayShadow sampler, int lod) } [require(glsl_hlsl_spirv, texture_size)] -__generic<T:__BuiltinArithmeticType, let N:int, let format:int> +__generic<T:ITexelElement, let format:int> [ForceInline] -public int textureSize(SamplerBuffer<vector<T,N>,format> sampler) +public int textureSize(SamplerBuffer<T,format> sampler) { uint result; sampler.GetDimensions(result); @@ -1681,9 +1684,9 @@ public int textureSize(SamplerBuffer<vector<T,N>,format> sampler) } [require(glsl_hlsl_spirv, texture_size)] -__generic<T:__BuiltinArithmeticType, let N:int, let sampleCount:int> +__generic<T:ITexelElement, let sampleCount:int> [ForceInline] -public ivec2 textureSize(Sampler2DMS<vector<T,N>,sampleCount> sampler) +public ivec2 textureSize(Sampler2DMS<T,sampleCount> sampler) { vector<int,2> result; int sampleCount; @@ -1693,9 +1696,9 @@ public ivec2 textureSize(Sampler2DMS<vector<T,N>,sampleCount> sampler) } [require(glsl_hlsl_spirv, texture_size)] -__generic<T:__BuiltinArithmeticType, let N:int, let sampleCount:int> +__generic<T:ITexelElement, let sampleCount:int> [ForceInline] -public ivec3 textureSize(Sampler2DMSArray<vector<T,N>,sampleCount> sampler) +public ivec3 textureSize(Sampler2DMSArray<T,sampleCount> sampler) { vector<int,3> result; int sampleCount; @@ -1708,7 +1711,7 @@ public ivec3 textureSize(Sampler2DMSArray<vector<T,N>,sampleCount> sampler) // textureQueryLod // ------------------- -__generic<T, let isArray:int, let sampleCount:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, let isArray:int, let sampleCount:int, let isShadow:int, let format:int> [ForceInline] [require(glsl_hlsl_metal_spirv, texture_querylod)] public vec2 textureQueryLod(_Texture< @@ -1741,7 +1744,7 @@ public vec2 textureQueryLod(_Texture< } } -__generic<T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let isShadow:int, let format:int> [ForceInline] [require(glsl_hlsl_metal_spirv, texture_querylod)] public vec2 textureQueryLod(_Texture< @@ -1778,10 +1781,10 @@ public vec2 textureQueryLod(_Texture< // textureQueryLevels // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)] -public int textureQueryLevels(Sampler1D<vector<T,N>> sampler) +public int textureQueryLevels(Sampler1D<T> sampler) { int width; int numberOfLevels; @@ -1789,10 +1792,10 @@ public int textureQueryLevels(Sampler1D<vector<T,N>> sampler) return numberOfLevels; } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)] -public int textureQueryLevels(Sampler2D<vector<T,N>> sampler) +public int textureQueryLevels(Sampler2D<T> sampler) { vector<int,2> dim; int numberOfLevels; @@ -1800,10 +1803,10 @@ public int textureQueryLevels(Sampler2D<vector<T,N>> sampler) return numberOfLevels; } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)] -public int textureQueryLevels(Sampler3D<vector<T,N>> sampler) +public int textureQueryLevels(Sampler3D<T> sampler) { vector<int,3> dim; int numberOfLevels; @@ -1811,10 +1814,10 @@ public int textureQueryLevels(Sampler3D<vector<T,N>> sampler) return numberOfLevels; } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)] -public int textureQueryLevels(SamplerCube<vector<T,N>> sampler) +public int textureQueryLevels(SamplerCube<T> sampler) { vector<int,2> dim; int numberOfLevels; @@ -1822,10 +1825,10 @@ public int textureQueryLevels(SamplerCube<vector<T,N>> sampler) return numberOfLevels; } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)] -public int textureQueryLevels(Sampler1DArray<vector<T,N>> sampler) +public int textureQueryLevels(Sampler1DArray<T> sampler) { vector<int,2> dim; int numberOfLevels; @@ -1833,10 +1836,10 @@ public int textureQueryLevels(Sampler1DArray<vector<T,N>> sampler) return numberOfLevels; } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)] -public int textureQueryLevels(Sampler2DArray<vector<T,N>> sampler) +public int textureQueryLevels(Sampler2DArray<T> sampler) { vector<int,3> dim; int numberOfLevels; @@ -1844,10 +1847,10 @@ public int textureQueryLevels(Sampler2DArray<vector<T,N>> sampler) return numberOfLevels; } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)] -public int textureQueryLevels(SamplerCubeArray<vector<T,N>> sampler) +public int textureQueryLevels(SamplerCubeArray<T> sampler) { vector<int,3> dim; int numberOfLevels; @@ -1919,7 +1922,7 @@ public int textureQueryLevels(samplerCubeArrayShadow sampler) // textureSamples // ------------------- -__generic<T, let sampleCount:int> +__generic<T:ITexelElement, let sampleCount:int> [ForceInline] [require(glsl_hlsl_spirv, image_samples)] public int textureSamples(Sampler2DMS<T,sampleCount> sampler) @@ -1931,7 +1934,7 @@ public int textureSamples(Sampler2DMS<T,sampleCount> sampler) return sampleCount; } -__generic<T, let sampleCount:int> +__generic<T:ITexelElement, let sampleCount:int> [ForceInline] [require(glsl_hlsl_spirv, image_samples)] public int textureSamples(Sampler2DMSArray<T,sampleCount> sampler) @@ -1951,27 +1954,27 @@ public int textureSamples(Sampler2DMSArray<T,sampleCount> sampler) // texture // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_cuda_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> texture(Sampler1D<vector<T,N>> sampler, float p) +public vector<T.Element,4> texture(Sampler1D<T> sampler, float p) { - return __vectorReshape<4>(sampler.Sample(p)); + return __vectorReshape2<T.Element, 4>(sampler.Sample(p)); } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> texture(Sampler1D<vector<T,N>> sampler, float p, constexpr float bias) +public vector<T.Element,4> texture(Sampler1D<T> sampler, float p, constexpr float bias) { - return __vectorReshape<4>(sampler.SampleBias(p, bias)); + return __vectorReshape2<T.Element, 4>(sampler.SampleBias(p, bias)); } -__generic<T:__BuiltinArithmeticType, let N:int, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let format:int> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> texture(_Texture< - vector<T,N>, +public vector<T.Element,4> texture(_Texture< + T, Shape, isArray, 0, // isMS @@ -1982,14 +1985,14 @@ public vector<T,4> texture(_Texture< format > sampler, vector<float,Shape.dimensions+isArray> p) { - return __vectorReshape<4>(sampler.Sample(p)); + return __vectorReshape2<T.Element, 4>(sampler.Sample(p)); } -__generic<T:__BuiltinArithmeticType, let N:int, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let format:int> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> texture(_Texture< - vector<T,N>, +public vector<T.Element,4> texture(_Texture< + T, Shape, isArray, 0, // isMS @@ -2000,7 +2003,7 @@ public vector<T,4> texture(_Texture< format > sampler, vector<float,Shape.dimensions+isArray> p, constexpr float bias) { - return __vectorReshape<4>(sampler.SampleBias(p, bias)); + return __vectorReshape2<T.Element,4>(sampler.SampleBias(p, bias)); } [ForceInline] @@ -2137,170 +2140,170 @@ public float texture(samplerCubeArrayShadow sampler, vec4 p, float compare) // textureProj // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProj(Sampler1D<vector<T,N>> sampler, vec2 p) +public vector<T.Element,4> textureProj(Sampler1D<T> sampler, vec2 p) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProj"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p }; default: return texture(sampler, p.x / p.y); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProj(Sampler1D<vector<T,N>> sampler, vec2 p, float bias) +public vector<T.Element,4> textureProj(Sampler1D<T> sampler, vec2 p, float bias) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProj"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p Bias $bias + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p Bias $bias }; default: return texture(sampler, p.x / p.y, bias); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProj(Sampler1D<vector<T,N>> sampler, vec4 p) +public vector<T.Element,4> textureProj(Sampler1D<T> sampler, vec4 p) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProj"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p }; default: return texture(sampler, p.x / p.w); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProj(Sampler1D<vector<T,N>> sampler, vec4 p, float bias) +public vector<T.Element,4> textureProj(Sampler1D<T> sampler, vec4 p, float bias) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProj"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p Bias $bias + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p Bias $bias }; default: return texture(sampler, p.x / p.w, bias); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProj(Sampler2D<vector<T,N>> sampler, vec3 p) +public vector<T.Element,4> textureProj(Sampler2D<T> sampler, vec3 p) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProj"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p }; default: return texture(sampler, p.xy / p.z); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProj(Sampler2D<vector<T,N>> sampler, vec3 p, float bias) +public vector<T.Element,4> textureProj(Sampler2D<T> sampler, vec3 p, float bias) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProj"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p Bias $bias + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p Bias $bias }; default: return texture(sampler, p.xy / p.z, bias); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProj(Sampler2D<vector<T,N>> sampler, vec4 p) +public vector<T.Element,4> textureProj(Sampler2D<T> sampler, vec4 p) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProj"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p }; default: return texture(sampler, p.xy / p.w); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProj(Sampler2D<vector<T,N>> sampler, vec4 p, float bias) +public vector<T.Element,4> textureProj(Sampler2D<T> sampler, vec4 p, float bias) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProj"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p Bias $bias + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p Bias $bias }; default: return texture(sampler, p.xy / p.w, bias); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProj(Sampler3D<vector<T,N>> sampler, vec4 p) +public vector<T.Element,4> textureProj(Sampler3D<T> sampler, vec4 p) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProj"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p }; default: return texture(sampler, p.xyz / p.w); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProj(Sampler3D<vector<T,N>> sampler, vec4 p, float bias) +public vector<T.Element,4> textureProj(Sampler3D<T> sampler, vec4 p, float bias) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProj"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p Bias $bias + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p Bias $bias }; default: return texture(sampler, p.xyz / p.w, bias); @@ -2395,19 +2398,19 @@ public float textureProj(sampler2DShadow sampler, vec4 p, float bias) // textureLod // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_cuda_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureLod(Sampler1D<vector<T,N>> sampler, float p, float lod) +public vector<T.Element,4> textureLod(Sampler1D<T> sampler, float p, float lod) { - return __vectorReshape<4>(sampler.SampleLevel(p, lod)); + return __vectorReshape2<T.Element,4>(sampler.SampleLevel(p, lod)); } -__generic<T:__BuiltinArithmeticType, let N:int, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let format:int> [ForceInline] [require(cpp_cuda_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureLod(_Texture< - vector<T,N>, +public vector<T.Element,4> textureLod(_Texture< + T, Shape, isArray, 0, // isMS @@ -2418,7 +2421,7 @@ public vector<T,4> textureLod(_Texture< format > sampler, vector<float,Shape.dimensions+isArray> p, float lod) { - return __vectorReshape<4>(sampler.SampleLevel(p, lod)); + return __vectorReshape2<T.Element,4>(sampler.SampleLevel(p, lod)); } [ForceInline] @@ -2501,28 +2504,28 @@ public float textureLod(sampler1DArrayShadow sampler, vec3 p, float lod) // textureOffset // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureOffset(Sampler1D<vector<T,N>> sampler, float p, constexpr int offset, float bias = 0.0) +public vector<T.Element,4> textureOffset(Sampler1D<T> sampler, float p, constexpr int offset, float bias = 0.0) { - return __vectorReshape<4>(sampler.SampleBias(p, bias, offset)); + return __vectorReshape2<T.Element,4>(sampler.SampleBias(p, bias, offset)); } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureOffset(Sampler2D<vector<T,N>> sampler, vec2 p, constexpr ivec2 offset, float bias = 0.0) +public vector<T.Element,4> textureOffset(Sampler2D<T> sampler, vec2 p, constexpr ivec2 offset, float bias = 0.0) { - return __vectorReshape<4>(sampler.SampleBias(p, bias, offset)); + return __vectorReshape2<T.Element,4>(sampler.SampleBias(p, bias, offset)); } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureOffset(Sampler3D<vector<T,N>> sampler, vec3 p, constexpr ivec3 offset, float bias = 0.0) +public vector<T.Element,4> textureOffset(Sampler3D<T> sampler, vec3 p, constexpr ivec3 offset, float bias = 0.0) { - return __vectorReshape<4>(sampler.SampleBias(p, bias, offset)); + return __vectorReshape2<T.Element,4>(sampler.SampleBias(p, bias, offset)); } [ForceInline] @@ -2591,20 +2594,20 @@ public float textureOffset(sampler1DShadow sampler, vec3 p, constexpr int offset } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureOffset(Sampler1DArray<vector<T,N>> sampler, vec2 p, constexpr int offset, float bias = 0.0) +public vector<T.Element,4> textureOffset(Sampler1DArray<T> sampler, vec2 p, constexpr int offset, float bias = 0.0) { - return __vectorReshape<4>(sampler.SampleBias(p, bias, offset)); + return __vectorReshape2<T.Element,4>(sampler.SampleBias(p, bias, offset)); } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureOffset(Sampler2DArray<vector<T,N>> sampler, vec3 p, constexpr ivec2 offset, float bias = 0.0) +public vector<T.Element,4> textureOffset(Sampler2DArray<T> sampler, vec3 p, constexpr ivec2 offset, float bias = 0.0) { - return __vectorReshape<4>(sampler.SampleBias(p, bias, offset)); + return __vectorReshape2<T.Element,4>(sampler.SampleBias(p, bias, offset)); } [ForceInline] @@ -2662,19 +2665,19 @@ public float textureOffset(sampler2DArrayShadow sampler, vec4 p, constexpr ivec2 // texelFetch // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1_samplerless)] -public vector<T,4> texelFetch(Sampler1D<vector<T,N>> sampler, int p, int lod) +public vector<T.Element,4> texelFetch(Sampler1D<T> sampler, int p, int lod) { - return __vectorReshape<4>(sampler.Load(int2(p, lod))); + return __vectorReshape2<T.Element,4>(sampler.Load(int2(p, lod))); } -__generic<T:__BuiltinArithmeticType, let N:int, Shape:__ITextureShape, let isArray:int, let sampleCount:int, let format:int> +__generic<T:ITexelElement, Shape:__ITextureShape, let isArray:int, let sampleCount:int, let format:int> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1_samplerless)] -public vector<T,4> texelFetch(_Texture< - vector<T,N>, +public vector<T.Element,4> texelFetch(_Texture< + T, Shape, isArray, 0, // isMS @@ -2685,30 +2688,30 @@ public vector<T,4> texelFetch(_Texture< format > sampler, vector<int,Shape.dimensions+isArray> p, int lod) { - return __vectorReshape<4>(sampler.Load(__makeVector(p,lod))); + return __vectorReshape2<T.Element,4>(sampler.Load(__makeVector(p,lod))); } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1_samplerless)] -public vector<T,4> texelFetch(Sampler2DRect<vector<T,N>> sampler, ivec2 p) +public vector<T.Element,4> texelFetch(Sampler2DRect<T> sampler, ivec2 p) { - return __vectorReshape<4>(sampler.Load(int3(p.xy,0))); + return __vectorReshape2<T.Element,4>(sampler.Load(int3(p.xy,0))); } -__generic<T:__BuiltinArithmeticType, let N:int, let format:int> +__generic<T:ITexelElement, let format:int> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_1_samplerless)] -public vector<T,4> texelFetch(SamplerBuffer<vector<T,N>,format> sampler, int p) +public vector<T.Element,4> texelFetch(SamplerBuffer<T,format> sampler, int p) { - return __vectorReshape<4>(sampler.Load(p)); + return __vectorReshape2<T.Element,4>(sampler.Load(p)); } -__generic<T:__BuiltinArithmeticType, let N:int, let isArray:int, let sampleCount:int, let format:int> +__generic<T:ITexelElement, let isArray:int, let sampleCount:int, let format:int> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1_samplerless)] -public vector<T,4> texelFetch(_Texture< - vector<T,N>, +public vector<T.Element,4> texelFetch(_Texture< + T, __Shape2D, isArray, 1, // isMS @@ -2724,7 +2727,7 @@ public vector<T,4> texelFetch(_Texture< case glsl: __intrinsic_asm "texelFetch"; default: // TODO: Need to apply lod - return __vectorReshape<4>(sampler.Load(__makeVector(p, 0))); + return __vectorReshape2<T.Element,4>(sampler.Load(__makeVector(p, 0))); } } @@ -2732,19 +2735,19 @@ public vector<T,4> texelFetch(_Texture< // texelFetchOffset // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1_samplerless)] -public vector<T,4> texelFetchOffset(Sampler1D<vector<T,N>> sampler, int p, int lod, constexpr int offset) +public vector<T.Element,4> texelFetchOffset(Sampler1D<T> sampler, int p, int lod, constexpr int offset) { - return __vectorReshape<4>(sampler.Load(int2(p, lod), offset)); + return __vectorReshape2<T.Element,4>(sampler.Load(int2(p, lod), offset)); } -__generic<T:__BuiltinArithmeticType, let N:int, Shape:__ITextureShape, let isArray:int, let sampleCount:int, let format:int> +__generic<T:ITexelElement, Shape:__ITextureShape, let isArray:int, let sampleCount:int, let format:int> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1_samplerless)] -public vector<T,4> texelFetchOffset(_Texture< - vector<T,N>, +public vector<T.Element,4> texelFetchOffset(_Texture< + T, Shape, isArray, 0, // isMS @@ -2755,59 +2758,59 @@ public vector<T,4> texelFetchOffset(_Texture< format > sampler, vector<int,Shape.dimensions+isArray> p, int lod, constexpr vector<int,Shape.planeDimensions> offset) { - return __vectorReshape<4>(sampler.Load(__makeVector(p,lod), offset)); + return __vectorReshape2<T.Element,4>(sampler.Load(__makeVector(p,lod), offset)); } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1_samplerless)] -public vector<T,4> texelFetchOffset(Sampler2DRect<vector<T,N>> sampler, ivec2 p, constexpr ivec2 offset) +public vector<T.Element,4> texelFetchOffset(Sampler2DRect<T> sampler, ivec2 p, constexpr ivec2 offset) { - return __vectorReshape<4>(sampler.Load(__makeVector(p, 0), offset)); + return __vectorReshape2<T.Element,4>(sampler.Load(__makeVector(p, 0), offset)); } // ------------------- // textureProjOffset // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjOffset(Sampler1D<vector<T,N>> sampler, vec2 p, constexpr int offset) +public vector<T.Element,4> textureProjOffset(Sampler1D<T> sampler, vec2 p, constexpr int offset) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProjOffset"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p ConstOffset $offset + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p ConstOffset $offset }; default: return textureOffset(sampler, p.x / p.y, offset); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjOffset(Sampler1D<vector<T,N>> sampler, vec2 p, constexpr int offset, float bias) +public vector<T.Element,4> textureProjOffset(Sampler1D<T> sampler, vec2 p, constexpr int offset, float bias) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProjOffset"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p Bias|ConstOffset $bias $offset + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p Bias|ConstOffset $bias $offset }; default: return textureOffset(sampler, p.x / p.y, offset, bias); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjOffset(Sampler1D<vector<T,N>> sampler, vec4 p, constexpr int offset) +public vector<T.Element,4> textureProjOffset(Sampler1D<T> sampler, vec4 p, constexpr int offset) { __requireComputeDerivative(); __target_switch @@ -2817,7 +2820,7 @@ public vector<T,4> textureProjOffset(Sampler1D<vector<T,N>> sampler, vec4 p, con { vec4 xw__ = p.xwww; return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $xw__ ConstOffset $offset + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $xw__ ConstOffset $offset }; } default: @@ -2825,10 +2828,10 @@ public vector<T,4> textureProjOffset(Sampler1D<vector<T,N>> sampler, vec4 p, con } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjOffset(Sampler1D<vector<T,N>> sampler, vec4 p, constexpr int offset, float bias) +public vector<T.Element,4> textureProjOffset(Sampler1D<T> sampler, vec4 p, constexpr int offset, float bias) { __requireComputeDerivative(); __target_switch @@ -2838,7 +2841,7 @@ public vector<T,4> textureProjOffset(Sampler1D<vector<T,N>> sampler, vec4 p, con { vec4 xw__ = p.xwww; return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $xw__ Bias|ConstOffset $bias $offset + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $xw__ Bias|ConstOffset $bias $offset }; } default: @@ -2846,44 +2849,44 @@ public vector<T,4> textureProjOffset(Sampler1D<vector<T,N>> sampler, vec4 p, con } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjOffset(Sampler2D<vector<T,N>> sampler, vec3 p, constexpr ivec2 offset) +public vector<T.Element,4> textureProjOffset(Sampler2D<T> sampler, vec3 p, constexpr ivec2 offset) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProjOffset"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p ConstOffset $offset + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p ConstOffset $offset }; default: return textureOffset(sampler, p.xy / p.z, offset); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjOffset(Sampler2D<vector<T,N>> sampler, vec3 p, constexpr ivec2 offset, float bias) +public vector<T.Element,4> textureProjOffset(Sampler2D<T> sampler, vec3 p, constexpr ivec2 offset, float bias) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProjOffset"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p Bias|ConstOffset $bias $offset + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p Bias|ConstOffset $bias $offset }; default: return textureOffset(sampler, p.xy / p.z, offset, bias); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjOffset(Sampler2D<vector<T,N>> sampler, vec4 p, constexpr ivec2 offset) +public vector<T.Element,4> textureProjOffset(Sampler2D<T> sampler, vec4 p, constexpr ivec2 offset) { __requireComputeDerivative(); __target_switch @@ -2893,7 +2896,7 @@ public vector<T,4> textureProjOffset(Sampler2D<vector<T,N>> sampler, vec4 p, con { vec4 xyw__ = p.xyww; return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $xyw__ ConstOffset $offset + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $xyw__ ConstOffset $offset }; } default: @@ -2901,10 +2904,10 @@ public vector<T,4> textureProjOffset(Sampler2D<vector<T,N>> sampler, vec4 p, con } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjOffset(Sampler2D<vector<T,N>> sampler, vec4 p, constexpr ivec2 offset, float bias) +public vector<T.Element,4> textureProjOffset(Sampler2D<T> sampler, vec4 p, constexpr ivec2 offset, float bias) { __requireComputeDerivative(); __target_switch @@ -2914,7 +2917,7 @@ public vector<T,4> textureProjOffset(Sampler2D<vector<T,N>> sampler, vec4 p, con { vec4 xyw_ = p.xyww; return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $xyw_ Bias|ConstOffset $bias $offset + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $xyw_ Bias|ConstOffset $bias $offset }; } default: @@ -2922,34 +2925,34 @@ public vector<T,4> textureProjOffset(Sampler2D<vector<T,N>> sampler, vec4 p, con } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjOffset(Sampler3D<vector<T,N>> sampler, vec4 p, constexpr ivec3 offset) +public vector<T.Element,4> textureProjOffset(Sampler3D<T> sampler, vec4 p, constexpr ivec3 offset) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProjOffset"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p ConstOffset $offset + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p ConstOffset $offset }; default: return textureOffset(sampler, p.xyz / p.w, offset); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjOffset(Sampler3D<vector<T,N>> sampler, vec4 p, constexpr ivec3 offset, float bias) +public vector<T.Element,4> textureProjOffset(Sampler3D<T> sampler, vec4 p, constexpr ivec3 offset, float bias) { __requireComputeDerivative(); __target_switch { case glsl: __intrinsic_asm "textureProjOffset"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjImplicitLod $sampler $p Bias|ConstOffset $bias $offset + result:$$vector<T.Element,4> = OpImageSampleProjImplicitLod $sampler $p Bias|ConstOffset $bias $offset }; default: return textureOffset(sampler, p.xyz / p.w, offset, bias); @@ -3044,19 +3047,19 @@ public float textureProjOffset(sampler2DShadow sampler, vec4 p, constexpr ivec2 // textureLodOffset // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0)] -public vector<T,4> textureLodOffset(Sampler1D<vector<T,N>> sampler, float p, float lod, constexpr int offset) +public vector<T.Element,4> textureLodOffset(Sampler1D<T> sampler, float p, float lod, constexpr int offset) { - return __vectorReshape<4>(sampler.SampleLevel(p, lod, offset)); + return __vectorReshape2<T.Element,4>(sampler.SampleLevel(p, lod, offset)); } -__generic<T:__BuiltinArithmeticType, let N:int, Shape:__ITextureShape, let isArray:int, let sampleCount:int, let format:int> +__generic<T:ITexelElement, Shape:__ITextureShape, let isArray:int, let sampleCount:int, let format:int> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_0)] -public vector<T,4> textureLodOffset(_Texture< - vector<T,N>, +public vector<T.Element,4> textureLodOffset(_Texture< + T, Shape, isArray, 0, // isMS @@ -3067,7 +3070,7 @@ public vector<T,4> textureLodOffset(_Texture< format > sampler, vector<float,Shape.dimensions+isArray> p, float lod, constexpr vector<int,Shape.planeDimensions> offset) { - return __vectorReshape<4>(sampler.SampleLevel(p, lod, offset)); + return __vectorReshape2<T.Element,4>(sampler.SampleLevel(p, lod, offset)); } [ForceInline] @@ -3134,26 +3137,26 @@ public float textureLodOffset(sampler1DArrayShadow sampler, vec3 p, float lod, c // textureProjLod // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_cuda_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjLod(Sampler1D<vector<T,N>> sampler, vec2 p, float lod) +public vector<T.Element,4> textureProjLod(Sampler1D<T> sampler, vec2 p, float lod) { __target_switch { case glsl: __intrinsic_asm "textureProjLod"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $p Lod $lod + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $p Lod $lod }; default: return textureLod(sampler, p.x / p.y, lod); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_cuda_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjLod(Sampler1D<vector<T,N>> sampler, vec4 p, float lod) +public vector<T.Element,4> textureProjLod(Sampler1D<T> sampler, vec4 p, float lod) { __target_switch { @@ -3162,7 +3165,7 @@ public vector<T,4> textureProjLod(Sampler1D<vector<T,N>> sampler, vec4 p, float { vec4 xw__ = p.xwww; return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $xw__ Lod $lod + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $xw__ Lod $lod }; } default: @@ -3170,26 +3173,26 @@ public vector<T,4> textureProjLod(Sampler1D<vector<T,N>> sampler, vec4 p, float } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_cuda_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjLod(Sampler2D<vector<T,N>> sampler, vec3 p, float lod) +public vector<T.Element,4> textureProjLod(Sampler2D<T> sampler, vec3 p, float lod) { __target_switch { case glsl: __intrinsic_asm "textureProjLod"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $p Lod $lod + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $p Lod $lod }; default: return textureLod(sampler, p.xy / p.z, lod); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_cuda_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjLod(Sampler2D<vector<T,N>> sampler, vec4 p, float lod) +public vector<T.Element,4> textureProjLod(Sampler2D<T> sampler, vec4 p, float lod) { __target_switch { @@ -3198,7 +3201,7 @@ public vector<T,4> textureProjLod(Sampler2D<vector<T,N>> sampler, vec4 p, float { vec4 xyw_ = p.xyww; return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $xyw_ Lod $lod + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $xyw_ Lod $lod }; } default: @@ -3206,16 +3209,16 @@ public vector<T,4> textureProjLod(Sampler2D<vector<T,N>> sampler, vec4 p, float } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_cuda_glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjLod(Sampler3D<vector<T,N>> sampler, vec4 p, float lod) +public vector<T.Element,4> textureProjLod(Sampler3D<T> sampler, vec4 p, float lod) { __target_switch { case glsl: __intrinsic_asm "textureProjLod"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $p Lod $lod + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $p Lod $lod }; default: return textureLod(sampler, p.xyz / p.w, lod); @@ -3266,26 +3269,26 @@ public float textureProjLod(sampler2DShadow sampler, vec4 p, float lod) // textureProjLodOffset // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjLodOffset(Sampler1D<vector<T,N>> sampler, vec2 p, float lod, constexpr int offset) +public vector<T.Element,4> textureProjLodOffset(Sampler1D<T> sampler, vec2 p, float lod, constexpr int offset) { __target_switch { case glsl: __intrinsic_asm "textureProjLodOffset"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $p Lod|ConstOffset $lod $offset + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $p Lod|ConstOffset $lod $offset }; default: return textureLodOffset(sampler, p.x / p.y, lod, offset); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjLodOffset(Sampler1D<vector<T,N>> sampler, vec4 p, float lod, constexpr int offset) +public vector<T.Element,4> textureProjLodOffset(Sampler1D<T> sampler, vec4 p, float lod, constexpr int offset) { __target_switch { @@ -3294,7 +3297,7 @@ public vector<T,4> textureProjLodOffset(Sampler1D<vector<T,N>> sampler, vec4 p, { vec4 xw__ = p.xwww; return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $xw__ Lod|ConstOffset $lod $offset + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $xw__ Lod|ConstOffset $lod $offset }; } default: @@ -3302,26 +3305,26 @@ public vector<T,4> textureProjLodOffset(Sampler1D<vector<T,N>> sampler, vec4 p, } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjLodOffset(Sampler2D<vector<T,N>> sampler, vec3 p, float lod, constexpr ivec2 offset) +public vector<T.Element,4> textureProjLodOffset(Sampler2D<T> sampler, vec3 p, float lod, constexpr ivec2 offset) { __target_switch { case glsl: __intrinsic_asm "textureProjLodOffset"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $p Lod|ConstOffset $lod $offset + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $p Lod|ConstOffset $lod $offset }; default: return textureLodOffset(sampler, p.xy / p.z, lod, offset); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjLodOffset(Sampler2D<vector<T,N>> sampler, vec4 p, float lod, constexpr ivec2 offset) +public vector<T.Element,4> textureProjLodOffset(Sampler2D<T> sampler, vec4 p, float lod, constexpr ivec2 offset) { __target_switch { @@ -3330,7 +3333,7 @@ public vector<T,4> textureProjLodOffset(Sampler2D<vector<T,N>> sampler, vec4 p, { vec4 xyw_ = p.xyww; return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $xyw_ Lod|ConstOffset $lod $offset + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $xyw_ Lod|ConstOffset $lod $offset }; } default: @@ -3338,16 +3341,16 @@ public vector<T,4> textureProjLodOffset(Sampler2D<vector<T,N>> sampler, vec4 p, } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(glsl_hlsl_spirv, texture_sm_4_0_fragment)] -public vector<T,4> textureProjLodOffset(Sampler3D<vector<T,N>> sampler, vec4 p, float lod, constexpr ivec3 offset) +public vector<T.Element,4> textureProjLodOffset(Sampler3D<T> sampler, vec4 p, float lod, constexpr ivec3 offset) { __target_switch { case glsl: __intrinsic_asm "textureProjLodOffset"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $p Lod|ConstOffset $lod $offset + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $p Lod|ConstOffset $lod $offset }; default: return textureLodOffset(sampler, p.xyz / p.w, lod, offset); @@ -3399,19 +3402,19 @@ public float textureProjLodOffset(sampler2DShadow sampler, vec4 p, float lod, co // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] -public vector<T,4> textureGrad(Sampler1D<vector<T,N>> sampler, float p, float dPdx, float dPdy) +public vector<T.Element,4> textureGrad(Sampler1D<T> sampler, float p, float dPdx, float dPdy) { - return __vectorReshape<4>(sampler.SampleGrad(p, dPdx, dPdy)); + return __vectorReshape2<T.Element,4>(sampler.SampleGrad(p, dPdx, dPdy)); } -__generic<T:__BuiltinArithmeticType, let N:int, Shape:__ITextureShape, let isArray:int, let sampleCount:int, let format:int> +__generic<T:ITexelElement, Shape:__ITextureShape, let isArray:int, let sampleCount:int, let format:int> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] -public vector<T,4> textureGrad(_Texture< - vector<T,N>, +public vector<T.Element,4> textureGrad(_Texture< + T, Shape, isArray, 0, // isMS @@ -3422,7 +3425,7 @@ public vector<T,4> textureGrad(_Texture< format > sampler, vector<float,Shape.dimensions+isArray> p, vector<float,Shape.dimensions> dPdx, vector<float,Shape.dimensions> dPdy) { - return __vectorReshape<4>(sampler.SampleGrad(p, dPdx, dPdy)); + return __vectorReshape2<T.Element,4>(sampler.SampleGrad(p, dPdx, dPdy)); } [ForceInline] @@ -3514,19 +3517,19 @@ public float textureGrad(sampler2DArrayShadow sampler, vec4 p, vec2 dPdx, vec2 d // textureGradOffset // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] -public vector<T,4> textureGradOffset(Sampler1D<vector<T,N>> sampler, float p, float dPdx, float dPdy, constexpr int offset) +public vector<T.Element,4> textureGradOffset(Sampler1D<T> sampler, float p, float dPdx, float dPdy, constexpr int offset) { - return __vectorReshape<4>(sampler.SampleGrad(p, dPdx, dPdy, offset)); + return __vectorReshape2<T.Element,4>(sampler.SampleGrad(p, dPdx, dPdy, offset)); } -__generic<T:__BuiltinArithmeticType, let N:int, Shape:__ITextureShape, let isArray:int, let sampleCount:int, let format:int> +__generic<T:ITexelElement, Shape:__ITextureShape, let isArray:int, let sampleCount:int, let format:int> [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] [ForceInline] -public vector<T,4> textureGradOffset(_Texture< - vector<T,N>, +public vector<T.Element,4> textureGradOffset(_Texture< + T, Shape, isArray, 0, // isMS @@ -3537,7 +3540,7 @@ public vector<T,4> textureGradOffset(_Texture< format > sampler, vector<float,Shape.dimensions+isArray> p, vector<float,Shape.dimensions> dPdx, vector<float,Shape.dimensions> dPdy, constexpr vector<int,Shape.dimensions> offset) { - return __vectorReshape<4>(sampler.SampleGrad(p, dPdx, dPdy, offset)); + return __vectorReshape2<T.Element,4>(sampler.SampleGrad(p, dPdx, dPdy, offset)); } [ForceInline] @@ -3612,26 +3615,26 @@ public float textureGradOffset(sampler2DArrayShadow sampler, vec4 p, vec2 dPdx, // textureProjGrad // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] -public vector<T,4> textureProjGrad(Sampler1D<vector<T,N>> sampler, vec2 p, float dPdx, float dPdy) +public vector<T.Element,4> textureProjGrad(Sampler1D<T> sampler, vec2 p, float dPdx, float dPdy) { __target_switch { case glsl: __intrinsic_asm "textureProjGrad"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $p Grad $dPdx $dPdy + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $p Grad $dPdx $dPdy }; default: return textureGrad(sampler, p.x / p.y, dPdx, dPdy); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] -public vector<T,4> textureProjGrad(Sampler1D<vector<T,N>> sampler, vec4 p, float dPdx, float dPdy) +public vector<T.Element,4> textureProjGrad(Sampler1D<T> sampler, vec4 p, float dPdx, float dPdy) { __target_switch { @@ -3640,7 +3643,7 @@ public vector<T,4> textureProjGrad(Sampler1D<vector<T,N>> sampler, vec4 p, float { vec4 xw__ = p.xwww; return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $xw__ Grad $dPdx $dPdy + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $xw__ Grad $dPdx $dPdy }; } default: @@ -3648,26 +3651,26 @@ public vector<T,4> textureProjGrad(Sampler1D<vector<T,N>> sampler, vec4 p, float } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] -public vector<T,4> textureProjGrad(Sampler2D<vector<T,N>> sampler, vec3 p, vec2 dPdx, vec2 dPdy) +public vector<T.Element,4> textureProjGrad(Sampler2D<T> sampler, vec3 p, vec2 dPdx, vec2 dPdy) { __target_switch { case glsl: __intrinsic_asm "textureProjGrad"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $p Grad $dPdx $dPdy + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $p Grad $dPdx $dPdy }; default: return textureGrad(sampler, p.xy / p.z, dPdx, dPdy); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] -public vector<T,4> textureProjGrad(Sampler2D<vector<T,N>> sampler, vec4 p, vec2 dPdx, vec2 dPdy) +public vector<T.Element,4> textureProjGrad(Sampler2D<T> sampler, vec4 p, vec2 dPdx, vec2 dPdy) { __target_switch { @@ -3676,7 +3679,7 @@ public vector<T,4> textureProjGrad(Sampler2D<vector<T,N>> sampler, vec4 p, vec2 { vec4 xyw_ = p.xyww; return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $xyw_ Grad $dPdx $dPdy + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $xyw_ Grad $dPdx $dPdy }; } default: @@ -3684,16 +3687,16 @@ public vector<T,4> textureProjGrad(Sampler2D<vector<T,N>> sampler, vec4 p, vec2 } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] -public vector<T,4> textureProjGrad(Sampler3D<vector<T,N>> sampler, vec4 p, vec3 dPdx, vec3 dPdy) +public vector<T.Element,4> textureProjGrad(Sampler3D<T> sampler, vec4 p, vec3 dPdx, vec3 dPdy) { __target_switch { case glsl: __intrinsic_asm "textureProjGrad"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $p Grad $dPdx $dPdy + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $p Grad $dPdx $dPdy }; default: return textureGrad(sampler, p.xyz / p.w, dPdx, dPdy); @@ -3744,26 +3747,26 @@ public float textureProjGrad(sampler2DShadow sampler, vec4 p, vec2 dPdx, vec2 dP // textureProjGradOffset // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] -public vector<T,4> textureProjGradOffset(Sampler1D<vector<T,N>> sampler, vec2 p, float dPdx, float dPdy, constexpr int offset) +public vector<T.Element,4> textureProjGradOffset(Sampler1D<T> sampler, vec2 p, float dPdx, float dPdy, constexpr int offset) { __target_switch { case glsl: __intrinsic_asm "textureProjGradOffset"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $p Grad|ConstOffset $dPdx $dPdy $offset + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $p Grad|ConstOffset $dPdx $dPdy $offset }; default: return textureGradOffset(sampler, p.x / p.y, dPdx, dPdy, offset); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] -public vector<T,4> textureProjGradOffset(Sampler1D<vector<T,N>> sampler, vec4 p, float dPdx, float dPdy, constexpr int offset) +public vector<T.Element,4> textureProjGradOffset(Sampler1D<T> sampler, vec4 p, float dPdx, float dPdy, constexpr int offset) { __target_switch { @@ -3772,7 +3775,7 @@ public vector<T,4> textureProjGradOffset(Sampler1D<vector<T,N>> sampler, vec4 p, { vec4 xw__ = p.xwww; return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $xw__ Grad|ConstOffset $dPdx $dPdy $offset + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $xw__ Grad|ConstOffset $dPdx $dPdy $offset }; } default: @@ -3780,26 +3783,26 @@ public vector<T,4> textureProjGradOffset(Sampler1D<vector<T,N>> sampler, vec4 p, } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] -public vector<T,4> textureProjGradOffset(Sampler2D<vector<T,N>> sampler, vec3 p, vec2 dPdx, vec2 dPdy, constexpr ivec2 offset) +public vector<T.Element,4> textureProjGradOffset(Sampler2D<T> sampler, vec3 p, vec2 dPdx, vec2 dPdy, constexpr ivec2 offset) { __target_switch { case glsl: __intrinsic_asm "textureProjGradOffset"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $p Grad|ConstOffset $dPdx $dPdy $offset + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $p Grad|ConstOffset $dPdx $dPdy $offset }; default: return textureGradOffset(sampler, p.xy / p.z, dPdx, dPdy, offset); } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] -public vector<T,4> textureProjGradOffset(Sampler2D<vector<T,N>> sampler, vec4 p, vec2 dPdx, vec2 dPdy, constexpr ivec2 offset) +public vector<T.Element,4> textureProjGradOffset(Sampler2D<T> sampler, vec4 p, vec2 dPdx, vec2 dPdy, constexpr ivec2 offset) { __target_switch { @@ -3808,7 +3811,7 @@ public vector<T,4> textureProjGradOffset(Sampler2D<vector<T,N>> sampler, vec4 p, { vec4 xyw_ = p.xyww; return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $xyw_ Grad|ConstOffset $dPdx $dPdy $offset + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $xyw_ Grad|ConstOffset $dPdx $dPdy $offset }; } default: @@ -3816,16 +3819,16 @@ public vector<T,4> textureProjGradOffset(Sampler2D<vector<T,N>> sampler, vec4 p, } } -__generic<T:__BuiltinArithmeticType, let N:int> +__generic<T:ITexelElement> [ForceInline] [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] -public vector<T,4> textureProjGradOffset(Sampler3D<vector<T,N>> sampler, vec4 p, vec3 dPdx, vec3 dPdy, constexpr ivec3 offset) +public vector<T.Element,4> textureProjGradOffset(Sampler3D<T> sampler, vec4 p, vec3 dPdx, vec3 dPdy, constexpr ivec3 offset) { __target_switch { case glsl: __intrinsic_asm "textureProjGradOffset"; case spirv: return spirv_asm { - result:$$vector<T,4> = OpImageSampleProjExplicitLod $sampler $p Grad|ConstOffset $dPdx $dPdy $offset + result:$$vector<T.Element,4> = OpImageSampleProjExplicitLod $sampler $p Grad|ConstOffset $dPdx $dPdy $offset }; default: return textureGradOffset(sampler, p.xyz / p.w, dPdx, dPdy, offset); @@ -3880,11 +3883,11 @@ public float textureProjGradOffset(sampler2DShadow sampler, vec4 p, vec2 dPdx, v // textureGather // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int, Shape:__ITextureShape, let isArray:int, let sampleCount:int, let format:int> +__generic<T:ITexelElement, Shape:__ITextureShape, let isArray:int, let sampleCount:int, let format:int> [ForceInline] [require(glsl_hlsl_spirv, texture_gather)] -public vector<T,4> textureGather(_Texture< - vector<T,N>, +public vector<T.Element,4> textureGather(_Texture< + T, Shape, isArray, 0, // isMS @@ -3926,11 +3929,11 @@ public vec4 textureGather(_Texture< // textureGatherOffset // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int, let isArray:int, let sampleCount:int, let format:int> +__generic<T:ITexelElement, let isArray:int, let sampleCount:int, let format:int> [ForceInline] [require(glsl_hlsl_spirv, texture_gather)] -public vector<T,4> textureGatherOffset(_Texture< - vector<T,N>, +public vector<T.Element,4> textureGatherOffset(_Texture< + T, __Shape2D, isArray, 0, // isMS @@ -3972,11 +3975,11 @@ public vec4 textureGatherOffset(_Texture< // textureGatherOffsets // ------------------- -__generic<T:__BuiltinArithmeticType, let N:int, let isArray:int, let sampleCount:int, let format:int> +__generic<T:ITexelElement, let isArray:int, let sampleCount:int, let format:int> [ForceInline] [require(glsl_hlsl_spirv, texture_gather)] -public vector<T,4> textureGatherOffsets(_Texture< - vector<T,N>, +public vector<T.Element,4> textureGatherOffsets(_Texture< + T, __Shape2D, isArray, 0, // isMS diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index d620197f3..9d6a81f84 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -10,6 +10,7 @@ void __requireGLSLExtension(String extensionName); /// Represents an interface for buffer data layout. /// This interface is used as a base for defining specific data layouts for buffers. [sealed] +[builtin] __magic_type(IBufferDataLayoutType) interface IBufferDataLayout { @@ -513,6 +514,86 @@ __generic<T, let N:int> vector<T,N+1> __makeVector(vector<T,N> vec, T scalar); //@public: +/// Represent types that can be used as texel element. +[sealed] +[builtin] +interface ITexelElement +{ + associatedtype Element : __BuiltinArithmeticType; + static const int elementCount; + __init(Element x); +} + +${{{ +// Scalar types that can be used as texel element. +const char* texeElementScalarTypes[] = { + "half", + "float", + "int", + "uint", + "int8_t", + "int16_t", + "uint8_t", + "uint16_t" +}; +for (auto elementType : texeElementScalarTypes) +{ +}}} +extension $(elementType) : ITexelElement +{ + typealias Element = $(elementType); + static const int elementCount = 1; + __intrinsic_op(0) __init(Element x); +} +extension<int N> vector<$(elementType), N> : ITexelElement +{ + typealias Element = $(elementType); + static const int elementCount = N; + __intrinsic_op($(kIROp_MakeVectorFromScalar)) __init(Element x); +} +${{{ +} // end for texelElementScalarTypes. +}}} + +// Additional 64-bit types that can be used as texel element. +extension double:ITexelElement +{ + typealias Element = double; + static const int elementCount = 1; + __intrinsic_op(0) __init(Element x); +} +extension double2:ITexelElement +{ + typealias Element = double; + static const int elementCount = 2; + __intrinsic_op($(kIROp_MakeVectorFromScalar)) __init(Element x); +} +extension uint64_t:ITexelElement +{ + typealias Element = uint64_t; + static const int elementCount = 1; + __intrinsic_op(0) __init(Element x); +} +extension int64_t:ITexelElement +{ + typealias Element = int64_t; + static const int elementCount = 1; + __intrinsic_op(0) __init(Element x); +} +extension vector<uint64_t,2>:ITexelElement +{ + typealias Element = uint64_t; + static const int elementCount = 2; + __intrinsic_op($(kIROp_MakeVectorFromScalar)) __init(Element x); +} +extension vector<int64_t,2>:ITexelElement +{ + typealias Element = int64_t; + static const int elementCount = 2; + __intrinsic_op($(kIROp_MakeVectorFromScalar)) __init(Element x); +} + +//@public: /// A parameterized type that represents all flavors of texture types supported by the Slang language. /// Please note that this type is not intended to be used directly in user code, and not all combinations /// of the generic arguments are valid. @@ -591,7 +672,7 @@ vector<T,N+1> __makeVector(vector<T,N> vec, T scalar); /// @category texture_types Texture types __magic_type(TextureType) __intrinsic_type($(kIROp_TextureType)) -struct _Texture<T, Shape: __ITextureShape, let isArray:int, let isMS:int, let sampleCount:int, let access:int, let isShadow:int, let isCombined:int, let format:int> +struct _Texture<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let isMS:int, let sampleCount:int, let access:int, let isShadow:int, let isCombined:int, let format:int> { } @@ -776,7 +857,7 @@ float __glsl_texture_level_offset_1d_shadow<TTexture, TCoord, TOffset>(TTexture //@public: -__generic<T, Shape: __ITextureShape, let isArray:int, let isMS:int, let sampleCount:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let isMS:int, let sampleCount:int, let isShadow:int, let format:int> extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,1,format> { //@hidden: @@ -1498,7 +1579,7 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,1,format> // Non-combined texture types specific functions -__generic<T, Shape: __ITextureShape, let isArray:int, let isMS:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let isMS:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> extension _Texture<T,Shape,isArray,isMS,sampleCount,access,isShadow,0,format> { typealias TextureCoord = vector<float, Shape.dimensions>; @@ -1596,7 +1677,7 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,access,isShadow,0,format> } } -__generic<T, Shape: __ITextureShape, let isArray:int, let isMS:int, let sampleCount:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let isMS:int, let sampleCount:int, let isShadow:int, let format:int> extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format> { [__readNone] @@ -2720,7 +2801,7 @@ for (int isMS = 0; isMS <= 1; isMS++) { TextureTypeInfo textureTypeInfo(kBaseTextureShapes[shapeIndex], isArray, isMS, 0, sb, path); }}}} -__generic<T, let sampleCount:int, let access:int, let isShadow:int, let isCombined:int, let format:int> +__generic<T:ITexelElement, let sampleCount:int, let access:int, let isShadow:int, let isCombined:int, let format:int> extension _Texture<T,$(shapeTypeName),$(isArray),$(isMS),sampleCount,access,isShadow,isCombined,format> { ${{{{ @@ -2733,7 +2814,7 @@ ${{{{ }}}} // Texture.GetSamplePosition(int s); -__generic<T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let isCombined:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let isCombined:int, let format:int> extension _Texture<T,Shape,isArray,1,sampleCount,access,isShadow,isCombined,format> { [require(cpp_cuda_glsl_hlsl_spirv, texture_sm_4_1_vertex_fragment_geometry)] @@ -2745,10 +2826,10 @@ Array<T,4> __makeArray<T>(T v0, T v1, T v2, T v3); // Beginning of Texture Gather -__generic<TElement, T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> [ForceInline] [require(glsl_metal_spirv_wgsl, texture_gather)] -vector<TElement,4> __texture_gather( +vector<T.Element,4> __texture_gather( _Texture<T, Shape, isArray, 0, sampleCount, access, isShadow, 0, format> texture, SamplerState s, vector<float, Shape.dimensions+isArray> location, @@ -2781,7 +2862,7 @@ vector<TElement,4> __texture_gather( case spirv: return spirv_asm { %sampledImage : __sampledImageType(texture) = OpSampledImage $texture $s; - result:$$vector<TElement,4> = OpImageGather %sampledImage $location $component; + result:$$vector<T.Element,4> = OpImageGather %sampledImage $location $component; }; case wgsl: if (isShadow == 1) @@ -2814,10 +2895,10 @@ vector<TElement,4> __texture_gather( } } -__generic<TElement, T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> [ForceInline] [require(glsl_spirv, texture_gather)] -vector<TElement,4> __texture_gather( +vector<T.Element,4> __texture_gather( _Texture<T, Shape, isArray, 0, sampleCount, access, isShadow, 1, format> sampler, vector<float, Shape.dimensions+isArray> location, int component) @@ -2828,15 +2909,15 @@ vector<TElement,4> __texture_gather( __intrinsic_asm "textureGather($0, $1, $2)"; case spirv: return spirv_asm { - result:$$vector<TElement,4> = OpImageGather $sampler $location $component; + result:$$vector<T.Element,4> = OpImageGather $sampler $location $component; }; } } -__generic<TElement, T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> [ForceInline] [require(glsl_metal_spirv_wgsl, texture_gather)] -vector<TElement,4> __texture_gather_offset( +vector<T.Element,4> __texture_gather_offset( _Texture<T, Shape, isArray, 0, sampleCount, access, isShadow, 0, format> texture, SamplerState s, vector<float, Shape.dimensions+isArray> location, @@ -2862,7 +2943,7 @@ vector<TElement,4> __texture_gather_offset( return spirv_asm { OpCapability ImageGatherExtended; %sampledImage : __sampledImageType(texture) = OpSampledImage $texture $s; - result:$$vector<TElement,4> = OpImageGather %sampledImage $location $component Offset $offset; + result:$$vector<T.Element,4> = OpImageGather %sampledImage $location $component Offset $offset; }; case wgsl: if (isShadow == 1) @@ -2895,10 +2976,10 @@ vector<TElement,4> __texture_gather_offset( } } -__generic<TElement, T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> [ForceInline] [require(glsl_spirv, texture_gather)] -vector<TElement,4> __texture_gather_offset( +vector<T.Element,4> __texture_gather_offset( _Texture<T, Shape, isArray, 0, sampleCount, access, isShadow, 1, format> sampler, vector<float, Shape.dimensions+isArray> location, constexpr vector<int, Shape.planeDimensions> offset, @@ -2911,15 +2992,15 @@ vector<TElement,4> __texture_gather_offset( case spirv: return spirv_asm { OpCapability ImageGatherExtended; - result:$$vector<TElement,4> = OpImageGather $sampler $location $component Offset $offset; + result:$$vector<T.Element,4> = OpImageGather $sampler $location $component Offset $offset; }; } } -__generic<TElement, T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> [ForceInline] [require(glsl_spirv, texture_gather)] -vector<TElement,4> __texture_gather_offsets( +vector<T.Element,4> __texture_gather_offsets( _Texture<T, Shape, isArray, 0, sampleCount, access, isShadow, 0, format> texture, SamplerState s, vector<float, Shape.dimensions+isArray> location, @@ -2938,15 +3019,15 @@ vector<TElement,4> __texture_gather_offsets( return spirv_asm { OpCapability ImageGatherExtended; %sampledImage : __sampledImageType(texture) = OpSampledImage $texture $s; - result:$$vector<TElement,4> = OpImageGather %sampledImage $location $component ConstOffsets $offsets; + result:$$vector<T.Element,4> = OpImageGather %sampledImage $location $component ConstOffsets $offsets; }; } } -__generic<TElement, T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> [ForceInline] [require(glsl_spirv, texture_gather)] -vector<TElement,4> __texture_gather_offsets( +vector<T.Element,4> __texture_gather_offsets( _Texture<T, Shape, isArray, 0, sampleCount, access, isShadow, 1, format> sampler, vector<float, Shape.dimensions+isArray> location, constexpr vector<int, Shape.planeDimensions> offset1, @@ -2963,19 +3044,19 @@ vector<TElement,4> __texture_gather_offsets( let offsets = __makeArray(offset1,offset2,offset3,offset4); return spirv_asm { OpCapability ImageGatherExtended; - result:$$vector<TElement,4> = OpImageGather $sampler $location $component ConstOffsets $offsets; + result:$$vector<T.Element,4> = OpImageGather $sampler $location $component ConstOffsets $offsets; }; } } -__generic<TElement, T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> [ForceInline] [require(glsl_metal_spirv_wgsl, texture_gather)] -vector<TElement,4> __texture_gatherCmp( +vector<T.Element,4> __texture_gatherCmp( _Texture<T, Shape, isArray, 0, sampleCount, access, isShadow, 0, format> texture, SamplerComparisonState s, vector<float, Shape.dimensions+isArray> location, - TElement compareValue) + T.Element compareValue) { __target_switch { @@ -2999,7 +3080,7 @@ vector<TElement,4> __texture_gatherCmp( case spirv: return spirv_asm { %sampledImage : __sampledImageType(texture) = OpSampledImage $texture $s; - result:$$vector<TElement,4> = OpImageDrefGather %sampledImage $location $compareValue; + result:$$vector<T.Element,4> = OpImageDrefGather %sampledImage $location $compareValue; }; case wgsl: static_assert(isShadow == 1, "WGSL supports textureGatherCompare only for depth textures."); @@ -3018,13 +3099,13 @@ vector<TElement,4> __texture_gatherCmp( } } -__generic<TElement, T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> [ForceInline] [require(glsl_spirv, texture_gather)] -vector<TElement,4> __texture_gatherCmp( +vector<T.Element,4> __texture_gatherCmp( _Texture<T, Shape, isArray, 0, sampleCount, access, isShadow, 1, format> sampler, vector<float, Shape.dimensions+isArray> location, - TElement compareValue) + T.Element compareValue) { __target_switch { @@ -3032,19 +3113,19 @@ vector<TElement,4> __texture_gatherCmp( __intrinsic_asm "textureGather($0, $1, $2)"; case spirv: return spirv_asm { - result:$$vector<TElement,4> = OpImageDrefGather $sampler $location $compareValue; + result:$$vector<T.Element,4> = OpImageDrefGather $sampler $location $compareValue; }; } } -__generic<TElement, T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> [ForceInline] [require(glsl_metal_spirv_wgsl, texture_gather)] -vector<TElement,4> __texture_gatherCmp_offset( +vector<T.Element,4> __texture_gatherCmp_offset( _Texture<T, Shape, isArray, 0, sampleCount, access, isShadow, 0, format> texture, SamplerComparisonState s, vector<float, Shape.dimensions+isArray> location, - TElement compareValue, + T.Element compareValue, constexpr vector<int, Shape.planeDimensions> offset) { __target_switch @@ -3065,7 +3146,7 @@ vector<TElement,4> __texture_gatherCmp_offset( case spirv: return spirv_asm { %sampledImage : __sampledImageType(texture) = OpSampledImage $texture $s; - result:$$vector<TElement,4> = OpImageDrefGather %sampledImage $location $compareValue ConstOffset $offset; + result:$$vector<T.Element,4> = OpImageDrefGather %sampledImage $location $compareValue ConstOffset $offset; }; case wgsl: static_assert(isShadow == 1, "WGSL supports textureGatherCompare only for depth textures."); @@ -3084,13 +3165,13 @@ vector<TElement,4> __texture_gatherCmp_offset( } } -__generic<TElement, T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> [ForceInline] [require(glsl_spirv, texture_gather)] -vector<TElement,4> __texture_gatherCmp_offset( +vector<T.Element,4> __texture_gatherCmp_offset( _Texture<T, Shape, isArray, 0, sampleCount, access, isShadow, 1, format> sampler, vector<float, Shape.dimensions+isArray> location, - TElement compareValue, + T.Element compareValue, constexpr vector<int, Shape.planeDimensions> offset) { __target_switch @@ -3099,19 +3180,19 @@ vector<TElement,4> __texture_gatherCmp_offset( __intrinsic_asm "textureGatherOffset($0, $1, $2, $3)"; case spirv: return spirv_asm { - result:$$vector<TElement,4> = OpImageDrefGather $sampler $location $compareValue ConstOffset $offset; + result:$$vector<T.Element,4> = OpImageDrefGather $sampler $location $compareValue ConstOffset $offset; }; } } -__generic<TElement, T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> [ForceInline] [require(glsl_spirv, texture_gather)] -vector<TElement,4> __texture_gatherCmp_offsets( +vector<T.Element,4> __texture_gatherCmp_offsets( _Texture<T, Shape, isArray, 0, sampleCount, access, isShadow, 0, format> texture, SamplerComparisonState s, vector<float, Shape.dimensions+isArray> location, - TElement compareValue, + T.Element compareValue, vector<int, Shape.planeDimensions> offset1, vector<int, Shape.planeDimensions> offset2, vector<int, Shape.planeDimensions> offset3, @@ -3126,18 +3207,18 @@ vector<TElement,4> __texture_gatherCmp_offsets( return spirv_asm { OpCapability ImageGatherExtended; %sampledImage : __sampledImageType(texture) = OpSampledImage $texture $s; - result:$$vector<TElement,4> = OpImageDrefGather %sampledImage $location $compareValue ConstOffsets $offsets; + result:$$vector<T.Element,4> = OpImageDrefGather %sampledImage $location $compareValue ConstOffsets $offsets; }; } } -__generic<TElement, T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let access:int, let isShadow:int, let format:int> [ForceInline] [require(glsl_spirv, texture_gather)] -vector<TElement,4> __texture_gatherCmp_offsets( +vector<T.Element,4> __texture_gatherCmp_offsets( _Texture<T, Shape, isArray, 0, sampleCount, access, isShadow, 1, format> sampler, vector<float, Shape.dimensions+isArray> location, - TElement compareValue, + T.Element compareValue, vector<int, Shape.planeDimensions> offset1, vector<int, Shape.planeDimensions> offset2, vector<int, Shape.planeDimensions> offset3, @@ -3151,30 +3232,26 @@ vector<TElement,4> __texture_gatherCmp_offsets( let offsets = __makeArray(offset1,offset2,offset3,offset4); return spirv_asm { OpCapability ImageGatherExtended; - result:$$vector<TElement,4> = OpImageDrefGather $sampler $location $compareValue ConstOffsets $offsets; + result:$$vector<T.Element,4> = OpImageDrefGather $sampler $location $compareValue ConstOffsets $offsets; }; } } ${{{{ for (int isCombined = 0; isCombined < 2; isCombined++) -for (int isScalarTexture = 0; isScalarTexture < 2; isScalarTexture++) { - const char* extSizeParam = isScalarTexture ? "" : ", let N:int"; - const char* extTexType = isScalarTexture ? "T" : "vector<T,N>"; - }}}} -// Gather for [TextureType = $(extTexType), isCombined = $(isCombined)] +// Gather for [isCombined = $(isCombined)] -__generic<T:__BuiltinArithmeticType $(extSizeParam), Shape: __ITextureShape, let isArray:int, let sampleCount:int, let isShadow:int, let format:int> -extension _Texture<$(extTexType),Shape,isArray,0,sampleCount,0,isShadow,$(isCombined),format> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let isShadow:int, let format:int> +extension _Texture<T,Shape,isArray,0,sampleCount,0,isShadow,$(isCombined),format> { ${{{{ for (int isShadow = 0; isShadow < 2; isShadow++) for (auto componentId = 0; componentId < 5; componentId++) { const char* compareFunc = isShadow ? "Cmp" : ""; - const char* compareParam = isShadow ? ", T compareValue" : ""; + const char* compareParam = isShadow ? ", T.Element compareValue" : ""; const char* compareArg = isShadow ? ", compareValue" : ""; // Some targets support the combined texture natively @@ -3190,7 +3267,7 @@ ${{{{ }}}} [ForceInline] [require(glsl_hlsl_metal_spirv_wgsl, texture_gather)] - vector<T,4> Gather$(compareFunc)$(componentFunc)( + vector<T.Element,4> Gather$(compareFunc)$(componentFunc)( $(samplerParam) vector<float, Shape.dimensions+isArray> location $(compareParam)) @@ -3203,16 +3280,16 @@ ${{{{ case hlsl: __intrinsic_asm ".Gather$(compareFunc)$(componentFunc)"; case metal: case wgsl: - return __texture_gather$(compareFunc)<T>($(getTexture) $(getSampler), location $(compareArg) $(componentArg)); + return __texture_gather$(compareFunc)($(getTexture) $(getSampler), location $(compareArg) $(componentArg)); case glsl: case spirv: - return __texture_gather$(compareFunc)<T>(this $(samplerArg), location $(compareArg) $(componentArg)); + return __texture_gather$(compareFunc)(this $(samplerArg), location $(compareArg) $(componentArg)); } } [ForceInline] [require(hlsl, texture_gather)] - vector<T,4> Gather$(compareFunc)$(componentFunc)( + vector<T.Element,4> Gather$(compareFunc)$(componentFunc)( $(samplerParam) vector<float, Shape.dimensions+isArray> location $(compareParam), @@ -3229,7 +3306,7 @@ ${{{{ [ForceInline] [require(glsl_hlsl_metal_spirv_wgsl, texture_gather)] - vector<T,4> Gather$(compareFunc)$(componentFunc)( + vector<T.Element,4> Gather$(compareFunc)$(componentFunc)( $(samplerParam) vector<float, Shape.dimensions+isArray> location $(compareParam), @@ -3243,16 +3320,16 @@ ${{{{ case hlsl: __intrinsic_asm ".Gather$(compareFunc)$(componentFunc)"; case metal: case wgsl: - return __texture_gather$(compareFunc)_offset<T>($(getTexture) $(getSampler), location $(compareArg), offset $(componentArg)); + return __texture_gather$(compareFunc)_offset($(getTexture) $(getSampler), location $(compareArg), offset $(componentArg)); case glsl: case spirv: - return __texture_gather$(compareFunc)_offset<T>(this $(samplerArg), location $(compareArg), offset $(componentArg)); + return __texture_gather$(compareFunc)_offset(this $(samplerArg), location $(compareArg), offset $(componentArg)); } } [ForceInline] [require(hlsl, texture_gather)] - vector<T,4> Gather$(compareFunc)$(componentFunc)( + vector<T.Element,4> Gather$(compareFunc)$(componentFunc)( $(samplerParam) vector<float, Shape.dimensions+isArray> location $(compareParam), @@ -3270,7 +3347,7 @@ ${{{{ [ForceInline] [require(glsl_hlsl_spirv, texture_gather)] - vector<T,4> Gather$(compareFunc)$(componentFunc)( + vector<T.Element,4> Gather$(compareFunc)$(componentFunc)( $(samplerParam) vector<float, Shape.dimensions+isArray> location $(compareParam), @@ -3293,7 +3370,7 @@ ${{{{ [ForceInline] [require(hlsl, texture_gather)] - vector<T,4> Gather$(compareFunc)$(componentFunc)( + vector<T.Element,4> Gather$(compareFunc)$(componentFunc)( $(samplerParam) vector<float, Shape.dimensions+isArray> location $(compareParam), @@ -3315,7 +3392,7 @@ ${{{{ ${{{{ } // for (componentId) }}}} -} // End of: Gather for [TextureType = $(extTexType), isCombined = $(isCombined)] +} // End of: Gather for [isCombined = $(isCombined)] ${{{{ } // for (isScalarTexture) @@ -3325,7 +3402,7 @@ ${{{{ // Load/Subscript for readonly, no MS textures -__generic<T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let isShadow:int, let isCombined:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let isShadow:int, let isCombined:int, let format:int> extension _Texture<T,Shape,isArray,0,sampleCount,0,isShadow,isCombined,format> { //@hidden: @@ -3453,7 +3530,7 @@ extension _Texture<T,Shape,isArray,0,sampleCount,0,isShadow,isCombined,format> case $(SLANG_TEXTURE_3D): __intrinsic_asm "textureLoad($0, ($1).xyz, ($1).w)$z"; } - return T(); + return __default<T>(); } } @@ -3555,7 +3632,7 @@ extension _Texture<T,Shape,isArray,0,sampleCount,0,isShadow,isCombined,format> // Texture Load/Subscript for readonly, MS textures -__generic<T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let isShadow:int, let isCombined:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let isShadow:int, let isCombined:int, let format:int> extension _Texture<T,Shape,isArray,1,sampleCount,0,isShadow,isCombined,format> { //@hidden: @@ -3746,7 +3823,7 @@ ${{{{ const char* glslIntrinsicMSOffset = "$cimageLoad($0, ($1)+($3), $2)$z"; }}}} -__generic<T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let isShadow:int, let format:int> extension _Texture<T,Shape,isArray,0,sampleCount,$(access),isShadow, 0,format> { ${{{{ @@ -4081,7 +4158,7 @@ if (access == kCoreModule_ResourceAccessReadWrite) { // RW MS textures. -__generic<T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let isShadow:int, let format:int> extension _Texture<T,Shape,isArray,1,sampleCount,$(access),isShadow, 0,format> { [__readNone] @@ -4234,7 +4311,7 @@ ${{{{ }}}} // Definitions to support the legacy texture .mips[][] operator. -struct __TextureMip<T, Shape : __ITextureShape, let isArray : int, let isCombined : int, let format : int> +struct __TextureMip<T:ITexelElement, Shape : __ITextureShape, let isArray : int, let isCombined : int, let format : int> { _Texture<T, Shape, isArray, 0 /*isMS*/, 0 /*sampleCount*/, 0 /*access*/, 0 /*isShadow*/, isCombined, format> tex; int mip; @@ -4245,7 +4322,7 @@ struct __TextureMip<T, Shape : __ITextureShape, let isArray : int, let isCombine } } -struct __TextureMips<T, Shape : __ITextureShape, let isArray : int, let isCombined : int, let format : int> +struct __TextureMips<T:ITexelElement, Shape : __ITextureShape, let isArray : int, let isCombined : int, let format : int> { _Texture<T, Shape, isArray, 0 /*isMS*/, 0 /*sampleCount*/, 0 /*access*/, 0 /*isShadow*/, isCombined, format> tex; __subscript(int mip)->__TextureMip<T, Shape, isArray, isCombined, format> @@ -4256,7 +4333,7 @@ struct __TextureMips<T, Shape : __ITextureShape, let isArray : int, let isCombin } //@hidden: -__generic<T, Shape : __ITextureShape, let isArray : int, let isCombined : int, let format : int> +__generic<T:ITexelElement, Shape : __ITextureShape, let isArray : int, let isCombined : int, let format : int> extension _Texture<T, Shape, isArray, 0 /*isMS*/, 0 /*sampleCount*/, 0 /*access*/, 0 /*isShadow*/, isCombined, format> { property __TextureMips<T, Shape, isArray, isCombined, format> mips @@ -4267,7 +4344,7 @@ extension _Texture<T, Shape, isArray, 0 /*isMS*/, 0 /*sampleCount*/, 0 /*access* } // Definitions to support the .sample[][] operator. -struct __TextureSample<T, Shape : __ITextureShape, let isArray : int, let isCombined : int, let format : int> +struct __TextureSample<T:ITexelElement, Shape : __ITextureShape, let isArray : int, let isCombined : int, let format : int> { _Texture<T, Shape, isArray, 1 /*isMS*/, 0 /*sampleCount*/, 0 /*access*/, 0 /*isShadow*/, isCombined, format> tex; int sample; @@ -4278,7 +4355,7 @@ struct __TextureSample<T, Shape : __ITextureShape, let isArray : int, let isComb } } -struct __TextureSampleMS<T, Shape : __ITextureShape, let isArray : int, let isCombined : int, let format : int> +struct __TextureSampleMS<T:ITexelElement, Shape : __ITextureShape, let isArray : int, let isCombined : int, let format : int> { _Texture<T, Shape, isArray, 1 /*isMS*/, 0 /*sampleCount*/, 0 /*access*/, 0 /*isShadow*/, isCombined, format> tex; __subscript(int sample)->__TextureSample<T, Shape, isArray, isCombined, format> @@ -4288,7 +4365,7 @@ struct __TextureSampleMS<T, Shape : __ITextureShape, let isArray : int, let isCo } } -__generic<T, Shape : __ITextureShape, let isArray : int, let isCombined : int, let format : int> +__generic<T:ITexelElement, Shape : __ITextureShape, let isArray : int, let isCombined : int, let format : int> extension _Texture<T, Shape, isArray, 1 /*isMS*/, 0 /*sampleCount*/, 0 /*access*/, 0 /*isShadow*/, isCombined, format> { property __TextureSampleMS<T, Shape, isArray, isCombined, format> sample @@ -4345,7 +4422,7 @@ ${{{{ /// @param format The storage format of the texture. /// @see Please refer to `_Texture` for more information about texture types. /// @category texture_types -typealias $(accessPrefix[access])$(textureTypeName)$(shapeTypeNames[shape])$(msPostFix[isMS])$(arrayPostFix[isArray])<T=float4, let sampleCount:int=0, let format:int=0> = _Texture<T, __Shape$(shapeTypeNames[shape]), $(isArray), $(isMS), sampleCount, $(access), 0, $(isCombined), format>; +typealias $(accessPrefix[access])$(textureTypeName)$(shapeTypeNames[shape])$(msPostFix[isMS])$(arrayPostFix[isArray])<T:ITexelElement=float4, let sampleCount:int=0, let format:int=0> = _Texture<T, __Shape$(shapeTypeNames[shape]), $(isArray), $(isMS), sampleCount, $(access), 0, $(isCombined), format>; ${{{{ } }}}} @@ -15633,7 +15710,7 @@ for (int aa = 0; aa < kBaseBufferAccessLevelCount; ++aa) { auto access = kBaseBufferAccessLevels[aa].access; sb << "/// @category texture_types\n"; - sb << "__generic<T,let format:int=0>\n"; + sb << "__generic<T:ITexelElement,let format:int=0>\n"; sb << "typealias "; sb << kBaseBufferAccessLevels[aa].name; sb << "Buffer = _Texture<T, __ShapeBuffer, 0, 0, 0, " << aa << ", 0, 0, format>;\n"; @@ -15648,7 +15725,7 @@ for (int aa = 0; aa < kBaseBufferAccessLevelCount; ++aa) char const* requireToSet_onlyHLSL = (isReadOnly) ? "[require(hlsl, texture_sm_4_1)]" : "[require(hlsl, texture_sm_4_1_compute_fragment)]"; }}}} -__generic<T, let format:int> +__generic<T:ITexelElement, let format:int> extension _Texture<T, __ShapeBuffer, 0, 0, 0, $(aa), 0, 0, format> { [__readNone] @@ -16920,23 +16997,33 @@ interface __BuiltinSamplerFeedbackType {}; [sealed] __magic_type(FeedbackType, $(int(FeedbackType::Kind::MinMip))) __target_intrinsic(hlsl, SAMPLER_FEEDBACK_MIN_MIP) -struct SAMPLER_FEEDBACK_MIN_MIP : __BuiltinSamplerFeedbackType {}; +struct SAMPLER_FEEDBACK_MIN_MIP : __BuiltinSamplerFeedbackType, ITexelElement { + typealias Element = float; + static const int elementCount = 1; + __intrinsic_op(0) __init(float x){} +}; /// @category texture_types [sealed] __magic_type(FeedbackType, $(int(FeedbackType::Kind::MipRegionUsed))) __target_intrinsic(hlsl, SAMPLER_FEEDBACK_MIP_REGION_USED) -struct SAMPLER_FEEDBACK_MIP_REGION_USED : __BuiltinSamplerFeedbackType {}; +struct SAMPLER_FEEDBACK_MIP_REGION_USED : __BuiltinSamplerFeedbackType, ITexelElement +{ + typealias Element = float; + static const int elementCount = 1; + __intrinsic_op(0) __init(float x){} +}; // All of these objects are write-only resources that point to a special kind of unordered access view meant for sampler feedback. -__generic<T:__BuiltinSamplerFeedbackType> -extension _Texture<T,__Shape2D, 0, 0, 0, $(kCoreModule_ResourceAccessFeedback), 0, 0, 0> +extension<T> _Texture<T,__Shape2D, 0, 0, 0, $(kCoreModule_ResourceAccessFeedback), 0, 0, 0> + where T:ITexelElement + where T:__BuiltinSamplerFeedbackType { // With Clamp [require(cpp_hlsl)] - void WriteSamplerFeedback<S>(Texture2D<S> tex, SamplerState samp, float2 location, float clamp) + void WriteSamplerFeedback<S:ITexelElement>(Texture2D<S> tex, SamplerState samp, float2 location, float clamp) { __target_switch { @@ -16946,7 +17033,7 @@ extension _Texture<T,__Shape2D, 0, 0, 0, $(kCoreModule_ResourceAccessFeedback), } [require(cpp_hlsl)] - void WriteSamplerFeedbackBias<S>(Texture2D<S> tex, SamplerState samp, float2 location, float bias, float clamp) + void WriteSamplerFeedbackBias<S:ITexelElement>(Texture2D<S> tex, SamplerState samp, float2 location, float bias, float clamp) { __target_switch { @@ -16956,7 +17043,7 @@ extension _Texture<T,__Shape2D, 0, 0, 0, $(kCoreModule_ResourceAccessFeedback), } [require(cpp_hlsl)] - void WriteSamplerFeedbackGrad<S>(Texture2D<S> tex, SamplerState samp, float2 location, float2 ddx, float2 ddy, float clamp) + void WriteSamplerFeedbackGrad<S:ITexelElement>(Texture2D<S> tex, SamplerState samp, float2 location, float2 ddx, float2 ddy, float clamp) { __target_switch { @@ -16968,7 +17055,7 @@ extension _Texture<T,__Shape2D, 0, 0, 0, $(kCoreModule_ResourceAccessFeedback), // Level [require(cpp_hlsl)] - void WriteSamplerFeedbackLevel<S>(Texture2D<S> tex, SamplerState samp, float2 location, float lod) + void WriteSamplerFeedbackLevel<S:ITexelElement>(Texture2D<S> tex, SamplerState samp, float2 location, float lod) { __target_switch { @@ -16980,7 +17067,7 @@ extension _Texture<T,__Shape2D, 0, 0, 0, $(kCoreModule_ResourceAccessFeedback), // Without Clamp [require(cpp_hlsl)] - void WriteSamplerFeedback<S>(Texture2D<S> tex, SamplerState samp, float2 location) + void WriteSamplerFeedback<S:ITexelElement>(Texture2D<S> tex, SamplerState samp, float2 location) { __target_switch { @@ -16990,7 +17077,7 @@ extension _Texture<T,__Shape2D, 0, 0, 0, $(kCoreModule_ResourceAccessFeedback), } [require(cpp_hlsl)] - void WriteSamplerFeedbackBias<S>(Texture2D<S> tex, SamplerState samp, float2 location, float bias) + void WriteSamplerFeedbackBias<S:ITexelElement>(Texture2D<S> tex, SamplerState samp, float2 location, float bias) { __target_switch { @@ -17000,7 +17087,7 @@ extension _Texture<T,__Shape2D, 0, 0, 0, $(kCoreModule_ResourceAccessFeedback), } [require(cpp_hlsl)] - void WriteSamplerFeedbackGrad<S>(Texture2D<S> tex, SamplerState samp, float2 location, float2 ddx, float2 ddy) + void WriteSamplerFeedbackGrad<S:ITexelElement>(Texture2D<S> tex, SamplerState samp, float2 location, float2 ddx, float2 ddy) { __target_switch { @@ -17010,13 +17097,14 @@ extension _Texture<T,__Shape2D, 0, 0, 0, $(kCoreModule_ResourceAccessFeedback), } }; -__generic<T:__BuiltinSamplerFeedbackType> -extension _Texture<T,__Shape2D, 1, 0, 0, $(kCoreModule_ResourceAccessFeedback), 0, 0, 0> +extension<T> _Texture<T,__Shape2D, 1, 0, 0, $(kCoreModule_ResourceAccessFeedback), 0, 0, 0> + where T:__BuiltinSamplerFeedbackType + where T:ITexelElement { // With Clamp [require(cpp_hlsl)] - void WriteSamplerFeedback<S>(Texture2DArray<S> texArray, SamplerState samp, float3 location, float clamp) + void WriteSamplerFeedback<S:ITexelElement>(Texture2DArray<S> texArray, SamplerState samp, float3 location, float clamp) { __target_switch { @@ -17026,7 +17114,7 @@ extension _Texture<T,__Shape2D, 1, 0, 0, $(kCoreModule_ResourceAccessFeedback), } [require(cpp_hlsl)] - void WriteSamplerFeedbackBias<S>(Texture2DArray<S> texArray, SamplerState samp, float3 location, float bias, float clamp) + void WriteSamplerFeedbackBias<S:ITexelElement>(Texture2DArray<S> texArray, SamplerState samp, float3 location, float bias, float clamp) { __target_switch { @@ -17036,7 +17124,7 @@ extension _Texture<T,__Shape2D, 1, 0, 0, $(kCoreModule_ResourceAccessFeedback), } [require(cpp_hlsl)] - void WriteSamplerFeedbackGrad<S>(Texture2DArray<S> texArray, SamplerState samp, float3 location, float3 ddx, float3 ddy, float clamp) + void WriteSamplerFeedbackGrad<S:ITexelElement>(Texture2DArray<S> texArray, SamplerState samp, float3 location, float3 ddx, float3 ddy, float clamp) { __target_switch { @@ -17048,7 +17136,7 @@ extension _Texture<T,__Shape2D, 1, 0, 0, $(kCoreModule_ResourceAccessFeedback), // Level [require(cpp_hlsl)] - void WriteSamplerFeedbackLevel<S>(Texture2DArray<S> texArray, SamplerState samp, float3 location, float lod) + void WriteSamplerFeedbackLevel<S:ITexelElement>(Texture2DArray<S> texArray, SamplerState samp, float3 location, float lod) { __target_switch { @@ -17060,7 +17148,7 @@ extension _Texture<T,__Shape2D, 1, 0, 0, $(kCoreModule_ResourceAccessFeedback), // Without Clamp [require(cpp_hlsl)] - void WriteSamplerFeedback<S>(Texture2DArray<S> texArray, SamplerState samp, float3 location) + void WriteSamplerFeedback<S:ITexelElement>(Texture2DArray<S> texArray, SamplerState samp, float3 location) { __target_switch { @@ -17070,7 +17158,7 @@ extension _Texture<T,__Shape2D, 1, 0, 0, $(kCoreModule_ResourceAccessFeedback), } [require(cpp_hlsl)] - void WriteSamplerFeedbackBias<S>(Texture2DArray<S> texArray, SamplerState samp, float3 location, float bias) + void WriteSamplerFeedbackBias<S:ITexelElement>(Texture2DArray<S> texArray, SamplerState samp, float3 location, float bias) { __target_switch { @@ -17080,7 +17168,7 @@ extension _Texture<T,__Shape2D, 1, 0, 0, $(kCoreModule_ResourceAccessFeedback), } [require(cpp_hlsl)] - void WriteSamplerFeedbackGrad<S>(Texture2DArray<S> texArray, SamplerState samp, float3 location, float3 ddx, float3 ddy) + void WriteSamplerFeedbackGrad<S:ITexelElement>(Texture2DArray<S> texArray, SamplerState samp, float3 location, float3 ddx, float3 ddy) { __target_switch { @@ -20025,10 +20113,10 @@ ${ // for any resource type. } -__intrinsic_op($(kIROp_GetRegisterSpace)) uint __getRegisterSpace<T, Shape: __ITextureShape, let isArray:int, let isMS:int, let sampleCount:int, let access:int, let isShadow:int, let isCombined:int, let format:int>(_Texture<T,Shape,isArray,isMS,sampleCount,access,isShadow,isCombined,format> texture); +__intrinsic_op($(kIROp_GetRegisterSpace)) uint __getRegisterSpace<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let isMS:int, let sampleCount:int, let access:int, let isShadow:int, let isCombined:int, let format:int>(_Texture<T,Shape,isArray,isMS,sampleCount,access,isShadow,isCombined,format> texture); __intrinsic_op($(kIROp_GetRegisterSpace)) uint __getRegisterSpace(SamplerState sampler); -__intrinsic_op($(kIROp_GetRegisterIndex)) uint __getRegisterIndex<T, Shape: __ITextureShape, let isArray:int, let isMS:int, let sampleCount:int, let access:int, let isShadow:int, let isCombined:int, let format:int>(_Texture<T,Shape,isArray,isMS,sampleCount,access,isShadow,isCombined,format> texture); +__intrinsic_op($(kIROp_GetRegisterIndex)) uint __getRegisterIndex<T:ITexelElement, Shape: __ITextureShape, let isArray:int, let isMS:int, let sampleCount:int, let access:int, let isShadow:int, let isCombined:int, let format:int>(_Texture<T,Shape,isArray,isMS,sampleCount,access,isShadow,isCombined,format> texture); __intrinsic_op($(kIROp_GetRegisterIndex)) uint __getRegisterIndex(SamplerState sampler); //@public: @@ -20218,7 +20306,7 @@ ${ // further clutter the original type declarations. } -__generic<T, Shape: __ITextureShape, let sampleCount:int, let isShadow:int, let format:int> +__generic<T:ITexelElement, Shape: __ITextureShape, let sampleCount:int, let isShadow:int, let format:int> extension _Texture<T,Shape,0,0,sampleCount,0,isShadow,0,format> { ${ @@ -21035,7 +21123,7 @@ enum __DynamicResourceKind Sampler = 1 } -__generic<T, Shape : __ITextureShape, let isArray : int, let isMS : int, let sampleCount : int, let access : int, let isShadow : int, let isCombined : int, let format : int> +__generic<T:ITexelElement, Shape : __ITextureShape, let isArray : int, let isMS : int, let sampleCount : int, let access : int, let isShadow : int, let isCombined : int, let format : int> extension _Texture<T, Shape, isArray, isMS, sampleCount, access, isShadow, isCombined, format> : __IDynamicResourceCastable<__DynamicResourceKind.General> { __intrinsic_op($(kIROp_CastDynamicResource)) diff --git a/source/slang/slang-check-inheritance.cpp b/source/slang/slang-check-inheritance.cpp index f774aae38..7af2d2e81 100644 --- a/source/slang/slang-check-inheritance.cpp +++ b/source/slang/slang-check-inheritance.cpp @@ -1149,6 +1149,10 @@ InheritanceInfo SharedSemanticsContext::_calcInheritanceInfo( info.facets = FacetList(directFacet); return info; } + else if (auto modifiedType = as<ModifiedType>(type)) + { + return _calcInheritanceInfo(modifiedType->getBase(), circularityInfo); + } else { // As a fallback, any type not covered by the above cases will diff --git a/source/slang/slang-emit-cpp.cpp b/source/slang/slang-emit-cpp.cpp index b0d1fbb4c..13a85e8ab 100644 --- a/source/slang/slang-emit-cpp.cpp +++ b/source/slang/slang-emit-cpp.cpp @@ -614,7 +614,10 @@ void CPPSourceEmitter::emitGlobalRTTISymbolPrefix() void CPPSourceEmitter::emitWitnessTable(IRWitnessTable* witnessTable) { - auto interfaceType = cast<IRInterfaceType>(witnessTable->getConformanceType()); + auto interfaceType = as<IRInterfaceType>(witnessTable->getConformanceType()); + + if (!interfaceType) + return; // Ignore witness tables for builtin interface types. if (isBuiltin(interfaceType)) diff --git a/source/slang/slang-ir-peephole.cpp b/source/slang/slang-ir-peephole.cpp index 0a08c67ff..ced0b5eb0 100644 --- a/source/slang/slang-ir-peephole.cpp +++ b/source/slang/slang-ir-peephole.cpp @@ -829,6 +829,8 @@ struct PeepholeContext : InstPassBase case kIROp_VectorReshape: { auto fromType = as<IRVectorType>(inst->getOperand(0)->getDataType()); + if (!fromType) + break; auto resultType = as<IRVectorType>(inst->getDataType()); if (!resultType) { |
