From 366a947cdf2e3c6958b7a9e17d561ce76ab0f594 Mon Sep 17 00:00:00 2001 From: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> Date: Thu, 25 Apr 2024 09:18:32 -0400 Subject: Support derivative functions in compute & capabilities adjustments (#4014) * Support derivative functions in compute & capabilities adjustments fixes #4000 PR implements derivative functions in compute shaders properly so we have the functionality for SPIR-V & GLSL. Tests reflect fragment and compute paths. PR also adjusts capabilities to correct wrong SPRI-V target capabilities for when using textures. Remarks: 1. __requireComputeDerivative(); is a intrinsic_op and not modifier since inlining will destroy the modifier. 2. Derivative mode is tied to an entry point decoration `[DerivativeGroupQuad]`/`[DerivativeGroupLinear]` or GLSL syntax ``derivative_group_linearNV`. Default is to set the mode to `[DerivativeGroupQuad]` * remove -emit-spirv-directly * fixes 1. fix minor issue fwidth change where I returned the wrong type 2. fix issue where glslang{glsl->spirv} is wrong, so we don't run that test and just run the glsl test & direct spir-v test for intrinsic-texture.slang * adjust as per review and refine code 1. add test to ensure multi-diverging-in-logic entry points work -- 2 functions which may cause computeDerivatives + 1 that uses, 1 that does not. 2. naming 3. use entry point ref graph for c-like-targets 4. reordered some code to util's and removed `static linline` since that was just for ease of coding on my end (should not have been pushed). * Grammer * split up source file + issolate GLSL emit path change. --------- Co-authored-by: Yong He --- source/slang/slang-ir-util.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'source/slang/slang-ir-util.cpp') 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); + } +} } -- cgit v1.2.3