Skip to content

Commit d5d03d1

Browse files
Emit errors when invalid capabilities are used (shader-slang#4510)
* Fix invalid capabilities being allowed fixes: shader-slang#4506 fixes: shader-slang#4508 1. As per shader-slang#4506, no longer allow invalid `[require(...)]` 2. As per shader-slang#4508, no longer allow mismatch between `case` and `require` of a calling function 3. Fixes incorrect hlsl.meta capabilities 4. Added a ref to the parent function/decl for when erroring with capabilities to help debug meta.slang files for when weird source locations are generated. * rename vars and copy lambdas by value * fix some more capabilities * incorrect capabilities on a texture test * push capabilities fix note: seperated capabilities for glsl,spirv,cuda,hlsl since not all functions support all targets (source of capability error) * fix cmd line arg by using `xslang` to passthrough to slangc * let auto-infer run for certain capabilities to reduce simple mistakes --------- Co-authored-by: Jay Kwak <82421531+jkwak-work@users.noreply.github.com>
1 parent bd01bd3 commit d5d03d1

9 files changed

+145
-85
lines changed

source/slang/glsl.meta.slang

+15-15
Original file line numberDiff line numberDiff line change
@@ -1870,7 +1870,7 @@ public ivec3 textureSize(Sampler2DMSArray<vector<T,N>,sampleCount> sampler)
18701870

18711871
__generic<T, let isArray:int, let sampleCount:int, let isShadow:int, let format:int>
18721872
[ForceInline]
1873-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylod)]
1873+
[require(glsl_hlsl_metal_spirv, texture_querylod)]
18741874
public vec2 textureQueryLod(__TextureImpl<
18751875
T,
18761876
__Shape1D,
@@ -1903,7 +1903,7 @@ public vec2 textureQueryLod(__TextureImpl<
19031903

19041904
__generic<T, Shape: __ITextureShape, let isArray:int, let sampleCount:int, let isShadow:int, let format:int>
19051905
[ForceInline]
1906-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylod)]
1906+
[require(glsl_hlsl_metal_spirv, texture_querylod)]
19071907
public vec2 textureQueryLod(__TextureImpl<
19081908
T,
19091909
Shape,
@@ -1940,7 +1940,7 @@ public vec2 textureQueryLod(__TextureImpl<
19401940

19411941
__generic<T:__BuiltinArithmeticType, let N:int>
19421942
[ForceInline]
1943-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylevels)]
1943+
[require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)]
19441944
public int textureQueryLevels(Sampler1D<vector<T,N>> sampler)
19451945
{
19461946
int width;
@@ -1951,7 +1951,7 @@ public int textureQueryLevels(Sampler1D<vector<T,N>> sampler)
19511951

19521952
__generic<T:__BuiltinArithmeticType, let N:int>
19531953
[ForceInline]
1954-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylevels)]
1954+
[require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)]
19551955
public int textureQueryLevels(Sampler2D<vector<T,N>> sampler)
19561956
{
19571957
vector<int,2> dim;
@@ -1962,7 +1962,7 @@ public int textureQueryLevels(Sampler2D<vector<T,N>> sampler)
19621962

19631963
__generic<T:__BuiltinArithmeticType, let N:int>
19641964
[ForceInline]
1965-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylevels)]
1965+
[require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)]
19661966
public int textureQueryLevels(Sampler3D<vector<T,N>> sampler)
19671967
{
19681968
vector<int,3> dim;
@@ -1973,7 +1973,7 @@ public int textureQueryLevels(Sampler3D<vector<T,N>> sampler)
19731973

19741974
__generic<T:__BuiltinArithmeticType, let N:int>
19751975
[ForceInline]
1976-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylevels)]
1976+
[require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)]
19771977
public int textureQueryLevels(SamplerCube<vector<T,N>> sampler)
19781978
{
19791979
vector<int,2> dim;
@@ -1984,7 +1984,7 @@ public int textureQueryLevels(SamplerCube<vector<T,N>> sampler)
19841984

19851985
__generic<T:__BuiltinArithmeticType, let N:int>
19861986
[ForceInline]
1987-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylevels)]
1987+
[require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)]
19881988
public int textureQueryLevels(Sampler1DArray<vector<T,N>> sampler)
19891989
{
19901990
vector<int,2> dim;
@@ -1995,7 +1995,7 @@ public int textureQueryLevels(Sampler1DArray<vector<T,N>> sampler)
19951995

19961996
__generic<T:__BuiltinArithmeticType, let N:int>
19971997
[ForceInline]
1998-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylevels)]
1998+
[require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)]
19991999
public int textureQueryLevels(Sampler2DArray<vector<T,N>> sampler)
20002000
{
20012001
vector<int,3> dim;
@@ -2006,7 +2006,7 @@ public int textureQueryLevels(Sampler2DArray<vector<T,N>> sampler)
20062006

20072007
__generic<T:__BuiltinArithmeticType, let N:int>
20082008
[ForceInline]
2009-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylevels)]
2009+
[require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)]
20102010
public int textureQueryLevels(SamplerCubeArray<vector<T,N>> sampler)
20112011
{
20122012
vector<int,3> dim;
@@ -2016,7 +2016,7 @@ public int textureQueryLevels(SamplerCubeArray<vector<T,N>> sampler)
20162016
}
20172017

