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

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

Issue 1251823005: cc: Make DisplayScheduler aware of resize and add tracing. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix tests; small logic changes Created 5 years, 5 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 | « cc/surfaces/display_scheduler_unittest.cc ('k') | cc/surfaces/surface_factory.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "base/test/null_task_runner.h"
6 #include "cc/output/compositor_frame.h" 6 #include "cc/output/compositor_frame.h"
7 #include "cc/output/copy_output_result.h" 7 #include "cc/output/copy_output_result.h"
8 #include "cc/output/delegated_frame_data.h" 8 #include "cc/output/delegated_frame_data.h"
9 #include "cc/quads/render_pass.h" 9 #include "cc/quads/render_pass.h"
10 #include "cc/resources/shared_bitmap_manager.h" 10 #include "cc/resources/shared_bitmap_manager.h"
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 void SetMemoryPolicy(const ManagedMemoryPolicy& policy) override {} 82 void SetMemoryPolicy(const ManagedMemoryPolicy& policy) override {}
83 }; 83 };
84 84
85 class TestDisplayScheduler : public DisplayScheduler { 85 class TestDisplayScheduler : public DisplayScheduler {
86 public: 86 public:
87 TestDisplayScheduler(DisplaySchedulerClient* client, 87 TestDisplayScheduler(DisplaySchedulerClient* client,
88 BeginFrameSource* begin_frame_source, 88 BeginFrameSource* begin_frame_source,
89 base::NullTaskRunner* task_runner) 89 base::NullTaskRunner* task_runner)
90 : DisplayScheduler(client, begin_frame_source, task_runner, 1), 90 : DisplayScheduler(client, begin_frame_source, task_runner, 1),
91 damaged(false), 91 damaged(false),
92 entire_display_damaged(false), 92 display_resized_(false),
93 has_new_root_surface(false),
93 swapped(false) {} 94 swapped(false) {}
94 95
95 ~TestDisplayScheduler() override {} 96 ~TestDisplayScheduler() override {}
96 97
97 void EntireDisplayDamaged(SurfaceId root_surface_id) override { 98 void DisplayResized() override { display_resized_ = true; }
98 entire_display_damaged = true; 99
100 void SetNewRootSurface(SurfaceId root_surface_id) override {
101 has_new_root_surface = true;
99 } 102 }
100 103
101 void SurfaceDamaged(SurfaceId surface_id) override { 104 void SurfaceDamaged(SurfaceId surface_id) override {
102 damaged = true; 105 damaged = true;
103 needs_draw_ = true; 106 needs_draw_ = true;
104 } 107 }
105 108
106 void DidSwapBuffers() override { swapped = true; } 109 void DidSwapBuffers() override { swapped = true; }
107 110
108 void ResetDamageForTest() { 111 void ResetDamageForTest() {
109 damaged = false; 112 damaged = false;
110 entire_display_damaged = false; 113 display_resized_ = false;
114 has_new_root_surface = false;
111 } 115 }
112 116
113 bool damaged; 117 bool damaged;
114 bool entire_display_damaged; 118 bool display_resized_;
119 bool has_new_root_surface;
115 bool swapped; 120 bool swapped;
116 }; 121 };
117 122
118 void CopyCallback(bool* called, scoped_ptr<CopyOutputResult> result) { 123 void CopyCallback(bool* called, scoped_ptr<CopyOutputResult> result) {
119 *called = true; 124 *called = true;
120 } 125 }
121 126
122 // Check that frame is damaged and swapped only under correct conditions. 127 // Check that frame is damaged and swapped only under correct conditions.
123 TEST_F(DisplayTest, DisplayDamaged) { 128 TEST_F(DisplayTest, DisplayDamaged) {
124 SetUpContext(nullptr); 129 SetUpContext(nullptr);
125 TestDisplayClient client; 130 TestDisplayClient client;
126 RendererSettings settings; 131 RendererSettings settings;
127 settings.partial_swap_enabled = true; 132 settings.partial_swap_enabled = true;
128 settings.finish_rendering_on_resize = true; 133 settings.finish_rendering_on_resize = true;
129 Display display(&client, &manager_, shared_bitmap_manager_.get(), nullptr, 134 Display display(&client, &manager_, shared_bitmap_manager_.get(), nullptr,
130 settings); 135 settings);
131 136
132 TestDisplayScheduler scheduler(&display, &fake_begin_frame_source_, 137 TestDisplayScheduler scheduler(&display, &fake_begin_frame_source_,
133 task_runner_.get()); 138 task_runner_.get());
134 display.Initialize(output_surface_.Pass(), &scheduler); 139 display.Initialize(output_surface_.Pass(), &scheduler);
135 140
136 SurfaceId surface_id(7u); 141 SurfaceId surface_id(7u);
137 EXPECT_FALSE(scheduler.damaged); 142 EXPECT_FALSE(scheduler.damaged);
138 EXPECT_FALSE(scheduler.entire_display_damaged); 143 EXPECT_FALSE(scheduler.has_new_root_surface);
139 display.SetSurfaceId(surface_id, 1.f); 144 display.SetSurfaceId(surface_id, 1.f);
140 EXPECT_FALSE(scheduler.damaged); 145 EXPECT_FALSE(scheduler.damaged);
141 EXPECT_TRUE(scheduler.entire_display_damaged); 146 EXPECT_FALSE(scheduler.display_resized_);
147 EXPECT_TRUE(scheduler.has_new_root_surface);
142 148
143 scheduler.ResetDamageForTest(); 149 scheduler.ResetDamageForTest();
144 display.Resize(gfx::Size(100, 100)); 150 display.Resize(gfx::Size(100, 100));
145 EXPECT_FALSE(scheduler.damaged); 151 EXPECT_FALSE(scheduler.damaged);
146 EXPECT_TRUE(scheduler.entire_display_damaged); 152 EXPECT_TRUE(scheduler.display_resized_);
153 EXPECT_FALSE(scheduler.has_new_root_surface);
147 154
148 factory_.Create(surface_id); 155 factory_.Create(surface_id);
149 156
150 // First draw from surface should have full damage. 157 // First draw from surface should have full damage.
151 RenderPassList pass_list; 158 RenderPassList pass_list;
152 scoped_ptr<RenderPass> pass = RenderPass::Create(); 159 scoped_ptr<RenderPass> pass = RenderPass::Create();
153 pass->output_rect = gfx::Rect(0, 0, 100, 100); 160 pass->output_rect = gfx::Rect(0, 0, 100, 100);
154 pass->damage_rect = gfx::Rect(10, 10, 1, 1); 161 pass->damage_rect = gfx::Rect(10, 10, 1, 1);
155 pass->id = RenderPassId(1, 1); 162 pass->id = RenderPassId(1, 1);
156 pass_list.push_back(pass.Pass()); 163 pass_list.push_back(pass.Pass());
157 164
158 scheduler.ResetDamageForTest(); 165 scheduler.ResetDamageForTest();
159 SubmitFrame(&pass_list, surface_id); 166 SubmitFrame(&pass_list, surface_id);
160 EXPECT_TRUE(scheduler.damaged); 167 EXPECT_TRUE(scheduler.damaged);
161 EXPECT_FALSE(scheduler.entire_display_damaged); 168 EXPECT_FALSE(scheduler.display_resized_);
169 EXPECT_FALSE(scheduler.has_new_root_surface);
162 170
163 EXPECT_FALSE(scheduler.swapped); 171 EXPECT_FALSE(scheduler.swapped);
164 EXPECT_EQ(0u, output_surface_ptr_->num_sent_frames()); 172 EXPECT_EQ(0u, output_surface_ptr_->num_sent_frames());
165 display.DrawAndSwap(); 173 display.DrawAndSwap();
166 EXPECT_TRUE(scheduler.swapped); 174 EXPECT_TRUE(scheduler.swapped);
167 EXPECT_EQ(1u, output_surface_ptr_->num_sent_frames()); 175 EXPECT_EQ(1u, output_surface_ptr_->num_sent_frames());
168 SoftwareFrameData* software_data = 176 SoftwareFrameData* software_data =
169 output_surface_ptr_->last_sent_frame().software_frame_data.get(); 177 output_surface_ptr_->last_sent_frame().software_frame_data.get();
170 ASSERT_NE(nullptr, software_data); 178 ASSERT_NE(nullptr, software_data);
171 EXPECT_EQ(gfx::Size(100, 100).ToString(), software_data->size.ToString()); 179 EXPECT_EQ(gfx::Size(100, 100).ToString(), software_data->size.ToString());
172 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), 180 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(),
173 software_data->damage_rect.ToString()); 181 software_data->damage_rect.ToString());
174 182
175 { 183 {
176 // Only damaged portion should be swapped. 184 // Only damaged portion should be swapped.
177 pass = RenderPass::Create(); 185 pass = RenderPass::Create();
178 pass->output_rect = gfx::Rect(0, 0, 100, 100); 186 pass->output_rect = gfx::Rect(0, 0, 100, 100);
179 pass->damage_rect = gfx::Rect(10, 10, 1, 1); 187 pass->damage_rect = gfx::Rect(10, 10, 1, 1);
180 pass->id = RenderPassId(1, 1); 188 pass->id = RenderPassId(1, 1);
181 189
182 pass_list.push_back(pass.Pass()); 190 pass_list.push_back(pass.Pass());
183 scheduler.ResetDamageForTest(); 191 scheduler.ResetDamageForTest();
184 SubmitFrame(&pass_list, surface_id); 192 SubmitFrame(&pass_list, surface_id);
185 EXPECT_TRUE(scheduler.damaged); 193 EXPECT_TRUE(scheduler.damaged);
186 EXPECT_FALSE(scheduler.entire_display_damaged); 194 EXPECT_FALSE(scheduler.display_resized_);
195 EXPECT_FALSE(scheduler.has_new_root_surface);
187 196
188 scheduler.swapped = false; 197 scheduler.swapped = false;
189 display.DrawAndSwap(); 198 display.DrawAndSwap();
190 EXPECT_TRUE(scheduler.swapped); 199 EXPECT_TRUE(scheduler.swapped);
191 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames()); 200 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames());
192 software_data = 201 software_data =
193 output_surface_ptr_->last_sent_frame().software_frame_data.get(); 202 output_surface_ptr_->last_sent_frame().software_frame_data.get();
194 ASSERT_NE(nullptr, software_data); 203 ASSERT_NE(nullptr, software_data);
195 EXPECT_EQ(gfx::Size(100, 100).ToString(), software_data->size.ToString()); 204 EXPECT_EQ(gfx::Size(100, 100).ToString(), software_data->size.ToString());
196 EXPECT_EQ(gfx::Rect(10, 10, 1, 1).ToString(), 205 EXPECT_EQ(gfx::Rect(10, 10, 1, 1).ToString(),
197 software_data->damage_rect.ToString()); 206 software_data->damage_rect.ToString());
198 } 207 }
199 208
200 { 209 {
201 // Pass has no damage so shouldn't be swapped. 210 // Pass has no damage so shouldn't be swapped.
202 pass = RenderPass::Create(); 211 pass = RenderPass::Create();
203 pass->output_rect = gfx::Rect(0, 0, 100, 100); 212 pass->output_rect = gfx::Rect(0, 0, 100, 100);
204 pass->damage_rect = gfx::Rect(10, 10, 0, 0); 213 pass->damage_rect = gfx::Rect(10, 10, 0, 0);
205 pass->id = RenderPassId(1, 1); 214 pass->id = RenderPassId(1, 1);
206 215
207 pass_list.push_back(pass.Pass()); 216 pass_list.push_back(pass.Pass());
208 scheduler.ResetDamageForTest(); 217 scheduler.ResetDamageForTest();
209 SubmitFrame(&pass_list, surface_id); 218 SubmitFrame(&pass_list, surface_id);
210 EXPECT_TRUE(scheduler.damaged); 219 EXPECT_TRUE(scheduler.damaged);
211 EXPECT_FALSE(scheduler.entire_display_damaged); 220 EXPECT_FALSE(scheduler.display_resized_);
221 EXPECT_FALSE(scheduler.has_new_root_surface);
212 222
213 scheduler.swapped = false; 223 scheduler.swapped = false;
214 display.DrawAndSwap(); 224 display.DrawAndSwap();
215 EXPECT_TRUE(scheduler.swapped); 225 EXPECT_TRUE(scheduler.swapped);
216 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames()); 226 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames());
217 } 227 }
218 228
219 { 229 {
220 // Pass is wrong size so shouldn't be swapped. 230 // Pass is wrong size so shouldn't be swapped.
221 pass = RenderPass::Create(); 231 pass = RenderPass::Create();
222 pass->output_rect = gfx::Rect(0, 0, 99, 99); 232 pass->output_rect = gfx::Rect(0, 0, 99, 99);
223 pass->damage_rect = gfx::Rect(10, 10, 10, 10); 233 pass->damage_rect = gfx::Rect(10, 10, 10, 10);
224 pass->id = RenderPassId(1, 1); 234 pass->id = RenderPassId(1, 1);
225 235
226 pass_list.push_back(pass.Pass()); 236 pass_list.push_back(pass.Pass());
227 scheduler.ResetDamageForTest(); 237 scheduler.ResetDamageForTest();
228 SubmitFrame(&pass_list, surface_id); 238 SubmitFrame(&pass_list, surface_id);
229 EXPECT_TRUE(scheduler.damaged); 239 EXPECT_TRUE(scheduler.damaged);
230 EXPECT_FALSE(scheduler.entire_display_damaged); 240 EXPECT_FALSE(scheduler.display_resized_);
241 EXPECT_FALSE(scheduler.has_new_root_surface);
231 242
232 scheduler.swapped = false; 243 scheduler.swapped = false;
233 display.DrawAndSwap(); 244 display.DrawAndSwap();
234 EXPECT_TRUE(scheduler.swapped); 245 EXPECT_TRUE(scheduler.swapped);
235 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames()); 246 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames());
236 } 247 }
237 248
238 { 249 {
239 // Pass has copy output request so should be swapped. 250 // Pass has copy output request so should be swapped.
240 pass = RenderPass::Create(); 251 pass = RenderPass::Create();
241 pass->output_rect = gfx::Rect(0, 0, 100, 100); 252 pass->output_rect = gfx::Rect(0, 0, 100, 100);
242 pass->damage_rect = gfx::Rect(10, 10, 0, 0); 253 pass->damage_rect = gfx::Rect(10, 10, 0, 0);
243 bool copy_called = false; 254 bool copy_called = false;
244 pass->copy_requests.push_back(CopyOutputRequest::CreateRequest( 255 pass->copy_requests.push_back(CopyOutputRequest::CreateRequest(
245 base::Bind(&CopyCallback, &copy_called))); 256 base::Bind(&CopyCallback, &copy_called)));
246 pass->id = RenderPassId(1, 1); 257 pass->id = RenderPassId(1, 1);
247 258
248 pass_list.push_back(pass.Pass()); 259 pass_list.push_back(pass.Pass());
249 scheduler.ResetDamageForTest(); 260 scheduler.ResetDamageForTest();
250 SubmitFrame(&pass_list, surface_id); 261 SubmitFrame(&pass_list, surface_id);
251 EXPECT_TRUE(scheduler.damaged); 262 EXPECT_TRUE(scheduler.damaged);
252 EXPECT_FALSE(scheduler.entire_display_damaged); 263 EXPECT_FALSE(scheduler.display_resized_);
264 EXPECT_FALSE(scheduler.has_new_root_surface);
253 265
254 scheduler.swapped = false; 266 scheduler.swapped = false;
255 display.DrawAndSwap(); 267 display.DrawAndSwap();
256 EXPECT_TRUE(scheduler.swapped); 268 EXPECT_TRUE(scheduler.swapped);
257 EXPECT_EQ(3u, output_surface_ptr_->num_sent_frames()); 269 EXPECT_EQ(3u, output_surface_ptr_->num_sent_frames());
258 EXPECT_TRUE(copy_called); 270 EXPECT_TRUE(copy_called);
259 } 271 }
260 272
261 // Pass has latency info so should be swapped. 273 // Pass has latency info so should be swapped.
262 { 274 {
263 pass = RenderPass::Create(); 275 pass = RenderPass::Create();
264 pass->output_rect = gfx::Rect(0, 0, 100, 100); 276 pass->output_rect = gfx::Rect(0, 0, 100, 100);
265 pass->damage_rect = gfx::Rect(10, 10, 0, 0); 277 pass->damage_rect = gfx::Rect(10, 10, 0, 0);
266 pass->id = RenderPassId(1, 1); 278 pass->id = RenderPassId(1, 1);
267 279
268 pass_list.push_back(pass.Pass()); 280 pass_list.push_back(pass.Pass());
269 scheduler.ResetDamageForTest(); 281 scheduler.ResetDamageForTest();
270 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); 282 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
271 pass_list.swap(frame_data->render_pass_list); 283 pass_list.swap(frame_data->render_pass_list);
272 284
273 scoped_ptr<CompositorFrame> frame(new CompositorFrame); 285 scoped_ptr<CompositorFrame> frame(new CompositorFrame);
274 frame->delegated_frame_data = frame_data.Pass(); 286 frame->delegated_frame_data = frame_data.Pass();
275 frame->metadata.latency_info.push_back(ui::LatencyInfo()); 287 frame->metadata.latency_info.push_back(ui::LatencyInfo());
276 288
277 factory_.SubmitFrame(surface_id, frame.Pass(), 289 factory_.SubmitFrame(surface_id, frame.Pass(),
278 SurfaceFactory::DrawCallback()); 290 SurfaceFactory::DrawCallback());
279 EXPECT_TRUE(scheduler.damaged); 291 EXPECT_TRUE(scheduler.damaged);
280 EXPECT_FALSE(scheduler.entire_display_damaged); 292 EXPECT_FALSE(scheduler.display_resized_);
293 EXPECT_FALSE(scheduler.has_new_root_surface);
281 294
282 scheduler.swapped = false; 295 scheduler.swapped = false;
283 display.DrawAndSwap(); 296 display.DrawAndSwap();
284 EXPECT_TRUE(scheduler.swapped); 297 EXPECT_TRUE(scheduler.swapped);
285 EXPECT_EQ(4u, output_surface_ptr_->num_sent_frames()); 298 EXPECT_EQ(4u, output_surface_ptr_->num_sent_frames());
286 } 299 }
287 300
288 // Resize should cause a swap if no frame was swapped at the previous size. 301 // Resize should cause a swap if no frame was swapped at the previous size.
289 { 302 {
290 scheduler.swapped = false; 303 scheduler.swapped = false;
(...skipping 10 matching lines...) Expand all
301 scheduler.ResetDamageForTest(); 314 scheduler.ResetDamageForTest();
302 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); 315 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
303 pass_list.swap(frame_data->render_pass_list); 316 pass_list.swap(frame_data->render_pass_list);
304 317
305 scoped_ptr<CompositorFrame> frame(new CompositorFrame); 318 scoped_ptr<CompositorFrame> frame(new CompositorFrame);
306 frame->delegated_frame_data = frame_data.Pass(); 319 frame->delegated_frame_data = frame_data.Pass();
307 320
308 factory_.SubmitFrame(surface_id, frame.Pass(), 321 factory_.SubmitFrame(surface_id, frame.Pass(),
309 SurfaceFactory::DrawCallback()); 322 SurfaceFactory::DrawCallback());
310 EXPECT_TRUE(scheduler.damaged); 323 EXPECT_TRUE(scheduler.damaged);
311 EXPECT_FALSE(scheduler.entire_display_damaged); 324 EXPECT_FALSE(scheduler.display_resized_);
325 EXPECT_FALSE(scheduler.has_new_root_surface);
312 326
313 scheduler.swapped = false; 327 scheduler.swapped = false;
314 display.Resize(gfx::Size(100, 100)); 328 display.Resize(gfx::Size(100, 100));
315 EXPECT_TRUE(scheduler.swapped); 329 EXPECT_TRUE(scheduler.swapped);
316 EXPECT_EQ(5u, output_surface_ptr_->num_sent_frames()); 330 EXPECT_EQ(5u, output_surface_ptr_->num_sent_frames());
317 } 331 }
318 332
319 factory_.Destroy(surface_id); 333 factory_.Destroy(surface_id);
320 } 334 }
321 335
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 404
391 EXPECT_CALL(*context_ptr, shallowFinishCHROMIUM()); 405 EXPECT_CALL(*context_ptr, shallowFinishCHROMIUM());
392 display.Resize(gfx::Size(250, 250)); 406 display.Resize(gfx::Size(250, 250));
393 testing::Mock::VerifyAndClearExpectations(context_ptr); 407 testing::Mock::VerifyAndClearExpectations(context_ptr);
394 408
395 factory_.Destroy(surface_id); 409 factory_.Destroy(surface_id);
396 } 410 }
397 411
398 } // namespace 412 } // namespace
399 } // namespace cc 413 } // namespace cc
OLDNEW
« no previous file with comments | « cc/surfaces/display_scheduler_unittest.cc ('k') | cc/surfaces/surface_factory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698