Compiler - Wrong Result from Matrix Multiply

TRAC #11751 Signed-off-by: Andrew Lewycky Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@101 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 403c9e59
...@@ -557,23 +557,33 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) ...@@ -557,23 +557,33 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
{ {
out << " = mul("; out << " = mul(";
if (node->getOp() == EOpMatrixTimesMatrixAssign) if (node->getLeft()->getQualifier() == EvqUniform)
{ {
out << "transpose("; out << "transpose(";
} }
node->getLeft()->traverse(this); node->getLeft()->traverse(this);
if (node->getOp() == EOpMatrixTimesMatrixAssign) if (node->getLeft()->getQualifier() == EvqUniform)
{ {
out << ")"; out << ")";
} }
out << ", transpose("; out << ", ";
if (node->getRight()->getQualifier() == EvqUniform)
{
out << "transpose(";
}
} }
else else
{ {
out << ")))"; if (node->getRight()->getQualifier() == EvqUniform)
{
out << ")";
}
out << "))";
} }
break; break;
case EOpDivAssign: outputTriplet(visit, "(", " /= ", ")"); break; case EOpDivAssign: outputTriplet(visit, "(", " /= ", ")"); break;
...@@ -646,9 +656,50 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) ...@@ -646,9 +656,50 @@ 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: outputTriplet(visit, "mul(", ", transpose(", "))"); break; case EOpVectorTimesMatrix:
case EOpMatrixTimesVector: outputTriplet(visit, "mul(transpose(", "), ", ")"); break; if (node->getRight()->getQualifier() == EvqUniform)
case EOpMatrixTimesMatrix: outputTriplet(visit, "mul(transpose(", "), transpose(", "))"); 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