Commit bc648b9e by Alexis Hetu Committed by Alexis Hétu

Error messages for uniform block validation

Many error messages related to uniform block validation were missing, so there was no output message when linking failed. Also, the rowMajor validation was missing and was also not set properly when individual block members were overriding this layout qualifier. Fixes: dEQP-GLES3.functional.shaders.linkage.uniform.block.layout_qualifier_mismatch_5 Change-Id: I97309c3ead6e541d6cd9054ecfd29d08206de7da Reviewed-on: https://swiftshader-review.googlesource.com/15808Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 743913c1
...@@ -103,14 +103,20 @@ namespace glsl ...@@ -103,14 +103,20 @@ namespace glsl
int arrayStride; int arrayStride;
int matrixStride; int matrixStride;
getBlockLayoutInfo(type, type.getArraySize(), isRowMajor, &arrayStride, &matrixStride); bool isVariableRowMajor = isRowMajor;
TLayoutMatrixPacking matrixPacking = type.getLayoutQualifier().matrixPacking;
if(matrixPacking != EmpUnspecified)
{
isVariableRowMajor = (matrixPacking == EmpRowMajor);
}
getBlockLayoutInfo(type, type.getArraySize(), isVariableRowMajor, &arrayStride, &matrixStride);
const BlockMemberInfo memberInfo(static_cast<int>(mCurrentOffset * BytesPerComponent), const BlockMemberInfo memberInfo(static_cast<int>(mCurrentOffset * BytesPerComponent),
static_cast<int>(arrayStride * BytesPerComponent), static_cast<int>(arrayStride * BytesPerComponent),
static_cast<int>(matrixStride * BytesPerComponent), static_cast<int>(matrixStride * BytesPerComponent),
(matrixStride > 0) && isRowMajor); (matrixStride > 0) && isVariableRowMajor);
advanceOffset(type, type.getArraySize(), isRowMajor, arrayStride, matrixStride); advanceOffset(type, type.getArraySize(), isVariableRowMajor, arrayStride, matrixStride);
return memberInfo; return memberInfo;
} }
......
...@@ -1867,14 +1867,17 @@ namespace es2 ...@@ -1867,14 +1867,17 @@ namespace es2
// validate blocks for the same member types // validate blocks for the same member types
if(block1.fields.size() != block2.fields.size()) if(block1.fields.size() != block2.fields.size())
{ {
appendToInfoLog("Types for interface block '%s' differ between vertex and fragment shaders", block1.name.c_str());
return false; return false;
} }
if(block1.arraySize != block2.arraySize) if(block1.arraySize != block2.arraySize)
{ {
appendToInfoLog("Array sizes differ for interface block '%s' between vertex and fragment shaders", block1.name.c_str());
return false; return false;
} }
if(block1.layout != block2.layout || block1.isRowMajorLayout != block2.isRowMajorLayout) if(block1.layout != block2.layout || block1.isRowMajorLayout != block2.isRowMajorLayout)
{ {
appendToInfoLog("Layout qualifiers differ for interface block '%s' between vertex and fragment shaders", block1.name.c_str());
return false; return false;
} }
const size_t numBlockMembers = block1.fields.size(); const size_t numBlockMembers = block1.fields.size();
...@@ -1882,11 +1885,30 @@ namespace es2 ...@@ -1882,11 +1885,30 @@ namespace es2
{ {
const glsl::Uniform& member1 = shader1->activeUniforms[block1.fields[blockMemberIndex]]; const glsl::Uniform& member1 = shader1->activeUniforms[block1.fields[blockMemberIndex]];
const glsl::Uniform& member2 = shader2->activeUniforms[block2.fields[blockMemberIndex]]; const glsl::Uniform& member2 = shader2->activeUniforms[block2.fields[blockMemberIndex]];
if(member1.name != member2.name || if(member1.name != member2.name)
member1.arraySize != member2.arraySize ||
member1.precision != member2.precision ||
member1.type != member2.type)
{ {
appendToInfoLog("Name mismatch for field %d of interface block '%s': (in vertex: '%s', in fragment: '%s')",
blockMemberIndex, block1.name.c_str(), member1.name.c_str(), member2.name.c_str());
return false;
}
if(member1.arraySize != member2.arraySize)
{
appendToInfoLog("Array sizes for %s differ between vertex and fragment shaders", member1.name.c_str());
return false;
}
if(member1.precision != member2.precision)
{
appendToInfoLog("Precisions for %s differ between vertex and fragment shaders", member1.name.c_str());
return false;
}
if(member1.type != member2.type)
{
appendToInfoLog("Types for %s differ between vertex and fragment shaders", member1.name.c_str());
return false;
}
if(member1.blockInfo.isRowMajorMatrix != member2.blockInfo.isRowMajorMatrix)
{
appendToInfoLog("Matrix packings for %s differ between vertex and fragment shaders", member1.name.c_str());
return false; return false;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment