diff options
| author | Yong He <yonghe@outlook.com> | 2024-12-06 00:55:35 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-06 00:55:35 -0800 |
| commit | 8ce7c6f6958f9f5ed750ef1a823b9e9ed8c042d8 (patch) | |
| tree | e4cb0ff1639ea0cf8209b466bd7d7537db783599 /source/slang/slang-ir-explicit-global-context.cpp | |
| parent | 22b64a446c8c37cc0b3670eb117b64575fc54d2f (diff) | |
Support specialization constant on WGSL and Metal. (#5780)
Diffstat (limited to 'source/slang/slang-ir-explicit-global-context.cpp')
| -rw-r--r-- | source/slang/slang-ir-explicit-global-context.cpp | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/source/slang/slang-ir-explicit-global-context.cpp b/source/slang/slang-ir-explicit-global-context.cpp index d891263cd..0516d574c 100644 --- a/source/slang/slang-ir-explicit-global-context.cpp +++ b/source/slang/slang-ir-explicit-global-context.cpp @@ -3,6 +3,7 @@ #include "slang-ir-clone.h" #include "slang-ir-insts.h" +#include "slang-ir-util.h" namespace Slang { @@ -39,7 +40,8 @@ struct IntroduceExplicitGlobalContextPass class ExplicitContextPolicy { public: - ExplicitContextPolicy(CodeGenTarget target) + ExplicitContextPolicy(CodeGenTarget inTarget) + : target(inTarget) { switch (target) { @@ -74,7 +76,7 @@ struct IntroduceExplicitGlobalContextPass return (UInt)hoistableGlobalObjectKind & (UInt)hoistable; } - bool canHoistGlobalVar(IRGlobalVar* inst) + bool canHoistGlobalVar(IRInst* inst) { if (!((UInt)hoistGlobalVarOptions & (UInt)HoistGlobalVarOptions::SharedGlobal) && as<IRGroupSharedRate>(inst->getRate())) @@ -99,6 +101,19 @@ struct IntroduceExplicitGlobalContextPass } } + // Do not move specialization constants to context. + switch (target) + { + case CodeGenTarget::Metal: + case CodeGenTarget::MetalLib: + case CodeGenTarget::MetalLibAssembly: + { + auto varLayout = findVarLayout(inst); + if (varLayout && + varLayout->findOffsetAttr(LayoutResourceKind::SpecializationConstant)) + return false; + } + } return true; } @@ -111,6 +126,7 @@ struct IntroduceExplicitGlobalContextPass GlobalObjectKind hoistableGlobalObjectKind = GlobalObjectKind::All; bool requiresFuncTypeCorrectionPass = false; AddressSpace addressSpaceOfLocals = AddressSpace::ThreadLocal; + CodeGenTarget target; }; IntroduceExplicitGlobalContextPass(IRModule* module, CodeGenTarget target) @@ -134,7 +150,7 @@ struct IntroduceExplicitGlobalContextPass bool canHoistType(GlobalObjectKind hoistable) { return m_options.canHoistType(hoistable); } - bool canHoistGlobalVar(IRGlobalVar* inst) { return m_options.canHoistGlobalVar(inst); } + bool canHoistGlobalVar(IRInst* inst) { return m_options.canHoistGlobalVar(inst); } void processModule() { @@ -183,6 +199,8 @@ struct IntroduceExplicitGlobalContextPass // auto globalParam = cast<IRGlobalParam>(inst); + if (!canHoistGlobalVar(globalParam)) + continue; // One detail we need to be careful about is that as a result // of legalizing the varying parameters of compute kernels to |
