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

Side by Side Diff: cc/output/overlay_unittest.cc

Issue 208213003: Plumb overlay processing into DirectRenderer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ScopedGLLock Created 6 years, 9 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "cc/base/scoped_ptr_vector.h" 5 #include "cc/base/scoped_ptr_vector.h"
6 #include "cc/output/gl_renderer.h"
6 #include "cc/output/output_surface.h" 7 #include "cc/output/output_surface.h"
7 #include "cc/output/output_surface_client.h" 8 #include "cc/output/output_surface_client.h"
8 #include "cc/output/overlay_candidate_validator.h" 9 #include "cc/output/overlay_candidate_validator.h"
9 #include "cc/output/overlay_processor.h" 10 #include "cc/output/overlay_processor.h"
10 #include "cc/output/overlay_strategy_single_on_top.h" 11 #include "cc/output/overlay_strategy_single_on_top.h"
11 #include "cc/quads/checkerboard_draw_quad.h" 12 #include "cc/quads/checkerboard_draw_quad.h"
12 #include "cc/quads/render_pass.h" 13 #include "cc/quads/render_pass.h"
13 #include "cc/quads/texture_draw_quad.h" 14 #include "cc/quads/texture_draw_quad.h"
14 #include "cc/resources/resource_provider.h" 15 #include "cc/resources/resource_provider.h"
15 #include "cc/resources/texture_mailbox.h" 16 #include "cc/resources/texture_mailbox.h"
16 #include "cc/test/fake_output_surface_client.h" 17 #include "cc/test/fake_output_surface_client.h"
17 #include "cc/test/geometry_test_utils.h" 18 #include "cc/test/geometry_test_utils.h"
18 #include "cc/test/test_context_provider.h" 19 #include "cc/test/test_context_provider.h"
20 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
20 22
23 using testing::_;
24 using testing::Mock;
25
21 namespace cc { 26 namespace cc {
22 namespace { 27 namespace {
23 28
24 const gfx::Rect kOverlayRect(0, 0, 128, 128); 29 const gfx::Rect kOverlayRect(0, 0, 128, 128);
25 const gfx::PointF kUVTopLeft(0.1f, 0.2f); 30 const gfx::PointF kUVTopLeft(0.1f, 0.2f);
26 const gfx::PointF kUVBottomRight(1.0f, 1.0f); 31 const gfx::PointF kUVBottomRight(1.0f, 1.0f);
27 32
28 void MailboxReleased(unsigned sync_point, bool lost_resource) {} 33 void MailboxReleased(unsigned sync_point, bool lost_resource) {}
29 34
30 class SingleOverlayValidator : public OverlayCandidateValidator { 35 class SingleOverlayValidator : public OverlayCandidateValidator {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 scoped_ptr<RenderPass> CreateRenderPass() { 101 scoped_ptr<RenderPass> CreateRenderPass() {
97 RenderPass::Id id(1, 0); 102 RenderPass::Id id(1, 0);
98 gfx::Rect output_rect(0, 0, 256, 256); 103 gfx::Rect output_rect(0, 0, 256, 256);
99 bool has_transparent_background = true; 104 bool has_transparent_background = true;
100 105
101 scoped_ptr<RenderPass> pass = RenderPass::Create(); 106 scoped_ptr<RenderPass> pass = RenderPass::Create();
102 pass->SetAll(id, 107 pass->SetAll(id,
103 output_rect, 108 output_rect,
104 output_rect, 109 output_rect,
105 gfx::Transform(), 110 gfx::Transform(),
106 has_transparent_background, 111 has_transparent_background);
107 RenderPass::NO_OVERLAY);
108 112
109 scoped_ptr<SharedQuadState> shared_state = SharedQuadState::Create(); 113 scoped_ptr<SharedQuadState> shared_state = SharedQuadState::Create();
110 shared_state->opacity = 1.f; 114 shared_state->opacity = 1.f;
111 pass->shared_quad_state_list.push_back(shared_state.Pass()); 115 pass->shared_quad_state_list.push_back(shared_state.Pass());
112 return pass.Pass(); 116 return pass.Pass();
113 } 117 }
114 118
115 scoped_ptr<TextureDrawQuad> CreateCandidateQuad( 119 ResourceProvider::ResourceId CreateResource(
116 ResourceProvider* resource_provider, 120 ResourceProvider* resource_provider) {
117 const SharedQuadState* shared_quad_state) {
118 unsigned sync_point = 0; 121 unsigned sync_point = 0;
119 TextureMailbox mailbox = 122 TextureMailbox mailbox =
120 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); 123 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point);
121 mailbox.set_allow_overlay(true); 124 mailbox.set_allow_overlay(true);
122 scoped_ptr<SingleReleaseCallback> release_callback = 125 scoped_ptr<SingleReleaseCallback> release_callback =
123 SingleReleaseCallback::Create(base::Bind(&MailboxReleased)); 126 SingleReleaseCallback::Create(base::Bind(&MailboxReleased));
124 127
125 ResourceProvider::ResourceId resource_id = 128 return resource_provider->CreateResourceFromTextureMailbox(
126 resource_provider->CreateResourceFromTextureMailbox( 129 mailbox, release_callback.Pass());
127 mailbox, release_callback.Pass()); 130 }
131
132 scoped_ptr<TextureDrawQuad> CreateCandidateQuad(
133 ResourceProvider* resource_provider,
134 const SharedQuadState* shared_quad_state) {
135 ResourceProvider::ResourceId resource_id = CreateResource(resource_provider);
128 bool premultiplied_alpha = false; 136 bool premultiplied_alpha = false;
129 bool flipped = false; 137 bool flipped = false;
130 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; 138 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
131 139
132 scoped_ptr<TextureDrawQuad> overlay_quad = TextureDrawQuad::Create(); 140 scoped_ptr<TextureDrawQuad> overlay_quad = TextureDrawQuad::Create();
133 overlay_quad->SetNew(shared_quad_state, 141 overlay_quad->SetNew(shared_quad_state,
134 kOverlayRect, 142 kOverlayRect,
135 kOverlayRect, 143 kOverlayRect,
136 kOverlayRect, 144 kOverlayRect,
137 resource_id, 145 resource_id,
(...skipping 24 matching lines...) Expand all
162 RenderPass* expected = expected_list[i]; 170 RenderPass* expected = expected_list[i];
163 RenderPass* actual = actual_list[i]; 171 RenderPass* actual = actual_list[i];
164 172
165 EXPECT_EQ(expected->id, actual->id); 173 EXPECT_EQ(expected->id, actual->id);
166 EXPECT_RECT_EQ(expected->output_rect, actual->output_rect); 174 EXPECT_RECT_EQ(expected->output_rect, actual->output_rect);
167 EXPECT_EQ(expected->transform_to_root_target, 175 EXPECT_EQ(expected->transform_to_root_target,
168 actual->transform_to_root_target); 176 actual->transform_to_root_target);
169 EXPECT_RECT_EQ(expected->damage_rect, actual->damage_rect); 177 EXPECT_RECT_EQ(expected->damage_rect, actual->damage_rect);
170 EXPECT_EQ(expected->has_transparent_background, 178 EXPECT_EQ(expected->has_transparent_background,
171 actual->has_transparent_background); 179 actual->has_transparent_background);
172 EXPECT_EQ(expected->overlay_state, actual->overlay_state);
173 180
174 EXPECT_EQ(expected->shared_quad_state_list.size(), 181 EXPECT_EQ(expected->shared_quad_state_list.size(),
175 actual->shared_quad_state_list.size()); 182 actual->shared_quad_state_list.size());
176 EXPECT_EQ(expected->quad_list.size(), actual->quad_list.size()); 183 EXPECT_EQ(expected->quad_list.size(), actual->quad_list.size());
177 184
178 for (size_t i = 0; i < expected->quad_list.size(); ++i) { 185 for (size_t i = 0; i < expected->quad_list.size(); ++i) {
179 EXPECT_EQ(expected->quad_list[i]->rect.ToString(), 186 EXPECT_EQ(expected->quad_list[i]->rect.ToString(),
180 actual->quad_list[i]->rect.ToString()); 187 actual->quad_list[i]->rect.ToString());
181 EXPECT_EQ( 188 EXPECT_EQ(
182 expected->quad_list[i]->shared_quad_state->content_bounds.ToString(), 189 expected->quad_list[i]->shared_quad_state->content_bounds.ToString(),
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 // Add something behind it. 252 // Add something behind it.
246 pass->quad_list.push_back(CreateCheckeredQuad( 253 pass->quad_list.push_back(CreateCheckeredQuad(
247 resource_provider_.get(), pass->shared_quad_state_list.back())); 254 resource_provider_.get(), pass->shared_quad_state_list.back()));
248 pass->quad_list.push_back(CreateCheckeredQuad( 255 pass->quad_list.push_back(CreateCheckeredQuad(
249 resource_provider_.get(), pass->shared_quad_state_list.back())); 256 resource_provider_.get(), pass->shared_quad_state_list.back()));
250 257
251 RenderPassList pass_list; 258 RenderPassList pass_list;
252 pass_list.push_back(pass.Pass()); 259 pass_list.push_back(pass.Pass());
253 260
254 // Check for potential candidates. 261 // Check for potential candidates.
255 overlay_processor_->ProcessForOverlays(&pass_list); 262 OverlayCandidateList candidate_list;
263 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
256 264
257 // This should have one more pass with an overlay. 265 ASSERT_EQ(1U, pass_list.size());
258 ASSERT_EQ(2U, pass_list.size()); 266 ASSERT_EQ(2U, candidate_list.size());
259 267
260 RenderPass* overlay_pass = pass_list.front();
261 EXPECT_EQ(RenderPass::SIMPLE_OVERLAY, overlay_pass->overlay_state);
262 RenderPass* main_pass = pass_list.back(); 268 RenderPass* main_pass = pass_list.back();
263 EXPECT_EQ(RenderPass::NO_OVERLAY, main_pass->overlay_state); 269 // Check that the quad is gone.
270 EXPECT_EQ(2U, main_pass->quad_list.size());
271 const QuadList& quad_list = main_pass->quad_list;
272 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin();
273 it != quad_list.BackToFrontEnd();
274 ++it) {
275 EXPECT_NE(DrawQuad::TEXTURE_CONTENT, (*it)->material);
276 }
264 277
265 // Check that the quad is what we expect it to be. 278 // Check that the right resource id got extracted.
266 EXPECT_EQ(1U, overlay_pass->quad_list.size()); 279 EXPECT_EQ(original_quad->resource_id, candidate_list.back().resource_id);
267 const DrawQuad* overlay_quad = overlay_pass->quad_list.front();
268 EXPECT_EQ(DrawQuad::TEXTURE_CONTENT, overlay_quad->material);
269 EXPECT_EQ(original_quad->resource_id,
270 TextureDrawQuad::MaterialCast(overlay_quad)->resource_id);
271 } 280 }
272 281
273 TEST_F(SingleOverlayOnTopTest, NoCandidates) { 282 TEST_F(SingleOverlayOnTopTest, NoCandidates) {
274 scoped_ptr<RenderPass> pass = CreateRenderPass(); 283 scoped_ptr<RenderPass> pass = CreateRenderPass();
275 pass->quad_list.push_back(CreateCheckeredQuad( 284 pass->quad_list.push_back(CreateCheckeredQuad(
276 resource_provider_.get(), pass->shared_quad_state_list.back())); 285 resource_provider_.get(), pass->shared_quad_state_list.back()));
277 pass->quad_list.push_back(CreateCheckeredQuad( 286 pass->quad_list.push_back(CreateCheckeredQuad(
278 resource_provider_.get(), pass->shared_quad_state_list.back())); 287 resource_provider_.get(), pass->shared_quad_state_list.back()));
279 288
280 RenderPassList pass_list; 289 RenderPassList pass_list;
281 pass_list.push_back(pass.Pass()); 290 pass_list.push_back(pass.Pass());
282 291
283 RenderPassList original_pass_list; 292 RenderPassList original_pass_list;
284 RenderPass::CopyAll(pass_list, &original_pass_list); 293 RenderPass::CopyAll(pass_list, &original_pass_list);
285 294
286 overlay_processor_->ProcessForOverlays(&pass_list); 295 OverlayCandidateList candidate_list;
296 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
297 EXPECT_EQ(0U, candidate_list.size());
287 // There should be nothing new here. 298 // There should be nothing new here.
288 CompareRenderPassLists(pass_list, original_pass_list); 299 CompareRenderPassLists(pass_list, original_pass_list);
289 } 300 }
290 301
291 TEST_F(SingleOverlayOnTopTest, OccludedCandidates) { 302 TEST_F(SingleOverlayOnTopTest, OccludedCandidates) {
292 scoped_ptr<RenderPass> pass = CreateRenderPass(); 303 scoped_ptr<RenderPass> pass = CreateRenderPass();
293 pass->quad_list.push_back(CreateCheckeredQuad( 304 pass->quad_list.push_back(CreateCheckeredQuad(
294 resource_provider_.get(), pass->shared_quad_state_list.back())); 305 resource_provider_.get(), pass->shared_quad_state_list.back()));
295 pass->quad_list.push_back(CreateCheckeredQuad( 306 pass->quad_list.push_back(CreateCheckeredQuad(
296 resource_provider_.get(), pass->shared_quad_state_list.back())); 307 resource_provider_.get(), pass->shared_quad_state_list.back()));
297 308
298 pass->quad_list.push_back( 309 pass->quad_list.push_back(
299 CreateCandidateQuad(resource_provider_.get(), 310 CreateCandidateQuad(resource_provider_.get(),
300 pass->shared_quad_state_list.back()) 311 pass->shared_quad_state_list.back())
301 .PassAs<DrawQuad>()); 312 .PassAs<DrawQuad>());
302 313
303 RenderPassList pass_list; 314 RenderPassList pass_list;
304 pass_list.push_back(pass.Pass()); 315 pass_list.push_back(pass.Pass());
305 316
306 RenderPassList original_pass_list; 317 RenderPassList original_pass_list;
307 RenderPass::CopyAll(pass_list, &original_pass_list); 318 RenderPass::CopyAll(pass_list, &original_pass_list);
308 319
309 overlay_processor_->ProcessForOverlays(&pass_list); 320 OverlayCandidateList candidate_list;
321 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
322 EXPECT_EQ(0U, candidate_list.size());
310 // There should be nothing new here. 323 // There should be nothing new here.
311 CompareRenderPassLists(pass_list, original_pass_list); 324 CompareRenderPassLists(pass_list, original_pass_list);
312 } 325 }
313 326
314 // Test with multiple render passes. 327 // Test with multiple render passes.
315 TEST_F(SingleOverlayOnTopTest, MultipleRenderPasses) { 328 TEST_F(SingleOverlayOnTopTest, MultipleRenderPasses) {
316 RenderPassList pass_list; 329 RenderPassList pass_list;
317 pass_list.push_back(CreateRenderPass()); 330 pass_list.push_back(CreateRenderPass());
318 331
319 scoped_ptr<RenderPass> pass = CreateRenderPass(); 332 scoped_ptr<RenderPass> pass = CreateRenderPass();
320 scoped_ptr<TextureDrawQuad> original_quad = CreateCandidateQuad( 333 scoped_ptr<TextureDrawQuad> original_quad = CreateCandidateQuad(
321 resource_provider_.get(), pass->shared_quad_state_list.back()); 334 resource_provider_.get(), pass->shared_quad_state_list.back());
322 335
323 pass->quad_list.push_back( 336 pass->quad_list.push_back(
324 original_quad->Copy(pass->shared_quad_state_list.back())); 337 original_quad->Copy(pass->shared_quad_state_list.back()));
325 // Add something behind it. 338 // Add something behind it.
326 pass->quad_list.push_back(CreateCheckeredQuad( 339 pass->quad_list.push_back(CreateCheckeredQuad(
327 resource_provider_.get(), pass->shared_quad_state_list.back())); 340 resource_provider_.get(), pass->shared_quad_state_list.back()));
328 pass->quad_list.push_back(CreateCheckeredQuad( 341 pass->quad_list.push_back(CreateCheckeredQuad(
329 resource_provider_.get(), pass->shared_quad_state_list.back())); 342 resource_provider_.get(), pass->shared_quad_state_list.back()));
330 343
331 pass_list.push_back(pass.Pass()); 344 pass_list.push_back(pass.Pass());
332 345
346 RenderPassList original_pass_list;
347 RenderPass::CopyAll(pass_list, &original_pass_list);
348
333 // Check for potential candidates. 349 // Check for potential candidates.
334 overlay_processor_->ProcessForOverlays(&pass_list); 350 OverlayCandidateList candidate_list;
351 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
352 EXPECT_EQ(2U, candidate_list.size());
335 353
336 // This should have one more pass with an overlay. 354 // This should be the same.
337 ASSERT_EQ(3U, pass_list.size()); 355 ASSERT_EQ(2U, pass_list.size());
338 } 356 }
339 357
340 TEST_F(SingleOverlayOnTopTest, RejectPremultipliedAlpha) { 358 TEST_F(SingleOverlayOnTopTest, RejectPremultipliedAlpha) {
341 scoped_ptr<RenderPass> pass = CreateRenderPass(); 359 scoped_ptr<RenderPass> pass = CreateRenderPass();
342 scoped_ptr<TextureDrawQuad> quad = CreateCandidateQuad( 360 scoped_ptr<TextureDrawQuad> quad = CreateCandidateQuad(
343 resource_provider_.get(), pass->shared_quad_state_list.back()); 361 resource_provider_.get(), pass->shared_quad_state_list.back());
344 quad->premultiplied_alpha = true; 362 quad->premultiplied_alpha = true;
345 363
346 pass->quad_list.push_back(quad.PassAs<DrawQuad>()); 364 pass->quad_list.push_back(quad.PassAs<DrawQuad>());
347 RenderPassList pass_list; 365 RenderPassList pass_list;
348 pass_list.push_back(pass.Pass()); 366 pass_list.push_back(pass.Pass());
349 overlay_processor_->ProcessForOverlays(&pass_list); 367 OverlayCandidateList candidate_list;
350 ASSERT_EQ(1U, pass_list.size()); 368 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
351 EXPECT_EQ(RenderPass::NO_OVERLAY, pass_list.back()->overlay_state); 369 EXPECT_EQ(1U, pass_list.size());
370 EXPECT_EQ(0U, candidate_list.size());
352 } 371 }
353 372
354 TEST_F(SingleOverlayOnTopTest, RejectBlending) { 373 TEST_F(SingleOverlayOnTopTest, RejectBlending) {
355 scoped_ptr<RenderPass> pass = CreateRenderPass(); 374 scoped_ptr<RenderPass> pass = CreateRenderPass();
356 scoped_ptr<TextureDrawQuad> quad = CreateCandidateQuad( 375 scoped_ptr<TextureDrawQuad> quad = CreateCandidateQuad(
357 resource_provider_.get(), pass->shared_quad_state_list.back()); 376 resource_provider_.get(), pass->shared_quad_state_list.back());
358 quad->needs_blending = true; 377 quad->needs_blending = true;
359 378
360 pass->quad_list.push_back(quad.PassAs<DrawQuad>()); 379 pass->quad_list.push_back(quad.PassAs<DrawQuad>());
361 RenderPassList pass_list; 380 RenderPassList pass_list;
362 pass_list.push_back(pass.Pass()); 381 pass_list.push_back(pass.Pass());
363 overlay_processor_->ProcessForOverlays(&pass_list); 382 OverlayCandidateList candidate_list;
383 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
364 ASSERT_EQ(1U, pass_list.size()); 384 ASSERT_EQ(1U, pass_list.size());
365 EXPECT_EQ(RenderPass::NO_OVERLAY, pass_list.back()->overlay_state); 385 EXPECT_EQ(0U, candidate_list.size());
366 } 386 }
367 387
368 TEST_F(SingleOverlayOnTopTest, RejectBackgroundColor) { 388 TEST_F(SingleOverlayOnTopTest, RejectBackgroundColor) {
369 scoped_ptr<RenderPass> pass = CreateRenderPass(); 389 scoped_ptr<RenderPass> pass = CreateRenderPass();
370 scoped_ptr<TextureDrawQuad> quad = CreateCandidateQuad( 390 scoped_ptr<TextureDrawQuad> quad = CreateCandidateQuad(
371 resource_provider_.get(), pass->shared_quad_state_list.back()); 391 resource_provider_.get(), pass->shared_quad_state_list.back());
372 quad->background_color = SK_ColorBLACK; 392 quad->background_color = SK_ColorBLACK;
373 393
374 pass->quad_list.push_back(quad.PassAs<DrawQuad>()); 394 pass->quad_list.push_back(quad.PassAs<DrawQuad>());
375 RenderPassList pass_list; 395 RenderPassList pass_list;
376 pass_list.push_back(pass.Pass()); 396 pass_list.push_back(pass.Pass());
377 overlay_processor_->ProcessForOverlays(&pass_list); 397 OverlayCandidateList candidate_list;
398 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
378 ASSERT_EQ(1U, pass_list.size()); 399 ASSERT_EQ(1U, pass_list.size());
379 EXPECT_EQ(RenderPass::NO_OVERLAY, pass_list.back()->overlay_state); 400 EXPECT_EQ(0U, candidate_list.size());
380 } 401 }
381 402
382 TEST_F(SingleOverlayOnTopTest, RejectBlendMode) { 403 TEST_F(SingleOverlayOnTopTest, RejectBlendMode) {
383 scoped_ptr<RenderPass> pass = CreateRenderPass(); 404 scoped_ptr<RenderPass> pass = CreateRenderPass();
384 scoped_ptr<TextureDrawQuad> quad = CreateCandidateQuad( 405 scoped_ptr<TextureDrawQuad> quad = CreateCandidateQuad(
385 resource_provider_.get(), pass->shared_quad_state_list.back()); 406 resource_provider_.get(), pass->shared_quad_state_list.back());
386 pass->shared_quad_state_list.back()->blend_mode = SkXfermode::kScreen_Mode; 407 pass->shared_quad_state_list.back()->blend_mode = SkXfermode::kScreen_Mode;
387 408
388 pass->quad_list.push_back(quad.PassAs<DrawQuad>()); 409 pass->quad_list.push_back(quad.PassAs<DrawQuad>());
389 RenderPassList pass_list; 410 RenderPassList pass_list;
390 pass_list.push_back(pass.Pass()); 411 pass_list.push_back(pass.Pass());
391 overlay_processor_->ProcessForOverlays(&pass_list); 412 OverlayCandidateList candidate_list;
413 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
392 ASSERT_EQ(1U, pass_list.size()); 414 ASSERT_EQ(1U, pass_list.size());
393 EXPECT_EQ(RenderPass::NO_OVERLAY, pass_list.back()->overlay_state); 415 EXPECT_EQ(0U, candidate_list.size());
394 } 416 }
395 417
396 TEST_F(SingleOverlayOnTopTest, RejectOpacity) { 418 TEST_F(SingleOverlayOnTopTest, RejectOpacity) {
397 scoped_ptr<RenderPass> pass = CreateRenderPass(); 419 scoped_ptr<RenderPass> pass = CreateRenderPass();
398 scoped_ptr<TextureDrawQuad> quad = CreateCandidateQuad( 420 scoped_ptr<TextureDrawQuad> quad = CreateCandidateQuad(
399 resource_provider_.get(), pass->shared_quad_state_list.back()); 421 resource_provider_.get(), pass->shared_quad_state_list.back());
400 pass->shared_quad_state_list.back()->opacity = 0.5f; 422 pass->shared_quad_state_list.back()->opacity = 0.5f;
401 423
402 pass->quad_list.push_back(quad.PassAs<DrawQuad>()); 424 pass->quad_list.push_back(quad.PassAs<DrawQuad>());
403 RenderPassList pass_list; 425 RenderPassList pass_list;
404 pass_list.push_back(pass.Pass()); 426 pass_list.push_back(pass.Pass());
405 overlay_processor_->ProcessForOverlays(&pass_list); 427 OverlayCandidateList candidate_list;
428 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
406 ASSERT_EQ(1U, pass_list.size()); 429 ASSERT_EQ(1U, pass_list.size());
407 EXPECT_EQ(RenderPass::NO_OVERLAY, pass_list.back()->overlay_state); 430 EXPECT_EQ(0U, candidate_list.size());
408 } 431 }
409 432
410 TEST_F(SingleOverlayOnTopTest, RejectTransform) { 433 TEST_F(SingleOverlayOnTopTest, RejectTransform) {
411 scoped_ptr<RenderPass> pass = CreateRenderPass(); 434 scoped_ptr<RenderPass> pass = CreateRenderPass();
412 scoped_ptr<TextureDrawQuad> quad = CreateCandidateQuad( 435 scoped_ptr<TextureDrawQuad> quad = CreateCandidateQuad(
413 resource_provider_.get(), pass->shared_quad_state_list.back()); 436 resource_provider_.get(), pass->shared_quad_state_list.back());
414 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.f, 437 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.f,
415 2.f); 438 2.f);
416 439
417 pass->quad_list.push_back(quad.PassAs<DrawQuad>()); 440 pass->quad_list.push_back(quad.PassAs<DrawQuad>());
418 RenderPassList pass_list; 441 RenderPassList pass_list;
419 pass_list.push_back(pass.Pass()); 442 pass_list.push_back(pass.Pass());
420 overlay_processor_->ProcessForOverlays(&pass_list); 443 OverlayCandidateList candidate_list;
444 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
421 ASSERT_EQ(1U, pass_list.size()); 445 ASSERT_EQ(1U, pass_list.size());
422 EXPECT_EQ(RenderPass::NO_OVERLAY, pass_list.back()->overlay_state); 446 EXPECT_EQ(0U, candidate_list.size());
447 }
448
449 class OverlayInfoRendererGL : public GLRenderer {
450 public:
451 OverlayInfoRendererGL(RendererClient* client,
452 const LayerTreeSettings* settings,
453 OutputSurface* output_surface,
454 ResourceProvider* resource_provider)
455 : GLRenderer(client,
456 settings,
457 output_surface,
458 resource_provider,
459 NULL,
460 0),
461 expect_overlays_(false) {}
462
463 MOCK_METHOD2(DoDrawQuad, void(DrawingFrame* frame, const DrawQuad* quad));
464
465 virtual void FinishDrawingFrame(DrawingFrame* frame) OVERRIDE {
466 GLRenderer::FinishDrawingFrame(frame);
467
468 if (!expect_overlays_) {
469 EXPECT_EQ(0U, frame->overlay_list.size());
470 return;
471 }
472
473 ASSERT_EQ(2U, frame->overlay_list.size());
474 EXPECT_NE(0U, frame->overlay_list.back().resource_id);
475 }
476
477 void set_expect_overlays(bool expect_overlays) {
478 expect_overlays_ = expect_overlays;
479 }
480
481 private:
482 bool expect_overlays_;
483 };
484
485 class FakeRendererClient : public RendererClient {
486 public:
487 // RendererClient methods.
488 virtual void SetFullRootLayerDamage() OVERRIDE {}
489 };
490
491 class MockOverlayScheduler {
492 public:
493 MOCK_METHOD5(Schedule,
494 void(int plane_z_order,
495 unsigned plane_transform,
496 unsigned overlay_texture_id,
497 const gfx::Rect& display_bounds,
498 const gfx::RectF& uv_rect));
499 };
500
501 class GLRendererWithOverlaysTest : public testing::Test {
502 protected:
503 GLRendererWithOverlaysTest() {
504 provider_ = TestContextProvider::Create();
505 output_surface_.reset(new OverlayOutputSurface(provider_));
506 CHECK(output_surface_->BindToClient(&output_surface_client_));
507 resource_provider_ =
508 ResourceProvider::Create(output_surface_.get(), NULL, 0, false, 1);
509
510 provider_->support()->SetScheduleOverlayPlaneCallback(base::Bind(
511 &MockOverlayScheduler::Schedule, base::Unretained(&scheduler_)));
512 }
513
514 void Init(bool use_validator) {
515 if (use_validator)
516 output_surface_->InitWithSingleOverlayValidator();
517
518 renderer_ =
519 make_scoped_ptr(new OverlayInfoRendererGL(&renderer_client_,
520 &settings_,
521 output_surface_.get(),
522 resource_provider_.get()));
523 }
524
525 void SwapBuffers() { renderer_->SwapBuffers(CompositorFrameMetadata()); }
526
527 LayerTreeSettings settings_;
528 FakeOutputSurfaceClient output_surface_client_;
529 scoped_ptr<OverlayOutputSurface> output_surface_;
530 FakeRendererClient renderer_client_;
531 scoped_ptr<ResourceProvider> resource_provider_;
532 scoped_ptr<OverlayInfoRendererGL> renderer_;
533 scoped_refptr<TestContextProvider> provider_;
534 MockOverlayScheduler scheduler_;
535 };
536
537 TEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) {
538 bool use_validator = true;
539 Init(use_validator);
540 renderer_->set_expect_overlays(true);
541 gfx::Rect viewport_rect(16, 16);
542
543 scoped_ptr<RenderPass> pass = CreateRenderPass();
544
545 pass->quad_list.push_back(
546 CreateCandidateQuad(resource_provider_.get(),
547 pass->shared_quad_state_list.back())
548 .PassAs<DrawQuad>());
549
550 pass->quad_list.push_back(CreateCheckeredQuad(
551 resource_provider_.get(), pass->shared_quad_state_list.back()));
552 pass->quad_list.push_back(CreateCheckeredQuad(
553 resource_provider_.get(), pass->shared_quad_state_list.back()));
554
555 RenderPassList pass_list;
556 pass_list.push_back(pass.Pass());
557
558 // Candidate pass was taken out and extra skipped pass added,
559 // so only draw 2 quads.
560 EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(2);
561 EXPECT_CALL(scheduler_,
562 Schedule(1,
563 OverlayCandidate::NONE,
564 _,
565 kOverlayRect,
566 BoundingRect(kUVTopLeft, kUVBottomRight))).Times(1);
567 renderer_->DrawFrame(
568 &pass_list, NULL, 1.f, viewport_rect, viewport_rect, false);
569
570 SwapBuffers();
571
572 Mock::VerifyAndClearExpectations(renderer_.get());
573 Mock::VerifyAndClearExpectations(&scheduler_);
574 }
575
576 TEST_F(GLRendererWithOverlaysTest, OccludedQuadDrawn) {
577 bool use_validator = true;
578 Init(use_validator);
579 renderer_->set_expect_overlays(false);
580 gfx::Rect viewport_rect(16, 16);
581
582 scoped_ptr<RenderPass> pass = CreateRenderPass();
583
584 pass->quad_list.push_back(CreateCheckeredQuad(
585 resource_provider_.get(), pass->shared_quad_state_list.back()));
586 pass->quad_list.push_back(CreateCheckeredQuad(
587 resource_provider_.get(), pass->shared_quad_state_list.back()));
588
589 pass->quad_list.push_back(
590 CreateCandidateQuad(resource_provider_.get(),
591 pass->shared_quad_state_list.back())
592 .PassAs<DrawQuad>());
593
594 RenderPassList pass_list;
595 pass_list.push_back(pass.Pass());
596
597 // 3 quads in the pass, all should draw.
598 EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(3);
599 EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(0);
600 renderer_->DrawFrame(
601 &pass_list, NULL, 1.f, viewport_rect, viewport_rect, false);
602
603 SwapBuffers();
604
605 Mock::VerifyAndClearExpectations(renderer_.get());
606 Mock::VerifyAndClearExpectations(&scheduler_);
607 }
608
609 TEST_F(GLRendererWithOverlaysTest, NoValidatorNoOverlay) {
610 bool use_validator = false;
611 Init(use_validator);
612 renderer_->set_expect_overlays(false);
613 gfx::Rect viewport_rect(16, 16);
614
615 scoped_ptr<RenderPass> pass = CreateRenderPass();
616
617 pass->quad_list.push_back(
618 CreateCandidateQuad(resource_provider_.get(),
619 pass->shared_quad_state_list.back())
620 .PassAs<DrawQuad>());
621
622 pass->quad_list.push_back(CreateCheckeredQuad(
623 resource_provider_.get(), pass->shared_quad_state_list.back()));
624 pass->quad_list.push_back(CreateCheckeredQuad(
625 resource_provider_.get(), pass->shared_quad_state_list.back()));
626
627 RenderPassList pass_list;
628 pass_list.push_back(pass.Pass());
629
630 // Should see no overlays.
631 EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(3);
632 EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(0);
633 renderer_->DrawFrame(
634 &pass_list, NULL, 1.f, viewport_rect, viewport_rect, false);
635
636 SwapBuffers();
637
638 Mock::VerifyAndClearExpectations(renderer_.get());
639 Mock::VerifyAndClearExpectations(&scheduler_);
640 }
641
642 TEST_F(GLRendererWithOverlaysTest, ResourcesExportedAndReturned) {
643 bool use_validator = true;
644 Init(use_validator);
645 renderer_->set_expect_overlays(true);
646
647 ResourceProvider::ResourceId resource1 =
648 CreateResource(resource_provider_.get());
649 ResourceProvider::ResourceId resource2 =
650 CreateResource(resource_provider_.get());
651
652 DirectRenderer::DrawingFrame frame1;
653 frame1.overlay_list.resize(2);
654 OverlayCandidate& overlay1 = frame1.overlay_list.back();
655 overlay1.resource_id = resource1;
656 overlay1.plane_z_order = 1;
657
658 DirectRenderer::DrawingFrame frame2;
659 frame2.overlay_list.resize(2);
660 OverlayCandidate& overlay2 = frame2.overlay_list.back();
661 overlay2.resource_id = resource2;
662 overlay2.plane_z_order = 1;
663
664 EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(1);
665 renderer_->FinishDrawingFrame(&frame1);
666 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
667 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource2));
668 SwapBuffers();
669 Mock::VerifyAndClearExpectations(&scheduler_);
670
671 EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(1);
672 renderer_->FinishDrawingFrame(&frame2);
673 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
674 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource2));
675 SwapBuffers();
676 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1));
677 Mock::VerifyAndClearExpectations(&scheduler_);
678
679 EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(1);
680 renderer_->FinishDrawingFrame(&frame1);
681 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
682 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource2));
683 SwapBuffers();
684 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource2));
685 Mock::VerifyAndClearExpectations(&scheduler_);
686
687 // No overlays, release the resource.
688 EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(0);
689 DirectRenderer::DrawingFrame frame3;
690 renderer_->set_expect_overlays(false);
691 renderer_->FinishDrawingFrame(&frame3);
692 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
693 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource2));
694 SwapBuffers();
695 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1));
696 Mock::VerifyAndClearExpectations(&scheduler_);
697
698 // Use the same buffer twice.
699 renderer_->set_expect_overlays(true);
700 EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(1);
701 renderer_->FinishDrawingFrame(&frame1);
702 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
703 SwapBuffers();
704 Mock::VerifyAndClearExpectations(&scheduler_);
705
706 EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(1);
707 renderer_->FinishDrawingFrame(&frame1);
708 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
709 SwapBuffers();
710 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
711 Mock::VerifyAndClearExpectations(&scheduler_);
712
713 EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(0);
714 renderer_->set_expect_overlays(false);
715 renderer_->FinishDrawingFrame(&frame3);
716 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
717 SwapBuffers();
718 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1));
719 Mock::VerifyAndClearExpectations(&scheduler_);
423 } 720 }
424 721
425 } // namespace 722 } // namespace
426 } // namespace cc 723 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698