0

[ios blink] Simplify external begin frames

Fork ExternalBeginFrameSourceMojo to an iOS specific variant so that we
don't have to unnecessarily wait for previous frame's BeginFrameAck.
This uses a new IssueExternalBeginFrameNoAck mojo API.

With this new variant, Motionmark is able to see 60fps in its frame rate
detection phase.

Change-Id: I4a415f2388a3855db963ca8c6d8f825e20fff36b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6398086
Reviewed-by: Alex Gough <ajgo@chromium.org>
Auto-Submit: Sunny Sachanandani <sunnyps@chromium.org>
Reviewed-by: Dave Tapuska <dtapuska@chromium.org>
Reviewed-by: Jonathan Ross <jonross@chromium.org>
Commit-Queue: Jonathan Ross <jonross@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1439376}
This commit is contained in:
Sunny Sachanandani
2025-03-28 07:06:45 -07:00
committed by Chromium LUCI CQ
parent e570133c2f
commit 6151353b2d
9 changed files with 196 additions and 51 deletions

@ -39,13 +39,13 @@ class BeginFrameSourceIOS
void SetPreferredInterval(base::TimeDelta interval) override;
private:
void BeginFrameAck(const viz::BeginFrameAck&);
const raw_ptr<ui::Compositor> compositor_;
raw_ptr<ui::Compositor> compositor_;
viz::ExternalBeginFrameSourceIOS begin_frame_source_;
viz::BeginFrameArgs last_used_begin_frame_args_;
bool send_begin_frame_ = true;
bool added_observer_ = false;
bool observing_begin_frame_source_ = false;
mojo::AssociatedReceiverSet<viz::mojom::ExternalBeginFrameControllerClient>
receivers_;

@ -4,6 +4,8 @@
#include "content/browser/renderer_host/begin_frame_source_ios.h"
#include "base/functional/callback_helpers.h"
namespace content {
////////////////////////////////////////////////////////////////////////////////
@ -12,6 +14,7 @@ namespace content {
BeginFrameSourceIOS::BeginFrameSourceIOS(ui::Compositor* compositor)
: compositor_(compositor),
begin_frame_source_(viz::BackToBackBeginFrameSource::kNotRestartableId) {
DCHECK(compositor_);
compositor_->SetExternalBeginFrameControllerClientFactory(this);
}
@ -20,19 +23,8 @@ BeginFrameSourceIOS::~BeginFrameSourceIOS() {
}
void BeginFrameSourceIOS::OnBeginFrame(const viz::BeginFrameArgs& args) {
if (!compositor_ || !send_begin_frame_) {
return;
}
last_used_begin_frame_args_ = args;
send_begin_frame_ = false;
compositor_->IssueExternalBeginFrame(
args, /*force=*/true,
base::BindOnce(&BeginFrameSourceIOS::BeginFrameAck,
weak_factory_.GetWeakPtr()));
}
void BeginFrameSourceIOS::BeginFrameAck(const viz::BeginFrameAck&) {
send_begin_frame_ = true;
compositor_->IssueExternalBeginFrameNoAck(args);
}
const viz::BeginFrameArgs& BeginFrameSourceIOS::LastUsedBeginFrameArgs() const {
@ -58,17 +50,13 @@ BeginFrameSourceIOS::CreateExternalBeginFrameControllerClient() {
}
void BeginFrameSourceIOS::SetNeedsBeginFrame(bool needs_begin_frames) {
if (needs_begin_frames == observing_begin_frame_source_) {
return;
}
observing_begin_frame_source_ = needs_begin_frames;
if (needs_begin_frames) {
if (added_observer_) {
return;
}
added_observer_ = true;
begin_frame_source_.AddObserver(this);
} else {
if (!added_observer_) {
return;
}
added_observer_ = false;
begin_frame_source_.RemoveObserver(this);
}
}