Commit 13859945 by Cody Northrop Committed by Commit Bot

Capture/Replay: Fix default uniform array capture

The pointer from vector::data() already reflects the size of the underlying type, so no need to include sizeof. This caused us to write beyond the vector bounds when reading multiple values. We were also missing component count. Test: MEC of NBA2K20 Bug: b/160014453 Change-Id: I51fc3f5f80c732221d6ea4b4bd1afde635e410a1 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2270909Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarManh Nguyen <nguyenmh@google.com> Commit-Queue: Cody Northrop <cnorthrop@google.com>
parent 900c7e87
......@@ -1577,7 +1577,8 @@ void CaptureUpdateUniformValues(const gl::State &replayState,
gl::UniformLocation uniformLoc = program->getUniformLocation(uniformName);
const gl::UniformTypeInfo *typeInfo = uniform.typeInfo;
int uniformSize = uniformCount * typeInfo->componentCount;
int componentCount = typeInfo->componentCount;
int uniformSize = uniformCount * componentCount;
// For arrayed uniforms, we'll need to increment a read location
gl::UniformLocation readLoc = uniformLoc;
......@@ -1589,9 +1590,8 @@ void CaptureUpdateUniformValues(const gl::State &replayState,
std::vector<GLfloat> uniformBuffer(uniformSize);
for (int index = 0; index < uniformCount; index++, readLoc.value++)
{
program->getUniformfv(
context, readLoc,
static_cast<GLfloat *>(uniformBuffer.data() + index * sizeof(GLfloat)));
program->getUniformfv(context, readLoc,
uniformBuffer.data() + index * componentCount);
}
switch (typeInfo->type)
{
......@@ -1668,11 +1668,10 @@ void CaptureUpdateUniformValues(const gl::State &replayState,
std::vector<GLint> uniformBuffer(uniformSize);
for (int index = 0; index < uniformCount; index++, readLoc.value++)
{
program->getUniformiv(
context, readLoc,
static_cast<GLint *>(uniformBuffer.data() + index * sizeof(GLint)));
program->getUniformiv(context, readLoc,
uniformBuffer.data() + index * componentCount);
}
switch (typeInfo->componentCount)
switch (componentCount)
{
case 4:
Capture(callsOut, CaptureUniform4iv(replayState, true, uniformLoc,
......@@ -1702,11 +1701,10 @@ void CaptureUpdateUniformValues(const gl::State &replayState,
std::vector<GLuint> uniformBuffer(uniformSize);
for (int index = 0; index < uniformCount; index++, readLoc.value++)
{
program->getUniformuiv(
context, readLoc,
static_cast<GLuint *>(uniformBuffer.data() + index * sizeof(GLuint)));
program->getUniformuiv(context, readLoc,
uniformBuffer.data() + index * componentCount);
}
switch (typeInfo->componentCount)
switch (componentCount)
{
case 4:
Capture(callsOut, CaptureUniform4uiv(replayState, true, uniformLoc,
......
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