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
diff --git a/src/libGLESv2/Program.cpp b/src/libGLESv2/Program.cpp
index 058bc6a..b81c3cb 100644
--- a/src/libGLESv2/Program.cpp
+++ b/src/libGLESv2/Program.cpp
@@ -1685,12 +1685,12 @@
return;
}
- if (!linkUniforms(mConstantTablePS))
+ if (!linkUniforms(GL_FRAGMENT_SHADER, mConstantTablePS))
{
return;
}
- if (!linkUniforms(mConstantTableVS))
+ if (!linkUniforms(GL_VERTEX_SHADER, mConstantTableVS))
{
return;
}
@@ -1794,21 +1794,22 @@
return -1;
}
-bool Program::linkUniforms(ID3DXConstantTable *constantTable)
+bool Program::linkUniforms(GLenum shader, ID3DXConstantTable *constantTable)
{
D3DXCONSTANTTABLE_DESC constantTableDescription;
- D3DXCONSTANT_DESC constantDescription;
- UINT descriptionCount = 1;
constantTable->GetDesc(&constantTableDescription);
for (unsigned int constantIndex = 0; constantIndex < constantTableDescription.Constants; constantIndex++)
{
D3DXHANDLE constantHandle = constantTable->GetConstant(0, constantIndex);
+
+ D3DXCONSTANT_DESC constantDescription;
+ UINT descriptionCount = 1;
HRESULT result = constantTable->GetConstantDesc(constantHandle, &constantDescription, &descriptionCount);
ASSERT(SUCCEEDED(result));
- if (!defineUniform(constantHandle, constantDescription))
+ if (!defineUniform(shader, constantHandle, constantDescription))
{
return false;
}
@@ -1819,7 +1820,7 @@
// Adds the description of a constant found in the binary shader to the list of uniforms
// 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)
{
@@ -1884,7 +1885,7 @@
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;
}
@@ -1897,14 +1898,14 @@
case D3DXPC_VECTOR:
case D3DXPC_MATRIX_COLUMNS:
case D3DXPC_OBJECT:
- return defineUniform(constantDescription, name + constantDescription.Name);
+ return defineUniform(shader, constantDescription, name + constantDescription.Name);
default:
UNREACHABLE();
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);
@@ -1931,8 +1932,8 @@
}
}
- initializeConstantHandles(uniform, &uniform->ps, mConstantTablePS);
- initializeConstantHandles(uniform, &uniform->vs, mConstantTableVS);
+ if (shader == GL_FRAGMENT_SHADER) uniform->ps.set(constantDescription);
+ if (shader == GL_VERTEX_SHADER) uniform->vs.set(constantDescription);
mUniforms.push_back(uniform);
unsigned int uniformIndex = mUniforms.size() - 1;
@@ -2783,33 +2784,6 @@
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
{
return mDxDepthRangeLocation;