20182018
[ForceInline]
2019-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylevels)]
2019+
[require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)]
20202020
public int textureQueryLevels(sampler1DShadow sampler)
20212021
{
20222022
int dim;
@@ -2026,7 +2026,7 @@ public int textureQueryLevels(sampler1DShadow sampler)
20262026
}
20272027

20282028
[ForceInline]
2029-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylevels)]
2029+
[require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)]
20302030
public int textureQueryLevels(sampler2DShadow sampler)
20312031
{
20322032
vector<int,2> dim;
@@ -2036,7 +2036,7 @@ public int textureQueryLevels(sampler2DShadow sampler)
20362036
}
20372037

20382038
[ForceInline]
2039-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylevels)]
2039+
[require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)]
20402040
public int textureQueryLevels(samplerCubeShadow sampler)
20412041
{
20422042
vector<int,2> dim;
@@ -2046,7 +2046,7 @@ public int textureQueryLevels(samplerCubeShadow sampler)
20462046
}
20472047

20482048
[ForceInline]
2049-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylevels)]
2049+
[require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)]
20502050
public int textureQueryLevels(sampler1DArrayShadow sampler)
20512051
{
20522052
vector<int,2> dim;
@@ -2056,7 +2056,7 @@ public int textureQueryLevels(sampler1DArrayShadow sampler)
20562056
}
20572057

20582058
[ForceInline]
2059-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylevels)]
2059+
[require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)]
20602060
public int textureQueryLevels(sampler2DArrayShadow sampler)
20612061
{
20622062
vector<int,3> dim;
@@ -2066,7 +2066,7 @@ public int textureQueryLevels(sampler2DArrayShadow sampler)
20662066
}
20672067

