From 12f7237e4060388494c549623f4a640327b7ca08 Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 14 Nov 2023 17:46:05 -0800 Subject: Add GLSL Compatibility. (#3321) * Parse glsl buffer blocks to GLSLInterfaceBlockDecl * Parse glsl local size layout declarations * Parse (and ignore) glsl version directives * spelling * Better l-value interpretation for glsl interface blocks * Better l-value interpretation for glsl interface blocks * Add compile flag for enabling glsl * Parse and ignore precision modifiers. * Automatically import `glsl` module for compatiblity. * Complete vector and matrix types for glsl * Remove generated file from repo * Bump .gitignore * do not mark out globals as params * Synthesize entrypoint layout from global inout vars. * update test result. * Allow HLSL semantic on global variables. * Fix. * Fix test. * Fix win32 compile error. * Add more builtin input/output and texture intrinsics. * Add struct/array constructor syntax. * Skip `#extension` lines. * overide operator * for matrix/vector multiplication. * Add `matrixCompMult`. * Parse modifiers in for loop init var declr. * Add more glsl intrinsics, add stage into to var layout. * Allow `int[3] x` syntax. * Fix array type syntax. --------- Co-authored-by: Ellie Hermaszewska Co-authored-by: Yong He --- source/slang/slang-check-expr.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (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 2f8b28afc..e130275bb 100644 --- a/source/slang/slang-check-expr.cpp +++ b/source/slang/slang-check-expr.cpp @@ -269,6 +269,25 @@ namespace Slang } } + static bool isMutableGLSLBufferBlockVarExpr(Expr* expr) + { + if(const auto varExpr = as(expr)) + { + if(const auto declRefType = as(varExpr->type->getCanonicalType())) + { + if(declRefType->getDeclRef().getDecl()->isDerivedFrom(ASTNodeType::GLSLInterfaceBlockDecl)) + { + const auto d = varExpr->declRef.getDecl(); + if(d->hasModifier() && !d->hasModifier()) + { + return true; + } + } + } + } + return false; + } + DeclRefExpr* SemanticsVisitor::ConstructDeclRefExpr( DeclRef declRef, Expr* baseExpr, @@ -370,7 +389,10 @@ namespace Slang // l-value status of the base expression into account now. if(!baseExpr->type.isLeftValue) { - expr->type.isLeftValue = false; + // One exception to this is if we're reading the contents + // of a GLSL buffer interface block which isn't marked as + // read_only + expr->type.isLeftValue = isMutableGLSLBufferBlockVarExpr(baseExpr); } else { -- cgit v1.2.3