Store all matrices as column-major and transpose when needed

TRAC #11825 Due to the difference in [][] matrix indexing between GLSL and HLSL, all matrices are stored in transposed format (column-major from the HLSL point of view), and transposed back when performing matrix math. Previously some paths didn't follow this principle. Signed-off-by: Shannon Woods Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@138 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 47c058c3
...@@ -652,7 +652,6 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) ...@@ -652,7 +652,6 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
case EOpVectorTimesScalarAssign: outputTriplet(visit, "(", " *= ", ")"); break; case EOpVectorTimesScalarAssign: outputTriplet(visit, "(", " *= ", ")"); break;
case EOpMatrixTimesScalarAssign: outputTriplet(visit, "(", " *= ", ")"); break; case EOpMatrixTimesScalarAssign: outputTriplet(visit, "(", " *= ", ")"); break;
case EOpVectorTimesMatrixAssign: case EOpVectorTimesMatrixAssign:
case EOpMatrixTimesMatrixAssign:
if (visit == PreVisit) if (visit == PreVisit)
{ {
out << "("; out << "(";
...@@ -660,35 +659,29 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) ...@@ -660,35 +659,29 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
else if (visit == InVisit) else if (visit == InVisit)
{ {
out << " = mul("; out << " = mul(";
if (node->getLeft()->getQualifier() == EvqUniform)
{
out << "transpose(";
}
node->getLeft()->traverse(this); node->getLeft()->traverse(this);
out << ", transpose(";
if (node->getLeft()->getQualifier() == EvqUniform) }
else
{ {
out << ")"; out << "))";
} }
break;
out << ", "; case EOpMatrixTimesMatrixAssign:
if (visit == PreVisit)
if (node->getRight()->getQualifier() == EvqUniform)
{ {
out << "transpose("; out << "(";
} }
else if (visit == InVisit)
{
out << " = mul(";
node->getLeft()->traverse(this);
out << ", ";
} }
else else
{ {
if (node->getRight()->getQualifier() == EvqUniform)
{
out << ")"; out << ")";
} }
out << "))";
}
break; break;
case EOpDivAssign: outputTriplet(visit, "(", " /= ", ")"); break; case EOpDivAssign: outputTriplet(visit, "(", " /= ", ")"); break;
case EOpIndexDirect: outputTriplet(visit, NULL, "[", "]"); break; case EOpIndexDirect: outputTriplet(visit, NULL, "[", "]"); break;
...@@ -843,50 +836,9 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) ...@@ -843,50 +836,9 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
case EOpGreaterThanEqual: outputTriplet(visit, "(", " >= ", ")"); break; case EOpGreaterThanEqual: outputTriplet(visit, "(", " >= ", ")"); break;
case EOpVectorTimesScalar: outputTriplet(visit, "(", " * ", ")"); break; case EOpVectorTimesScalar: outputTriplet(visit, "(", " * ", ")"); break;
case EOpMatrixTimesScalar: outputTriplet(visit, "(", " * ", ")"); break; case EOpMatrixTimesScalar: outputTriplet(visit, "(", " * ", ")"); break;
case EOpVectorTimesMatrix: case EOpVectorTimesMatrix: outputTriplet(visit, "mul(", ", transpose(", "))"); break;
if (node->getRight()->getQualifier() == EvqUniform) case EOpMatrixTimesVector: outputTriplet(visit, "mul(transpose(", "), ", ")"); break;
{ case EOpMatrixTimesMatrix: outputTriplet(visit, "mul(", ", ", ")"); break;
outputTriplet(visit, "mul(", ", transpose(", "))");
}
else
{
outputTriplet(visit, "mul(", ", ", ")");
}
break;
case EOpMatrixTimesVector:
if (node->getLeft()->getQualifier() == EvqUniform)
{
outputTriplet(visit, "mul(transpose(", "), ", ")");
}
else
{
outputTriplet(visit, "mul(", ", ", ")");
}
break;
case EOpMatrixTimesMatrix:
if (node->getLeft()->getQualifier() == EvqUniform)
{
if (node->getRight()->getQualifier() == EvqUniform)
{
outputTriplet(visit, "mul(transpose(", "), transpose(", "))");
}
else
{
outputTriplet(visit, "mul(transpose(", "), ", ")");
}
}
else
{
if (node->getRight()->getQualifier() == EvqUniform)
{
outputTriplet(visit, "mul(", ", transpose(", "))");
}
else
{
outputTriplet(visit, "mul(", ", ", ")");
}
}
break;
case EOpLogicalOr: outputTriplet(visit, "(", " || ", ")"); break; case EOpLogicalOr: outputTriplet(visit, "(", " || ", ")"); break;
case EOpLogicalXor: outputTriplet(visit, "xor(", ", ", ")"); break; // FIXME: Prevent name clashes case EOpLogicalXor: outputTriplet(visit, "xor(", ", ", ")"); break; // FIXME: Prevent name clashes
case EOpLogicalAnd: outputTriplet(visit, "(", " && ", ")"); break; case EOpLogicalAnd: outputTriplet(visit, "(", " && ", ")"); break;
......
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