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, ...@@ -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; break;
} }
default: default:
...@@ -2210,6 +2219,15 @@ void CaptureBufferResetCalls(const gl::State &replayState, ...@@ -2210,6 +2219,15 @@ void CaptureBufferResetCalls(const gl::State &replayState,
CaptureUnmapBuffer(replayState, true, gl::BufferBinding::Array, GL_TRUE)); 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, void CaptureMidExecutionSetup(const gl::Context *context,
std::vector<CallCapture> *setupCalls, std::vector<CallCapture> *setupCalls,
ResourceTracker *resourceTracker, ResourceTracker *resourceTracker,
...@@ -2370,6 +2388,12 @@ void CaptureMidExecutionSetup(const gl::Context *context, ...@@ -2370,6 +2388,12 @@ void CaptureMidExecutionSetup(const gl::Context *context,
{ {
cap(CaptureBindBuffer(replayState, true, binding, bufferID)); 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. // Set a unpack alignment of 1.
......
...@@ -225,6 +225,8 @@ class ResourceTracker final : angle::NonCopyable ...@@ -225,6 +225,8 @@ class ResourceTracker final : angle::NonCopyable
BufferCalls &getBufferMapCalls() { return mBufferMapCalls; } BufferCalls &getBufferMapCalls() { return mBufferMapCalls; }
BufferCalls &getBufferUnmapCalls() { return mBufferUnmapCalls; } BufferCalls &getBufferUnmapCalls() { return mBufferUnmapCalls; }
std::vector<CallCapture> &getBufferBindingCalls() { return mBufferBindingCalls; }
BufferSet &getStartingBuffers() { return mStartingBuffers; } BufferSet &getStartingBuffers() { return mStartingBuffers; }
BufferSet &getNewBuffers() { return mNewBuffers; } BufferSet &getNewBuffers() { return mNewBuffers; }
BufferSet &getBuffersToRegen() { return mBuffersToRegen; } BufferSet &getBuffersToRegen() { return mBuffersToRegen; }
...@@ -266,6 +268,9 @@ class ResourceTracker final : angle::NonCopyable ...@@ -266,6 +268,9 @@ class ResourceTracker final : angle::NonCopyable
// Buffer unmap calls will bind and unmap a given buffer // Buffer unmap calls will bind and unmap a given buffer
BufferCalls mBufferUnmapCalls; 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 // Starting buffers include all the buffers created during setup for MEC
BufferSet mStartingBuffers; BufferSet mStartingBuffers;
// New buffers are those generated while capturing // 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