Add an array index to arrays of structures.

TRAC #13625 This patch ensures that (member variables of) arrays of structures are listed separately by glGetActiveUniforms(). Their location can also be retrieved individually with glGetUniformLocation() using the array operator. Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@487 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent a6e31e58
......@@ -241,26 +241,22 @@ void Program::setSamplerDirty(unsigned int samplerIndex, bool dirty)
GLint Program::getUniformLocation(const char *name, bool decorated)
{
std::string nameStr(name);
std::string _name = decorated ? name : decorate(name);
int subscript = 0;
size_t beginB = nameStr.find('[');
size_t endB = nameStr.find(']');
if (beginB != std::string::npos && endB != std::string::npos)
{
std::string subscrStr = nameStr.substr(beginB + 1, beginB - endB - 1);
nameStr.erase(beginB);
subscript = atoi(subscrStr.c_str());
}
if (!decorated)
// Strip any trailing array operator and retrieve the subscript
size_t open = _name.find_last_of('[');
size_t close = _name.find_last_of(']');
if (open != std::string::npos && close == _name.length() - 1)
{
nameStr = decorate(nameStr);
subscript = atoi(_name.substr(open + 1).c_str());
_name.erase(open);
}
unsigned int numUniforms = mUniformIndex.size();
for (unsigned int location = 0; location < numUniforms; location++)
{
if (mUniformIndex[location].name == nameStr &&
if (mUniformIndex[location].name == _name &&
mUniformIndex[location].element == subscript)
{
return location;
......@@ -1674,18 +1670,23 @@ bool Program::defineUniform(const D3DXHANDLE &constantHandle, const D3DXCONSTANT
{
case D3DXPC_STRUCT:
{
for (unsigned int field = 0; field < constantDescription.StructMembers; field++)
for (unsigned int arrayIndex = 0; arrayIndex < constantDescription.Elements; arrayIndex++)
{
D3DXHANDLE fieldHandle = mConstantTablePS->GetConstant(constantHandle, field);
for (unsigned int field = 0; field < constantDescription.StructMembers; field++)
{
D3DXHANDLE fieldHandle = mConstantTablePS->GetConstant(constantHandle, field);
D3DXCONSTANT_DESC fieldDescription;
UINT descriptionCount = 1;
D3DXCONSTANT_DESC fieldDescription;
UINT descriptionCount = 1;
mConstantTablePS->GetConstantDesc(fieldHandle, &fieldDescription, &descriptionCount);
mConstantTablePS->GetConstantDesc(fieldHandle, &fieldDescription, &descriptionCount);
if (!defineUniform(fieldHandle, fieldDescription, name + constantDescription.Name + "."))
{
return false;
std::string structIndex = (constantDescription.Elements > 1) ? ("[" + str(arrayIndex) + "]") : "";
if (!defineUniform(fieldHandle, fieldDescription, name + constantDescription.Name + structIndex + "."))
{
return false;
}
}
}
......
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