Fix HLSL translation for mod(vec2,vec2)
ANGLEBUG=258
Signed-off-by: Daniel Koch
Signed-off-by: Nicolas Capens
Author: Sam Hocevar
git-svn-id: https://angleproject.googlecode.com/svn/trunk@890 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/OutputHLSL.cpp b/src/compiler/OutputHLSL.cpp
index af5696f..572ca4e 100644
--- a/src/compiler/OutputHLSL.cpp
+++ b/src/compiler/OutputHLSL.cpp
@@ -45,9 +45,12 @@
mUsesPointSize = false;
mUsesXor = false;
mUsesMod1 = false;
- mUsesMod2 = false;
- mUsesMod3 = false;
- mUsesMod4 = false;
+ mUsesMod2v = false;
+ mUsesMod2f = false;
+ mUsesMod3v = false;
+ mUsesMod3f = false;
+ mUsesMod4v = false;
+ mUsesMod4f = false;
mUsesFaceforward1 = false;
mUsesFaceforward2 = false;
mUsesFaceforward3 = false;
@@ -479,8 +482,17 @@
"}\n"
"\n";
}
-
- if (mUsesMod2)
+
+ if (mUsesMod2v)
+ {
+ out << "float2 mod(float2 x, float2 y)\n"
+ "{\n"
+ " return x - y * floor(x / y);\n"
+ "}\n"
+ "\n";
+ }
+
+ if (mUsesMod2f)
{
out << "float2 mod(float2 x, float y)\n"
"{\n"
@@ -489,7 +501,16 @@
"\n";
}
- if (mUsesMod3)
+ if (mUsesMod3v)
+ {
+ out << "float3 mod(float3 x, float3 y)\n"
+ "{\n"
+ " return x - y * floor(x / y);\n"
+ "}\n"
+ "\n";
+ }
+
+ if (mUsesMod3f)
{
out << "float3 mod(float3 x, float y)\n"
"{\n"
@@ -498,7 +519,16 @@
"\n";
}
- if (mUsesMod4)
+ if (mUsesMod4v)
+ {
+ out << "float4 mod(float4 x, float4 y)\n"
+ "{\n"
+ " return x - y * floor(x / y);\n"
+ "}\n"
+ "\n";
+ }
+
+ if (mUsesMod4f)
{
out << "float4 mod(float4 x, float y)\n"
"{\n"
@@ -1447,12 +1477,17 @@
case EOpVectorNotEqual: outputTriplet(visit, "(", " != ", ")"); break;
case EOpMod:
{
- switch (node->getSequence()[0]->getAsTyped()->getNominalSize()) // Number of components in the first argument
+ // We need to look at the number of components in both arguments
+ switch (node->getSequence()[0]->getAsTyped()->getNominalSize() * 10
+ + node->getSequence()[1]->getAsTyped()->getNominalSize())
{
- case 1: mUsesMod1 = true; break;
- case 2: mUsesMod2 = true; break;
- case 3: mUsesMod3 = true; break;
- case 4: mUsesMod4 = true; break;
+ case 11: mUsesMod1 = true; break;
+ case 22: mUsesMod2v = true; break;
+ case 21: mUsesMod2f = true; break;
+ case 33: mUsesMod3v = true; break;
+ case 31: mUsesMod3f = true; break;
+ case 44: mUsesMod4v = true; break;
+ case 41: mUsesMod4f = true; break;
default: UNREACHABLE();
}
diff --git a/src/compiler/OutputHLSL.h b/src/compiler/OutputHLSL.h
index b1058bd..06ad849 100644
--- a/src/compiler/OutputHLSL.h
+++ b/src/compiler/OutputHLSL.h
@@ -91,9 +91,12 @@
bool mUsesPointSize;
bool mUsesXor;
bool mUsesMod1;
- bool mUsesMod2;
- bool mUsesMod3;
- bool mUsesMod4;
+ bool mUsesMod2v;
+ bool mUsesMod2f;
+ bool mUsesMod3v;
+ bool mUsesMod3f;
+ bool mUsesMod4v;
+ bool mUsesMod4f;
bool mUsesFaceforward1;
bool mUsesFaceforward2;
bool mUsesFaceforward3;