summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-ir-spirv-legalize.cpp8
-rw-r--r--source/slang/slang-ir-translate-glsl-global-var.cpp51
2 files changed, 39 insertions, 20 deletions
diff --git a/source/slang/slang-ir-spirv-legalize.cpp b/source/slang/slang-ir-spirv-legalize.cpp
index 1feba361b..6dbbbcd1f 100644
--- a/source/slang/slang-ir-spirv-legalize.cpp
+++ b/source/slang/slang-ir-spirv-legalize.cpp
@@ -2031,7 +2031,7 @@ void legalizeSPIRV(SPIRVEmitSharedContext* sharedContext, IRModule* module)
context.processModule();
}
-void buildEntryPointReferenceGraph(SPIRVEmitSharedContext* context, IRModule* module)
+void buildEntryPointReferenceGraph(Dictionary<IRInst*, HashSet<IRFunc*>>& referencingEntryPoints, IRModule* module)
{
struct WorkItem
{
@@ -2056,13 +2056,13 @@ void buildEntryPointReferenceGraph(SPIRVEmitSharedContext* context, IRModule* mo
auto registerEntryPointReference = [&](IRFunc* entryPoint, IRInst* inst)
{
- if (auto set = context->m_referencingEntryPoints.tryGetValue(inst))
+ if (auto set = referencingEntryPoints.tryGetValue(inst))
set->add(entryPoint);
else
{
HashSet<IRFunc*> newSet;
newSet.add(entryPoint);
- context->m_referencingEntryPoints.add(inst, _Move(newSet));
+ referencingEntryPoints.add(inst, _Move(newSet));
}
};
auto visit = [&](IRFunc* entryPoint, IRInst* inst)
@@ -2176,7 +2176,7 @@ void legalizeIRForSPIRV(
SLANG_UNUSED(entryPoints);
legalizeSPIRV(context, module);
simplifyIRForSpirvLegalization(context->m_targetProgram, codeGenContext->getSink(), module);
- buildEntryPointReferenceGraph(context, module);
+ buildEntryPointReferenceGraph(context->m_referencingEntryPoints, module);
}
} // namespace Slang
diff --git a/source/slang/slang-ir-translate-glsl-global-var.cpp b/source/slang/slang-ir-translate-glsl-global-var.cpp
index 5d79cbe17..775c1b9d6 100644
--- a/source/slang/slang-ir-translate-glsl-global-var.cpp
+++ b/source/slang/slang-ir-translate-glsl-global-var.cpp
@@ -6,35 +6,54 @@
namespace Slang
{
+ void buildEntryPointReferenceGraph(Dictionary<IRInst*, HashSet<IRFunc*>>& referencingEntryPoints, IRModule* module);
+
struct GlobalVarTranslationContext
{
CodeGenContext* context;
void processModule(IRModule* module)
{
- List<IRInst*> outputVars;
- List<IRInst*> inputVars;
+ Dictionary<IRInst*, HashSet<IRFunc*>> referencingEntryPoints;
+ buildEntryPointReferenceGraph(referencingEntryPoints, module);
+
List<IRInst*> entryPoints;
for (auto inst : module->getGlobalInsts())
{
- if (inst->findDecoration<IRGlobalOutputDecoration>())
- outputVars.add(inst);
- if (inst->findDecoration<IRGlobalInputDecoration>())
- inputVars.add(inst);
- if (inst->findDecoration<IREntryPointDecoration>())
+ if (inst->getOp() == kIROp_Func && inst->findDecoration<IREntryPointDecoration>())
entryPoints.add(inst);
}
IRBuilder builder(module);
- bool hasInput = inputVars.getCount() != 0;
- bool hasOutput = outputVars.getCount() != 0;
-
- if (!hasInput && !hasOutput)
- return;
-
for (auto entryPoint : entryPoints)
{
+ List<IRInst*> outputVars;
+ List<IRInst*> inputVars;
+ for (auto inst : module->getGlobalInsts())
+ {
+ if (auto referencingEntryPointSet = referencingEntryPoints.tryGetValue(inst))
+ {
+ if (referencingEntryPointSet->contains((IRFunc*)entryPoint))
+ {
+ if (inst->findDecoration<IRGlobalOutputDecoration>())
+ {
+ outputVars.add(inst);
+ }
+ if (inst->findDecoration<IRGlobalInputDecoration>())
+ {
+ inputVars.add(inst);
+ }
+ }
+ }
+ }
+
+ bool hasInput = inputVars.getCount() != 0;
+ bool hasOutput = outputVars.getCount() != 0;
+
+ if (!hasInput && !hasOutput)
+ continue;
+
auto entryPointFunc = as<IRFunc>(entryPoint);
if (!entryPointFunc)
continue;
@@ -62,7 +81,6 @@ namespace Slang
}
auto field = builder.createStructField(inputStructType, key, inputType);
IRTypeLayout::Builder fieldTypeLayout(&builder);
- fieldTypeLayout.addResourceUsage(LayoutResourceKind::VaryingInput, LayoutSize(1));
IRVarLayout::Builder varLayoutBuilder(&builder, fieldTypeLayout.build());
varLayoutBuilder.setStage(entryPointDecor->getProfile().getStage());
if (auto locationDecoration = input->findDecoration<IRGLSLLocationDecoration>())
@@ -75,6 +93,7 @@ namespace Slang
}
else
{
+ fieldTypeLayout.addResourceUsage(LayoutResourceKind::VaryingInput, LayoutSize(1));
if (entryPointDecor->getProfile().getStage() == Stage::Fragment)
{
varLayoutBuilder.setUserSemantic("COLOR", inputVarIndex);
@@ -132,7 +151,6 @@ namespace Slang
auto ptrType = as<IRPtrTypeBase>(output->getDataType());
builder.createStructField(resultType, key, ptrType->getValueType());
IRTypeLayout::Builder fieldTypeLayout(&builder);
- fieldTypeLayout.addResourceUsage(LayoutResourceKind::VaryingOutput, LayoutSize(1));
IRVarLayout::Builder varLayoutBuilder(&builder, fieldTypeLayout.build());
varLayoutBuilder.setStage(entryPointDecor->getProfile().getStage());
if (auto semanticDecor = output->findDecoration<IRSemanticDecoration>())
@@ -141,6 +159,8 @@ namespace Slang
}
else
{
+ fieldTypeLayout.addResourceUsage(LayoutResourceKind::VaryingOutput, LayoutSize(1));
+
if (auto locationDecoration = output->findDecoration<IRGLSLLocationDecoration>())
{
varLayoutBuilder.findOrAddResourceInfo(LayoutResourceKind::VaryingOutput)->offset = (UInt)getIntVal(locationDecoration->getLocation());
@@ -204,7 +224,6 @@ namespace Slang
void translateGLSLGlobalVar(CodeGenContext* context, IRModule* module)
{
-
GlobalVarTranslationContext ctx;
ctx.context = context;
ctx.processModule(module);