diff options
Diffstat (limited to 'source/slang/slang-ir-inline.cpp')
| -rw-r--r-- | source/slang/slang-ir-inline.cpp | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/source/slang/slang-ir-inline.cpp b/source/slang/slang-ir-inline.cpp index 8412a1912..3b01d7dde 100644 --- a/source/slang/slang-ir-inline.cpp +++ b/source/slang/slang-ir-inline.cpp @@ -252,9 +252,6 @@ struct InliningPassBase { case kIROp_IntrinsicOpDecoration: return true; - case kIROp_RequireSPIRVCapabilityDecoration: - // Don't inline a function with spirv capability decoration to avoid losing it. - return false; } } @@ -947,7 +944,7 @@ void performGLSLResourceReturnFunctionInlining(IRModule* module) while (changed) { changed = pass.considerAllCallSites(); - simplifyIR(module); + simplifyIR(module, IRSimplificationOptions::getFast()); } } @@ -964,8 +961,6 @@ struct IntrinsicFunctionInliningPass : InliningPassBase auto func = as<IRFunc>(getResolvedInstForDecorations(info.callee)); if (!func) return false; - if (func->findDecorationImpl(kIROp_RequireSPIRVCapabilityDecoration)) - return false; auto returnInst = as<IRReturn>(func->getFirstBlock()->getTerminator()); if (!returnInst) return false; @@ -1025,4 +1020,32 @@ bool inlineCall(IRCall* call) } +struct SpirvInliningPass : InliningPassBase +{ + typedef InliningPassBase Super; + + SpirvInliningPass(IRModule* module) + : Super(module) + {} + + bool shouldInline(CallSiteInfo const& info) + { + if (!info.callee->findDecoration<IREntryPointDecoration>()) + return true; + return false; + } +}; + +void performSpirvInlining(IRModule* module) +{ + SLANG_PROFILE; + while (true) + { + SpirvInliningPass pass(module); + if (pass.considerAllCallSites()) + continue; + break; + } +} + } // namespace Slang |
