diff options
Diffstat (limited to 'source/slang/slang-check-shader.cpp')
| -rw-r--r-- | source/slang/slang-check-shader.cpp | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/source/slang/slang-check-shader.cpp b/source/slang/slang-check-shader.cpp index 99205e522..3a1e4c7f6 100644 --- a/source/slang/slang-check-shader.cpp +++ b/source/slang/slang-check-shader.cpp @@ -557,7 +557,7 @@ namespace Slang for (auto target : linkage->targets) { auto targetCaps = target->getTargetCaps(); - auto stageCapabilitySet = CapabilitySet(entryPoint->getProfile().getCapabilityName()); + auto stageCapabilitySet = entryPoint->getProfile().getCapabilityName(); targetCaps.join(stageCapabilitySet); if (targetCaps.isIncompatibleWith(entryPointFuncDecl->inferredCapabilityRequirements)) { @@ -613,20 +613,23 @@ namespace Slang if (auto entryPointAttr = entryPointFuncDecl->findModifier<EntryPointAttribute>()) { auto entryPointProfileStage = entryPointProfile.getStage(); - // Ensure every target is specifying the same stage as an entry` point + auto entryPointStage = getStageFromAtom(entryPointAttr->capabilitySet.getTargetStage()); + + // Ensure every target is specifying the same stage as an entry-point // if a profile+stage was set, else user will not be aware that their // code is requiring `fragment` on a `vertex` shader for (auto target : targets) { auto targetProfile = target->getOptionSet().getProfile(); auto profileStage = targetProfile.getStage(); - if (profileStage != Stage::Unknown && profileStage != entryPointAttr->stage) - maybeDiagnose(sink, optionSet, DiagnosticCategory::Capability, entryPointAttr, Diagnostics::entryPointAndProfileAreIncompatible, entryPointFuncDecl, entryPointAttr->stage, targetProfile.getName()); + if (profileStage != Stage::Unknown && profileStage != entryPointStage) + maybeDiagnose(sink, optionSet, DiagnosticCategory::Capability, entryPointAttr, Diagnostics::entryPointAndProfileAreIncompatible, entryPointFuncDecl, entryPointStage, targetProfile.getName()); } if (entryPointProfileStage == Stage::Unknown) - entryPointProfile.setStage(entryPointAttr->stage); - else if (entryPointProfileStage != Stage::Unknown && entryPointProfileStage != entryPointAttr->stage) - maybeDiagnose(sink, optionSet, DiagnosticCategory::Capability, entryPointFuncDecl, Diagnostics::specifiedStageDoesntMatchAttribute, entryPointFuncDecl->getName(), entryPointProfileStage, entryPointAttr->stage); + entryPointProfile = Profile(entryPointStage); + else if (entryPointProfileStage != Stage::Unknown && entryPointProfileStage != entryPointStage) + maybeDiagnose(sink, optionSet, DiagnosticCategory::Capability, entryPointFuncDecl, Diagnostics::specifiedStageDoesntMatchAttribute, entryPointFuncDecl->getName(), entryPointProfileStage, entryPointStage); + entryPointProfile.additionalCapabilities.add(entryPointAttr->capabilitySet); return true; } return false; |
