Use a map to store uniform locations instead of a vector.
Some intel drivers use seemingly arbitrary integers as uniform locations.
This causes the location vector to be resized to arbitrarily large sizes.
BUG=angleproject:882
Change-Id: I8db89178907dd6206eb8e646a0b426aa9bac0832
Reviewed-on: https://chromium-review.googlesource.com/274816
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index 0059516..ef69fb7 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -529,12 +529,17 @@
return LinkResult(false, gl::Error(GL_NO_ERROR));
}
- mUniformIndex.resize(uniformIndexCount);
for (unsigned int uniformIndexIndex = 0; uniformIndexIndex < uniformIndexCount; uniformIndexIndex++)
{
- stream->readString(&mUniformIndex[uniformIndexIndex].name);
- stream->readInt(&mUniformIndex[uniformIndexIndex].element);
- stream->readInt(&mUniformIndex[uniformIndexIndex].index);
+ GLuint location;
+ stream->readInt(&location);
+
+ gl::VariableLocation variable;
+ stream->readString(&variable.name);
+ stream->readInt(&variable.element);
+ stream->readInt(&variable.index);
+
+ mUniformIndex[location] = variable;
}
unsigned int uniformBlockCount = stream->readInt<unsigned int>();
@@ -756,11 +761,15 @@
}
stream->writeInt(mUniformIndex.size());
- for (size_t i = 0; i < mUniformIndex.size(); ++i)
+ for (const auto &uniform : mUniformIndex)
{
- stream->writeString(mUniformIndex[i].name);
- stream->writeInt(mUniformIndex[i].element);
- stream->writeInt(mUniformIndex[i].index);
+ GLuint location = uniform.first;
+ stream->writeInt(location);
+
+ const gl::VariableLocation &variable = uniform.second;
+ stream->writeString(variable.name);
+ stream->writeInt(variable.element);
+ stream->writeInt(variable.index);
}
stream->writeInt(mUniformBlocks.size());
@@ -1974,7 +1983,8 @@
{
if (!uniform.isBuiltIn())
{
- mUniformIndex.push_back(gl::VariableLocation(uniform.name, arrayIndex, uniformIndex));
+ // Assign in-order uniform locations
+ mUniformIndex[mUniformIndex.size()] = gl::VariableLocation(uniform.name, arrayIndex, uniformIndex);
}
}
}