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

Side by Side Diff: cc/surfaces/display_unittest.cc

Issue 1012853003: Add DisplayScheduler for Surfaces (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: actually add unit tests Created 5 years, 8 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/test/null_task_runner.h"
5 #include "cc/output/compositor_frame.h" 6 #include "cc/output/compositor_frame.h"
6 #include "cc/output/copy_output_result.h" 7 #include "cc/output/copy_output_result.h"
7 #include "cc/output/delegated_frame_data.h" 8 #include "cc/output/delegated_frame_data.h"
8 #include "cc/quads/render_pass.h" 9 #include "cc/quads/render_pass.h"
9 #include "cc/resources/shared_bitmap_manager.h" 10 #include "cc/resources/shared_bitmap_manager.h"
10 #include "cc/surfaces/display.h" 11 #include "cc/surfaces/display.h"
11 #include "cc/surfaces/display_client.h" 12 #include "cc/surfaces/display_client.h"
12 #include "cc/surfaces/surface.h" 13 #include "cc/surfaces/surface.h"
13 #include "cc/surfaces/surface_factory.h" 14 #include "cc/surfaces/surface_factory.h"
14 #include "cc/surfaces/surface_factory_client.h" 15 #include "cc/surfaces/surface_factory_client.h"
15 #include "cc/surfaces/surface_id_allocator.h" 16 #include "cc/surfaces/surface_id_allocator.h"
16 #include "cc/surfaces/surface_manager.h" 17 #include "cc/surfaces/surface_manager.h"
17 #include "cc/test/fake_output_surface.h" 18 #include "cc/test/fake_output_surface.h"
19 #include "cc/test/scheduler_test_common.h"
18 #include "cc/test/test_shared_bitmap_manager.h" 20 #include "cc/test/test_shared_bitmap_manager.h"
19 #include "testing/gmock/include/gmock/gmock.h" 21 #include "testing/gmock/include/gmock/gmock.h"
20 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
21 23
22 namespace cc { 24 namespace cc {
23 namespace { 25 namespace {
24 26
25 class EmptySurfaceFactoryClient : public SurfaceFactoryClient { 27 class EmptySurfaceFactoryClient : public SurfaceFactoryClient {
26 public: 28 public:
27 void ReturnResources(const ReturnedResourceArray& resources) override {} 29 void ReturnResources(const ReturnedResourceArray& resources) override {}
(...skipping 20 matching lines...) Expand all
48 50
49 factory_.SubmitFrame(surface_id, frame.Pass(), 51 factory_.SubmitFrame(surface_id, frame.Pass(),
50 SurfaceFactory::DrawCallback()); 52 SurfaceFactory::DrawCallback());
51 } 53 }
52 54
53 SurfaceManager manager_; 55 SurfaceManager manager_;
54 EmptySurfaceFactoryClient empty_client_; 56 EmptySurfaceFactoryClient empty_client_;
55 SurfaceFactory factory_; 57 SurfaceFactory factory_;
56 scoped_ptr<FakeOutputSurface> output_surface_; 58 scoped_ptr<FakeOutputSurface> output_surface_;
57 FakeOutputSurface* output_surface_ptr_; 59 FakeOutputSurface* output_surface_ptr_;
60 FakeBeginFrameSource fake_begin_frame_source_;
58 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 61 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
59 }; 62 };
60 63
61 class TestDisplayClient : public DisplayClient { 64 class TestDisplayClient : public DisplayClient {
62 public: 65 public:
63 TestDisplayClient() : damaged(false), swapped(false) {} 66 TestDisplayClient() {}
64 ~TestDisplayClient() override {} 67 ~TestDisplayClient() override {}
65 68
66 void DisplayDamaged() override { damaged = true; }
67 void DidSwapBuffers() override { swapped = true; }
68 void DidSwapBuffersComplete() override {}
69 void CommitVSyncParameters(base::TimeTicks timebase, 69 void CommitVSyncParameters(base::TimeTicks timebase,
70 base::TimeDelta interval) override {} 70 base::TimeDelta interval) override {}
71 void OutputSurfaceLost() override {} 71 void OutputSurfaceLost() override {}
72 void SetMemoryPolicy(const ManagedMemoryPolicy& policy) override {} 72 void SetMemoryPolicy(const ManagedMemoryPolicy& policy) override {}
73 };
74
75 class TestDisplayScheduler : public DisplayScheduler {
76 public:
77 TestDisplayScheduler(DisplaySchedulerClient* client,
78 BeginFrameSource* begin_frame_source)
79 : DisplayScheduler(client,
80 begin_frame_source,
81 make_scoped_refptr(new base::NullTaskRunner),
82 1),
83 damaged(false),
84 entire_display_damaged(false),
85 swapped(false) {}
86
87 ~TestDisplayScheduler() override {}
88
89 void EntireDisplayDamaged() override { entire_display_damaged = true; }
90
91 void SurfaceDamaged(SurfaceId surface_id) override { damaged = true; }
92
93 void DidSwapBuffers() override { swapped = true; }
94
95 void ResetDamageForTest() {
96 damaged = false;
97 entire_display_damaged = false;
98 }
73 99
74 bool damaged; 100 bool damaged;
101 bool entire_display_damaged;
75 bool swapped; 102 bool swapped;
76 }; 103 };
77 104
78 void CopyCallback(bool* called, scoped_ptr<CopyOutputResult> result) { 105 void CopyCallback(bool* called, scoped_ptr<CopyOutputResult> result) {
79 *called = true; 106 *called = true;
80 } 107 }
81 108
82 // Check that frame is damaged and swapped only under correct conditions. 109 // Check that frame is damaged and swapped only under correct conditions.
83 TEST_F(DisplayTest, DisplayDamaged) { 110 TEST_F(DisplayTest, DisplayDamaged) {
84 TestDisplayClient client; 111 TestDisplayClient client;
85 RendererSettings settings; 112 RendererSettings settings;
86 settings.partial_swap_enabled = true; 113 settings.partial_swap_enabled = true;
87 Display display(&client, &manager_, shared_bitmap_manager_.get(), nullptr, 114 Display display(&client, &manager_, shared_bitmap_manager_.get(), nullptr,
88 settings); 115 settings);
89 116
90 display.Initialize(output_surface_.Pass()); 117 TestDisplayScheduler scheduler(&display, &fake_begin_frame_source_);
118 display.Initialize(output_surface_.Pass(), &scheduler);
91 119
92 SurfaceId surface_id(7u); 120 SurfaceId surface_id(7u);
93 EXPECT_FALSE(client.damaged); 121 EXPECT_FALSE(scheduler.damaged);
122 EXPECT_FALSE(scheduler.entire_display_damaged);
94 display.SetSurfaceId(surface_id, 1.f); 123 display.SetSurfaceId(surface_id, 1.f);
95 EXPECT_TRUE(client.damaged); 124 EXPECT_FALSE(scheduler.damaged);
125 EXPECT_TRUE(scheduler.entire_display_damaged);
96 126
97 client.damaged = false; 127 scheduler.ResetDamageForTest();
98 display.Resize(gfx::Size(100, 100)); 128 display.Resize(gfx::Size(100, 100));
99 EXPECT_TRUE(client.damaged); 129 EXPECT_FALSE(scheduler.damaged);
130 EXPECT_TRUE(scheduler.entire_display_damaged);
100 131
101 factory_.Create(surface_id); 132 factory_.Create(surface_id);
102 133
103 // First draw from surface should have full damage. 134 // First draw from surface should have full damage.
104 RenderPassList pass_list; 135 RenderPassList pass_list;
105 scoped_ptr<RenderPass> pass = RenderPass::Create(); 136 scoped_ptr<RenderPass> pass = RenderPass::Create();
106 pass->output_rect = gfx::Rect(0, 0, 100, 100); 137 pass->output_rect = gfx::Rect(0, 0, 100, 100);
107 pass->damage_rect = gfx::Rect(10, 10, 1, 1); 138 pass->damage_rect = gfx::Rect(10, 10, 1, 1);
108 pass->id = RenderPassId(1, 1); 139 pass->id = RenderPassId(1, 1);
109 pass_list.push_back(pass.Pass()); 140 pass_list.push_back(pass.Pass());
110 141
111 client.damaged = false; 142 scheduler.ResetDamageForTest();
112 SubmitFrame(&pass_list, surface_id); 143 SubmitFrame(&pass_list, surface_id);
113 EXPECT_TRUE(client.damaged); 144 EXPECT_TRUE(scheduler.damaged);
145 EXPECT_FALSE(scheduler.entire_display_damaged);
114 146
115 EXPECT_FALSE(client.swapped); 147 EXPECT_FALSE(scheduler.swapped);
116 EXPECT_EQ(0u, output_surface_ptr_->num_sent_frames()); 148 EXPECT_EQ(0u, output_surface_ptr_->num_sent_frames());
117 display.Draw(); 149 display.DrawAndSwap();
118 EXPECT_TRUE(client.swapped); 150 EXPECT_TRUE(scheduler.swapped);
119 EXPECT_EQ(1u, output_surface_ptr_->num_sent_frames()); 151 EXPECT_EQ(1u, output_surface_ptr_->num_sent_frames());
120 SoftwareFrameData* software_data = 152 SoftwareFrameData* software_data =
121 output_surface_ptr_->last_sent_frame().software_frame_data.get(); 153 output_surface_ptr_->last_sent_frame().software_frame_data.get();
122 ASSERT_NE(nullptr, software_data); 154 ASSERT_NE(nullptr, software_data);
123 EXPECT_EQ(gfx::Size(100, 100).ToString(), software_data->size.ToString()); 155 EXPECT_EQ(gfx::Size(100, 100).ToString(), software_data->size.ToString());
124 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), 156 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(),
125 software_data->damage_rect.ToString()); 157 software_data->damage_rect.ToString());
126 158
127 { 159 {
128 // Only damaged portion should be swapped. 160 // Only damaged portion should be swapped.
129 pass = RenderPass::Create(); 161 pass = RenderPass::Create();
130 pass->output_rect = gfx::Rect(0, 0, 100, 100); 162 pass->output_rect = gfx::Rect(0, 0, 100, 100);
131 pass->damage_rect = gfx::Rect(10, 10, 1, 1); 163 pass->damage_rect = gfx::Rect(10, 10, 1, 1);
132 pass->id = RenderPassId(1, 1); 164 pass->id = RenderPassId(1, 1);
133 165
134 pass_list.push_back(pass.Pass()); 166 pass_list.push_back(pass.Pass());
135 client.damaged = false; 167 scheduler.ResetDamageForTest();
136 SubmitFrame(&pass_list, surface_id); 168 SubmitFrame(&pass_list, surface_id);
137 EXPECT_TRUE(client.damaged); 169 EXPECT_TRUE(scheduler.damaged);
170 EXPECT_FALSE(scheduler.entire_display_damaged);
138 171
139 client.swapped = false; 172 scheduler.swapped = false;
140 display.Draw(); 173 display.DrawAndSwap();
141 EXPECT_TRUE(client.swapped); 174 EXPECT_TRUE(scheduler.swapped);
142 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames()); 175 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames());
143 software_data = 176 software_data =
144 output_surface_ptr_->last_sent_frame().software_frame_data.get(); 177 output_surface_ptr_->last_sent_frame().software_frame_data.get();
145 ASSERT_NE(nullptr, software_data); 178 ASSERT_NE(nullptr, software_data);
146 EXPECT_EQ(gfx::Size(100, 100).ToString(), software_data->size.ToString()); 179 EXPECT_EQ(gfx::Size(100, 100).ToString(), software_data->size.ToString());
147 EXPECT_EQ(gfx::Rect(10, 10, 1, 1).ToString(), 180 EXPECT_EQ(gfx::Rect(10, 10, 1, 1).ToString(),
148 software_data->damage_rect.ToString()); 181 software_data->damage_rect.ToString());
149 } 182 }
150 183
151 { 184 {
152 // Pass has no damage so shouldn't be swapped. 185 // Pass has no damage so shouldn't be swapped.
153 pass = RenderPass::Create(); 186 pass = RenderPass::Create();
154 pass->output_rect = gfx::Rect(0, 0, 100, 100); 187 pass->output_rect = gfx::Rect(0, 0, 100, 100);
155 pass->damage_rect = gfx::Rect(10, 10, 0, 0); 188 pass->damage_rect = gfx::Rect(10, 10, 0, 0);
156 pass->id = RenderPassId(1, 1); 189 pass->id = RenderPassId(1, 1);
157 190
158 pass_list.push_back(pass.Pass()); 191 pass_list.push_back(pass.Pass());
159 client.damaged = false; 192 scheduler.ResetDamageForTest();
160 SubmitFrame(&pass_list, surface_id); 193 SubmitFrame(&pass_list, surface_id);
161 EXPECT_TRUE(client.damaged); 194 EXPECT_TRUE(scheduler.damaged);
195 EXPECT_FALSE(scheduler.entire_display_damaged);
162 196
163 client.swapped = false; 197 scheduler.swapped = false;
164 display.Draw(); 198 display.DrawAndSwap();
165 EXPECT_TRUE(client.swapped); 199 EXPECT_TRUE(scheduler.swapped);
166 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames()); 200 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames());
167 } 201 }
168 202
169 { 203 {
170 // Pass is wrong size so shouldn't be swapped. 204 // Pass is wrong size so shouldn't be swapped.
171 pass = RenderPass::Create(); 205 pass = RenderPass::Create();
172 pass->output_rect = gfx::Rect(0, 0, 99, 99); 206 pass->output_rect = gfx::Rect(0, 0, 99, 99);
173 pass->damage_rect = gfx::Rect(10, 10, 10, 10); 207 pass->damage_rect = gfx::Rect(10, 10, 10, 10);
174 pass->id = RenderPassId(1, 1); 208 pass->id = RenderPassId(1, 1);
175 209
176 pass_list.push_back(pass.Pass()); 210 pass_list.push_back(pass.Pass());
177 client.damaged = false; 211 scheduler.ResetDamageForTest();
178 SubmitFrame(&pass_list, surface_id); 212 SubmitFrame(&pass_list, surface_id);
179 EXPECT_TRUE(client.damaged); 213 EXPECT_TRUE(scheduler.damaged);
214 EXPECT_FALSE(scheduler.entire_display_damaged);
180 215
181 client.swapped = false; 216 scheduler.swapped = false;
182 display.Draw(); 217 display.DrawAndSwap();
183 EXPECT_TRUE(client.swapped); 218 EXPECT_TRUE(scheduler.swapped);
184 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames()); 219 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames());
185 } 220 }
186 221
187 { 222 {
188 // Pass has copy output request so should be swapped. 223 // Pass has copy output request so should be swapped.
189 pass = RenderPass::Create(); 224 pass = RenderPass::Create();
190 pass->output_rect = gfx::Rect(0, 0, 100, 100); 225 pass->output_rect = gfx::Rect(0, 0, 100, 100);
191 pass->damage_rect = gfx::Rect(10, 10, 0, 0); 226 pass->damage_rect = gfx::Rect(10, 10, 0, 0);
192 bool copy_called = false; 227 bool copy_called = false;
193 pass->copy_requests.push_back(CopyOutputRequest::CreateRequest( 228 pass->copy_requests.push_back(CopyOutputRequest::CreateRequest(
194 base::Bind(&CopyCallback, &copy_called))); 229 base::Bind(&CopyCallback, &copy_called)));
195 pass->id = RenderPassId(1, 1); 230 pass->id = RenderPassId(1, 1);
196 231
197 pass_list.push_back(pass.Pass()); 232 pass_list.push_back(pass.Pass());
198 client.damaged = false; 233 scheduler.ResetDamageForTest();
199 SubmitFrame(&pass_list, surface_id); 234 SubmitFrame(&pass_list, surface_id);
200 EXPECT_TRUE(client.damaged); 235 EXPECT_TRUE(scheduler.damaged);
236 EXPECT_FALSE(scheduler.entire_display_damaged);
201 237
202 client.swapped = false; 238 scheduler.swapped = false;
203 display.Draw(); 239 display.DrawAndSwap();
204 EXPECT_TRUE(client.swapped); 240 EXPECT_TRUE(scheduler.swapped);
205 EXPECT_EQ(3u, output_surface_ptr_->num_sent_frames()); 241 EXPECT_EQ(3u, output_surface_ptr_->num_sent_frames());
206 EXPECT_TRUE(copy_called); 242 EXPECT_TRUE(copy_called);
207 } 243 }
208 244
209 // Pass has latency info so should be swapped. 245 // Pass has latency info so should be swapped.
210 { 246 {
211 pass = RenderPass::Create(); 247 pass = RenderPass::Create();
212 pass->output_rect = gfx::Rect(0, 0, 100, 100); 248 pass->output_rect = gfx::Rect(0, 0, 100, 100);
213 pass->damage_rect = gfx::Rect(10, 10, 0, 0); 249 pass->damage_rect = gfx::Rect(10, 10, 0, 0);
214 pass->id = RenderPassId(1, 1); 250 pass->id = RenderPassId(1, 1);
215 251
216 pass_list.push_back(pass.Pass()); 252 pass_list.push_back(pass.Pass());
217 client.damaged = false; 253 scheduler.ResetDamageForTest();
218 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); 254 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
219 pass_list.swap(frame_data->render_pass_list); 255 pass_list.swap(frame_data->render_pass_list);
220 256
221 scoped_ptr<CompositorFrame> frame(new CompositorFrame); 257 scoped_ptr<CompositorFrame> frame(new CompositorFrame);
222 frame->delegated_frame_data = frame_data.Pass(); 258 frame->delegated_frame_data = frame_data.Pass();
223 frame->metadata.latency_info.push_back(ui::LatencyInfo()); 259 frame->metadata.latency_info.push_back(ui::LatencyInfo());
224 260
225 factory_.SubmitFrame(surface_id, frame.Pass(), 261 factory_.SubmitFrame(surface_id, frame.Pass(),
226 SurfaceFactory::DrawCallback()); 262 SurfaceFactory::DrawCallback());
227 EXPECT_TRUE(client.damaged); 263 EXPECT_TRUE(scheduler.damaged);
264 EXPECT_FALSE(scheduler.entire_display_damaged);
228 265
229 client.swapped = false; 266 scheduler.swapped = false;
230 display.Draw(); 267 display.DrawAndSwap();
231 EXPECT_TRUE(client.swapped); 268 EXPECT_TRUE(scheduler.swapped);
232 EXPECT_EQ(4u, output_surface_ptr_->num_sent_frames()); 269 EXPECT_EQ(4u, output_surface_ptr_->num_sent_frames());
233 } 270 }
234 271
235 factory_.Destroy(surface_id); 272 factory_.Destroy(surface_id);
236 } 273 }
237 274
238 } // namespace 275 } // namespace
239 } // namespace cc 276 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698