summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-c-like.cpp
diff options
context:
space:
mode:
authorArielG-NV <159081215+ArielG-NV@users.noreply.github.com>2024-04-25 09:18:32 -0400
committerGitHub <noreply@github.com>2024-04-25 09:18:32 -0400
commit366a947cdf2e3c6958b7a9e17d561ce76ab0f594 (patch)
treeca305c7315806b51c3922d334b10b5f203a0b219 /source/slang/slang-emit-c-like.cpp
parent52dcb5bd44aa15f07826062c53fae344d55959e9 (diff)
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 <yonghe@outlook.com>
Diffstat (limited to 'source/slang/slang-emit-c-like.cpp')
-rw-r--r--source/slang/slang-emit-c-like.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp
index bd3337769..fa380e061 100644
--- a/source/slang/slang-emit-c-like.cpp
+++ b/source/slang/slang-emit-c-like.cpp
@@ -129,6 +129,11 @@ void CLikeSourceEmitter::emitPreModuleImpl()
m_writer->emit(prelude->getStringSlice());
m_writer->emit("\n");
}
+ for (auto prelude : m_requiredPreludesRaw)
+ {
+ m_writer->emit(prelude);
+ m_writer->emit("\n");
+ }
}
//
@@ -2747,6 +2752,10 @@ void CLikeSourceEmitter::defaultEmitInstExpr(IRInst* inst, const EmitOpInfo& inO
{
break; //should already have set requirement; case covered for empty intrinsic block
}
+ case kIROp_RequireComputeDerivative:
+ {
+ break; //should already have been parsed and used.
+ }
default:
diagnoseUnhandledInst(inst);
break;
@@ -3358,7 +3367,8 @@ void CLikeSourceEmitter::emitSimpleFuncImpl(IRFunc* func)
// Deal with decorations that need
// to be emitted as attributes
- if ( IREntryPointDecoration* entryPointDecor = func->findDecoration<IREntryPointDecoration>())
+ IREntryPointDecoration* entryPointDecor = func->findDecoration<IREntryPointDecoration>();
+ if (entryPointDecor)
{
emitEntryPointAttributes(func, entryPointDecor);
}
@@ -4446,6 +4456,7 @@ void CLikeSourceEmitter::emitModuleImpl(IRModule* module, DiagnosticSink* sink)
List<EmitAction> actions;
+ beforeComputeEmitActions(module);
computeEmitActions(module, actions);
executeEmitActions(actions);
}