Simplify the varying priority sorting logic, and add more verbose comments.

TRAC #23746

Signed-off-by: Nicolas Capens
Signed-off-by: Shannon Woods
diff --git a/src/libGLESv2/Shader.cpp b/src/libGLESv2/Shader.cpp
index f862ef4..11a68fc 100644
--- a/src/libGLESv2/Shader.cpp
+++ b/src/libGLESv2/Shader.cpp
@@ -525,54 +525,70 @@
     return GL_NONE;
 }
 
-typedef std::map<GLenum, int> VaryingPriorityMap;
-static VaryingPriorityMap varyingPriorities;
-
-static void makeVaryingPriorityMap()
+// [OpenGL ES SL 3.00.4] Section 11 p. 120
+// Vertex Outs/Fragment Ins packing priorities
+static const GLenum varyingPriorityList[] =
 {
-    varyingPriorities[GL_FLOAT_MAT4]    = 0;
-    varyingPriorities[GL_FLOAT_MAT3x4]  = 10;
-    varyingPriorities[GL_FLOAT_MAT4x3]  = 20;
-    varyingPriorities[GL_FLOAT_MAT2x4]  = 30;
-    varyingPriorities[GL_FLOAT_MAT4x2]  = 40;
-    varyingPriorities[GL_FLOAT_MAT2]    = 50;
-    varyingPriorities[GL_FLOAT_VEC4]    = 60;
-    varyingPriorities[GL_INT_VEC4]      = 61;
-    varyingPriorities[GL_UNSIGNED_INT_VEC4] = 62;
-    varyingPriorities[GL_FLOAT_MAT3]    = 70;
-    varyingPriorities[GL_FLOAT_MAT2x3]  = 80;
-    varyingPriorities[GL_FLOAT_MAT3x2]  = 90;
-    varyingPriorities[GL_FLOAT_VEC3]    = 100;
-    varyingPriorities[GL_INT_VEC3]      = 101;
-    varyingPriorities[GL_UNSIGNED_INT_VEC3] = 102;
-    varyingPriorities[GL_FLOAT_VEC2]    = 110;
-    varyingPriorities[GL_INT_VEC2]      = 111;
-    varyingPriorities[GL_UNSIGNED_INT_VEC2] = 112;
-    varyingPriorities[GL_FLOAT]         = 120;
-    varyingPriorities[GL_INT]           = 125;
-    varyingPriorities[GL_UNSIGNED_INT]  = 130;
-}
+    // 1. Arrays of mat4 and mat4
+    GL_FLOAT_MAT4,
+
+    // Non-square matrices of type matCxR consume the same space as a square
+    // matrix of type matN where N is the greater of C and R
+    GL_FLOAT_MAT3x4,
+    GL_FLOAT_MAT4x3,
+    GL_FLOAT_MAT2x4,
+    GL_FLOAT_MAT4x2,
+
+    // 2. Arrays of mat2 and mat2 (since they occupy full rows)
+    GL_FLOAT_MAT2,
+
+    // 3. Arrays of vec4 and vec4
+    GL_FLOAT_VEC4,
+    GL_INT_VEC4,
+    GL_UNSIGNED_INT_VEC4,
+
+    // 4. Arrays of mat3 and mat3
+    GL_FLOAT_MAT3,
+    GL_FLOAT_MAT2x3,
+    GL_FLOAT_MAT3x2,
+
+    // 5. Arrays of vec3 and vec3
+    GL_FLOAT_VEC3,
+    GL_INT_VEC3,
+    GL_UNSIGNED_INT_VEC3,
+
+    // 6. Arrays of vec2 and vec2
+    GL_FLOAT_VEC2,
+    GL_INT_VEC2,
+    GL_UNSIGNED_INT_VEC2,
+
+    // 7. Arrays of float and float
+    GL_FLOAT,
+    GL_INT,
+    GL_UNSIGNED_INT,
+};
 
 // true if varying x has a higher priority in packing than y
 bool Shader::compareVarying(const Varying &x, const Varying &y)
 {
-    if (varyingPriorities.empty())
-    {
-        makeVaryingPriorityMap();
-    }
-
-    if(x.type == y.type)
+    if (x.type == y.type)
     {
         return x.size > y.size;
     }
 
-    VaryingPriorityMap::iterator xPriority = varyingPriorities.find(x.type);
-    VaryingPriorityMap::iterator yPriority = varyingPriorities.find(y.type);
+    unsigned int xPriority = GL_INVALID_INDEX;
+    unsigned int yPriority = GL_INVALID_INDEX;
 
-    ASSERT(xPriority != varyingPriorities.end());
-    ASSERT(yPriority != varyingPriorities.end());
+    for (unsigned int priorityIndex = 0; priorityIndex < ArraySize(varyingPriorityList); priorityIndex++)
+    {
+        if (varyingPriorityList[priorityIndex] == x.type) xPriority = priorityIndex;
+        if (varyingPriorityList[priorityIndex] == y.type) yPriority = priorityIndex;
+        if (xPriority != GL_INVALID_INDEX && yPriority != GL_INVALID_INDEX) break;
+    }
 
-    return xPriority->second <= yPriority->second;
+    ASSERT(xPriority != GL_INVALID_INDEX && yPriority != GL_INVALID_INDEX);
+
+    return xPriority <= yPriority;
 }
 
 int Shader::getShaderVersion() const