Refactored setting the register information.

Avoided calling GetConstantByName. TRAC #20948 Issue=337 Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@1137 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent ea7c345f
...@@ -1685,12 +1685,12 @@ void Program::link() ...@@ -1685,12 +1685,12 @@ void Program::link()
return; return;
} }
if (!linkUniforms(mConstantTablePS)) if (!linkUniforms(GL_FRAGMENT_SHADER, mConstantTablePS))
{ {
return; return;
} }
if (!linkUniforms(mConstantTableVS)) if (!linkUniforms(GL_VERTEX_SHADER, mConstantTableVS))
{ {
return; return;
} }
...@@ -1794,21 +1794,22 @@ int Program::getAttributeBinding(const std::string &name) ...@@ -1794,21 +1794,22 @@ int Program::getAttributeBinding(const std::string &name)
return -1; return -1;
} }
bool Program::linkUniforms(ID3DXConstantTable *constantTable) bool Program::linkUniforms(GLenum shader, ID3DXConstantTable *constantTable)
{ {
D3DXCONSTANTTABLE_DESC constantTableDescription; D3DXCONSTANTTABLE_DESC constantTableDescription;
D3DXCONSTANT_DESC constantDescription;
UINT descriptionCount = 1;
constantTable->GetDesc(&constantTableDescription); constantTable->GetDesc(&constantTableDescription);
for (unsigned int constantIndex = 0; constantIndex < constantTableDescription.Constants; constantIndex++) for (unsigned int constantIndex = 0; constantIndex < constantTableDescription.Constants; constantIndex++)
{ {
D3DXHANDLE constantHandle = constantTable->GetConstant(0, constantIndex); D3DXHANDLE constantHandle = constantTable->GetConstant(0, constantIndex);
D3DXCONSTANT_DESC constantDescription;
UINT descriptionCount = 1;
HRESULT result = constantTable->GetConstantDesc(constantHandle, &constantDescription, &descriptionCount); HRESULT result = constantTable->GetConstantDesc(constantHandle, &constantDescription, &descriptionCount);
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
if (!defineUniform(constantHandle, constantDescription)) if (!defineUniform(shader, constantHandle, constantDescription))
{ {
return false; return false;
} }
...@@ -1819,7 +1820,7 @@ bool Program::linkUniforms(ID3DXConstantTable *constantTable) ...@@ -1819,7 +1820,7 @@ bool Program::linkUniforms(ID3DXConstantTable *constantTable)
// Adds the description of a constant found in the binary shader to the list of uniforms // Adds the description of a constant found in the binary shader to the list of uniforms
// Returns true if succesful (uniform not already defined) // Returns true if succesful (uniform not already defined)
bool Program::defineUniform(const D3DXHANDLE &constantHandle, const D3DXCONSTANT_DESC &constantDescription, std::string name) bool Program::defineUniform(GLenum shader, const D3DXHANDLE &constantHandle, const D3DXCONSTANT_DESC &constantDescription, std::string name)
{ {
if (constantDescription.RegisterSet == D3DXRS_SAMPLER) if (constantDescription.RegisterSet == D3DXRS_SAMPLER)
{ {
...@@ -1884,7 +1885,7 @@ bool Program::defineUniform(const D3DXHANDLE &constantHandle, const D3DXCONSTANT ...@@ -1884,7 +1885,7 @@ bool Program::defineUniform(const D3DXHANDLE &constantHandle, const D3DXCONSTANT
std::string structIndex = (constantDescription.Elements > 1) ? ("[" + str(arrayIndex) + "]") : ""; std::string structIndex = (constantDescription.Elements > 1) ? ("[" + str(arrayIndex) + "]") : "";
if (!defineUniform(fieldHandle, fieldDescription, name + constantDescription.Name + structIndex + ".")) if (!defineUniform(shader, fieldHandle, fieldDescription, name + constantDescription.Name + structIndex + "."))
{ {
return false; return false;
} }
...@@ -1897,14 +1898,14 @@ bool Program::defineUniform(const D3DXHANDLE &constantHandle, const D3DXCONSTANT ...@@ -1897,14 +1898,14 @@ bool Program::defineUniform(const D3DXHANDLE &constantHandle, const D3DXCONSTANT
case D3DXPC_VECTOR: case D3DXPC_VECTOR:
case D3DXPC_MATRIX_COLUMNS: case D3DXPC_MATRIX_COLUMNS:
case D3DXPC_OBJECT: case D3DXPC_OBJECT:
return defineUniform(constantDescription, name + constantDescription.Name); return defineUniform(shader, constantDescription, name + constantDescription.Name);
default: default:
UNREACHABLE(); UNREACHABLE();
return false; return false;
} }
} }
bool Program::defineUniform(const D3DXCONSTANT_DESC &constantDescription, const std::string &_name) bool Program::defineUniform(GLenum shader, const D3DXCONSTANT_DESC &constantDescription, const std::string &_name)
{ {
Uniform *uniform = createUniform(constantDescription, _name); Uniform *uniform = createUniform(constantDescription, _name);
...@@ -1931,8 +1932,8 @@ bool Program::defineUniform(const D3DXCONSTANT_DESC &constantDescription, const ...@@ -1931,8 +1932,8 @@ bool Program::defineUniform(const D3DXCONSTANT_DESC &constantDescription, const
} }
} }
initializeConstantHandles(uniform, &uniform->ps, mConstantTablePS); if (shader == GL_FRAGMENT_SHADER) uniform->ps.set(constantDescription);
initializeConstantHandles(uniform, &uniform->vs, mConstantTableVS); if (shader == GL_VERTEX_SHADER) uniform->vs.set(constantDescription);
mUniforms.push_back(uniform); mUniforms.push_back(uniform);
unsigned int uniformIndex = mUniforms.size() - 1; unsigned int uniformIndex = mUniforms.size() - 1;
...@@ -2783,33 +2784,6 @@ bool Program::validateSamplers(bool logErrors) ...@@ -2783,33 +2784,6 @@ bool Program::validateSamplers(bool logErrors)
return true; return true;
} }
void Program::initializeConstantHandles(Uniform *targetUniform, Uniform::RegisterInfo *ri, ID3DXConstantTable *constantTable)
{
D3DXHANDLE handle = constantTable->GetConstantByName(0, targetUniform->_name.c_str());
if (handle)
{
UINT descriptionCount = 1;
D3DXCONSTANT_DESC constantDescription;
HRESULT result = constantTable->GetConstantDesc(handle, &constantDescription, &descriptionCount);
ASSERT(SUCCEEDED(result));
switch(constantDescription.RegisterSet)
{
case D3DXRS_BOOL: ri->boolIndex = constantDescription.RegisterIndex; break;
case D3DXRS_FLOAT4: ri->float4Index = constantDescription.RegisterIndex; break;
case D3DXRS_SAMPLER: ri->samplerIndex = constantDescription.RegisterIndex; break;
default: UNREACHABLE();
}
ASSERT(ri->registerCount == 0 || ri->registerCount == (int)constantDescription.RegisterCount);
ri->registerCount = constantDescription.RegisterCount;
}
else
{
ri->registerCount = 0;
}
}
GLint Program::getDxDepthRangeLocation() const GLint Program::getDxDepthRangeLocation() const
{ {
return mDxDepthRangeLocation; return mDxDepthRangeLocation;
......
...@@ -52,6 +52,20 @@ struct Uniform ...@@ -52,6 +52,20 @@ struct Uniform
registerCount = 0; registerCount = 0;
} }
void set(const D3DXCONSTANT_DESC &constantDescription)
{
switch(constantDescription.RegisterSet)
{
case D3DXRS_BOOL: boolIndex = constantDescription.RegisterIndex; break;
case D3DXRS_FLOAT4: float4Index = constantDescription.RegisterIndex; break;
case D3DXRS_SAMPLER: samplerIndex = constantDescription.RegisterIndex; break;
default: UNREACHABLE();
}
ASSERT(registerCount == 0 || registerCount == (int)constantDescription.RegisterCount);
registerCount = constantDescription.RegisterCount;
}
int float4Index; int float4Index;
int samplerIndex; int samplerIndex;
int boolIndex; int boolIndex;
...@@ -162,9 +176,9 @@ class Program ...@@ -162,9 +176,9 @@ class Program
bool linkAttributes(); bool linkAttributes();
int getAttributeBinding(const std::string &name); int getAttributeBinding(const std::string &name);
bool linkUniforms(ID3DXConstantTable *constantTable); bool linkUniforms(GLenum shader, ID3DXConstantTable *constantTable);
bool defineUniform(const D3DXHANDLE &constantHandle, const D3DXCONSTANT_DESC &constantDescription, std::string name = ""); bool defineUniform(GLenum shader, const D3DXHANDLE &constantHandle, const D3DXCONSTANT_DESC &constantDescription, std::string name = "");
bool defineUniform(const D3DXCONSTANT_DESC &constantDescription, const std::string &name); bool defineUniform(GLenum shader, const D3DXCONSTANT_DESC &constantDescription, const std::string &name);
Uniform *createUniform(const D3DXCONSTANT_DESC &constantDescription, const std::string &name); Uniform *createUniform(const D3DXCONSTANT_DESC &constantDescription, const std::string &name);
bool applyUniformnfv(Uniform *targetUniform, const GLfloat *v); bool applyUniformnfv(Uniform *targetUniform, const GLfloat *v);
bool applyUniform1iv(Uniform *targetUniform, GLsizei count, const GLint *v); bool applyUniform1iv(Uniform *targetUniform, GLsizei count, const GLint *v);
...@@ -174,8 +188,6 @@ class Program ...@@ -174,8 +188,6 @@ class Program
void applyUniformniv(Uniform *targetUniform, GLsizei count, const D3DXVECTOR4 *vector); void applyUniformniv(Uniform *targetUniform, GLsizei count, const D3DXVECTOR4 *vector);
void applyUniformnbv(Uniform *targetUniform, GLsizei count, int width, const GLboolean *v); void applyUniformnbv(Uniform *targetUniform, GLsizei count, int width, const GLboolean *v);
void initializeConstantHandles(Uniform *targetUniform, Uniform::RegisterInfo *rs, ID3DXConstantTable *constantTable);
void appendToInfoLogSanitized(const char *message); void appendToInfoLogSanitized(const char *message);
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