Commit e02d1e63 authored by Eric Seckler's avatar Eric Seckler Committed by Commit Bot

[viz] Ignore stray BeginFrameAcks in DisplayScheduler.

The DisplayScheduler's surface state tracking mechanism was susceptible
to overriding a surface's state with an older sequence number, which
could cause infinite blocking in wait_for_all_surfaces_before_draw mode.

Bug: 697086
Change-Id: Ife6ea5df9ccef729df2a17ff3f199ee5784c880b
Reviewed-on: https://chromium-review.googlesource.com/700554
Commit-Queue: Eric Seckler <eseckler@chromium.org>
Reviewed-by: default avatardanakj <danakj@chromium.org>
Cr-Commit-Position: refs/heads/master@{#506700}
parent 9ea03537
...@@ -119,10 +119,17 @@ void DisplayScheduler::ProcessSurfaceDamage(const SurfaceId& surface_id, ...@@ -119,10 +119,17 @@ void DisplayScheduler::ProcessSurfaceDamage(const SurfaceId& surface_id,
bool valid_ack = ack.sequence_number != BeginFrameArgs::kInvalidFrameNumber; bool valid_ack = ack.sequence_number != BeginFrameArgs::kInvalidFrameNumber;
if (valid_ack) { if (valid_ack) {
auto it = surface_states_.find(surface_id); auto it = surface_states_.find(surface_id);
if (it != surface_states_.end()) // Ignore stray acknowledgments for prior BeginFrames, to ensure we don't
// override a newer sequence number in the surface state. We may receive
// such stray acks e.g. when a CompositorFrame activates in a later
// BeginFrame than it was created.
if (it != surface_states_.end() &&
(it->second.last_ack.source_id != ack.source_id ||
it->second.last_ack.sequence_number < ack.sequence_number)) {
it->second.last_ack = ack; it->second.last_ack = ack;
else } else {
valid_ack = false; valid_ack = false;
}
} }
bool pending_surfaces_changed = false; bool pending_surfaces_changed = false;
......
...@@ -418,6 +418,15 @@ TEST_F(DisplaySchedulerWaitForAllSurfacesTest, WaitForAllSurfacesBeforeDraw) { ...@@ -418,6 +418,15 @@ TEST_F(DisplaySchedulerWaitForAllSurfacesTest, WaitForAllSurfacesBeforeDraw) {
ack = AckForCurrentBeginFrame(); ack = AckForCurrentBeginFrame();
ack.has_damage = false; ack.has_damage = false;
scheduler_.ProcessSurfaceDamage(sid1, ack, false); scheduler_.ProcessSurfaceDamage(sid1, ack, false);
EXPECT_GE(now_src().NowTicks(),
scheduler_.DesiredBeginFrameDeadlineTimeForTest());
// Stray BeginFrameAcks for older BeginFrames are ignored.
ack.sequence_number--;
scheduler_.ProcessSurfaceDamage(sid1, ack, false);
// If the acknowledgment above was not ignored and instead updated the surface
// state for sid1, the surface would become a pending surface again, and the
// deadline would no longer be immediate. Since it is ignored, we are
// expecting the deadline to remain immedate.
EXPECT_GE(now_src().NowTicks(), EXPECT_GE(now_src().NowTicks(),
scheduler_.DesiredBeginFrameDeadlineTimeForTest()); scheduler_.DesiredBeginFrameDeadlineTimeForTest());
scheduler_.BeginFrameDeadlineForTest(); scheduler_.BeginFrameDeadlineForTest();
......
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