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) : ...@@ -32,6 +32,7 @@ Uniform::Uniform(GLenum type, const std::string &name, unsigned int arraySize) :
data = new unsigned char[bytes]; data = new unsigned char[bytes];
memset(data, 0, bytes); memset(data, 0, bytes);
dirty = true; dirty = true;
handlesSet = false;
} }
Uniform::~Uniform() Uniform::~Uniform()
...@@ -1793,8 +1794,10 @@ bool Program::applyUniform1bv(GLint location, GLsizei count, const GLboolean *v) ...@@ -1793,8 +1794,10 @@ bool Program::applyUniform1bv(GLint location, GLsizei count, const GLboolean *v)
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -1826,8 +1829,9 @@ bool Program::applyUniform2bv(GLint location, GLsizei count, const GLboolean *v) ...@@ -1826,8 +1829,9 @@ bool Program::applyUniform2bv(GLint location, GLsizei count, const GLboolean *v)
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -1860,8 +1864,9 @@ bool Program::applyUniform3bv(GLint location, GLsizei count, const GLboolean *v) ...@@ -1860,8 +1864,9 @@ bool Program::applyUniform3bv(GLint location, GLsizei count, const GLboolean *v)
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -1895,8 +1900,9 @@ bool Program::applyUniform4bv(GLint location, GLsizei count, const GLboolean *v) ...@@ -1895,8 +1900,9 @@ bool Program::applyUniform4bv(GLint location, GLsizei count, const GLboolean *v)
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -1918,8 +1924,9 @@ bool Program::applyUniform1fv(GLint location, GLsizei count, const GLfloat *v) ...@@ -1918,8 +1924,9 @@ bool Program::applyUniform1fv(GLint location, GLsizei count, const GLfloat *v)
{ {
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -1948,8 +1955,9 @@ bool Program::applyUniform2fv(GLint location, GLsizei count, const GLfloat *v) ...@@ -1948,8 +1955,9 @@ bool Program::applyUniform2fv(GLint location, GLsizei count, const GLfloat *v)
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -1980,8 +1988,9 @@ bool Program::applyUniform3fv(GLint location, GLsizei count, const GLfloat *v) ...@@ -1980,8 +1988,9 @@ bool Program::applyUniform3fv(GLint location, GLsizei count, const GLfloat *v)
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -2003,8 +2012,9 @@ bool Program::applyUniform4fv(GLint location, GLsizei count, const GLfloat *v) ...@@ -2003,8 +2012,9 @@ bool Program::applyUniform4fv(GLint location, GLsizei count, const GLfloat *v)
{ {
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -2036,8 +2046,9 @@ bool Program::applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat ...@@ -2036,8 +2046,9 @@ bool Program::applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -2071,8 +2082,9 @@ bool Program::applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat ...@@ -2071,8 +2082,9 @@ bool Program::applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -2106,8 +2118,9 @@ bool Program::applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat ...@@ -2106,8 +2118,9 @@ bool Program::applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -2129,8 +2142,9 @@ bool Program::applyUniform1iv(GLint location, GLsizei count, const GLint *v) ...@@ -2129,8 +2142,9 @@ bool Program::applyUniform1iv(GLint location, GLsizei count, const GLint *v)
{ {
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -2190,8 +2204,9 @@ bool Program::applyUniform2iv(GLint location, GLsizei count, const GLint *v) ...@@ -2190,8 +2204,9 @@ bool Program::applyUniform2iv(GLint location, GLsizei count, const GLint *v)
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -2222,8 +2237,9 @@ bool Program::applyUniform3iv(GLint location, GLsizei count, const GLint *v) ...@@ -2222,8 +2237,9 @@ bool Program::applyUniform3iv(GLint location, GLsizei count, const GLint *v)
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -2254,8 +2270,9 @@ bool Program::applyUniform4iv(GLint location, GLsizei count, const GLint *v) ...@@ -2254,8 +2270,9 @@ bool Program::applyUniform4iv(GLint location, GLsizei count, const GLint *v)
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantPS;
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, targetUniform->name.c_str()); D3DXHANDLE constantVS;
getConstantHandles(targetUniform, &constantPS, &constantVS);
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
if (constantPS) if (constantPS)
...@@ -2658,4 +2675,17 @@ bool Program::validateSamplers() const ...@@ -2658,4 +2675,17 @@ bool Program::validateSamplers() const
return true; 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 ...@@ -36,6 +36,10 @@ struct Uniform
unsigned char *data; unsigned char *data;
bool dirty; bool dirty;
D3DXHANDLE vsHandle;
D3DXHANDLE psHandle;
bool handlesSet;
}; };
// Struct used for correlating uniforms/elements of uniform arrays to handles // Struct used for correlating uniforms/elements of uniform arrays to handles
...@@ -147,6 +151,8 @@ class Program ...@@ -147,6 +151,8 @@ class Program
bool applyUniform3iv(GLint location, GLsizei count, const GLint *v); bool applyUniform3iv(GLint location, GLsizei count, const GLint *v);
bool applyUniform4iv(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 appendToInfoLog(const char *info, ...);
void resetInfoLog(); 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