summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir-util.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-ir-util.cpp')
-rw-r--r--source/slang/slang-ir-util.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/source/slang/slang-ir-util.cpp b/source/slang/slang-ir-util.cpp
index f7a93dca6..f6b0acaed 100644
--- a/source/slang/slang-ir-util.cpp
+++ b/source/slang/slang-ir-util.cpp
@@ -1743,5 +1743,41 @@ IRType* dropNormAttributes(IRType* const t)
return t;
}
+void verifyComputeDerivativeGroupModifiers(
+ DiagnosticSink* sink,
+ SourceLoc errorLoc,
+ bool quadAttr,
+ bool linearAttr,
+ IRNumThreadsDecoration* numThreadsDecor)
+{
+ if (!numThreadsDecor)
+ return;
+
+ if (quadAttr && linearAttr)
+ {
+ sink->diagnose(errorLoc, Diagnostics::onlyOneOfDerivativeGroupLinearOrQuadCanBeSet);
+ }
+
+ IRIntegerValue x = 1;
+ IRIntegerValue y = 1;
+ IRIntegerValue z = 1;
+ if (numThreadsDecor->getX())
+ x = numThreadsDecor->getX()->getValue();
+ if (numThreadsDecor->getY())
+ y = numThreadsDecor->getY()->getValue();
+ if (numThreadsDecor->getZ())
+ z = numThreadsDecor->getZ()->getValue();
+
+ if (quadAttr)
+ {
+ if (x % 2 != 0 || y % 2 != 0)
+ sink->diagnose(errorLoc, Diagnostics::derivativeGroupQuadMustBeMultiple2ForXYThreads);
+ }
+ else if (linearAttr)
+ {
+ if ((x * y * z) % 4 != 0)
+ sink->diagnose(errorLoc, Diagnostics::derivativeGroupLinearMustBeMultiple4ForTotalThreadCount);
+ }
+}
}