Replace the logic for doing vector and matrix equivalence tests in the shader with a much simpler formula.
We can use the HLSL fragment "all(a == b)" for all matrix and vector types.
TRAC #23535
Signed-off-by: Nicolas Capens
Signed-off-by: Shannon Woods
Authored-by: Jamie Madill
diff --git a/src/compiler/OutputHLSL.cpp b/src/compiler/OutputHLSL.cpp
index e0afe54..79a373e 100644
--- a/src/compiler/OutputHLSL.cpp
+++ b/src/compiler/OutputHLSL.cpp
@@ -68,18 +68,6 @@
mUsesFaceforward2 = false;
mUsesFaceforward3 = false;
mUsesFaceforward4 = false;
- mUsesEqualMat2 = false;
- mUsesEqualMat3 = false;
- mUsesEqualMat4 = false;
- mUsesEqualVec2 = false;
- mUsesEqualVec3 = false;
- mUsesEqualVec4 = false;
- mUsesEqualIVec2 = false;
- mUsesEqualIVec3 = false;
- mUsesEqualIVec4 = false;
- mUsesEqualBVec2 = false;
- mUsesEqualBVec3 = false;
- mUsesEqualBVec4 = false;
mUsesAtan2_1 = false;
mUsesAtan2_2 = false;
mUsesAtan2_3 = false;
@@ -996,108 +984,6 @@
"\n";
}
- if (mUsesEqualMat2)
- {
- out << "bool equal(float2x2 m, float2x2 n)\n"
- "{\n"
- " return m[0][0] == n[0][0] && m[0][1] == n[0][1] &&\n"
- " m[1][0] == n[1][0] && m[1][1] == n[1][1];\n"
- "}\n";
- }
-
- if (mUsesEqualMat3)
- {
- out << "bool equal(float3x3 m, float3x3 n)\n"
- "{\n"
- " return m[0][0] == n[0][0] && m[0][1] == n[0][1] && m[0][2] == n[0][2] &&\n"
- " m[1][0] == n[1][0] && m[1][1] == n[1][1] && m[1][2] == n[1][2] &&\n"
- " m[2][0] == n[2][0] && m[2][1] == n[2][1] && m[2][2] == n[2][2];\n"
- "}\n";
- }
-
- if (mUsesEqualMat4)
- {
- out << "bool equal(float4x4 m, float4x4 n)\n"
- "{\n"
- " return m[0][0] == n[0][0] && m[0][1] == n[0][1] && m[0][2] == n[0][2] && m[0][3] == n[0][3] &&\n"
- " m[1][0] == n[1][0] && m[1][1] == n[1][1] && m[1][2] == n[1][2] && m[1][3] == n[1][3] &&\n"
- " m[2][0] == n[2][0] && m[2][1] == n[2][1] && m[2][2] == n[2][2] && m[2][3] == n[2][3] &&\n"
- " m[3][0] == n[3][0] && m[3][1] == n[3][1] && m[3][2] == n[3][2] && m[3][3] == n[3][3];\n"
- "}\n";
- }
-
- if (mUsesEqualVec2)
- {
- out << "bool equal(float2 v, float2 u)\n"
- "{\n"
- " return v.x == u.x && v.y == u.y;\n"
- "}\n";
- }
-
- if (mUsesEqualVec3)
- {
- out << "bool equal(float3 v, float3 u)\n"
- "{\n"
- " return v.x == u.x && v.y == u.y && v.z == u.z;\n"
- "}\n";
- }
-
- if (mUsesEqualVec4)
- {
- out << "bool equal(float4 v, float4 u)\n"
- "{\n"
- " return v.x == u.x && v.y == u.y && v.z == u.z && v.w == u.w;\n"
- "}\n";
- }
-
- if (mUsesEqualIVec2)
- {
- out << "bool equal(int2 v, int2 u)\n"
- "{\n"
- " return v.x == u.x && v.y == u.y;\n"
- "}\n";
- }
-
- if (mUsesEqualIVec3)
- {
- out << "bool equal(int3 v, int3 u)\n"
- "{\n"
- " return v.x == u.x && v.y == u.y && v.z == u.z;\n"
- "}\n";
- }
-
- if (mUsesEqualIVec4)
- {
- out << "bool equal(int4 v, int4 u)\n"
- "{\n"
- " return v.x == u.x && v.y == u.y && v.z == u.z && v.w == u.w;\n"
- "}\n";
- }
-
- if (mUsesEqualBVec2)
- {
- out << "bool equal(bool2 v, bool2 u)\n"
- "{\n"
- " return v.x == u.x && v.y == u.y;\n"
- "}\n";
- }
-
- if (mUsesEqualBVec3)
- {
- out << "bool equal(bool3 v, bool3 u)\n"
- "{\n"
- " return v.x == u.x && v.y == u.y && v.z == u.z;\n"
- "}\n";
- }
-
- if (mUsesEqualBVec4)
- {
- out << "bool equal(bool4 v, bool4 u)\n"
- "{\n"
- " return v.x == u.x && v.y == u.y && v.z == u.z && v.w == u.w;\n"
- "}\n";
- }
-
if (mUsesAtan2_1)
{
out << "float atanyx(float y, float x)\n"
@@ -1391,59 +1277,15 @@
}
else
{
- if (node->getLeft()->isMatrix())
- {
- switch (node->getLeft()->getNominalSize())
- {
- case 2: mUsesEqualMat2 = true; break;
- case 3: mUsesEqualMat3 = true; break;
- case 4: mUsesEqualMat4 = true; break;
- default: UNREACHABLE();
- }
- }
- else if (node->getLeft()->isVector())
- {
- switch (node->getLeft()->getBasicType())
- {
- case EbtFloat:
- switch (node->getLeft()->getNominalSize())
- {
- case 2: mUsesEqualVec2 = true; break;
- case 3: mUsesEqualVec3 = true; break;
- case 4: mUsesEqualVec4 = true; break;
- default: UNREACHABLE();
- }
- break;
- case EbtInt:
- switch (node->getLeft()->getNominalSize())
- {
- case 2: mUsesEqualIVec2 = true; break;
- case 3: mUsesEqualIVec3 = true; break;
- case 4: mUsesEqualIVec4 = true; break;
- default: UNREACHABLE();
- }
- break;
- case EbtBool:
- switch (node->getLeft()->getNominalSize())
- {
- case 2: mUsesEqualBVec2 = true; break;
- case 3: mUsesEqualBVec3 = true; break;
- case 4: mUsesEqualBVec4 = true; break;
- default: UNREACHABLE();
- }
- break;
- default: UNREACHABLE();
- }
- }
- else UNREACHABLE();
+ ASSERT(node->getLeft()->isMatrix() || node->getLeft()->isVector());
if (node->getOp() == EOpEqual)
{
- outputTriplet(visit, "equal(", ", ", ")");
+ outputTriplet(visit, "all(", " == ", ")");
}
else
{
- outputTriplet(visit, "!equal(", ", ", ")");
+ outputTriplet(visit, "!all(", " == ", ")");
}
}
break;
diff --git a/src/compiler/OutputHLSL.h b/src/compiler/OutputHLSL.h
index b33b1f5..cde4120 100644
--- a/src/compiler/OutputHLSL.h
+++ b/src/compiler/OutputHLSL.h
@@ -121,18 +121,6 @@
bool mUsesFaceforward2;
bool mUsesFaceforward3;
bool mUsesFaceforward4;
- bool mUsesEqualMat2;
- bool mUsesEqualMat3;
- bool mUsesEqualMat4;
- bool mUsesEqualVec2;
- bool mUsesEqualVec3;
- bool mUsesEqualVec4;
- bool mUsesEqualIVec2;
- bool mUsesEqualIVec3;
- bool mUsesEqualIVec4;
- bool mUsesEqualBVec2;
- bool mUsesEqualBVec3;
- bool mUsesEqualBVec4;
bool mUsesAtan2_1;
bool mUsesAtan2_2;
bool mUsesAtan2_3;