Cache D3D constant handles with their associated uniforms.
TRAC #12237
Signed-off-by: Andrew Lewycky
Signed-off-by: Daniel Koch

Author:    Shannon Woods

git-svn-id: https://angleproject.googlecode.com/svn/trunk@285 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Program.cpp b/src/libGLESv2/Program.cpp
index b709dbc..ba649a6 100644
--- a/src/libGLESv2/Program.cpp
+++ b/src/libGLESv2/Program.cpp
@@ -32,6 +32,7 @@
     data = new unsigned char[bytes];
     memset(data, 0, bytes);
     dirty = true;
+    handlesSet = false;
 }
 
 Uniform::~Uniform()
@@ -1793,8 +1794,10 @@
 
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
+
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -1826,8 +1829,9 @@
 
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -1860,8 +1864,9 @@
 
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -1895,8 +1900,9 @@
 
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -1918,8 +1924,9 @@
 {
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -1948,8 +1955,9 @@
 
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -1980,8 +1988,9 @@
 
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -2003,8 +2012,9 @@
 {
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -2036,8 +2046,9 @@
 
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -2071,8 +2082,9 @@
 
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -2106,8 +2118,9 @@
 
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -2129,8 +2142,9 @@
 {
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -2190,8 +2204,9 @@
 
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -2222,8 +2237,9 @@
 
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -2254,8 +2270,9 @@
 
     Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
 
-    D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
-    D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+    D3DXHANDLE constantPS;
+    D3DXHANDLE constantVS;
+    getConstantHandles(targetUniform, &constantPS, &constantVS);
     IDirect3DDevice9 *device = getDevice();
 
     if (constantPS)
@@ -2658,4 +2675,17 @@
 
     return true;
 }
+
+void Program::getConstantHandles(Uniform *targetUniform, D3DXHANDLE *constantPS, D3DXHANDLE *constantVS)
+{
+    if (!targetUniform->handlesSet)
+    {
+        targetUniform->psHandle = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str());
+        targetUniform->vsHandle = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str());
+        targetUniform->handlesSet = true;
+    }
+
+    *constantPS = targetUniform->psHandle;
+    *constantVS = targetUniform->vsHandle;
+}
 }
diff --git a/src/libGLESv2/Program.h b/src/libGLESv2/Program.h
index 27a260a..d23513b 100644
--- a/src/libGLESv2/Program.h
+++ b/src/libGLESv2/Program.h
@@ -36,6 +36,10 @@
 
     unsigned char *data;
     bool dirty;
+
+    D3DXHANDLE vsHandle;
+    D3DXHANDLE psHandle;
+    bool handlesSet;
 };
 
 // Struct used for correlating uniforms/elements of uniform arrays to handles
@@ -147,6 +151,8 @@
     bool applyUniform3iv(GLint location, GLsizei count, const GLint *v);
     bool applyUniform4iv(GLint location, GLsizei count, const GLint *v);
 
+    void getConstantHandles(Uniform *targetUniform, D3DXHANDLE *constantPS, D3DXHANDLE *constantVS);
+
     void appendToInfoLog(const char *info, ...);
     void resetInfoLog();