Commit 27ea50a5 by Cody Northrop Committed by Commit Bot

Capture/Replay: Restore buffer bindings during Reset

Emit code to reset all buffer bindings to how they were at the beginning during MEC. Test: Capture Clash of Clans Bug: angleproject:4048 Bug: b/172626835 Change-Id: I5a5446304d119f51a018c8fe88ff386243d19749 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2521179Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCourtney Goeltzenleuchter <courtneygo@google.com> Commit-Queue: Cody Northrop <cnorthrop@google.com>
parent e70b1527
......@@ -909,6 +909,15 @@ void MaybeResetResources(std::stringstream &out,
}
}
// Restore buffer bindings as seen during MEC
std::vector<CallCapture> &bufferBindingCalls = resourceTracker->getBufferBindingCalls();
for (CallCapture &call : bufferBindingCalls)
{
out << " ";
WriteCppReplayForCall(call, dataTracker, out, header, binaryData);
out << ";\n";
}
break;
}
default:
......@@ -2210,6 +2219,15 @@ void CaptureBufferResetCalls(const gl::State &replayState,
CaptureUnmapBuffer(replayState, true, gl::BufferBinding::Array, GL_TRUE));
}
void CaptureBufferBindingResetCalls(const gl::State &replayState,
ResourceTracker *resourceTracker,
gl::BufferBinding binding,
gl::BufferID id)
{
std::vector<CallCapture> &bufferBindingCalls = resourceTracker->getBufferBindingCalls();
Capture(&bufferBindingCalls, CaptureBindBuffer(replayState, true, binding, id));
}
void CaptureMidExecutionSetup(const gl::Context *context,
std::vector<CallCapture> *setupCalls,
ResourceTracker *resourceTracker,
......@@ -2370,6 +2388,12 @@ void CaptureMidExecutionSetup(const gl::Context *context,
{
cap(CaptureBindBuffer(replayState, true, binding, bufferID));
}
// Restore all buffer bindings for Reset
if (bufferID.value != 0)
{
CaptureBufferBindingResetCalls(replayState, resourceTracker, binding, bufferID);
}
}
// Set a unpack alignment of 1.
......
......@@ -225,6 +225,8 @@ class ResourceTracker final : angle::NonCopyable
BufferCalls &getBufferMapCalls() { return mBufferMapCalls; }
BufferCalls &getBufferUnmapCalls() { return mBufferUnmapCalls; }
std::vector<CallCapture> &getBufferBindingCalls() { return mBufferBindingCalls; }
BufferSet &getStartingBuffers() { return mStartingBuffers; }
BufferSet &getNewBuffers() { return mNewBuffers; }
BufferSet &getBuffersToRegen() { return mBuffersToRegen; }
......@@ -266,6 +268,9 @@ class ResourceTracker final : angle::NonCopyable
// Buffer unmap calls will bind and unmap a given buffer
BufferCalls mBufferUnmapCalls;
// Buffer binding calls to restore bindings recorded during MEC
std::vector<CallCapture> mBufferBindingCalls;
// Starting buffers include all the buffers created during setup for MEC
BufferSet mStartingBuffers;
// New buffers are those generated while capturing
......
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