Fix non-square matrix uniform packing.
This was broken in two places: the register count was using the non-
transposed matrix row count. The block layout encoder was also not
set to transpose matrices, which was causing incorrect packing info
to be calculated in link.
BUG=angleproject:1923
Change-Id: I89094aa116fad4bda15f018498f8637520f12bd4
Reviewed-on: https://chromium-review.googlesource.com/454876
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index 5875733..1a28298 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -260,7 +260,7 @@
data = new uint8_t[bytes];
memset(data, 0, bytes);
- // TODO(jmadill): is this correct with non-square matrices?
+ // Use the row count as register count, will work for non-square matrices.
registerCount = gl::VariableRowCount(type) * elementCount();
}
}
@@ -1902,7 +1902,6 @@
if (computeShader)
{
for (const sh::Uniform &computeUniform : computeShader->getUniforms())
-
{
if (computeUniform.staticUse)
{
@@ -1914,7 +1913,6 @@
{
const gl::Shader *vertexShader = mState.getAttachedVertexShader();
for (const sh::Uniform &vertexUniform : vertexShader->getUniforms())
-
{
if (vertexUniform.staticUse)
{
@@ -1962,7 +1960,7 @@
unsigned int startRegister = shaderD3D->getUniformRegister(uniform.name);
ShShaderOutput outputType = shaderD3D->getCompilerOutputType();
- sh::HLSLBlockEncoder encoder(sh::HLSLBlockEncoder::GetStrategyFor(outputType));
+ sh::HLSLBlockEncoder encoder(sh::HLSLBlockEncoder::GetStrategyFor(outputType), true);
encoder.skipRegisters(startRegister);
defineUniform(shader->getType(), uniform, uniform.name, &encoder, uniformMap);
@@ -2192,7 +2190,7 @@
// define member uniforms
sh::Std140BlockEncoder std140Encoder;
- sh::HLSLBlockEncoder hlslEncoder(sh::HLSLBlockEncoder::ENCODE_PACKED);
+ sh::HLSLBlockEncoder hlslEncoder(sh::HLSLBlockEncoder::ENCODE_PACKED, false);
sh::BlockLayoutEncoder *encoder = nullptr;
if (interfaceBlock.layout == sh::BLOCKLAYOUT_STANDARD)