From da5cf478c6be06c9e6c20917a7d472cbdcb624e3 Mon Sep 17 00:00:00 2001 From: Gangzheng Tong Date: Fri, 30 May 2025 17:16:59 -0700 Subject: Add check for the variable requirement (#6677) * Add check for the variable requirement This change adds the capability check for the variables requirement. With this check, the shader ``` [require(cpp_cuda_glsl_hlsl_metal_spirv)] Buffer InputTyped; [require(cpp_cuda_glsl_hlsl_metal_spirv)] RWBuffer OutputTyped; ``` will issue error if targeting to WSGL e.g. `.\build\Debug\bin\slangc .\tests\wgsl_no_buffer.slang -o wgsl_no_buffer.txt -target wgsl -entry Main -stage compute` .\tests\wgsl_no_buffer.slang(2): error 36108: 'InputTyped' has dependencies that are not compatible on the required target 'wgsl'. Buffer InputTyped; ^~~~~~~~~~ .\tests\wgsl_no_buffer.slang(4): error 36108: 'OutputTyped' has dependencies that are not compatible on the required target 'wgsl'. RWBuffer OutputTyped; ^~~~~~~~~~~ Fixes #6304 * Add var capability tests * Do capability checks for global var only * Add inferredCapabilityRequirements to var capability check * Add requirement to the intrinsic types Buffer/RWBuffer * format code * Update capabliity test * use DefaultDataLayout as default data layout * Use visitMemberExpr to check the capabilities * Update the cap tests to match the error messages * update test to use the ScalarDataLayout for hlsl target * Update tests check condition to use error number only * Add default push_constant data layout type --------- Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com> --- tests/bugs/gh-3429.slang | 3 ++- .../capability/var-capability-incompatible.slang | 19 +++++++++++++++++++ .../capability/var-capability-wgsl-2.slang | 15 +++++++++++++++ .../capability/var-capability-wgsl.slang | 15 +++++++++++++++ .../capability/var-implicit-capability-wgsl.slang | 14 ++++++++++++++ 5 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 tests/language-feature/capability/var-capability-incompatible.slang create mode 100644 tests/language-feature/capability/var-capability-wgsl-2.slang create mode 100644 tests/language-feature/capability/var-capability-wgsl.slang create mode 100644 tests/language-feature/capability/var-implicit-capability-wgsl.slang (limited to 'tests') diff --git a/tests/bugs/gh-3429.slang b/tests/bugs/gh-3429.slang index c9b49e5f4..115ebdb06 100644 --- a/tests/bugs/gh-3429.slang +++ b/tests/bugs/gh-3429.slang @@ -14,7 +14,8 @@ struct PushConstants bool bufferHasOnlyOneElement; }; -[[vk::push_constant]] ConstantBuffer gPushConstants; +[[vk::push_constant]] +ConstantBuffer gPushConstants; float loadDataConditionTrue() { diff --git a/tests/language-feature/capability/var-capability-incompatible.slang b/tests/language-feature/capability/var-capability-incompatible.slang new file mode 100644 index 000000000..89378f6b3 --- /dev/null +++ b/tests/language-feature/capability/var-capability-incompatible.slang @@ -0,0 +1,19 @@ +//TEST:SIMPLE(filecheck=CHECK):-target spirv +[require(hlsl)] +struct MyType +{} + +//CHECK: ([[# @LINE+2]]): error 36107 +[numthreads(1,1,1)] +void f1() +{ + MyType t; // compile to spirv should result error here. +} + +ConstantBuffer t2; +//CHECK: ([[# @LINE+2]]): error 36107 +[numthreads(1,1,1)] +void f2() // compile to spirv should result error here. +{ + ConstantBuffer t3 = t2; +} diff --git a/tests/language-feature/capability/var-capability-wgsl-2.slang b/tests/language-feature/capability/var-capability-wgsl-2.slang new file mode 100644 index 000000000..4fb259ea6 --- /dev/null +++ b/tests/language-feature/capability/var-capability-wgsl-2.slang @@ -0,0 +1,15 @@ +//TEST:SIMPLE(filecheck=CHECK_IGNORE_CAPS): -target wgsl -entry Main -stage compute + +//CHECK_IGNORE_CAPS-NOT: error 36107 +[require(cpp_cuda_glsl_hlsl_metal_spirv)] +struct inputWrapper { + RWBuffer InputTyped; +}; + +inputWrapper input; + +[numthreads(64, 1, 1)] +void Main(uint3 DTid : SV_DispatchThreadID) +{ + // We should not see an error here, because the inputWrapper is not referenced. +} \ No newline at end of file diff --git a/tests/language-feature/capability/var-capability-wgsl.slang b/tests/language-feature/capability/var-capability-wgsl.slang new file mode 100644 index 000000000..2a67cc6e2 --- /dev/null +++ b/tests/language-feature/capability/var-capability-wgsl.slang @@ -0,0 +1,15 @@ +//TEST:SIMPLE(filecheck=CHECK): -target wgsl -entry Main -stage compute +//TEST:SIMPLE(filecheck=CHECK_IGNORE_CAPS): -target wgsl -entry Main -stage compute -ignore-capabilities + +[require(cpp_cuda_glsl_hlsl_metal_spirv)] +Buffer InputTyped; +[require(cpp_cuda_glsl_hlsl_metal_spirv)] +RWBuffer OutputTyped; + +//CHECK: ([[# @LINE+3]]): error 36107 +//CHECK_IGNORE_CAPS-NOT: error 36107 +[numthreads(64, 1, 1)] +void Main(uint3 DTid : SV_DispatchThreadID) +{ + OutputTyped[DTid.x] = InputTyped[DTid.x]; +} \ No newline at end of file diff --git a/tests/language-feature/capability/var-implicit-capability-wgsl.slang b/tests/language-feature/capability/var-implicit-capability-wgsl.slang new file mode 100644 index 000000000..56aa4157d --- /dev/null +++ b/tests/language-feature/capability/var-implicit-capability-wgsl.slang @@ -0,0 +1,14 @@ +//TEST:SIMPLE(filecheck=CHECK): -target wgsl -entry Main -stage compute +//TEST:SIMPLE(filecheck=CHECK_IGNORE_CAPS): -target wgsl -entry Main -stage compute -ignore-capabilities + + +Buffer InputTyped; +RWBuffer OutputTyped; + +//CHECK: ([[# @LINE+3]]): error 36107 +//CHECK_IGNORE_CAPS-NOT: error 36107 +[numthreads(64, 1, 1)] +void Main(uint3 DTid : SV_DispatchThreadID) +{ + OutputTyped[DTid.x] = InputTyped[DTid.x]; +} \ No newline at end of file -- cgit v1.2.3