SPV: Distinguish between std140 and std430 layouts, and correctly use alignments as the base for strides.
This commit is contained in:
@@ -1630,10 +1630,18 @@ bool TGlslangToSpvTraverser::requiresExplicitLayout(const glslang::TType& type)
|
||||
// Given an array type, returns the integer stride required for that array
|
||||
int TGlslangToSpvTraverser::getArrayStride(const glslang::TType& arrayType)
|
||||
{
|
||||
glslang::TType derefType(arrayType, 0);
|
||||
int size;
|
||||
glslangIntermediate->getBaseAlignment(derefType, size, true);
|
||||
return size;
|
||||
int stride = glslangIntermediate->getBaseAlignment(arrayType, size, arrayType.getQualifier().layoutPacking == glslang::ElpStd140);
|
||||
if (arrayType.isMatrix()) {
|
||||
// GLSL strides are set to alignments of the matrix flattened to individual rows/cols,
|
||||
// but SPV needs an array stride for the whole matrix, not the rows/cols
|
||||
if (arrayType.getQualifier().layoutMatrix == glslang::ElmRowMajor)
|
||||
stride *= arrayType.getMatrixRows();
|
||||
else
|
||||
stride *= arrayType.getMatrixCols();
|
||||
}
|
||||
|
||||
return stride;
|
||||
}
|
||||
|
||||
// Given a matrix type, returns the integer stride required for that matrix
|
||||
@@ -1641,7 +1649,7 @@ int TGlslangToSpvTraverser::getArrayStride(const glslang::TType& arrayType)
|
||||
int TGlslangToSpvTraverser::getMatrixStride(const glslang::TType& matrixType)
|
||||
{
|
||||
int size;
|
||||
return glslangIntermediate->getBaseAlignment(matrixType, size, true);
|
||||
return glslangIntermediate->getBaseAlignment(matrixType, size, matrixType.getQualifier().layoutPacking == glslang::ElpStd140);
|
||||
}
|
||||
|
||||
// Given a member type of a struct, realign the current offset for it, and compute
|
||||
|
||||
Reference in New Issue
Block a user