Iterate directly over uniforms when applying them
Directly iterate over uniforms, not over uniform locations, so we don't waste time looking at locations in the middle of arrays. Gets about 1 fps on a NaCl benchmark.
BUG=
TEST=webgl conformance tests
Review URL: http://codereview.appspot.com/5210042
git-svn-id: https://angleproject.googlecode.com/svn/trunk@792 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Program.cpp b/src/libGLESv2/Program.cpp
index 27e6550..09e3b61 100644
--- a/src/libGLESv2/Program.cpp
+++ b/src/libGLESv2/Program.cpp
@@ -920,15 +920,8 @@
// Applies all the uniforms set for this program object to the Direct3D 9 device
void Program::applyUniforms()
{
- unsigned int numUniforms = mUniformIndex.size();
- for (unsigned int location = 0; location < numUniforms; location++)
- {
- if (mUniformIndex[location].element != 0)
- {
- continue;
- }
-
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
+ for (std::vector<Uniform*>::iterator ub = mUniforms.begin(), ue = mUniforms.end(); ub != ue; ++ub) {
+ Uniform *targetUniform = *ub;
if (targetUniform->dirty)
{
@@ -939,23 +932,23 @@
switch (targetUniform->type)
{
- case GL_BOOL: applyUniform1bv(location, arraySize, b); break;
- case GL_BOOL_VEC2: applyUniform2bv(location, arraySize, b); break;
- case GL_BOOL_VEC3: applyUniform3bv(location, arraySize, b); break;
- case GL_BOOL_VEC4: applyUniform4bv(location, arraySize, b); break;
- case GL_FLOAT: applyUniform1fv(location, arraySize, f); break;
- case GL_FLOAT_VEC2: applyUniform2fv(location, arraySize, f); break;
- case GL_FLOAT_VEC3: applyUniform3fv(location, arraySize, f); break;
- case GL_FLOAT_VEC4: applyUniform4fv(location, arraySize, f); break;
- case GL_FLOAT_MAT2: applyUniformMatrix2fv(location, arraySize, f); break;
- case GL_FLOAT_MAT3: applyUniformMatrix3fv(location, arraySize, f); break;
- case GL_FLOAT_MAT4: applyUniformMatrix4fv(location, arraySize, f); break;
+ case GL_BOOL: applyUniform1bv(targetUniform, arraySize, b); break;
+ case GL_BOOL_VEC2: applyUniform2bv(targetUniform, arraySize, b); break;
+ case GL_BOOL_VEC3: applyUniform3bv(targetUniform, arraySize, b); break;
+ case GL_BOOL_VEC4: applyUniform4bv(targetUniform, arraySize, b); break;
+ case GL_FLOAT: applyUniform1fv(targetUniform, arraySize, f); break;
+ case GL_FLOAT_VEC2: applyUniform2fv(targetUniform, arraySize, f); break;
+ case GL_FLOAT_VEC3: applyUniform3fv(targetUniform, arraySize, f); break;
+ case GL_FLOAT_VEC4: applyUniform4fv(targetUniform, arraySize, f); break;
+ case GL_FLOAT_MAT2: applyUniformMatrix2fv(targetUniform, arraySize, f); break;
+ case GL_FLOAT_MAT3: applyUniformMatrix3fv(targetUniform, arraySize, f); break;
+ case GL_FLOAT_MAT4: applyUniformMatrix4fv(targetUniform, arraySize, f); break;
case GL_SAMPLER_2D:
case GL_SAMPLER_CUBE:
- case GL_INT: applyUniform1iv(location, arraySize, i); break;
- case GL_INT_VEC2: applyUniform2iv(location, arraySize, i); break;
- case GL_INT_VEC3: applyUniform3iv(location, arraySize, i); break;
- case GL_INT_VEC4: applyUniform4iv(location, arraySize, i); break;
+ case GL_INT: applyUniform1iv(targetUniform, arraySize, i); break;
+ case GL_INT_VEC2: applyUniform2iv(targetUniform, arraySize, i); break;
+ case GL_INT_VEC3: applyUniform3iv(targetUniform, arraySize, i); break;
+ case GL_INT_VEC4: applyUniform4iv(targetUniform, arraySize, i); break;
default:
UNREACHABLE();
}
@@ -1925,7 +1918,7 @@
return _name;
}
-bool Program::applyUniform1bv(GLint location, GLsizei count, const GLboolean *v)
+bool Program::applyUniform1bv(Uniform *targetUniform, GLsizei count, const GLboolean *v)
{
BOOL *vector = new BOOL[count];
for (int i = 0; i < count; i++)
@@ -1936,8 +1929,6 @@
vector[i] = 1;
}
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
@@ -1959,7 +1950,7 @@
return true;
}
-bool Program::applyUniform2bv(GLint location, GLsizei count, const GLboolean *v)
+bool Program::applyUniform2bv(Uniform *targetUniform, GLsizei count, const GLboolean *v)
{
D3DXVECTOR4 *vector = new D3DXVECTOR4[count];
@@ -1971,8 +1962,6 @@
v += 2;
}
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
@@ -1993,7 +1982,7 @@
return true;
}
-bool Program::applyUniform3bv(GLint location, GLsizei count, const GLboolean *v)
+bool Program::applyUniform3bv(Uniform *targetUniform, GLsizei count, const GLboolean *v)
{
D3DXVECTOR4 *vector = new D3DXVECTOR4[count];
@@ -2006,8 +1995,6 @@
v += 3;
}
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
@@ -2028,7 +2015,7 @@
return true;
}
-bool Program::applyUniform4bv(GLint location, GLsizei count, const GLboolean *v)
+bool Program::applyUniform4bv(Uniform *targetUniform, GLsizei count, const GLboolean *v)
{
D3DXVECTOR4 *vector = new D3DXVECTOR4[count];
@@ -2042,8 +2029,6 @@
v += 3;
}
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
@@ -2064,10 +2049,8 @@
return true;
}
-bool Program::applyUniform1fv(GLint location, GLsizei count, const GLfloat *v)
+bool Program::applyUniform1fv(Uniform *targetUniform, GLsizei count, const GLfloat *v)
{
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
@@ -2086,7 +2069,7 @@
return true;
}
-bool Program::applyUniform2fv(GLint location, GLsizei count, const GLfloat *v)
+bool Program::applyUniform2fv(Uniform *targetUniform, GLsizei count, const GLfloat *v)
{
D3DXVECTOR4 *vector = new D3DXVECTOR4[count];
@@ -2097,8 +2080,6 @@
v += 2;
}
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
@@ -2119,7 +2100,7 @@
return true;
}
-bool Program::applyUniform3fv(GLint location, GLsizei count, const GLfloat *v)
+bool Program::applyUniform3fv(Uniform *targetUniform, GLsizei count, const GLfloat *v)
{
D3DXVECTOR4 *vector = new D3DXVECTOR4[count];
@@ -2130,8 +2111,6 @@
v += 3;
}
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
@@ -2152,10 +2131,8 @@
return true;
}
-bool Program::applyUniform4fv(GLint location, GLsizei count, const GLfloat *v)
+bool Program::applyUniform4fv(Uniform *targetUniform, GLsizei count, const GLfloat *v)
{
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
@@ -2174,7 +2151,7 @@
return true;
}
-bool Program::applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value)
+bool Program::applyUniformMatrix2fv(Uniform *targetUniform, GLsizei count, const GLfloat *value)
{
D3DXMATRIX *matrix = new D3DXMATRIX[count];
@@ -2188,8 +2165,6 @@
value += 4;
}
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
@@ -2210,7 +2185,7 @@
return true;
}
-bool Program::applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value)
+bool Program::applyUniformMatrix3fv(Uniform *targetUniform, GLsizei count, const GLfloat *value)
{
D3DXMATRIX *matrix = new D3DXMATRIX[count];
@@ -2224,8 +2199,6 @@
value += 9;
}
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
@@ -2246,7 +2219,7 @@
return true;
}
-bool Program::applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value)
+bool Program::applyUniformMatrix4fv(Uniform *targetUniform, GLsizei count, const GLfloat *value)
{
D3DXMATRIX *matrix = new D3DXMATRIX[count];
@@ -2260,8 +2233,6 @@
value += 16;
}
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
@@ -2282,10 +2253,8 @@
return true;
}
-bool Program::applyUniform1iv(GLint location, GLsizei count, const GLint *v)
+bool Program::applyUniform1iv(Uniform *targetUniform, GLsizei count, const GLint *v)
{
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
@@ -2350,7 +2319,7 @@
return true;
}
-bool Program::applyUniform2iv(GLint location, GLsizei count, const GLint *v)
+bool Program::applyUniform2iv(Uniform *targetUniform, GLsizei count, const GLint *v)
{
D3DXVECTOR4 *vector = new D3DXVECTOR4[count];
@@ -2361,8 +2330,6 @@
v += 2;
}
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
@@ -2383,7 +2350,7 @@
return true;
}
-bool Program::applyUniform3iv(GLint location, GLsizei count, const GLint *v)
+bool Program::applyUniform3iv(Uniform *targetUniform, GLsizei count, const GLint *v)
{
D3DXVECTOR4 *vector = new D3DXVECTOR4[count];
@@ -2394,8 +2361,6 @@
v += 3;
}
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
@@ -2416,7 +2381,7 @@
return true;
}
-bool Program::applyUniform4iv(GLint location, GLsizei count, const GLint *v)
+bool Program::applyUniform4iv(Uniform *targetUniform, GLsizei count, const GLint *v)
{
D3DXVECTOR4 *vector = new D3DXVECTOR4[count];
@@ -2427,8 +2392,6 @@
v += 4;
}
- Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
-
D3DXHANDLE constantPS;
D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);