Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit b0ff8d4

Browse files
author
Kaushik Iska
committed
[embedder] Arg to specify the display refresh rate
This is then wired to the vsync waiter to provide the advisory display refresh rate.
1 parent 983b0ef commit b0ff8d4

12 files changed

+101
-9
lines changed

shell/common/shell.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1430,7 +1430,7 @@ bool Shell::OnServiceProtocolGetDisplayRefreshRate(
14301430
FML_DCHECK(task_runners_.GetUITaskRunner()->RunsTasksOnCurrentThread());
14311431
response->SetObject();
14321432
response->AddMember("type", "DisplayRefreshRate", response->GetAllocator());
1433-
response->AddMember("fps", engine_->GetDisplayRefreshRate(),
1433+
response->AddMember("fps", display_refresh_rate_.load(),
14341434
response->GetAllocator());
14351435
return true;
14361436
}

shell/common/vsync_waiter_fallback.cc

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,15 @@ static fml::TimePoint SnapToNextTick(fml::TimePoint value,
2121

2222
} // namespace
2323

24+
VsyncWaiterFallback::VsyncWaiterFallback(TaskRunners task_runners,
25+
float display_refresh_rate)
26+
: VsyncWaiter(std::move(task_runners)),
27+
phase_(fml::TimePoint::Now()),
28+
display_refresh_rate_(display_refresh_rate) {}
29+
2430
VsyncWaiterFallback::VsyncWaiterFallback(TaskRunners task_runners)
25-
: VsyncWaiter(std::move(task_runners)), phase_(fml::TimePoint::Now()) {}
31+
: VsyncWaiterFallback(std::move(task_runners),
32+
VsyncWaiter::kUnknownRefreshRateFPS) {}
2633

2734
VsyncWaiterFallback::~VsyncWaiterFallback() = default;
2835

@@ -37,4 +44,8 @@ void VsyncWaiterFallback::AwaitVSync() {
3744
FireCallback(next, next + kSingleFrameInterval);
3845
}
3946

47+
float VsyncWaiterFallback::GetDisplayRefreshRate() const {
48+
return display_refresh_rate_;
49+
}
50+
4051
} // namespace flutter

shell/common/vsync_waiter_fallback.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,15 @@ class VsyncWaiterFallback final : public VsyncWaiter {
1717
public:
1818
VsyncWaiterFallback(TaskRunners task_runners);
1919

20+
VsyncWaiterFallback(TaskRunners task_runners, float display_refresh_rate);
21+
2022
~VsyncWaiterFallback() override;
2123

24+
float GetDisplayRefreshRate() const override;
25+
2226
private:
23-
fml::TimePoint phase_;
27+
const fml::TimePoint phase_;
28+
const float display_refresh_rate_;
2429

2530
// |VsyncWaiter|
2631
void AwaitVSync() override;

shell/platform/embedder/embedder.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ extern const intptr_t kPlatformStrongDillSize;
4646
#include "flutter/shell/common/persistent_cache.h"
4747
#include "flutter/shell/common/rasterizer.h"
4848
#include "flutter/shell/common/switches.h"
49+
#include "flutter/shell/common/vsync_waiter.h"
4950
#include "flutter/shell/platform/embedder/embedder.h"
5051
#include "flutter/shell/platform/embedder/embedder_engine.h"
5152
#include "flutter/shell/platform/embedder/embedder_platform_message_response.h"
@@ -992,13 +993,17 @@ FlutterEngineResult FlutterEngineInitialize(size_t version,
992993
"Compositor arguments were invalid.");
993994
}
994995

996+
float display_refresh_rate = SAFE_ACCESS(
997+
args, display_refresh_rate, flutter::VsyncWaiter::kUnknownRefreshRateFPS);
998+
995999
flutter::PlatformViewEmbedder::PlatformDispatchTable platform_dispatch_table =
9961000
{
9971001
update_semantics_nodes_callback, //
9981002
update_semantics_custom_actions_callback, //
9991003
platform_message_response_callback, //
10001004
vsync_callback, //
10011005
compute_platform_resolved_locale_callback, //
1006+
display_refresh_rate, //
10021007
};
10031008

