Skip to content

Commit

Permalink
Make various parameters and return types require specialization when …
Browse files Browse the repository at this point in the history
…targeting WGSL

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 #5228, issue #5278 and issue #5288 by enabling specialized functions
to be generated in these cases, in order to work around these constraints.
  • Loading branch information
aleino-nv committed Nov 6, 2024
1 parent 79056cd commit 765b0c1
Show file tree
Hide file tree
Showing 9 changed files with 29 additions and 9 deletions.
3 changes: 3 additions & 0 deletions source/slang/slang-compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -1958,6 +1958,9 @@ bool isCUDATarget(TargetRequest* targetReq);
// Are we generating code for a CPU target
bool isCPUTarget(TargetRequest* targetReq);

/// Are we generating code for the WebGPU API?
bool isWGPUTarget(TargetRequest* targetReq);

/// A request to generate output in some target format.
class TargetRequest : public RefObject
{
Expand Down
13 changes: 11 additions & 2 deletions source/slang/slang-ir-specialize-resources.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,10 @@ struct ResourceParameterSpecializationCondition : FunctionCallSpecializeConditio
else
return isIllegalGLSLParameterType(type);
}

else if (isWGPUTarget(targetRequest))
{
return isIllegalWGSLParameterType(type);
}

// For now, we will not treat any other parameters as
// needing specialization, even if they use resource
Expand Down Expand Up @@ -1220,7 +1223,7 @@ bool specializeResourceOutputs(
HashSet<IRFunc*>& unspecializableFuncs)
{
auto targetRequest = codeGenContext->getTargetReq();
if (isD3DTarget(targetRequest) || isKhronosTarget(targetRequest))
if (isD3DTarget(targetRequest) || isKhronosTarget(targetRequest) || isWGPUTarget(targetRequest))
{
}
else
Expand Down Expand Up @@ -1354,4 +1357,10 @@ bool isIllegalSPIRVParameterType(IRType* type, bool isArray)
}
return false;
}

bool isIllegalWGSLParameterType(IRType* type)
{
return isIllegalGLSLParameterType(type);
}

} // namespace Slang
1 change: 1 addition & 0 deletions source/slang/slang-ir-specialize-resources.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,6 @@ bool specializeResourceUsage(CodeGenContext* codeGenContext, IRModule* irModule)

bool isIllegalGLSLParameterType(IRType* type);
bool isIllegalSPIRVParameterType(IRType* type, bool isArray);
bool isIllegalWGSLParameterType(IRType* type);

} // namespace Slang
14 changes: 14 additions & 0 deletions source/slang/slang-type-layout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2397,6 +2397,20 @@ bool isCUDATarget(TargetRequest* targetReq)
}
}

bool isWGPUTarget(TargetRequest* targetReq)
{
switch (targetReq->getTarget())
{
default:
return false;

case CodeGenTarget::WGSL:
case CodeGenTarget::WGSLSPIRV:
case CodeGenTarget::WGSLSPIRVAssembly:
return true;
}
}

SourceLanguage getIntermediateSourceLanguageForTarget(TargetProgram* targetProgram)
{
// If we are emitting directly, there is no intermediate source language
Expand Down
1 change: 0 additions & 1 deletion tests/autodiff/bug-1.slang
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK): -slang -compute -shaderobj -output-using-type
//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu

#define DO_FLOOR
#define MANUAL_DERIVATIVE
Expand Down
1 change: 0 additions & 1 deletion tests/bugs/mutating/resource-specialization-inout.slang
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// Bug related to resource specialization on unused resource typed fields.

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

//TEST_INPUT: Texture2D(size=4, content = one):name t2D
Texture2D t2D;
Expand Down
1 change: 0 additions & 1 deletion tests/compute/func-resource-param.slang
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-dx12 -compute -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-cpu -compute -shaderobj
//DISABLE_TEST(compute):COMPARE_COMPUTE:-wgpu

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

Expand Down
3 changes: 0 additions & 3 deletions tests/expected-failure-github.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ tests/bugs/gh-3980.slang.7 syn (wgpu)
tests/bugs/gh-471.slang.1 syn (wgpu)
tests/bugs/gh-518.slang.2 syn (wgpu)
tests/bugs/gh-566.slang.1 syn (wgpu)
tests/bugs/mutating/resource-specialization-inout.slang.1 syn (wgpu)
tests/bugs/nested-switch.slang.3 syn (wgpu)
tests/bugs/obfuscate-specialization-naming.slang.2 syn (wgpu)
tests/bugs/op-assignment-unify-mat.slang.4 syn (wgpu)
Expand All @@ -51,7 +50,6 @@ tests/compute/compile-time-loop.slang.2 syn (wgpu)
tests/compute/constexpr.slang.2 syn (wgpu)
tests/compute/discard-stmt.slang.2 syn (wgpu)
tests/compute/func-param-legalize.slang.1 syn (wgpu)
tests/compute/func-resource-param.slang.4 syn (wgpu)
tests/compute/global-init.slang.2 syn (wgpu)
tests/compute/interface-shader-param-in-struct.slang.4 syn (wgpu)
tests/compute/interface-shader-param.slang.5 syn (wgpu)
Expand Down Expand Up @@ -98,5 +96,4 @@ tests/language-feature/types/opaque/return-opaque-type-in-struct.slang.2 syn (wg
tests/language-feature/types/opaque/return-opaque-type.slang.1 syn (wgpu)
tests/metal/groupshared-threadlocal-same-parameter.slang.4 syn (wgpu)
tests/optimization/func-resource-result/func-resource-result-complex.slang.2 syn (wgpu)
tests/optimization/func-resource-result/func-resource-result-simple.slang.4 syn (wgpu)
tests/pipeline/compute/compute-system-values.slang.3 syn (wgpu)
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-wgpu

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

0 comments on commit 765b0c1

Please sign in to comment.