Store integer and boolean uniforms in 4-element vectors.

TRAC #22428
Signed-off-by: Geoff Lang
Signed-off-by: Jamie Madill
Author: Nicolas Capens

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1897 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Renderer9.cpp b/src/libGLESv2/renderer/Renderer9.cpp
index c9eb918..c137817 100644
--- a/src/libGLESv2/renderer/Renderer9.cpp
+++ b/src/libGLESv2/renderer/Renderer9.cpp
@@ -1633,7 +1633,6 @@
 
         if (targetUniform->dirty)
         {
-            int count = targetUniform->elementCount();
             GLfloat *f = (GLfloat*)targetUniform->data;
             GLint *i = (GLint*)targetUniform->data;
 
@@ -1641,22 +1640,28 @@
             {
               case GL_SAMPLER_2D:
               case GL_SAMPLER_CUBE:
-                  break;
-              case GL_BOOL:       applyUniformnbv(targetUniform, count, 1, i);    break;
-              case GL_BOOL_VEC2:  applyUniformnbv(targetUniform, count, 2, i);    break;
-              case GL_BOOL_VEC3:  applyUniformnbv(targetUniform, count, 3, i);    break;
-              case GL_BOOL_VEC4:  applyUniformnbv(targetUniform, count, 4, i);    break;
+                break;
+              case GL_BOOL:
+              case GL_BOOL_VEC2:
+              case GL_BOOL_VEC3:
+              case GL_BOOL_VEC4:
+                applyUniformnbv(targetUniform, i);
+                break;
               case GL_FLOAT:
               case GL_FLOAT_VEC2:
               case GL_FLOAT_VEC3:
               case GL_FLOAT_VEC4:
               case GL_FLOAT_MAT2:
               case GL_FLOAT_MAT3:
-              case GL_FLOAT_MAT4: applyUniformnfv(targetUniform, f);              break;
-              case GL_INT:        applyUniform1iv(targetUniform, count, i);       break;
-              case GL_INT_VEC2:   applyUniform2iv(targetUniform, count, i);       break;
-              case GL_INT_VEC3:   applyUniform3iv(targetUniform, count, i);       break;
-              case GL_INT_VEC4:   applyUniform4iv(targetUniform, count, i);       break;
+              case GL_FLOAT_MAT4:
+                applyUniformnfv(targetUniform, f);
+                break;
+              case GL_INT:
+              case GL_INT_VEC2:
+              case GL_INT_VEC3:
+              case GL_INT_VEC4:
+                applyUniformniv(targetUniform, i);
+                break;
               default:
                 UNREACHABLE();
             }
@@ -1674,32 +1679,6 @@
     }
 }
 
-void Renderer9::applyUniformnbv(gl::Uniform *targetUniform, GLsizei count, int width, const GLint *v)
-{
-    float vector[D3D9_MAX_FLOAT_CONSTANTS * 4];
-
-    if (targetUniform->psRegisterIndex >= 0 || targetUniform->vsRegisterIndex >= 0)
-    {
-        ASSERT(count <= D3D9_MAX_FLOAT_CONSTANTS);
-        for (int i = 0; i < count; i++)
-        {
-            for (int j = 0; j < 4; j++)
-            {
-                if (j < width)
-                {
-                    vector[i * 4 + j] = (v[i * width + j] == GL_FALSE) ? 0.0f : 1.0f;
-                }
-                else
-                {
-                    vector[i * 4 + j] = 0.0f;
-                }
-            }
-        }
-    }
-
-    applyUniformnfv(targetUniform, vector);
-}
-
 void Renderer9::applyUniformnfv(gl::Uniform *targetUniform, const GLfloat *v)
 {
     if (targetUniform->psRegisterIndex >= 0)
@@ -1713,62 +1692,36 @@
     }
 }
 
