diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-ir-spirv-legalize.cpp | 8 | ||||
| -rw-r--r-- | source/slang/slang-ir-translate-glsl-global-var.cpp | 51 |
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); |
