Add parsing for default block storage qualifiers.
Also add in a missing layout qualifier error check.
TRAC #23083
Signed-off-by: Nicolas Capens
Signed-off-by: Shannon Woods
Authored-by: Jamie Madill
diff --git a/src/compiler/ParseHelper.cpp b/src/compiler/ParseHelper.cpp
index 3f8f39d..f126c8f 100644
--- a/src/compiler/ParseHelper.cpp
+++ b/src/compiler/ParseHelper.cpp
@@ -1450,7 +1450,10 @@
defaultMatrixPacking = layoutQualifier.matrixPacking;
}
- // TODO: block storage
+ if (layoutQualifier.blockStorage != EmpUnspecified)
+ {
+ defaultBlockStorage = layoutQualifier.blockStorage;
+ }
}
TFunction *TParseContext::addConstructorFunc(TPublicType publicType)
@@ -1915,6 +1918,11 @@
blockLayoutQualifier.matrixPacking = defaultMatrixPacking;
}
+ if (blockLayoutQualifier.blockStorage == EbsUnspecified)
+ {
+ blockLayoutQualifier.blockStorage = defaultBlockStorage;
+ }
+
TSymbol* blockNameSymbol = new TInterfaceBlockName(&blockName);
if (!symbolTable.declare(*blockNameSymbol)) {
error(nameLine, "redefinition", blockName.c_str(), "interface block name");
@@ -1949,6 +1957,12 @@
recover();
}
+ if (memberLayoutQualifier.blockStorage != EbsUnspecified)
+ {
+ error(memberTypeLine.line, "invalid layout qualifier:", getBlockStorageString(memberLayoutQualifier.blockStorage), "cannot be used here");
+ recover();
+ }
+
if (memberLayoutQualifier.matrixPacking == EmpUnspecified)
{
memberLayoutQualifier.matrixPacking = blockLayoutQualifier.matrixPacking;
diff --git a/src/compiler/ParseHelper.h b/src/compiler/ParseHelper.h
index dcb0938..2c92daa 100644
--- a/src/compiler/ParseHelper.h
+++ b/src/compiler/ParseHelper.h
@@ -39,6 +39,7 @@
functionReturnsValue(false),
checksPrecisionErrors(checksPrecErrors),
defaultMatrixPacking(EmpColumnMajor),
+ defaultBlockStorage(EbsShared),
diagnostics(is),
shaderVersion(100),
directiveHandler(ext, diagnostics, shaderVersion),
@@ -59,6 +60,7 @@
bool checksPrecisionErrors; // true if an error will be generated when a variable is declared without precision, explicit or implicit.
bool fragmentPrecisionHigh; // true if highp precision is supported in the fragment language.
TLayoutMatrixPacking defaultMatrixPacking;
+ TLayoutBlockStorage defaultBlockStorage;
TString HashErrMsg;
TDiagnostics diagnostics;
TDirectiveHandler directiveHandler;