From 6d5ef9b650a9db35f7774ca09d9225d0c30849e4 Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 11 Jun 2024 00:01:12 -0700 Subject: Fix `GetAttributeAtVertex` for spirv and glsl targets. (#4334) --- source/slang/slang-check-expr.cpp | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'source/slang/slang-check-expr.cpp') 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); + if (!checkedInvokeExpr) + return; + auto declRefFuncExpr = as(checkedInvokeExpr->functionExpr); + if (!declRefFuncExpr) + return; + auto callee = declRefFuncExpr->declRef.getDecl(); + if (!callee) + return; + auto knownBuiltinAttr = callee->findModifier(); + if (!knownBuiltinAttr) + return; + if (knownBuiltinAttr->name == "GetAttributeAtVertex") + { + if (checkedInvokeExpr->arguments.getCount() != 2) + return; + auto vertexAttributeArg = checkedInvokeExpr->arguments[0]; + auto vertexAttributeArgDeclRefExpr = as(vertexAttributeArg); + if (!vertexAttributeArgDeclRefExpr) + { + getSink()->diagnose(invokeExpr, Diagnostics::getAttributeAtVertexMustReferToPerVertexInput); + return; + } + auto vertexAttributeArgDecl = vertexAttributeArgDeclRefExpr->declRef.getDecl(); + if (!vertexAttributeArgDecl) + return; + if (!vertexAttributeArgDecl->findModifier() && + !vertexAttributeArgDecl->findModifier()) + { + getSink()->diagnose(vertexAttributeArgDeclRefExpr, Diagnostics::getAttributeAtVertexMustReferToPerVertexInput); + return; + } + } + } + Expr* SemanticsVisitor::MaybeDereference(Expr* inExpr) { Expr* expr = inExpr; -- cgit v1.2.3