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

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

Issue 440193002: Let OverlayStrategySingleOnTop select non-topmost quad (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix tests Created 6 years, 4 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/output/overlay_strategy_single_on_top.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/gl_renderer.h"
7 #include "cc/output/output_surface.h" 7 #include "cc/output/output_surface.h"
8 #include "cc/output/output_surface_client.h" 8 #include "cc/output/output_surface_client.h"
9 #include "cc/output/overlay_candidate_validator.h" 9 #include "cc/output/overlay_candidate_validator.h"
10 #include "cc/output/overlay_processor.h" 10 #include "cc/output/overlay_processor.h"
(...skipping 10 matching lines...) Expand all
21 #include "testing/gmock/include/gmock/gmock.h" 21 #include "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
23 23
24 using testing::_; 24 using testing::_;
25 using testing::Mock; 25 using testing::Mock;
26 26
27 namespace cc { 27 namespace cc {
28 namespace { 28 namespace {
29 29
30 const gfx::Rect kOverlayRect(0, 0, 128, 128); 30 const gfx::Rect kOverlayRect(0, 0, 128, 128);
31 const gfx::Rect kOverlayTopLeftRect(0, 0, 64, 64);
32 const gfx::Rect kOverlayBottomRightRect(64, 64, 64, 64);
31 const gfx::PointF kUVTopLeft(0.1f, 0.2f); 33 const gfx::PointF kUVTopLeft(0.1f, 0.2f);
32 const gfx::PointF kUVBottomRight(1.0f, 1.0f); 34 const gfx::PointF kUVBottomRight(1.0f, 1.0f);
33 35
34 void MailboxReleased(unsigned sync_point, bool lost_resource) {} 36 void MailboxReleased(unsigned sync_point, bool lost_resource) {}
35 37
36 class SingleOverlayValidator : public OverlayCandidateValidator { 38 class SingleOverlayValidator : public OverlayCandidateValidator {
37 public: 39 public:
38 virtual void CheckOverlaySupport(OverlayCandidateList* surfaces) OVERRIDE; 40 virtual void CheckOverlaySupport(OverlayCandidateList* surfaces) OVERRIDE;
39 }; 41 };
40 42
41 void SingleOverlayValidator::CheckOverlaySupport( 43 void SingleOverlayValidator::CheckOverlaySupport(
42 OverlayCandidateList* surfaces) { 44 OverlayCandidateList* surfaces) {
43 ASSERT_EQ(2U, surfaces->size()); 45 ASSERT_EQ(2U, surfaces->size());
44 46
45 OverlayCandidate& candidate = surfaces->back(); 47 OverlayCandidate& candidate = surfaces->back();
46 EXPECT_EQ(kOverlayRect.ToString(), candidate.display_rect.ToString()); 48 if (candidate.display_rect.width() == 64)
danakj 2014/08/06 15:52:59 need {} on the if and the else, since the body is
49 EXPECT_EQ(kOverlayBottomRightRect.ToString(),
danakj 2014/08/06 15:52:59 we don't need to ToString() rects anymore, it happ
achaulk 2014/08/06 16:00:10 Done.
50 candidate.display_rect.ToString());
51 else
52 EXPECT_EQ(kOverlayRect.ToString(), candidate.display_rect.ToString());
47 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(), 53 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(),
48 candidate.uv_rect.ToString()); 54 candidate.uv_rect.ToString());
49 candidate.overlay_handled = true; 55 candidate.overlay_handled = true;
50 } 56 }
51 57
52 class SingleOverlayProcessor : public OverlayProcessor { 58 class SingleOverlayProcessor : public OverlayProcessor {
53 public: 59 public:
54 SingleOverlayProcessor(OutputSurface* surface, 60 SingleOverlayProcessor(OutputSurface* surface,
55 ResourceProvider* resource_provider); 61 ResourceProvider* resource_provider);
56 // Virtual to allow testing different strategies. 62 // Virtual to allow testing different strategies.
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 TextureMailbox mailbox = 128 TextureMailbox mailbox =
123 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); 129 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point);
124 mailbox.set_allow_overlay(true); 130 mailbox.set_allow_overlay(true);
125 scoped_ptr<SingleReleaseCallback> release_callback = 131 scoped_ptr<SingleReleaseCallback> release_callback =
126 SingleReleaseCallback::Create(base::Bind(&MailboxReleased)); 132 SingleReleaseCallback::Create(base::Bind(&MailboxReleased));
127 133
128 return resource_provider->CreateResourceFromTextureMailbox( 134 return resource_provider->CreateResourceFromTextureMailbox(
129 mailbox, release_callback.Pass()); 135 mailbox, release_callback.Pass());
130 } 136 }
131 137
132 TextureDrawQuad* CreateCandidateQuad(ResourceProvider* resource_provider, 138 TextureDrawQuad* CreateCandidateQuadAt(ResourceProvider* resource_provider,
133 const SharedQuadState* shared_quad_state, 139 const SharedQuadState* shared_quad_state,
134 RenderPass* render_pass) { 140 RenderPass* render_pass,
141 const gfx::Rect& rect) {
135 ResourceProvider::ResourceId resource_id = CreateResource(resource_provider); 142 ResourceProvider::ResourceId resource_id = CreateResource(resource_provider);
136 bool premultiplied_alpha = false; 143 bool premultiplied_alpha = false;
137 bool flipped = false; 144 bool flipped = false;
138 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; 145 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
139 146
140 TextureDrawQuad* overlay_quad = 147 TextureDrawQuad* overlay_quad =
141 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); 148 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
142 overlay_quad->SetNew(shared_quad_state, 149 overlay_quad->SetNew(shared_quad_state,
143 kOverlayRect, 150 rect,
144 kOverlayRect, 151 rect,
145 kOverlayRect, 152 rect,
146 resource_id, 153 resource_id,
147 premultiplied_alpha, 154 premultiplied_alpha,
148 kUVTopLeft, 155 kUVTopLeft,
149 kUVBottomRight, 156 kUVBottomRight,
150 SK_ColorTRANSPARENT, 157 SK_ColorTRANSPARENT,
151 vertex_opacity, 158 vertex_opacity,
152 flipped); 159 flipped);
153 160
154 return overlay_quad; 161 return overlay_quad;
155 } 162 }
156 163
164 TextureDrawQuad* CreateCandidateQuad(ResourceProvider* resource_provider,
danakj 2014/08/06 15:52:59 CreateFullscreenCandidateQuad?
165 const SharedQuadState* shared_quad_state,
166 RenderPass* render_pass) {
167 return CreateCandidateQuadAt(
168 resource_provider, shared_quad_state, render_pass, kOverlayRect);
169 }
170
171 void CreateCheckeredQuadAt(ResourceProvider* resource_provider,
172 const SharedQuadState* shared_quad_state,
173 RenderPass* render_pass,
174 const gfx::Rect& rect) {
175 CheckerboardDrawQuad* checkerboard_quad =
176 render_pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
177 checkerboard_quad->SetNew(shared_quad_state, rect, rect, SkColor());
178 }
179
157 void CreateCheckeredQuad(ResourceProvider* resource_provider, 180 void CreateCheckeredQuad(ResourceProvider* resource_provider,
danakj 2014/08/06 15:52:59 CreateFullscreenCheckeredQuad?
158 const SharedQuadState* shared_quad_state, 181 const SharedQuadState* shared_quad_state,
159 RenderPass* render_pass) { 182 RenderPass* render_pass) {
160 CheckerboardDrawQuad* checkerboard_quad = 183 CreateCheckeredQuadAt(
161 render_pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>(); 184 resource_provider, shared_quad_state, render_pass, kOverlayRect);
162 checkerboard_quad->SetNew(
163 shared_quad_state, kOverlayRect, kOverlayRect, SkColor());
164 } 185 }
165 186
166 static void CompareRenderPassLists(const RenderPassList& expected_list, 187 static void CompareRenderPassLists(const RenderPassList& expected_list,
167 const RenderPassList& actual_list) { 188 const RenderPassList& actual_list) {
168 EXPECT_EQ(expected_list.size(), actual_list.size()); 189 EXPECT_EQ(expected_list.size(), actual_list.size());
169 for (size_t i = 0; i < actual_list.size(); ++i) { 190 for (size_t i = 0; i < actual_list.size(); ++i) {
170 RenderPass* expected = expected_list[i]; 191 RenderPass* expected = expected_list[i];
171 RenderPass* actual = actual_list[i]; 192 RenderPass* actual = actual_list[i];
172 193
173 EXPECT_EQ(expected->id, actual->id); 194 EXPECT_EQ(expected->id, actual->id);
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 381
361 // Check for potential candidates. 382 // Check for potential candidates.
362 OverlayCandidateList candidate_list; 383 OverlayCandidateList candidate_list;
363 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); 384 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
364 EXPECT_EQ(2U, candidate_list.size()); 385 EXPECT_EQ(2U, candidate_list.size());
365 386
366 // This should be the same. 387 // This should be the same.
367 ASSERT_EQ(2U, pass_list.size()); 388 ASSERT_EQ(2U, pass_list.size());
368 } 389 }
369 390
370 TEST_F(SingleOverlayOnTopTest, RejectPremultipliedAlpha) {
danakj 2014/08/06 15:52:59 Where'd this go?
achaulk 2014/08/06 16:00:10 Deleted, seems to work fine on actual hardware (so
danakj 2014/08/06 16:03:34 Ok, it seems unrelated to this CL, can you do it s
371 scoped_ptr<RenderPass> pass = CreateRenderPass();
372 TextureDrawQuad* quad =
373 CreateCandidateQuad(resource_provider_.get(),
374 pass->shared_quad_state_list.back(),
375 pass.get());
376 quad->premultiplied_alpha = true;
377
378 RenderPassList pass_list;
379 pass_list.push_back(pass.Pass());
380 OverlayCandidateList candidate_list;
381 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
382 EXPECT_EQ(1U, pass_list.size());
383 EXPECT_EQ(0U, candidate_list.size());
384 }
385
386 TEST_F(SingleOverlayOnTopTest, RejectBlending) { 391 TEST_F(SingleOverlayOnTopTest, RejectBlending) {
387 scoped_ptr<RenderPass> pass = CreateRenderPass(); 392 scoped_ptr<RenderPass> pass = CreateRenderPass();
388 TextureDrawQuad* quad = 393 TextureDrawQuad* quad =
389 CreateCandidateQuad(resource_provider_.get(), 394 CreateCandidateQuad(resource_provider_.get(),
390 pass->shared_quad_state_list.back(), 395 pass->shared_quad_state_list.back(),
391 pass.get()); 396 pass.get());
392 quad->needs_blending = true; 397 quad->needs_blending = true;
393 398
394 RenderPassList pass_list; 399 RenderPassList pass_list;
395 pass_list.push_back(pass.Pass()); 400 pass_list.push_back(pass.Pass());
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); 448 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
444 ASSERT_EQ(1U, pass_list.size()); 449 ASSERT_EQ(1U, pass_list.size());
445 EXPECT_EQ(0U, candidate_list.size()); 450 EXPECT_EQ(0U, candidate_list.size());
446 } 451 }
447 452
448 TEST_F(SingleOverlayOnTopTest, RejectTransform) { 453 TEST_F(SingleOverlayOnTopTest, RejectTransform) {
449 scoped_ptr<RenderPass> pass = CreateRenderPass(); 454 scoped_ptr<RenderPass> pass = CreateRenderPass();
450 CreateCandidateQuad(resource_provider_.get(), 455 CreateCandidateQuad(resource_provider_.get(),
451 pass->shared_quad_state_list.back(), 456 pass->shared_quad_state_list.back(),
452 pass.get()); 457 pass.get());
453 pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.f, 458 pass->shared_quad_state_list.back()
454 2.f); 459 ->content_to_target_transform.RotateAboutXAxis(45.f);
danakj 2014/08/06 15:52:59 Why this change? Does scale not get rejected anymo
achaulk 2014/08/06 16:00:10 The hardware should be capable of handling basic p
danakj 2014/08/06 16:03:34 Can we do this as a separate CL so if we have prob
455 460
456 RenderPassList pass_list; 461 RenderPassList pass_list;
457 pass_list.push_back(pass.Pass()); 462 pass_list.push_back(pass.Pass());
458 OverlayCandidateList candidate_list; 463 OverlayCandidateList candidate_list;
459 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); 464 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
460 ASSERT_EQ(1U, pass_list.size()); 465 ASSERT_EQ(1U, pass_list.size());
461 EXPECT_EQ(0U, candidate_list.size()); 466 EXPECT_EQ(0U, candidate_list.size());
462 } 467 }
463 468
469 TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) {
danakj 2014/08/06 15:52:59 What if it is occluded, is that covered?
achaulk 2014/08/06 16:00:10 Covered by another test
470 scoped_ptr<RenderPass> pass = CreateRenderPass();
471 CreateCheckeredQuadAt(resource_provider_.get(),
472 pass->shared_quad_state_list.back(),
473 pass.get(),
474 kOverlayTopLeftRect);
475 CreateCandidateQuadAt(resource_provider_.get(),
476 pass->shared_quad_state_list.back(),
477 pass.get(),
478 kOverlayBottomRightRect);
479
480 RenderPassList pass_list;
481 pass_list.push_back(pass.Pass());
482
483 RenderPassList original_pass_list;
484 RenderPass::CopyAll(pass_list, &original_pass_list);
485
486 OverlayCandidateList candidate_list;
487 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
488 EXPECT_EQ(1U, pass_list.size());
489 EXPECT_EQ(2U, candidate_list.size());
490 }
491
464 class OverlayInfoRendererGL : public GLRenderer { 492 class OverlayInfoRendererGL : public GLRenderer {
465 public: 493 public:
466 OverlayInfoRendererGL(RendererClient* client, 494 OverlayInfoRendererGL(RendererClient* client,
467 const LayerTreeSettings* settings, 495 const LayerTreeSettings* settings,
468 OutputSurface* output_surface, 496 OutputSurface* output_surface,
469 ResourceProvider* resource_provider) 497 ResourceProvider* resource_provider)
470 : GLRenderer(client, 498 : GLRenderer(client,
471 settings, 499 settings,
472 output_surface, 500 output_surface,
473 resource_provider, 501 resource_provider,
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 renderer_->set_expect_overlays(false); 759 renderer_->set_expect_overlays(false);
732 renderer_->FinishDrawingFrame(&frame3); 760 renderer_->FinishDrawingFrame(&frame3);
733 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); 761 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
734 SwapBuffers(); 762 SwapBuffers();
735 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); 763 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1));
736 Mock::VerifyAndClearExpectations(&scheduler_); 764 Mock::VerifyAndClearExpectations(&scheduler_);
737 } 765 }
738 766
739 } // namespace 767 } // namespace
740 } // namespace cc 768 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/overlay_strategy_single_on_top.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698