Add support for unsigned integer vector types to the shader translator.

TRAC #23080

Signed-off-by: Nicolas Capens
Signed-off-by: Shannon Woods
Author: Jamie Madill

git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2404 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/OutputHLSL.cpp b/src/compiler/OutputHLSL.cpp
index bb0fc11..b7e63fc 100644
--- a/src/compiler/OutputHLSL.cpp
+++ b/src/compiler/OutputHLSL.cpp
@@ -82,6 +82,9 @@
     mUsesEqualIVec2 = false;
     mUsesEqualIVec3 = false;
     mUsesEqualIVec4 = false;
+    mUsesEqualUVec2 = false;
+    mUsesEqualUVec3 = false;
+    mUsesEqualUVec4 = false;
     mUsesEqualBVec2 = false;
     mUsesEqualBVec3 = false;
     mUsesEqualBVec4 = false;
@@ -1268,6 +1271,30 @@
                "}\n";
     }
 
+    if (mUsesEqualUVec2)
+    {
+        out << "bool equal(uint2 v, uint2 u)\n"
+               "{\n"
+               "    return v.x == u.x && v.y == u.y;\n"
+               "}\n";
+    }
+
+    if (mUsesEqualUVec3)
+    {
+        out << "bool equal(uint3 v, uint3 u)\n"
+               "{\n"
+               "    return v.x == u.x && v.y == u.y && v.z == u.z;\n"
+               "}\n";
+    }
+
+    if (mUsesEqualUVec4)
+    {
+        out << "bool equal(uint4 v, uint4 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"
@@ -1620,8 +1647,13 @@
                     }
                     break;
                   case EbtUInt:
-                    // TODO
-                    UNIMPLEMENTED();
+                    switch (node->getLeft()->getNominalSize())
+                    {
+                      case 2: mUsesEqualUVec2 = true; break;
+                      case 3: mUsesEqualUVec3 = true; break;
+                      case 4: mUsesEqualUVec4 = true; break;
+                      default: UNREACHABLE();
+                    }
                     break;
                   case EbtBool:
                     switch (node->getLeft()->getNominalSize())
@@ -1725,9 +1757,9 @@
         switch (node->getOperand()->getType().getCols())
         {
           case 1:    outputTriplet(visit, "uint(", "", ")");  break;
-          case 2:
-          case 3:
-          case 4:    UNIMPLEMENTED(); break;
+          case 2:    outputTriplet(visit, "uint2(", "", ")");  break;
+          case 3:    outputTriplet(visit, "uint3(", "", ")");  break;
+          case 4:    outputTriplet(visit, "uint4(", "", ")");  break;
           default: UNREACHABLE();
         }
         break;
@@ -2224,6 +2256,18 @@
         addConstructor(node->getType(), "uvec1", &node->getSequence());
         outputTriplet(visit, "uvec1(", "", ")");
         break;
+      case EOpConstructUVec2:
+        addConstructor(node->getType(), "uvec2", &node->getSequence());
+        outputTriplet(visit, "uvec2(", ", ", ")");
+        break;
+      case EOpConstructUVec3:
+        addConstructor(node->getType(), "uvec3", &node->getSequence());
+        outputTriplet(visit, "uvec3(", ", ", ")");
+        break;
+      case EOpConstructUVec4:
+        addConstructor(node->getType(), "uvec4", &node->getSequence());
+        outputTriplet(visit, "uvec4(", ", ", ")");
+        break;
       case EOpConstructMat2:
         addConstructor(node->getType(), "mat2", &node->getSequence());
         outputTriplet(visit, "mat2(", ", ", ")");
@@ -2883,7 +2927,9 @@
             switch (type.getCols())
             {
               case 1: return "uint";
-              default: UNIMPLEMENTED(); return "error";
+              case 2: return "uint2";
+              case 3: return "uint3";
+              case 4: return "uint4";
             }
           case EbtBool:
             switch (type.getNominalSize())
@@ -3455,7 +3501,13 @@
         }
         else if (type.isVector())
         {
-            UNIMPLEMENTED();
+            switch(type.getCols())
+            {
+              case 2: return GL_UNSIGNED_INT_VEC2;
+              case 3: return GL_UNSIGNED_INT_VEC3;
+              case 4: return GL_UNSIGNED_INT_VEC4;
+              default: UNREACHABLE();
+            }
         }
         else UNREACHABLE();
     }