10041009
auto on_create_platform_view = InferPlatformViewCreationCallback(

shell/platform/embedder/embedder.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1318,6 +1318,12 @@ typedef struct {
13181318
/// matches what the platform would natively resolve to as possible.
13191319
FlutterComputePlatformResolvedLocaleCallback
13201320
compute_platform_resolved_locale_callback;
1321+
1322+
/// The refresh rate of the display in frames per second.
1323+
///
1324+
/// This information is purely advisory and is not used by any component. It
1325+
/// is only used by the tooling to visualize frame performance.
1326+
float display_refresh_rate;
13211327
} FlutterProjectArgs;
13221328

13231329
//------------------------------------------------------------------------------

shell/platform/embedder/platform_view_embedder.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,13 @@ sk_sp<GrDirectContext> PlatformViewEmbedder::CreateResourceContext() const {
8585
// |PlatformView|
8686
std::unique_ptr<VsyncWaiter> PlatformViewEmbedder::CreateVSyncWaiter() {
8787
if (!platform_dispatch_table_.vsync_callback) {
88-
// Superclass implementation creates a timer based fallback.
89-
return PlatformView::CreateVSyncWaiter();
88+
return std::make_unique<VsyncWaiterFallback>(
89+
task_runners_, platform_dispatch_table_.display_refresh_rate);
9090
}
9191

9292
return std::make_unique<VsyncWaiterEmbedder>(
93-
platform_dispatch_table_.vsync_callback, task_runners_);
93+
platform_dispatch_table_.vsync_callback, task_runners_,
94+
platform_dispatch_table_.display_refresh_rate);
9495
}
9596

9697
// |PlatformView|

shell/platform/embedder/platform_view_embedder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "flutter/fml/macros.h"
1111
#include "flutter/shell/common/platform_view.h"
12+
#include "flutter/shell/common/vsync_waiter_fallback.h"
1213
#include "flutter/shell/platform/embedder/embedder.h"
1314
#include "flutter/shell/platform/embedder/embedder_surface.h"
1415
#include "flutter/shell/platform/embedder/embedder_surface_gl.h"
@@ -38,6 +39,7 @@ class PlatformViewEmbedder final : public PlatformView {
3839
VsyncWaiterEmbedder::VsyncCallback vsync_callback; // optional
3940
ComputePlatformResolvedLocaleCallback
4041
compute_platform_resolved_locale_callback;
42+
float display_refresh_rate;
4143
};
4244

4345
// Creates a platform view that sets up an OpenGL rasterizer.

shell/platform/embedder/tests/embedder_config_builder.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,10 @@ void EmbedderConfigBuilder::SetPlatformMessageCallback(
232232
context_.SetPlatformMessageCallback(callback);
233233
}
234234

235+
void EmbedderConfigBuilder::SetDisplayRefreshRate(float display_refresh_rate) {
236+
project_args_.display_refresh_rate = display_refresh_rate;
237+
}
238+
235239
void EmbedderConfigBuilder::SetCompositor() {
236240
context_.SetupCompositor();
237241
auto& compositor = context_.GetCompositor();

shell/platform/embedder/tests/embedder_config_builder.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ class EmbedderConfigBuilder {
8686

8787
void SetCompositor();
8888

89+
/// Sets the `FlutterProjectArgs`'s display refresh rate. This is in frames
90+
/// per second.
91+
void SetDisplayRefreshRate(float display_refresh_rate);
92+
8993
FlutterCompositor& GetCompositor();
9094

9195
UniqueEngine LaunchEngine() const;

shell/platform/embedder/tests/embedder_unittests.cc

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4459,5 +4459,48 @@ TEST_F(EmbedderTest, PresentInfoContainsValidFBOId) {
44594459
frame_latch.Wait();
44604460
}
44614461

4462+
TEST_F(EmbedderTest, DisplayRefreshRateIsSet) {
4463+
auto& context = GetEmbedderContext();
4464+
fml::AutoResetWaitableEvent latch;
4465+
context.AddIsolateCreateCallback([&latch]() { latch.Signal(); });
4466+
EmbedderConfigBuilder builder(context);
4467+
builder.SetSoftwareRendererConfig();
4468+
constexpr float refresh_rate = 60.0f;
4469+
builder.SetDisplayRefreshRate(refresh_rate);
4470+
auto engine = builder.LaunchEngine();
4471+
ASSERT_TRUE(engine.is_valid());
4472+
// Wait for the root isolate to launch.
4473+
latch.Wait();
4474+
4475+
flutter::Shell& shell = ToEmbedderEngine(engine.get())->GetShell();
4476+
auto vsync_waiter = shell.GetPlatformView()->CreateVSyncWaiter();
4477+
4478+
const float embedder_refresh_rate = vsync_waiter->GetDisplayRefreshRate();
4479+
ASSERT_FLOAT_EQ(refresh_rate, embedder_refresh_rate);
4480+
4481+
engine.reset();
4482+
}
4483+
4484+
TEST_F(EmbedderTest, DefaultDisplayRefreshRateIsUnknown) {
4485+
auto& context = GetEmbedderContext();
4486+
fml::AutoResetWaitableEvent latch;
4487+
context.AddIsolateCreateCallback([&latch]() { latch.Signal(); });
4488+
EmbedderConfigBuilder builder(context);
4489+
builder.SetSoftwareRendererConfig();
4490+
auto engine = builder.LaunchEngine();
4491+
ASSERT_TRUE(engine.is_valid());
4492+
// Wait for the root isolate to launch.
4493+
latch.Wait();
4494+
4495+
flutter::Shell& shell = ToEmbedderEngine(engine.get())->GetShell();
4496+
auto vsync_waiter = shell.GetPlatformView()->CreateVSyncWaiter();
4497+
4498+
const float embedder_refresh_rate = vsync_waiter->GetDisplayRefreshRate();
4499+
ASSERT_FLOAT_EQ(flutter::VsyncWaiter::kUnknownRefreshRateFPS,
4500+
embedder_refresh_rate);
4501+
4502+
engine.reset();
4503+
}
4504+
44624505
} // namespace testing
44634506
} // namespace flutter

0 commit comments

Comments
 (0)