From fa917fedc89287778eef65a62413ff09d1065d97 Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 19 Nov 2024 09:03:48 -0800 Subject: Fix specialization constant miscompile in glsl mode. (#5568) Co-authored-by: Ellie Hermaszewska --- source/slang/slang-check-decl.cpp | 14 +++++++++++++- tests/spirv/specialization-constant.slang | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index fb27614d0..07d5dd1fa 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -1709,6 +1709,18 @@ void SemanticsDeclHeaderVisitor::maybeApplyLayoutModifier(VarDeclBase* varDecl) } } +bool isSpecializationConstant(VarDeclBase* varDecl) +{ + for (auto modifier : varDecl->modifiers) + { + if (as(modifier)) + return true; + if (as(modifier)) + return true; + } + return false; +} + void SemanticsDeclHeaderVisitor::checkVarDeclCommon(VarDeclBase* varDecl) { // A variable that didn't have an explicit type written must @@ -1943,7 +1955,7 @@ void SemanticsDeclHeaderVisitor::checkVarDeclCommon(VarDeclBase* varDecl) // without any `uniform` modifiers as true global variables by default. if (!varDecl->findModifier() && !varDecl->findModifier() && !varDecl->findModifier() && - !varDecl->findModifier()) + !varDecl->findModifier() && !isSpecializationConstant(varDecl)) { if (!isUniformParameterType(varDecl->type)) { diff --git a/tests/spirv/specialization-constant.slang b/tests/spirv/specialization-constant.slang index 63141d25e..dbf315926 100644 --- a/tests/spirv/specialization-constant.slang +++ b/tests/spirv/specialization-constant.slang @@ -1,4 +1,6 @@ +//TEST:SIMPLE(filecheck=GLSL): -target glsl -allow-glsl //TEST:SIMPLE(filecheck=GLSL): -target glsl +//TEST:SIMPLE(filecheck=CHECK): -target spirv -allow-glsl //TEST:SIMPLE(filecheck=CHECK): -target spirv // CHECK-DAG: OpDecorate %[[C0:[0-9A-Za-z_]+]] SpecId 0 -- cgit v1.2.3