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();