[go: nahoru, domu]

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;
 }