Skip to content

Commit f829420

Browse files
authored
Make various parameters and return types require specialization when targeting WGSL (shader-slang#5483)
Structured buffer types translate to array types in the WGSL emitter. WGSL doesn't allow passing runtime-sized arrays to functions. Similarly for pointers to texture handles. Also, structured buffers (runtime-sized arrays) cannot be returned in WGSL. This closes issue shader-slang#5228, issue shader-slang#5278 and issue shader-slang#5288 by enabling specialized functions to be generated in these cases, in order to work around these constraints.
1 parent 79056cd commit f829420

8 files changed

+29
-8
lines changed

source/slang/slang-compiler.h

+3
Original file line numberDiff line numberDiff line change
@@ -1958,6 +1958,9 @@ bool isCUDATarget(TargetRequest* targetReq);
19581958
// Are we generating code for a CPU target
19591959
bool isCPUTarget(TargetRequest* targetReq);
19601960

1961+
/// Are we generating code for the WebGPU API?
1962+
bool isWGPUTarget(TargetRequest* targetReq);
1963+
19611964
/// A request to generate output in some target format.
19621965
class TargetRequest : public RefObject
19631966
{

source/slang/slang-ir-specialize-resources.cpp

+11-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ struct ResourceParameterSpecializationCondition : FunctionCallSpecializeConditio
6767
else
6868
return isIllegalGLSLParameterType(type);
6969
}
70-
70+
else if (isWGPUTarget(targetRequest))
71+
{
72+
return isIllegalWGSLParameterType(type);
73+
}
7174

7275
// For now, we will not treat any other parameters as
7376
// needing specialization, even if they use resource
@@ -1220,7 +1223,7 @@ bool specializeResourceOutputs(
12201223
HashSet<IRFunc*>& unspecializableFuncs)
12211224
{
12221225
auto targetRequest = codeGenContext->getTargetReq();
1223-
if (isD3DTarget(targetRequest) || isKhronosTarget(targetRequest))
1226+
if (isD3DTarget(targetRequest) || isKhronosTarget(targetRequest) || isWGPUTarget(targetRequest))
12241227
{
12251228
}
12261229
else
@@ -1354,4 +1357,10 @@ bool isIllegalSPIRVParameterType(IRType* type, bool isArray)
13541357
}
13551358
return false;
13561359
}
1360+
1361+
bool isIllegalWGSLParameterType(IRType* type)
1362+
{
1363+
return isIllegalGLSLParameterType(type);
1364+
}
1365+
13571366
} // namespace Slang

source/slang/slang-ir-specialize-resources.h

+1
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,6 @@ bool specializeResourceUsage(CodeGenContext* codeGenContext, IRModule* irModule)
2626

2727
bool isIllegalGLSLParameterType(IRType* type);
2828
bool isIllegalSPIRVParameterType(IRType* type, bool isArray);
29+
bool isIllegalWGSLParameterType(IRType* type);
2930

3031
} // namespace Slang

source/slang/slang-type-layout.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -2397,6 +2397,20 @@ bool isCUDATarget(TargetRequest* targetReq)
23972397
}
23982398
}
23992399

2400+
bool isWGPUTarget(TargetRequest* targetReq)
2401+
{
2402+
switch (targetReq->getTarget())
2403+
{
2404+
default:
2405+
return false;
2406+
2407+
case CodeGenTarget::WGSL:
2408+
case CodeGenTarget::WGSLSPIRV:
2409+
case CodeGenTarget::WGSLSPIRVAssembly:
2410+
return true;
2411+
}
2412+
}
2413+
24002414
SourceLanguage getIntermediateSourceLanguageForTarget(TargetProgram* targetProgram)
24012415
{
24022416
// If we are emitting directly, there is no intermediate source language

tests/bugs/mutating/resource-specialization-inout.slang

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Bug related to resource specialization on unused resource typed fields.
22

33
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj
4-
//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu
54

65
//TEST_INPUT: Texture2D(size=4, content = one):name t2D
76
Texture2D t2D;

tests/compute/func-resource-param.slang

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-dx12 -compute -shaderobj
99
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
1010
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-cpu -compute -shaderobj
11-
//DISABLE_TEST(compute):COMPARE_COMPUTE:-wgpu
1211

1312
//NO_TEST:SIMPLE:-target glsl -entry computeMain -stage compute -validate-ir -dump-ir
1413

tests/expected-failure-github.txt

-3
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ tests/bugs/gh-3980.slang.7 syn (wgpu)
3232
tests/bugs/gh-471.slang.1 syn (wgpu)
3333
tests/bugs/gh-518.slang.2 syn (wgpu)
3434
tests/bugs/gh-566.slang.1 syn (wgpu)
35-
tests/bugs/mutating/resource-specialization-inout.slang.1 syn (wgpu)
3635
tests/bugs/nested-switch.slang.3 syn (wgpu)
3736
tests/bugs/obfuscate-specialization-naming.slang.2 syn (wgpu)
3837
tests/bugs/op-assignment-unify-mat.slang.4 syn (wgpu)
@@ -51,7 +50,6 @@ tests/compute/compile-time-loop.slang.2 syn (wgpu)
5150
tests/compute/constexpr.slang.2 syn (wgpu)
5251
tests/compute/discard-stmt.slang.2 syn (wgpu)
5352
tests/compute/func-param-legalize.slang.1 syn (wgpu)
54-
tests/compute/func-resource-param.slang.4 syn (wgpu)
5553
tests/compute/global-init.slang.2 syn (wgpu)
5654
tests/compute/interface-shader-param-in-struct.slang.4 syn (wgpu)
5755
tests/compute/interface-shader-param.slang.5 syn (wgpu)
@@ -98,5 +96,4 @@ tests/language-feature/types/opaque/return-opaque-type-in-struct.slang.2 syn (wg
9896
tests/language-feature/types/opaque/return-opaque-type.slang.1 syn (wgpu)
9997
tests/metal/groupshared-threadlocal-same-parameter.slang.4 syn (wgpu)
10098
tests/optimization/func-resource-result/func-resource-result-complex.slang.2 syn (wgpu)
101-
tests/optimization/func-resource-result/func-resource-result-simple.slang.4 syn (wgpu)
10299
tests/pipeline/compute/compute-system-values.slang.3 syn (wgpu)

tests/optimization/func-resource-result/func-resource-result-simple.slang

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
55
//TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -shaderobj
66
//TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
7-
//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu
87

98
// Test that a function that returns a resource type can be
109
// compiled for targets that don't natively support resource

0 commit comments

Comments
 (0)