-void Renderer9::applyUniform1iv(gl::Uniform *targetUniform, GLsizei count, const GLint *v)
+void Renderer9::applyUniformniv(gl::Uniform *targetUniform, const GLint *v)
 {
-    ASSERT(count <= D3D9_MAX_FLOAT_CONSTANTS);
-    gl::Vector4 vector[D3D9_MAX_FLOAT_CONSTANTS];
+    ASSERT(targetUniform->registerCount <= D3D9_MAX_FLOAT_CONSTANTS);
+    GLfloat vector[D3D9_MAX_FLOAT_CONSTANTS][4];
 
-    for (int i = 0; i < count; i++)
+    for (unsigned int i = 0; i < targetUniform->registerCount; i++)
     {
-        vector[i] = gl::Vector4((float)v[i], 0, 0, 0);
+        vector[i][0] = (GLfloat)v[4 * i + 0];
+        vector[i][1] = (GLfloat)v[4 * i + 1];
+        vector[i][2] = (GLfloat)v[4 * i + 2];
+        vector[i][3] = (GLfloat)v[4 * i + 3];
     }
 
-    applyUniformnfv(targetUniform, (const GLfloat*)vector);
+    applyUniformnfv(targetUniform, (GLfloat*)vector);
 }
 
-void Renderer9::applyUniform2iv(gl::Uniform *targetUniform, GLsizei count, const GLint *v)
+void Renderer9::applyUniformnbv(gl::Uniform *targetUniform, const GLint *v)
 {
-    ASSERT(count <= D3D9_MAX_FLOAT_CONSTANTS);
-    gl::Vector4 vector[D3D9_MAX_FLOAT_CONSTANTS];
+    ASSERT(targetUniform->registerCount <= D3D9_MAX_FLOAT_CONSTANTS);
+    GLfloat vector[D3D9_MAX_FLOAT_CONSTANTS][4];
 
-    for (int i = 0; i < count; i++)
+    for (unsigned int i = 0; i < targetUniform->registerCount; i++)
     {
-        vector[i] = gl::Vector4((float)v[0], (float)v[1], 0, 0);
-
-        v += 2;
+        vector[i][0] = (v[4 * i + 0] == GL_FALSE) ? 0.0f : 1.0f;
+        vector[i][1] = (v[4 * i + 1] == GL_FALSE) ? 0.0f : 1.0f;
+        vector[i][2] = (v[4 * i + 2] == GL_FALSE) ? 0.0f : 1.0f;
+        vector[i][3] = (v[4 * i + 3] == GL_FALSE) ? 0.0f : 1.0f;
     }
 
-    applyUniformnfv(targetUniform, (const GLfloat*)vector);
-}
-
-void Renderer9::applyUniform3iv(gl::Uniform *targetUniform, GLsizei count, const GLint *v)
-{
-    ASSERT(count <= D3D9_MAX_FLOAT_CONSTANTS);
-    gl::Vector4 vector[D3D9_MAX_FLOAT_CONSTANTS];
-
-    for (int i = 0; i < count; i++)
-    {
-        vector[i] = gl::Vector4((float)v[0], (float)v[1], (float)v[2], 0);
-
-        v += 3;
-    }
-
-    applyUniformnfv(targetUniform, (const GLfloat*)vector);
-}
-
-void Renderer9::applyUniform4iv(gl::Uniform *targetUniform, GLsizei count, const GLint *v)
-{
-    ASSERT(count <= D3D9_MAX_FLOAT_CONSTANTS);
-    gl::Vector4 vector[D3D9_MAX_FLOAT_CONSTANTS];
-
-    for (int i = 0; i < count; i++)
-    {
-        vector[i] = gl::Vector4((float)v[0], (float)v[1], (float)v[2], (float)v[3]);
-
-        v += 4;
-    }
-
-    applyUniformnfv(targetUniform, (const GLfloat*)vector);
+    applyUniformnfv(targetUniform, (GLfloat*)vector);
 }
 
 void Renderer9::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer)