Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: services/gfx/compositor/tests/scheduling_apptest.cc

Issue 1997513002: Mozart: Generalize frame scheduling. (Closed) Base URL: git@github.com:domokit/mojo.git@moz-jank2
Patch Set: add comments Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « services/gfx/compositor/tests/README.md ('k') | services/ui/launcher/launch_instance.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "mojo/public/cpp/application/application_impl.h"
6 #include "mojo/public/cpp/application/application_test_base.h"
7 #include "mojo/public/cpp/application/connect.h"
8 #include "mojo/public/cpp/bindings/synchronous_interface_ptr.h"
9 #include "mojo/public/cpp/system/macros.h"
10 #include "mojo/services/gfx/composition/interfaces/compositor.mojom-sync.h"
11 #include "mojo/services/gfx/composition/interfaces/scheduling.mojom-sync.h"
12 #include "mojo/services/gpu/interfaces/context_provider.mojom.h"
13 #include "mojo/services/native_viewport/interfaces/native_viewport.mojom.h"
14
15 namespace test {
16
17 using SynchronousCompositorPtr =
18 mojo::SynchronousInterfacePtr<mojo::gfx::composition::Compositor>;
19
20 using SynchronousFrameSchedulerPtr =
21 mojo::SynchronousInterfacePtr<mojo::gfx::composition::FrameScheduler>;
22
23 class SchedulingTest : public mojo::test::ApplicationTestBase {
24 public:
25 SchedulingTest() {}
26
27 protected:
28 void SetUp() override {
29 mojo::test::ApplicationTestBase::SetUp();
30
31 mojo::ConnectToService(shell(), "mojo:native_viewport_service",
32 GetProxy(&viewport_));
33 auto size = mojo::Size::New();
34 size->width = 320;
35 size->height = 640;
36 auto configuration = mojo::SurfaceConfiguration::New();
37 viewport_->Create(size.Pass(), configuration.Pass(),
38 [](mojo::ViewportMetricsPtr metrics) {
39
40 });
41 viewport_->Show();
42
43 mojo::ContextProviderPtr context_provider;
44 viewport_->GetContextProvider(GetProxy(&context_provider));
45
46 mojo::ConnectToService(shell(), "mojo:compositor_service",
47 mojo::GetSynchronousProxy(&compositor_));
48 compositor_->CreateRenderer(context_provider.Pass(),
49 mojo::GetProxy(&renderer_), "SchedulingTest");
50 }
51
52 void TestScheduler(SynchronousFrameSchedulerPtr scheduler) {
53 mojo::gfx::composition::FrameInfoPtr frame_info1;
54 ASSERT_TRUE(scheduler->ScheduleFrame(&frame_info1));
55 AssertValidFrameInfo(frame_info1.get());
56
57 mojo::gfx::composition::FrameInfoPtr frame_info2;
58 ASSERT_TRUE(scheduler->ScheduleFrame(&frame_info2));
59 AssertValidFrameInfo(frame_info2.get());
60
61 EXPECT_GT(frame_info2->frame_time, frame_info1->frame_time);
62 EXPECT_GT(frame_info2->presentation_time, frame_info1->presentation_time);
63 }
64
65 void AssertValidFrameInfo(mojo::gfx::composition::FrameInfo* frame_info) {
66 ASSERT_NE(nullptr, frame_info);
67 EXPECT_LT(frame_info->frame_time, MojoGetTimeTicksNow());
68 EXPECT_GT(frame_info->frame_interval, 0u);
69 EXPECT_GT(frame_info->frame_deadline, frame_info->frame_time);
70 EXPECT_GT(frame_info->presentation_time, frame_info->frame_deadline);
71 }
72
73 mojo::NativeViewportPtr viewport_;
74 SynchronousCompositorPtr compositor_;
75 mojo::gfx::composition::RendererPtr renderer_;
76
77 private:
78 MOJO_DISALLOW_COPY_AND_ASSIGN(SchedulingTest);
79 };
80
81 namespace {
82
83 TEST_F(SchedulingTest, RendererScheduler) {
84 SynchronousFrameSchedulerPtr scheduler;
85 renderer_->GetScheduler(mojo::GetSynchronousProxy(&scheduler));
86 TestScheduler(scheduler.Pass());
87 }
88
89 // Test what happens when a scene is not attached to a renderer.
90 // It should still receive scheduled frame updates occasionally albeit
91 // at some indeterminate rate (enough to keep the scene from hanging).
92 TEST_F(SchedulingTest, OrphanedSceneScheduler) {
93 mojo::gfx::composition::ScenePtr scene;
94 mojo::gfx::composition::SceneTokenPtr scene_token;
95 compositor_->CreateScene(mojo::GetProxy(&scene), "SchedulingTest",
96 &scene_token);
97
98 SynchronousFrameSchedulerPtr scheduler;
99 scene->GetScheduler(mojo::GetSynchronousProxy(&scheduler));
100 TestScheduler(scheduler.Pass());
101 }
102
103 // Test what happens when a scene is attached to a renderer.
104 // It should receive scheduled frame updates at a rate determined
105 // by the renderer.
106 TEST_F(SchedulingTest, RootSceneScheduler) {
107 mojo::gfx::composition::ScenePtr scene;
108 mojo::gfx::composition::SceneTokenPtr scene_token;
109 compositor_->CreateScene(mojo::GetProxy(&scene), "SchedulingTest",
110 &scene_token);
111
112 auto viewport = mojo::Rect::New();
113 viewport->width = 1;
114 viewport->height = 1;
115 renderer_->SetRootScene(scene_token.Pass(),
116 mojo::gfx::composition::kSceneVersionNone,
117 viewport.Pass());
118
119 SynchronousFrameSchedulerPtr scheduler;
120 scene->GetScheduler(mojo::GetSynchronousProxy(&scheduler));
121 TestScheduler(scheduler.Pass());
122 }
123
124 } // namespace
125 } // namespace mojo
OLDNEW
« no previous file with comments | « services/gfx/compositor/tests/README.md ('k') | services/ui/launcher/launch_instance.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698