Reland "slim: Delayed scheduler"
This is a reland of commit e4a888661c5a8c02e750f5997784a3e48627ff60
Two fixes:
* Null check WindowAndroid is straightforward
* Avoid reentrancy issues in DelayedScheduler. Previously in
BeginFrameAndResetArgs, calling `client_->DoBeginFrame` could
recurse back to DelayedScheduler to consume `unused_args_`, which
leads to sending `DidNotProduceFrame` with invalid args. Avoid this
by making a copy and resetting args before calling to client.
Original change's description:
> slim: Delayed scheduler
>
> Scheduler specifically optimized for the use case of android browser
> compositor moving the top/bottom browser controls as a result of
> renderer compositor updates.
>
> Bug: 1408128
> Change-Id: I2a82ddc8b2a9fb91e05baf6bba34dc7e60597b25
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4353951
> Reviewed-by: Kyle Charbonneau <kylechar@chromium.org>
> Reviewed-by: Jonathan Ross <jonross@chromium.org>
> Commit-Queue: Bo Liu <boliu@chromium.org>
> Cr-Commit-Position: refs/heads/main@{#1124740}
Bug: 1408128
Change-Id: I8dc6450d2ab4dc2a73c96335492663ee75f26920
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4403837
Reviewed-by: Kyle Charbonneau <kylechar@chromium.org>
Commit-Queue: Bo Liu <boliu@chromium.org>
Reviewed-by: Jonathan Ross <jonross@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1126769}
diff --git a/cc/slim/frame_sink_impl.cc b/cc/slim/frame_sink_impl.cc
index a64f27e..b367db8 100644
--- a/cc/slim/frame_sink_impl.cc
+++ b/cc/slim/frame_sink_impl.cc
@@ -15,6 +15,7 @@
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "cc/slim/constants.h"
+#include "cc/slim/delayed_scheduler.h"
#include "cc/slim/frame_sink_impl_client.h"
#include "components/viz/common/features.h"
#include "components/viz/common/quads/compositor_frame.h"
@@ -123,9 +124,14 @@
return;
}
needs_begin_frame_ = needs_begin_frame;
+ scheduler_->SetNeedsBeginFrame(needs_begin_frame);
frame_sink_->SetNeedsBeginFrame(needs_begin_frame);
}
+void FrameSinkImpl::MaybeCompositeNow() {
+ scheduler_->MaybeCompositeNow();
+}
+
void FrameSinkImpl::UploadUIResource(cc::UIResourceId resource_id,
cc::UIResourceBitmap resource_bitmap) {
const gpu::Capabilities& caps = context_provider_->ContextCapabilities();
@@ -229,6 +235,9 @@
ReclaimResources(std::move(resources));
DCHECK_GT(num_unacked_frames_, 0u);
num_unacked_frames_--;
+ if (!num_unacked_frames_) {
+ scheduler_->SetIsSwapThrottled(false);
+ }
client_->DidReceiveCompositorFrameAck();
}
@@ -305,6 +314,9 @@
0);
}
num_unacked_frames_++;
+ if (num_unacked_frames_ == 1) {
+ scheduler_->SetIsSwapThrottled(true);
+ }
client_->DidSubmitCompositorFrame();
return true;
}