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
parent d8e93724
......@@ -32,6 +32,7 @@ Uniform::Uniform(GLenum type, const std::string &name, unsigned int arraySize) :
data = new unsigned char[bytes];
memset(data, 0, bytes);
dirty = true;
handlesSet = false;
}
Uniform::~Uniform()
......@@ -1793,8 +1794,10 @@ bool Program::applyUniform1bv(GLint location, GLsizei count, const GLboolean *v)
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 @@ bool Program::applyUniform2bv(GLint location, GLsizei count, const GLboolean *v)
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 @@ bool Program::applyUniform3bv(GLint location, GLsizei count, const GLboolean *v)
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 @@ bool Program::applyUniform4bv(GLint location, GLsizei count, const GLboolean *v)
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 @@ bool Program::applyUniform1fv(GLint location, GLsizei count, const GLfloat *v)
{
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 @@ bool Program::applyUniform2fv(GLint location, GLsizei count, const GLfloat *v)
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 @@ bool Program::applyUniform3fv(GLint location, GLsizei count, const GLfloat *v)
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 @@ bool Program::applyUniform4fv(GLint location, GLsizei count, const GLfloat *v)
{
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 @@ bool Program::applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat
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 @@ bool Program::applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat
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 @@ bool Program::applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat
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 @@ bool Program::applyUniform1iv(GLint location, GLsizei count, const GLint *v)
{
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 @@ bool Program::applyUniform2iv(GLint location, GLsizei count, const GLint *v)
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 @@ bool Program::applyUniform3iv(GLint location, GLsizei count, const GLint *v)
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 @@ bool Program::applyUniform4iv(GLint location, GLsizei count, const GLint *v)
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 @@ bool Program::validateSamplers() const
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;
}
}
......@@ -36,6 +36,10 @@ struct Uniform
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 @@ class Program
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();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment