summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-check-modifier.cpp
diff options
context:
space:
mode:
authorJay Kwak <82421531+jkwak-work@users.noreply.github.com>2024-04-01 22:02:25 -0700
committerGitHub <noreply@github.com>2024-04-01 22:02:25 -0700
commit251f55c5ec4cb2b7432e71d6ba8adc96700d35c2 (patch)
tree6360ae937545943a97f3a380cbcb3c2d8fb950bd /source/slang/slang-check-modifier.cpp
parentdaf63cc983fd5f8f2b24872a9125e0394ed2180e (diff)
Support SM6.6 keyword "WaveSize" (#3871)
Resolves an issue #3385 Shader Model 6.6 added a new keyowrd, "WaveSize". See the following link for more details: https://microsoft.github.io/DirectX-Specs/d3d/HLSL_SM_6_6_WaveSize.html Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source/slang/slang-check-modifier.cpp')
-rw-r--r--source/slang/slang-check-modifier.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp
index 1587fa1b0..a387e458c 100644
--- a/source/slang/slang-check-modifier.cpp
+++ b/source/slang/slang-check-modifier.cpp
@@ -362,6 +362,47 @@ namespace Slang
numThreadsAttr->y = values[1];
numThreadsAttr->z = values[2];
}
+ else if (auto waveSizeAttr = as<WaveSizeAttribute>(attr))
+ {
+ SLANG_ASSERT(attr->args.getCount() == 1);
+
+ IntVal* value = nullptr;
+
+ auto arg = attr->args[0];
+ if (arg)
+ {
+ auto intValue = checkLinkTimeConstantIntVal(arg);
+ if (!intValue)
+ {
+ return false;
+ }
+ if (auto constIntVal = as<ConstantIntVal>(intValue))
+ {
+ bool isValidWaveSize = false;
+ const IntegerLiteralValue waveSize = constIntVal->getValue();
+ for (int validWaveSize : { 4, 8, 16, 32, 64, 128 })
+ {
+ if (validWaveSize == waveSize)
+ {
+ isValidWaveSize = true;
+ break;
+ }
+ }
+ if (!isValidWaveSize)
+ {
+ getSink()->diagnose(attr, Diagnostics::invalidWaveSize, constIntVal->getValue());
+ return false;
+ }
+ }
+ value = intValue;
+ }
+ else
+ {
+ value = m_astBuilder->getIntVal(m_astBuilder->getIntType(), 1);
+ }
+
+ waveSizeAttr->numLanes = value;
+ }
else if (auto anyValueSizeAttr = as<AnyValueSizeAttribute>(attr))
{
// This case handles GLSL-oriented layout attributes