SPV: Distinguish between std140 and std430 layouts, and correctly use alignments as the base for strides.
This commit is contained in:
parent
dd6ca17845
commit
e721f49dbd
@ -1630,10 +1630,18 @@ bool TGlslangToSpvTraverser::requiresExplicitLayout(const glslang::TType& type)
|
|||||||
// Given an array type, returns the integer stride required for that array
|
// Given an array type, returns the integer stride required for that array
|
||||||
int TGlslangToSpvTraverser::getArrayStride(const glslang::TType& arrayType)
|
int TGlslangToSpvTraverser::getArrayStride(const glslang::TType& arrayType)
|
||||||
{
|
{
|
||||||
glslang::TType derefType(arrayType, 0);
|
|
||||||
int size;
|
int size;
|
||||||
glslangIntermediate->getBaseAlignment(derefType, size, true);
|
int stride = glslangIntermediate->getBaseAlignment(arrayType, size, arrayType.getQualifier().layoutPacking == glslang::ElpStd140);
|
||||||
return size;
|
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
|
// 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 TGlslangToSpvTraverser::getMatrixStride(const glslang::TType& matrixType)
|
||||||
{
|
{
|
||||||
int size;
|
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
|
// Given a member type of a struct, realign the current offset for it, and compute
|
||||||
|
@ -54,7 +54,7 @@ Linked fragment stage:
|
|||||||
MemberDecorate 88(bn) 4 Offset 640
|
MemberDecorate 88(bn) 4 Offset 640
|
||||||
MemberDecorate 88(bn) 4 MatrixStride 16
|
MemberDecorate 88(bn) 4 MatrixStride 16
|
||||||
Decorate 88(bn) Block
|
Decorate 88(bn) Block
|
||||||
Decorate 92 ArrayStride 12
|
Decorate 92 ArrayStride 16
|
||||||
MemberDecorate 93(bi) 0 Offset 0
|
MemberDecorate 93(bi) 0 Offset 0
|
||||||
Decorate 93(bi) Block
|
Decorate 93(bi) Block
|
||||||
2: TypeVoid
|
2: TypeVoid
|
||||||
|
@ -2,5 +2,5 @@
|
|||||||
// For the version, it uses the latest git tag followed by the number of commits.
|
// For the version, it uses the latest git tag followed by the number of commits.
|
||||||
// For the date, it uses the current date (when then script is run).
|
// For the date, it uses the current date (when then script is run).
|
||||||
|
|
||||||
#define GLSLANG_REVISION "SPIRV99.821"
|
#define GLSLANG_REVISION "SPIRV99.822"
|
||||||
#define GLSLANG_DATE "06-Dec-2015"
|
#define GLSLANG_DATE "06-Dec-2015"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user