diff options
| author | Yong He <yonghe@outlook.com> | 2024-06-11 00:01:12 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-11 00:01:12 -0700 |
| commit | 6d5ef9b650a9db35f7774ca09d9225d0c30849e4 (patch) | |
| tree | d8f812a52d937709efa23b17c1e36c51ee1b66f4 /source/slang/slang-check-expr.cpp | |
| parent | 21bbebb19dfdbbee107b9fd9830e18d5fb6a573a (diff) | |
Fix `GetAttributeAtVertex` for spirv and glsl targets. (#4334)
Diffstat (limited to 'source/slang/slang-check-expr.cpp')
| -rw-r--r-- | source/slang/slang-check-expr.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp index 065a74c77..f7ad5bdbf 100644 --- a/source/slang/slang-check-expr.cpp +++ b/source/slang/slang-check-expr.cpp @@ -2616,6 +2616,9 @@ namespace Slang auto checkedExpr = CheckInvokeExprWithCheckedOperands(expr); + // Perform additional validation for known built-in functions. + maybeCheckKnownBuiltinInvocation(checkedExpr); + if (m_parentDifferentiableAttr) { FunctionDifferentiableLevel callerDiffLevel = FunctionDifferentiableLevel::None; @@ -3401,6 +3404,43 @@ namespace Slang return expr; } + void SemanticsExprVisitor::maybeCheckKnownBuiltinInvocation(Expr* invokeExpr) + { + auto checkedInvokeExpr = as<InvokeExpr>(invokeExpr); + if (!checkedInvokeExpr) + return; + auto declRefFuncExpr = as<DeclRefExpr>(checkedInvokeExpr->functionExpr); + if (!declRefFuncExpr) + return; + auto callee = declRefFuncExpr->declRef.getDecl(); + if (!callee) + return; + auto knownBuiltinAttr = callee->findModifier<KnownBuiltinAttribute>(); + if (!knownBuiltinAttr) + return; + if (knownBuiltinAttr->name == "GetAttributeAtVertex") + { + if (checkedInvokeExpr->arguments.getCount() != 2) + return; + auto vertexAttributeArg = checkedInvokeExpr->arguments[0]; + auto vertexAttributeArgDeclRefExpr = as<DeclRefExpr>(vertexAttributeArg); + if (!vertexAttributeArgDeclRefExpr) + { + getSink()->diagnose(invokeExpr, Diagnostics::getAttributeAtVertexMustReferToPerVertexInput); + return; + } + auto vertexAttributeArgDecl = vertexAttributeArgDeclRefExpr->declRef.getDecl(); + if (!vertexAttributeArgDecl) + return; + if (!vertexAttributeArgDecl->findModifier<PerVertexModifier>() && + !vertexAttributeArgDecl->findModifier<HLSLNoInterpolationModifier>()) + { + getSink()->diagnose(vertexAttributeArgDeclRefExpr, Diagnostics::getAttributeAtVertexMustReferToPerVertexInput); + return; + } + } + } + Expr* SemanticsVisitor::MaybeDereference(Expr* inExpr) { Expr* expr = inExpr; |
