OLD | NEW |
---|---|
(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 // | |
54 mojo::gfx::composition::FrameInfoPtr frame_info1; | |
55 ASSERT_TRUE(scheduler->ScheduleFrame(&frame_info1)); | |
mikejurka
2016/05/19 23:59:00
does scheduleframe block until the frame is fully
jeffbrown
2016/05/20 00:38:12
ScheduleFrame blocks until the next frame is due.
| |
56 AssertValidFrameInfo(frame_info1.get()); | |
57 | |
58 mojo::gfx::composition::FrameInfoPtr frame_info2; | |
59 ASSERT_TRUE(scheduler->ScheduleFrame(&frame_info2)); | |
60 AssertValidFrameInfo(frame_info2.get()); | |
61 | |
62 EXPECT_GT(frame_info2->frame_time, frame_info1->frame_time); | |
63 EXPECT_GT(frame_info2->presentation_time, frame_info1->presentation_time); | |
64 } | |
65 | |
66 void AssertValidFrameInfo(mojo::gfx::composition::FrameInfo* frame_info) { | |
67 ASSERT_NE(nullptr, frame_info); | |
68 EXPECT_LT(frame_info->frame_time, MojoGetTimeTicksNow()); | |
69 EXPECT_GT(frame_info->frame_interval, 0u); | |
70 EXPECT_GT(frame_info->frame_deadline, frame_info->frame_time); | |
71 EXPECT_GT(frame_info->presentation_time, frame_info->frame_deadline); | |
72 } | |
73 | |
74 mojo::NativeViewportPtr viewport_; | |
75 SynchronousCompositorPtr compositor_; | |
76 mojo::gfx::composition::RendererPtr renderer_; | |
77 | |
78 private: | |
79 MOJO_DISALLOW_COPY_AND_ASSIGN(SchedulingTest); | |
80 }; | |
81 | |
82 namespace { | |
83 | |
84 TEST_F(SchedulingTest, RendererScheduler) { | |
85 SynchronousFrameSchedulerPtr scheduler; | |
86 renderer_->GetScheduler(mojo::GetSynchronousProxy(&scheduler)); | |
87 TestScheduler(scheduler.Pass()); | |
88 } | |
89 | |
90 TEST_F(SchedulingTest, OrphanedSceneScheduler) { | |
91 mojo::gfx::composition::ScenePtr scene; | |
mikejurka
2016/05/19 23:59:00
why is this scene orphaned -- is it because it sho
jeffbrown
2016/05/20 00:38:12
Added a comment.
| |
92 mojo::gfx::composition::SceneTokenPtr scene_token; | |
93 compositor_->CreateScene(mojo::GetProxy(&scene), "SchedulingTest", | |
94 &scene_token); | |
95 | |
96 SynchronousFrameSchedulerPtr scheduler; | |
97 scene->GetScheduler(mojo::GetSynchronousProxy(&scheduler)); | |
98 TestScheduler(scheduler.Pass()); | |
99 } | |
100 | |
101 TEST_F(SchedulingTest, RootSceneScheduler) { | |
102 mojo::gfx::composition::ScenePtr scene; | |
103 mojo::gfx::composition::SceneTokenPtr scene_token; | |
104 compositor_->CreateScene(mojo::GetProxy(&scene), "SchedulingTest", | |
105 &scene_token); | |
106 | |
107 auto viewport = mojo::Rect::New(); | |
108 viewport->width = 1; | |
109 viewport->height = 1; | |
110 renderer_->SetRootScene(scene_token.Pass(), | |
111 mojo::gfx::composition::kSceneVersionNone, | |
112 viewport.Pass()); | |
113 | |
114 SynchronousFrameSchedulerPtr scheduler; | |
115 scene->GetScheduler(mojo::GetSynchronousProxy(&scheduler)); | |
116 TestScheduler(scheduler.Pass()); | |
117 } | |
118 | |
119 } // namespace | |
120 } // namespace mojo | |
OLD | NEW |