diff options
| author | Yong He <yonghe@outlook.com> | 2024-08-30 12:03:23 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-30 12:03:23 -0700 |
| commit | de83628070614ec37349c9f334ed72a54a6889da (patch) | |
| tree | bc97f74013a073fc958b75e68089696e14d71412 /source/slang/slang-check-modifier.cpp | |
| parent | f428a058ea48535a323c32d206ebc7e551c3c3e9 (diff) | |
Support specialization constants. (#4963)
* Support specialization constants.
* Fix.
* Fix.
* Fix.
* Fix.
* Make sure specialization constants have names.
* Clean up and support the dxc [vk::constant_id] syntax.
* Fix.
* Fix.
* Fix.
Diffstat (limited to 'source/slang/slang-check-modifier.cpp')
| -rw-r--r-- | source/slang/slang-check-modifier.cpp | 123 |
1 files changed, 57 insertions, 66 deletions
diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp index d7f879c51..f05b58c34 100644 --- a/source/slang/slang-check-modifier.cpp +++ b/source/slang/slang-check-modifier.cpp @@ -330,7 +330,7 @@ namespace Slang return false; } - bool SemanticsVisitor::validateAttribute(Attribute* attr, AttributeDecl* attribClassDecl, ModifiableSyntaxNode* attrTarget) + Modifier* SemanticsVisitor::validateAttribute(Attribute* attr, AttributeDecl* attribClassDecl, ModifiableSyntaxNode* attrTarget) { if (auto numThreadsAttr = as<NumThreadsAttribute>(attr)) { @@ -348,14 +348,14 @@ namespace Slang auto intValue = checkLinkTimeConstantIntVal(arg); if (!intValue) { - return false; + return nullptr; } if (auto constIntVal = as<ConstantIntVal>(intValue)) { if (constIntVal->getValue() < 1) { getSink()->diagnose(attr, Diagnostics::nonPositiveNumThreads, constIntVal->getValue()); - return false; + return nullptr; } if (intValue->getType() != m_astBuilder->getIntType()) { @@ -390,7 +390,7 @@ namespace Slang auto intValue = checkLinkTimeConstantIntVal(arg); if (!intValue) { - return false; + return nullptr; } if (auto constIntVal = as<ConstantIntVal>(intValue)) { @@ -407,7 +407,7 @@ namespace Slang if (!isValidWaveSize) { getSink()->diagnose(attr, Diagnostics::invalidWaveSize, constIntVal->getValue()); - return false; + return nullptr; } } value = intValue; @@ -426,20 +426,20 @@ namespace Slang if (attr->args.getCount() != 1) { - return false; + return nullptr; } auto value = checkConstantIntVal(attr->args[0]); if (value == nullptr) { - return false; + return nullptr; } const IRIntegerValue kMaxAnyValueSize = 0x7FFF; if (value->getValue() > kMaxAnyValueSize) { getSink()->diagnose(anyValueSizeAttr->loc, Diagnostics::anyValueSizeExceedsLimit, kMaxAnyValueSize); - return false; + return nullptr; } anyValueSizeAttr->size = int32_t(value->getValue()); @@ -448,16 +448,16 @@ namespace Slang { if (attr->args.getCount() != 1) { - return false; + return nullptr; } auto value = checkConstantIntVal(attr->args[0]); if (value == nullptr) { - return false; + return nullptr; } if (value->getValue() < 0) { - return false; + return nullptr; } glslRequireShaderInputParameter->parameterNumber = int32_t(value->getValue()); } @@ -465,23 +465,23 @@ namespace Slang { if (attr->args.getCount() != 1) { - return false; + return nullptr; } auto rank = checkConstantIntVal(attr->args[0]); if (rank == nullptr) { - return false; + return nullptr; } overloadRankAttr->rank = int32_t(rank->getValue()); } else if (auto inputAttachmentIndexLayoutAttribute = as<GLSLInputAttachmentIndexLayoutAttribute>(attr)) { if (attr->args.getCount() != 1) - return false; + return nullptr; auto location = checkConstantIntVal(attr->args[0]); if(!location) - return false; + return nullptr; inputAttachmentIndexLayoutAttribute->location = location->getValue(); } @@ -492,7 +492,7 @@ namespace Slang // in core.meta.slang, but that's not completely implemented. So for now we check here. if (attr->args.getCount() != 2) { - return false; + return nullptr; } // TODO(JS): Prior validation currently doesn't ensure both args are ints (as specified in core.meta.slang), so check here @@ -502,7 +502,7 @@ namespace Slang if (binding == nullptr || set == nullptr) { - return false; + return nullptr; } bindingAttr->binding = int32_t(binding->getValue()); @@ -515,13 +515,13 @@ namespace Slang if (attr->args.getCount() != 1) { - return false; + return nullptr; } auto value = checkConstantIntVal(attr->args[0]); if (value == nullptr) { - return false; + return nullptr; } simpleLayoutAttr->value = int32_t(value->getValue()); @@ -531,7 +531,7 @@ namespace Slang SLANG_ASSERT(attr->args.getCount() == 1); auto val = checkConstantIntVal(attr->args[0]); - if (!val) return false; + if (!val) return nullptr; maxVertexCountAttr->value = (int32_t)val->getValue(); } @@ -540,7 +540,7 @@ namespace Slang SLANG_ASSERT(attr->args.getCount() == 1); auto val = checkConstantIntVal(attr->args[0]); - if (!val) return false; + if (!val) return nullptr; instanceAttr->value = (int32_t)val->getValue(); } @@ -551,7 +551,7 @@ namespace Slang String capNameString; if (!checkLiteralStringVal(attr->args[0], &capNameString)) { - return false; + return nullptr; } CapabilityName capName = findCapabilityName(capNameString.getUnownedSlice()); @@ -587,7 +587,7 @@ namespace Slang { // always diagnose this error since nothing can compile with an invalid capability getSink()->diagnose(attr, Diagnostics::unknownCapability, capNameString); - return false; + return nullptr; } } else if ((as<DomainAttribute>(attr)) || @@ -627,21 +627,6 @@ namespace Slang getSink()->diagnose(attr, Diagnostics::expectedSingleIntArg, attr->keywordName); } } - else if (as<PushConstantAttribute>(attr)) - { - // Has no args - SLANG_ASSERT(attr->args.getCount() == 0); - } - else if (as<ShaderRecordAttribute>(attr)) - { - // Has no args - SLANG_ASSERT(attr->args.getCount() == 0); - } - else if (as<EarlyDepthStencilAttribute>(attr)) - { - // Has no args - SLANG_ASSERT(attr->args.getCount() == 0); - } else if (auto attrUsageAttr = as<AttributeUsageAttribute>(attr)) { uint32_t targetClassId = (uint32_t)UserDefinedAttributeTargets::None; @@ -655,13 +640,13 @@ namespace Slang else { getSink()->diagnose(attr, Diagnostics::expectedSingleIntArg, attr->keywordName); - return false; + return nullptr; } } if (!getAttributeTargetSyntaxClasses(attrUsageAttr->targetSyntaxClass, targetClassId)) { getSink()->diagnose(attr, Diagnostics::invalidAttributeTarget); - return false; + return nullptr; } } else if (const auto unrollAttr = as<UnrollAttribute>(attr)) @@ -753,7 +738,7 @@ namespace Slang String formatName; if(!checkLiteralStringVal(attr->args[0], &formatName)) { - return false; + return nullptr; } ImageFormat format = ImageFormat::unknown; @@ -782,7 +767,7 @@ namespace Slang String diagnosticName; if(!checkLiteralStringVal(attr->args[0], &diagnosticName)) { - return false; + return nullptr; } auto diagnosticInfo = findDiagnosticByName(diagnosticName.getUnownedSlice()); @@ -800,14 +785,14 @@ namespace Slang String libraryName; if (!checkLiteralStringVal(dllImportAttr->args[0], &libraryName)) { - return false; + return nullptr; } dllImportAttr->modulePath = libraryName; String functionName; if (dllImportAttr->args.getCount() == 2 && !checkLiteralStringVal(dllImportAttr->args[1], &functionName)) { - return false; + return nullptr; } dllImportAttr->functionName = functionName; } @@ -816,7 +801,7 @@ namespace Slang SLANG_ASSERT(attr->args.getCount() == 1); auto val = checkConstantIntVal(attr->args[0]); - if (!val) return false; + if (!val) return nullptr; rayPayloadAttr->location = (int32_t)val->getValue(); } @@ -824,7 +809,7 @@ namespace Slang { SLANG_ASSERT(attr->args.getCount() == 1); auto val = checkConstantIntVal(attr->args[0]); - if (!val) return false; + if (!val) return nullptr; rayPayloadInAttr->location = (int32_t)val->getValue(); } else if (auto callablePayloadAttr = as<VulkanCallablePayloadAttribute>(attr)) @@ -832,7 +817,7 @@ namespace Slang SLANG_ASSERT(attr->args.getCount() == 1); auto val = checkConstantIntVal(attr->args[0]); - if (!val) return false; + if (!val) return nullptr; callablePayloadAttr->location = (int32_t)val->getValue(); } @@ -840,7 +825,7 @@ namespace Slang { SLANG_ASSERT(attr->args.getCount() == 1); auto val = checkConstantIntVal(attr->args[0]); - if (!val) return false; + if (!val) return nullptr; callablePayloadInAttr->location = (int32_t)val->getValue(); } else if (auto hitObjectAttributesAttr = as<VulkanHitObjectAttributesAttribute>(attr)) @@ -848,10 +833,18 @@ namespace Slang SLANG_ASSERT(attr->args.getCount() == 1); auto val = checkConstantIntVal(attr->args[0]); - if (!val) return false; + if (!val) return nullptr; hitObjectAttributesAttr->location = (int32_t)val->getValue(); } + else if (auto constantIdAttr = as<VkConstantIdAttribute>(attr)) + { + SLANG_ASSERT(attr->args.getCount() == 1); + auto val = checkConstantIntVal(attr->args[0]); + + if (!val) return nullptr; + constantIdAttr->location = (int32_t)val->getValue(); + } else if (as<UserDefinedDerivativeAttribute>(attr) || as<PrimalSubstituteAttribute>(attr)) { SLANG_ASSERT(attr->args.getCount() == 1); @@ -876,7 +869,7 @@ namespace Slang SLANG_ASSERT(as<Decl>(attrTarget)); auto val = checkConstantIntVal(attr->args[0]); - if (!val) return false; + if (!val) return nullptr; preferRecomputeAttr->sideEffectBehavior = (PreferRecomputeAttribute::SideEffectBehavior) val->getValue(); } @@ -886,7 +879,7 @@ namespace Slang String guid; if (!checkLiteralStringVal(comInterfaceAttr->args[0], &guid)) { - return false; + return nullptr; } StringBuilder resultGUID; for (auto ch : guid) @@ -902,14 +895,14 @@ namespace Slang else { getSink()->diagnose(attr, Diagnostics::invalidGUID, guid); - return false; + return nullptr; } } comInterfaceAttr->guid = resultGUID.toString(); if (comInterfaceAttr->guid.getLength() != 32) { getSink()->diagnose(attr, Diagnostics::invalidGUID, guid); - return false; + return nullptr; } } else if (const auto derivativeMemberAttr = as<DerivativeMemberAttribute>(attr)) @@ -918,7 +911,7 @@ namespace Slang if (!varDecl) { getSink()->diagnose(attr, Diagnostics::attributeNotApplicable, attr->getKeywordName()); - return false; + return nullptr; } } else if (auto deprecatedAttr = as<DeprecatedAttribute>(attr)) @@ -928,7 +921,7 @@ namespace Slang String message; if(!checkLiteralStringVal(attr->args[0], &message)) { - return false; + return nullptr; } deprecatedAttr->message = message; @@ -940,7 +933,7 @@ namespace Slang String name; if(!checkLiteralStringVal(attr->args[0], &name)) { - return false; + return nullptr; } knownBuiltinAttr->name = name; @@ -953,7 +946,7 @@ namespace Slang String name; if(!checkLiteralStringVal(attr->args[0], &name)) { - return false; + return nullptr; } pyExportAttr->name = name; @@ -980,17 +973,17 @@ namespace Slang if (attr->args.getCount() > 2) { getSink()->diagnose(attr, Diagnostics::tooManyArguments, attr->args.getCount(), 0); - return false; + return nullptr; } else if (attr->args.getCount() < 2) { getSink()->diagnose(attr, Diagnostics::notEnoughArguments, attr->args.getCount(), 2); - return false; + return nullptr; } CapabilityName capName; if (!checkCapabilityName(attr->args[0], capName)) { - return false; + return nullptr; } requirePreludeAttr->capabilitySet = CapabilitySet(capName); if (auto stringLitExpr = as<StringLiteralExpr>(attr->args[1])) @@ -1000,9 +993,9 @@ namespace Slang else { getSink()->diagnose(attr->args[1], Diagnostics::expectedAStringLiteral); - return false; + return nullptr; } - return true; + return attr; } else { @@ -1016,11 +1009,11 @@ namespace Slang // We should be special-casing the checking of any attribute // with a non-zero number of arguments. getSink()->diagnose(attr, Diagnostics::tooManyArguments, attr->args.getCount(), 0); - return false; + return nullptr; } } - return true; + return attr; } AttributeBase* SemanticsVisitor::checkAttribute( @@ -1156,7 +1149,6 @@ namespace Slang // Modifiers that are their own exclusive group. case ASTNodeType::GLSLLayoutModifier: case ASTNodeType::GLSLParsedLayoutModifier: - case ASTNodeType::GLSLConstantIDLayoutModifier: case ASTNodeType::GLSLLocationLayoutModifier: case ASTNodeType::GLSLInputAttachmentIndexLayoutAttribute: case ASTNodeType::GLSLOffsetLayoutAttribute: @@ -1236,7 +1228,6 @@ namespace Slang case ASTNodeType::OutModifier: case ASTNodeType::GLSLLayoutModifier: case ASTNodeType::GLSLParsedLayoutModifier: - case ASTNodeType::GLSLConstantIDLayoutModifier: case ASTNodeType::GLSLLocationLayoutModifier: case ASTNodeType::GLSLInputAttachmentIndexLayoutAttribute: case ASTNodeType::GLSLOffsetLayoutAttribute: |
