5#define FML_USED_ON_EMBEDDER
7#include "flutter/shell/common/animator.h"
13#include "flutter/shell/common/shell_test.h"
14#include "flutter/shell/common/shell_test_platform_view.h"
15#include "flutter/testing/post_task_sync.h"
16#include "flutter/testing/testing.h"
17#include "gmock/gmock.h"
18#include "gtest/gtest.h"
46 (std::shared_ptr<FramePipeline> pipeline),
50 std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder)
override {}
59 auto nativeOnBeginFrame = [&on_target_time_latch,
64 on_target_time_latch.
Signal();
66 AddNativeCallback(
"NativeOnBeginFrame",
71 auto settings = CreateSettingsForFixture();
73 std::unique_ptr<Shell>
shell;
77 const auto vsync_clock = std::make_shared<ShellTestVsyncClock>();
79 return static_cast<std::unique_ptr<VsyncWaiter>
>(
80 std::make_unique<ConstantFiringVsyncWaiter>(task_runners));
84 auto platform_task = std::async(std::launch::async, [&]() {
89 [vsync_clock, &create_vsync_waiter](
Shell&
shell) {
91 shell,
shell.GetTaskRunners(), vsync_clock, create_vsync_waiter,
93 shell.GetIsGpuDisabledSyncSwitch());
99 ASSERT_TRUE(configuration.IsValid());
100 configuration.SetEntrypoint(
"onBeginFrameMain");
102 RunEngine(
shell.get(), std::move(configuration));
104 platform_task.wait();
105 on_target_time_latch.
Wait();
106 const auto vsync_waiter_target_time =
108 ASSERT_EQ(vsync_waiter_target_time.ToEpochDelta().ToMicroseconds(),
112 ASSERT_EQ(GetLatestFrameTargetTime(
shell.get()), vsync_waiter_target_time);
115 DestroyShell(std::move(
shell), task_runners);
129 auto clock = std::make_shared<ShellTestVsyncClock>();
131 std::shared_ptr<Animator> animator;
133 auto flush_vsync_task = [&] {
137 clock->SimulateVSync();
144 auto vsync_waiter =
static_cast<std::unique_ptr<VsyncWaiter>
>(
145 std::make_unique<ShellTestVsyncWaiter>(task_runners, clock));
146 animator = std::make_unique<Animator>(delegate, task_runners,
147 std::move(vsync_waiter));
157 animator->RequestFrame(
false);
168 EXPECT_CALL(delegate, OnAnimatorBeginFrame).WillOnce([&] {
170 std::make_unique<LayerTree>(
nullptr,
SkISize::Make(600, 800));
176 animator->RequestFrame(
true);
191 animator->RequestFrame(
false);
219 auto clock = std::make_shared<ShellTestVsyncClock>();
220 std::shared_ptr<Animator> animator;
222 auto flush_vsync_task = [&] {
226 clock->SimulateVSync();
232 auto vsync_waiter = static_cast<std::unique_ptr<VsyncWaiter>>(
233 std::make_unique<ShellTestVsyncWaiter>(task_runners, clock));
234 animator = std::make_unique<Animator>(delegate, task_runners,
235 std::move(vsync_waiter));
241 EXPECT_CALL(delegate, OnAnimatorUpdateLatestFrameTargetTime).Times(2);
245 EXPECT_CALL(delegate, OnAnimatorDraw).Times(1);
247 for (
int i = 0;
i < 2;
i++) {
249 EXPECT_CALL(delegate, OnAnimatorBeginFrame).WillOnce([&] {
251 std::make_unique<LayerTree>(
nullptr,
SkISize::Make(600, 800));
253 begin_frame_latch.
Signal();
255 animator->RequestFrame();
258 begin_frame_latch.
Wait();
virtual void OnAnimatorBeginFrame(fml::TimePoint frame_target_time, uint64_t frame_number)=0
virtual void OnAnimatorUpdateLatestFrameTargetTime(fml::TimePoint frame_target_time)=0
virtual void OnAnimatorDraw(std::shared_ptr< FramePipeline > pipeline)=0
static bool IsInstanceRunning()
static RunConfiguration InferFromSettings(const Settings &settings, const fml::RefPtr< fml::TaskRunner > &io_worker=nullptr, IsolateLaunchType launch_type=IsolateLaunchType::kNewGroup)
Attempts to infer a run configuration from the settings object. This tries to create a run configurat...
static std::unique_ptr< Shell > Create(const PlatformData &platform_data, const TaskRunners &task_runners, Settings settings, const CreateCallback< PlatformView > &on_create_platform_view, const CreateCallback< Rasterizer > &on_create_rasterizer, bool is_gpu_disabled=false)
Creates a shell instance using the provided settings. The callbacks to create the various shell subco...
fml::RefPtr< fml::TaskRunner > GetUITaskRunner() const
fml::RefPtr< fml::TaskRunner > GetPlatformTaskRunner() const
static constexpr fml::TimePoint kFrameTargetTime
MOCK_METHOD(void, OnAnimatorUpdateLatestFrameTargetTime,(fml::TimePoint frame_target_time),(override))
MOCK_METHOD(void, OnAnimatorDraw,(std::shared_ptr< FramePipeline > pipeline),(override))
MOCK_METHOD(void, OnAnimatorBeginFrame,(fml::TimePoint frame_target_time, uint64_t frame_number),(override))
void OnAnimatorDrawLastLayerTrees(std::unique_ptr< FrameTimingsRecorder > frame_timings_recorder) override
void OnAnimatorNotifyIdle(fml::TimeDelta deadline) override
bool WaitWithTimeout(TimeDelta timeout)
static void EnsureInitializedForCurrentThread()
virtual void PostTask(const fml::closure &task) override
virtual void PostDelayedTask(const fml::closure &task, fml::TimeDelta delay)
static constexpr TimeDelta FromMilliseconds(int64_t millis)
struct _Dart_Handle * Dart_Handle
struct _Dart_NativeArguments * Dart_NativeArguments
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
fml::RefPtr< fml::TaskRunner > CreateNewThread(const std::string &name)
TEST_F(DisplayListTest, Defaults)
void PostTaskSync(const fml::RefPtr< fml::TaskRunner > &task_runner, const std::function< void()> &function)
TaskRunners GetTaskRunnersForFixture()
std::function< std::unique_ptr< VsyncWaiter >()> CreateVsyncWaiter
constexpr int64_t kImplicitViewId
static constexpr SkISize Make(int32_t w, int32_t h)
#define CREATE_NATIVE_ENTRY(native_entry)