20682068
[ForceInline]
2069-
[require(cpp_cuda_glsl_hlsl_spirv, texture_querylevels)]
2069+
[require(cpp_glsl_hlsl_metal_spirv, texture_querylevels)]
20702070
public int textureQueryLevels(samplerCubeArrayShadow sampler)
20712071
{
20722072
vector<int,3> dim;

source/slang/hlsl.meta.slang

+11-17
Original file line numberDiff line numberDiff line change
@@ -2901,7 +2901,6 @@ extension __TextureImpl<T,Shape,isArray,0,sampleCount,$(access),isShadow, 0,form
29012901

29022902
[__readNone]
29032903
[ForceInline]
2904-
[require(hlsl, texture_sm_4_1)]
29052904
T Load(vector<int, Shape.dimensions+isArray> location, vector<int, Shape.dimensions+isArray> offset, out uint status)
29062905
{
29072906
__target_switch
@@ -3124,7 +3123,6 @@ extension __TextureImpl<T,Shape,isArray,1,sampleCount,$(access),isShadow, 0,form
31243123

31253124
[__readNone]
31263125
[ForceInline]
3127-
[require(hlsl, texture_sm_4_1_compute_fragment)]
31283126
T Load(vector<int, Shape.dimensions+isArray> location, int sampleIndex, vector<int, Shape.dimensions+isArray> offset, out uint status)
31293127
{
31303128
__target_switch
@@ -3292,11 +3290,7 @@ ${{{{
32923290
if (shape == kStdlibShapeIndex3D && isArray == 1)
32933291
continue;
32943292
const char* textureTypeName = isCombined ? "Sampler" : "Texture";
3295-
3296-
StringBuilder requireStringBuilder;
3297-
auto requireString = requireStringBuilder.toString();
32983293
}}}}
3299-
$(requireString)
33003294
typealias $(accessPrefix[access])$(textureTypeName)$(shapeTypeNames[shape])$(msPostFix[isMS])$(arrayPostFix[isArray])<T=float4, let sampleCount:int=0, let format:int=0> = __TextureImpl<T, __Shape$(shapeTypeNames[shape]), $(isArray), $(isMS), sampleCount, $(access), 0, $(isCombined), format>;
33013295
${{{{
33023296
}
@@ -14117,7 +14111,7 @@ vector<T, N> WaveActive$(opName.hlslName)(vector<T, N> expr)
1411714111
}
1411814112

1411914113
__generic<T : __BuiltinIntegerType, let N : int, let M : int>
14120-
[require(cuda_hlsl, subgroup_arithmetic)]
14114+
[require(cuda_glsl_hlsl_spirv, subgroup_arithmetic)]
1412114115
matrix<T, N, M> WaveActive$(opName.hlslName)(matrix<T, N, M> expr)
1412214116
{
1412314117
__target_switch
@@ -14189,7 +14183,7 @@ vector<T, N> WaveActive$(opName)(vector<T, N> expr)
1418914183
}
1419014184

1419114185
__generic<T : __BuiltinArithmeticType, let N : int, let M : int>
14192-
[require(cuda_hlsl, subgroup_arithmetic)]
14186+
[require(cuda_glsl_hlsl_spirv, subgroup_arithmetic)]
1419314187
matrix<T, N, M> WaveActive$(opName)(matrix<T, N, M> expr)
1419414188
{
1419514189
__target_switch
@@ -14283,7 +14277,7 @@ vector<T,N> WaveActive$(opName.hlslName)(vector<T,N> expr)
1428314277
}
1428414278

1428514279
__generic<T : __BuiltinArithmeticType, let N : int, let M : int>
14286-
[require(cuda_hlsl, subgroup_arithmetic)]
14280+
[require(cuda_glsl_hlsl_spirv, subgroup_arithmetic)]
1428714281
matrix<T, N, M> WaveActive$(opName.hlslName)(matrix<T, N, M> expr)
1428814282
{
1428914283
__target_switch
@@ -14600,7 +14594,7 @@ vector<T,N> WavePrefixProduct(vector<T,N> expr)
1460014594
}
1460114595

1460214596
__generic<T : __BuiltinArithmeticType, let N : int, let M : int>
14603-
[require(cuda_hlsl, subgroup_arithmetic)]
14597+
[require(cuda_glsl_hlsl_spirv, subgroup_arithmetic)]
1460414598
matrix<T, N, M> WavePrefixProduct(matrix<T, N, M> expr)
1460514599
{
1460614600
__target_switch
@@ -14676,7 +14670,7 @@ vector<T,N> WavePrefixSum(vector<T,N> expr)
1467614670
}
1467714671

1467814672
__generic<T : __BuiltinArithmeticType, let N : int, let M : int>
14679-
[require(cuda_hlsl, subgroup_arithmetic)]
14673+
[require(cuda_glsl_hlsl_spirv, subgroup_arithmetic)]
1468014674
matrix<T,N,M> WavePrefixSum(matrix<T,N,M> expr)
1468114675
{
1468214676
__target_switch
@@ -14732,7 +14726,7 @@ vector<T,N> WaveReadLaneFirst(vector<T,N> expr)
1473214726
}
1473314727

1473414728
__generic<T : __BuiltinType, let N : int, let M : int>
14735-
[require(cuda_hlsl, subgroup_ballot)]
14729+
[require(cuda_glsl_hlsl_spirv, subgroup_ballot)]
1473614730
matrix<T,N,M> WaveReadLaneFirst(matrix<T,N,M> expr)
1473714731
{
1473814732
__target_switch
@@ -14796,7 +14790,7 @@ vector<T,N> WaveBroadcastLaneAt(vector<T,N> value, constexpr int lane)
1479614790
}
1479714791

1479814792
__generic<T : __BuiltinType, let N : int, let M : int>
14799-
[require(cuda_hlsl, subgroup_ballot)]
14793+
[require(cuda_glsl_hlsl_spirv, subgroup_ballot)]
1480014794
matrix<T, N, M> WaveBroadcastLaneAt(matrix<T, N, M> value, constexpr int lane)
1480114795
{
1480214796
__target_switch
@@ -14857,7 +14851,7 @@ vector<T,N> WaveReadLaneAt(vector<T,N> value, int lane)
1485714851
}
1485814852

1485914853
__generic<T : __BuiltinType, let N : int, let M : int>
14860-
[require(cuda_hlsl, subgroup_shuffle)]
14854+
[require(cuda_glsl_hlsl_spirv, subgroup_shuffle)]
1486114855
matrix<T, N, M> WaveReadLaneAt(matrix<T, N, M> value, int lane)
1486214856
{
1486314857
__target_switch
@@ -15023,7 +15017,7 @@ uint4 WaveMatch(vector<T,N> value)
1502315017
}
1502415018

1502515019
__generic<T : __BuiltinType, let N : int, let M : int>
15026-
[require(cuda_glsl_hlsl, subgroup_partitioned)]
15020+
[require(cuda_glsl_hlsl_spirv, subgroup_partitioned)]
1502715021
uint4 WaveMatch(matrix<T,N,M> value)
1502815022
{
1502915023
__target_switch
@@ -16243,7 +16237,7 @@ void SetMeshOutputCounts(uint vertexCount, uint primitiveCount)
1624316237
// This function cannot be inlined due to a legalization pass happening mid-way through processing
1624416238
// and later more processing happening to the function which requires eventual inlining.
1624516239
[KnownBuiltin("DispatchMesh")]
16246-
[require(glsl_hlsl_spirv, meshshading)]
16240+
[require(glsl_hlsl_metal_spirv, meshshading)]
1624716241
[noRefInline]
1624816242
void DispatchMesh<P>(uint threadGroupCountX, uint threadGroupCountY, uint threadGroupCountZ, __ref P meshPayload)
1624916243
{
@@ -18533,7 +18527,7 @@ struct HitObject
1853318527

1853418528
/// Returns the attributes of a hit. Valid if the hit object represents a hit or a miss.
1853518529
[ForceInline]
18536-
[require(glsl_spirv, ser_raygen_closesthit_miss)]
18530+
[require(glsl_hlsl_spirv, ser_raygen_closesthit_miss)]
1853718531
attr_t GetAttributes<attr_t>()
1853818532
{
1853918533
__target_switch

source/slang/slang-capabilities.capdef

+18-14
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ alias rayquery = GL_EXT_ray_query | _sm_6_3;
401401
alias raytracing_motionblur = raytracing + motionblur | cuda;
402402
alias ser_motion = ser + motionblur;
403403
alias shaderclock = GL_EXT_shader_realtime_clock | hlsl_nvapi | cpp | cuda;
404-
alias meshshading_internal = GL_EXT_mesh_shader | _sm_6_5;
404+
alias meshshading_internal = GL_EXT_mesh_shader | _sm_6_5 | metal;
405405
alias meshshading = amplification_mesh + meshshading_internal;
406406
alias fragmentshaderinterlock = _GL_ARB_fragment_shader_interlock | hlsl_nvapi | spvFragmentShaderPixelInterlockEXT;
407407
alias atomic64 = GL_EXT_shader_atomic_int64 | _sm_6_6 | cpp | cuda;
@@ -447,7 +447,7 @@ alias sm_4_0_version = _sm_4_0
447447
;
448448
alias sm_4_0 = sm_4_0_version
449449
| SPV_GOOGLE_user_type + spvMinLod
450-
| GL_ARB_sparse_texture_clamp + GL_EXT_samplerless_texture_functions + GL_EXT_texture_query_lod + GL_EXT_texture_shadow_lod + GL_EXT_debug_printf
450+
| GL_ARB_sparse_texture_clamp + GL_EXT_samplerless_texture_functions + GL_EXT_texture_query_lod + GL_EXT_texture_shadow_lod + GL_EXT_debug_printf + GL_ARB_shader_image_size
451451
;
452452

453453
alias sm_4_1_version = _sm_4_1
@@ -458,6 +458,7 @@ alias sm_4_1_version = _sm_4_1
458458
| cpp
459459
;
460460
alias sm_4_1 = sm_4_1_version
461+
| GL_ARB_texture_gather + GL_ARB_texture_query_levels + GL_ARB_shader_texture_image_samples
461462
// previous
462463
| sm_4_0
463464
;
@@ -737,6 +738,9 @@ alias consumestructuredbuffer = sm_5_0_version;
737738
alias fragmentprocessing = fragment + _sm_5_0
738739
| fragment + glsl_spirv
739740
| raytracingstages_compute_amplification_mesh + GL_NV_compute_shader_derivatives
741+
| fragment + metal
742+
| fragment + cpp
743+
| fragment + cuda
740744
;
741745
alias fragmentprocessing_derivativecontrol = fragment + _sm_5_0
742746
| fragment + GL_ARB_derivative_control
@@ -758,15 +762,15 @@ alias texture_sm_4_1_samplerless = texture_sm_4_1
758762
// supposedly works on only limited stages, support all stages for now
759763
alias texture_sm_4_1_compute_fragment = texture_sm_4_1;
760764
alias texture_sm_4_0_fragment = texture_sm_4_0;
761-
alias texture_sm_4_1_clamp_fragment = texture_sm_4_0_fragment + GL_ARB_sparse_texture_clamp;
765+
alias texture_sm_4_1_clamp_fragment = texture_sm_4_0_fragment | GL_ARB_sparse_texture_clamp;
762766
alias texture_sm_4_1_vertex_fragment_geometry = texture_sm_4_1;
763-
alias texture_gather = texture_sm_4_1_vertex_fragment_geometry + GL_ARB_texture_gather;
764-
alias image_samples = texture_sm_4_1_compute_fragment + GL_ARB_shader_texture_image_samples;
765-
alias image_size = texture_sm_4_1_compute_fragment + GL_ARB_shader_image_size;
766-
alias texture_size = texture_sm_4_1 + GL_ARB_shader_image_size;
767-
alias texture_querylod = texture_sm_4_1 + GL_EXT_texture_query_lod;
768-
alias texture_querylevels = texture_sm_4_1 + GL_ARB_texture_query_levels;
769-
alias texture_shadowlod = texture_sm_4_1 + GL_EXT_texture_shadow_lod
767+
alias texture_gather = texture_sm_4_1_vertex_fragment_geometry | GL_ARB_texture_gather;
768+
alias image_samples = texture_sm_4_1_compute_fragment | GL_ARB_shader_texture_image_samples;
769+
alias image_size = texture_sm_4_1_compute_fragment | GL_ARB_shader_image_size;
770+
alias texture_size = texture_sm_4_1 | GL_ARB_shader_image_size;
771+
alias texture_querylod = texture_sm_4_1 | GL_EXT_texture_query_lod;
772+
alias texture_querylevels = texture_sm_4_1 | GL_ARB_texture_query_levels;
773+
alias texture_shadowlod = texture_sm_4_1 | GL_EXT_texture_shadow_lod
770774
| texture_sm_4_1;
771775

772776
alias atomic_glsl_float1 = GL_EXT_shader_atomic_float;
@@ -803,19 +807,19 @@ alias subgroup_basic_ballot = glsl + GL_KHR_shader_subgroup_basic + subgroup_bal
803807
alias subgroup_vote = GL_KHR_shader_subgroup_vote | _sm_6_0 | _cuda_sm_7_0;
804808
alias shaderinvocationgroup = subgroup_vote;
805809
alias subgroup_arithmetic = GL_KHR_shader_subgroup_arithmetic | _sm_6_0 | _cuda_sm_7_0;
806-
alias subgroup_shuffle = glsl + GL_KHR_shader_subgroup_shuffle | _sm_6_0 | _cuda_sm_7_0;
810+
alias subgroup_shuffle = GL_KHR_shader_subgroup_shuffle | _sm_6_0 | _cuda_sm_7_0;
807811
alias subgroup_shufflerelative = GL_KHR_shader_subgroup_shuffle_relative | _sm_6_0 | _cuda_sm_7_0;
808812
alias subgroup_clustered = GL_KHR_shader_subgroup_clustered | _sm_6_0 | _cuda_sm_7_0;
809813
alias subgroup_quad = GL_KHR_shader_subgroup_quad | _sm_6_0 | _cuda_sm_7_0;
810-
alias subgroup_partitioned = GL_NV_shader_subgroup_partitioned + subgroup_ballot_activemask | _sm_6_5;
814+
alias subgroup_partitioned = GL_NV_shader_subgroup_partitioned + subgroup_ballot_activemask | _sm_6_5 | _cuda_sm_7_0;
811815

812816
alias atomic_glsl_hlsl_nvapi_cuda_float1 = atomic_glsl_float1 | hlsl_nvapi + _sm_4_0 | _cuda_sm_2_0;
813817
alias atomic_glsl_hlsl_nvapi_cuda5_int64 = atomic_glsl_int64 | hlsl_nvapi + _sm_4_0 | _cuda_sm_6_0;
814818
alias atomic_glsl_hlsl_nvapi_cuda6_int64 = atomic_glsl_int64 | hlsl_nvapi + _sm_4_0 | _cuda_sm_6_0;
815819
alias atomic_glsl_hlsl_nvapi_cuda9_int64 = atomic_glsl_int64 | hlsl_nvapi + _sm_4_0 | _cuda_sm_9_0;
816820

817-
alias atomic_glsl_hlsl_cuda = atomic_glsl | _sm_5_0 | _cuda_sm_2_0;
818-
alias atomic_glsl_hlsl_cuda9_int64 = atomic_glsl_int64 | _sm_6_6 | _cuda_sm_9_0;
821+
alias atomic_glsl_hlsl_cuda = atomic_glsl | _sm_5_0 | _cuda_sm_2_0 | metal;
822+
alias atomic_glsl_hlsl_cuda9_int64 = atomic_glsl_int64 | _sm_6_6 | _cuda_sm_9_0 | metal;
819823

820824
alias helper_lane = _sm_6_0 + fragment
821825
| GL_EXT_demote_to_helper_invocation + fragment

0 commit comments

Comments
 (0)