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

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

Issue 979693005: Add underlays and split off common overlay functionality (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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
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"
11 #include "cc/output/overlay_strategy_single_on_top.h" 11 #include "cc/output/overlay_strategy_single_on_top.h"
12 #include "cc/output/overlay_strategy_underlay.h"
12 #include "cc/quads/checkerboard_draw_quad.h" 13 #include "cc/quads/checkerboard_draw_quad.h"
13 #include "cc/quads/render_pass.h" 14 #include "cc/quads/render_pass.h"
14 #include "cc/quads/stream_video_draw_quad.h" 15 #include "cc/quads/stream_video_draw_quad.h"
15 #include "cc/quads/texture_draw_quad.h" 16 #include "cc/quads/texture_draw_quad.h"
16 #include "cc/resources/resource_provider.h" 17 #include "cc/resources/resource_provider.h"
17 #include "cc/resources/texture_mailbox.h" 18 #include "cc/resources/texture_mailbox.h"
18 #include "cc/test/fake_output_surface_client.h" 19 #include "cc/test/fake_output_surface_client.h"
19 #include "cc/test/geometry_test_utils.h" 20 #include "cc/test/geometry_test_utils.h"
20 #include "cc/test/test_context_provider.h" 21 #include "cc/test/test_context_provider.h"
21 #include "cc/test/test_shared_bitmap_manager.h" 22 #include "cc/test/test_shared_bitmap_manager.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 OverlayCandidate& candidate = surfaces->back(); 62 OverlayCandidate& candidate = surfaces->back();
62 if (candidate.display_rect.width() == 64) 63 if (candidate.display_rect.width() == 64)
63 EXPECT_EQ(kOverlayBottomRightRect, candidate.display_rect); 64 EXPECT_EQ(kOverlayBottomRightRect, candidate.display_rect);
64 else 65 else
65 EXPECT_EQ(kOverlayRect, candidate.display_rect); 66 EXPECT_EQ(kOverlayRect, candidate.display_rect);
66 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(), 67 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(),
67 candidate.uv_rect.ToString()); 68 candidate.uv_rect.ToString());
68 candidate.overlay_handled = true; 69 candidate.overlay_handled = true;
69 } 70 }
70 71
72 template <typename OverlayStrategyType>
71 class SingleOverlayProcessor : public OverlayProcessor { 73 class SingleOverlayProcessor : public OverlayProcessor {
72 public: 74 public:
73 SingleOverlayProcessor(OutputSurface* surface, 75 SingleOverlayProcessor(OutputSurface* surface,
74 ResourceProvider* resource_provider); 76 ResourceProvider* resource_provider)
77 : OverlayProcessor(surface, resource_provider) {
78 EXPECT_EQ(surface, surface_);
79 EXPECT_EQ(resource_provider, resource_provider_);
80 }
81
75 // Virtual to allow testing different strategies. 82 // Virtual to allow testing different strategies.
76 void Initialize() override; 83 void Initialize() override {
84 OverlayCandidateValidator* candidates =
85 surface_->overlay_candidate_validator();
86 ASSERT_TRUE(candidates != NULL);
87 strategies_.push_back(scoped_ptr<Strategy>(
88 new OverlayStrategyType(candidates, resource_provider_)));
89 }
77 }; 90 };
78 91
79 SingleOverlayProcessor::SingleOverlayProcessor(
80 OutputSurface* surface,
81 ResourceProvider* resource_provider)
82 : OverlayProcessor(surface, resource_provider) {
83 EXPECT_EQ(surface, surface_);
84 EXPECT_EQ(resource_provider, resource_provider_);
85 }
86
87 void SingleOverlayProcessor::Initialize() {
88 OverlayCandidateValidator* candidates =
89 surface_->overlay_candidate_validator();
90 ASSERT_TRUE(candidates != NULL);
91 strategies_.push_back(scoped_ptr<Strategy>(
92 new OverlayStrategySingleOnTop(candidates, resource_provider_)));
93 }
94
95 class DefaultOverlayProcessor : public OverlayProcessor { 92 class DefaultOverlayProcessor : public OverlayProcessor {
96 public: 93 public:
97 DefaultOverlayProcessor(OutputSurface* surface, 94 DefaultOverlayProcessor(OutputSurface* surface,
98 ResourceProvider* resource_provider); 95 ResourceProvider* resource_provider);
99 size_t GetStrategyCount(); 96 size_t GetStrategyCount();
100 }; 97 };
101 98
102 DefaultOverlayProcessor::DefaultOverlayProcessor( 99 DefaultOverlayProcessor::DefaultOverlayProcessor(
103 OutputSurface* surface, 100 OutputSurface* surface,
104 ResourceProvider* resource_provider) 101 ResourceProvider* resource_provider)
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 new TestSharedBitmapManager()); 292 new TestSharedBitmapManager());
296 scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( 293 scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
297 &output_surface, shared_bitmap_manager.get(), NULL, NULL, 0, false, 1)); 294 &output_surface, shared_bitmap_manager.get(), NULL, NULL, 0, false, 1));
298 295
299 scoped_ptr<DefaultOverlayProcessor> overlay_processor( 296 scoped_ptr<DefaultOverlayProcessor> overlay_processor(
300 new DefaultOverlayProcessor(&output_surface, resource_provider.get())); 297 new DefaultOverlayProcessor(&output_surface, resource_provider.get()));
301 overlay_processor->Initialize(); 298 overlay_processor->Initialize();
302 EXPECT_GE(1U, overlay_processor->GetStrategyCount()); 299 EXPECT_GE(1U, overlay_processor->GetStrategyCount());
303 } 300 }
304 301
305 class SingleOverlayOnTopTest : public testing::Test { 302 template <typename OverlayStrategyType>
303 class OverlayTest : public testing::Test {
306 protected: 304 protected:
307 void SetUp() override { 305 void SetUp() override {
308 provider_ = TestContextProvider::Create(); 306 provider_ = TestContextProvider::Create();
309 output_surface_.reset(new OverlayOutputSurface(provider_)); 307 output_surface_.reset(new OverlayOutputSurface(provider_));
310 EXPECT_TRUE(output_surface_->BindToClient(&client_)); 308 EXPECT_TRUE(output_surface_->BindToClient(&client_));
311 output_surface_->InitWithSingleOverlayValidator(); 309 output_surface_->InitWithSingleOverlayValidator();
312 EXPECT_TRUE(output_surface_->overlay_candidate_validator() != NULL); 310 EXPECT_TRUE(output_surface_->overlay_candidate_validator() != NULL);
313 311
314 shared_bitmap_manager_.reset(new TestSharedBitmapManager()); 312 shared_bitmap_manager_.reset(new TestSharedBitmapManager());
315 resource_provider_ = ResourceProvider::Create(output_surface_.get(), 313 resource_provider_ = ResourceProvider::Create(output_surface_.get(),
316 shared_bitmap_manager_.get(), 314 shared_bitmap_manager_.get(),
317 NULL, 315 NULL,
318 NULL, 316 NULL,
319 0, 317 0,
320 false, 318 false,
321 1); 319 1);
322 320
323 overlay_processor_.reset(new SingleOverlayProcessor( 321 overlay_processor_.reset(new SingleOverlayProcessor<OverlayStrategyType>(
324 output_surface_.get(), resource_provider_.get())); 322 output_surface_.get(), resource_provider_.get()));
325 overlay_processor_->Initialize(); 323 overlay_processor_->Initialize();
326 } 324 }
327 325
328 scoped_refptr<TestContextProvider> provider_; 326 scoped_refptr<TestContextProvider> provider_;
329 scoped_ptr<OverlayOutputSurface> output_surface_; 327 scoped_ptr<OverlayOutputSurface> output_surface_;
330 FakeOutputSurfaceClient client_; 328 FakeOutputSurfaceClient client_;
331 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 329 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
332 scoped_ptr<ResourceProvider> resource_provider_; 330 scoped_ptr<ResourceProvider> resource_provider_;
333 scoped_ptr<SingleOverlayProcessor> overlay_processor_; 331 scoped_ptr<SingleOverlayProcessor<OverlayStrategyType>> overlay_processor_;
334 }; 332 };
335 333
334 typedef OverlayTest<OverlayStrategySingleOnTop> SingleOverlayOnTopTest;
335 typedef OverlayTest<OverlayStrategyUnderlay> UnderlayTest;
336
336 TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { 337 TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) {
337 scoped_ptr<RenderPass> pass = CreateRenderPass(); 338 scoped_ptr<RenderPass> pass = CreateRenderPass();
338 TextureDrawQuad* original_quad = 339 TextureDrawQuad* original_quad =
339 CreateFullscreenCandidateQuad(resource_provider_.get(), 340 CreateFullscreenCandidateQuad(resource_provider_.get(),
340 pass->shared_quad_state_list.back(), 341 pass->shared_quad_state_list.back(),
341 pass.get()); 342 pass.get());
342 unsigned original_resource_id = original_quad->resource_id; 343 unsigned original_resource_id = original_quad->resource_id;
343 344
344 // Add something behind it. 345 // Add something behind it.
345 CreateFullscreenCheckeredQuad(resource_provider_.get(), 346 CreateFullscreenCheckeredQuad(resource_provider_.get(),
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 pass.get(), kYMirrorTransform); 755 pass.get(), kYMirrorTransform);
755 756
756 RenderPassList pass_list; 757 RenderPassList pass_list;
757 pass_list.push_back(pass.Pass()); 758 pass_list.push_back(pass.Pass());
758 OverlayCandidateList candidate_list; 759 OverlayCandidateList candidate_list;
759 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); 760 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
760 ASSERT_EQ(1U, pass_list.size()); 761 ASSERT_EQ(1U, pass_list.size());
761 EXPECT_EQ(2U, candidate_list.size()); 762 EXPECT_EQ(2U, candidate_list.size());
762 } 763 }
763 764
765 TEST_F(UnderlayTest, OverlayLayerUnderMainLayer) {
766 scoped_ptr<RenderPass> pass = CreateRenderPass();
767 SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
768 shared_state->opacity = 0.5f;
769 CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(),
770 kOverlayBottomRightRect);
771 shared_state = pass->CreateAndAppendSharedQuadState();
772 shared_state->opacity = 1.f;
773 CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(),
774 kOverlayBottomRightRect);
775
776 RenderPassList pass_list;
777 pass_list.push_back(pass.Pass());
778
779 OverlayCandidateList candidate_list;
780 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
781 EXPECT_EQ(1U, pass_list.size());
782 ASSERT_EQ(2U, candidate_list.size());
783 EXPECT_EQ(0, candidate_list[0].plane_z_order);
784 EXPECT_EQ(-1, candidate_list[1].plane_z_order);
785 // The overlay quad should have changed to a SOLID_COLOR quad.
786 EXPECT_EQ(pass_list[0]->quad_list.back()->material, DrawQuad::SOLID_COLOR);
danakj 2015/03/18 21:30:14 What if you just removed that quad, you'd still pa
achaulk 2015/03/23 19:16:03 Oh right, didn't notice the other quad was also so
787 }
788
789 TEST_F(UnderlayTest, AllowOnTop) {
790 scoped_ptr<RenderPass> pass = CreateRenderPass();
791 CreateFullscreenCandidateQuad(resource_provider_.get(),
792 pass->shared_quad_state_list.back(),
793 pass.get());
794 CreateFullscreenCheckeredQuad(resource_provider_.get(),
danakj 2015/03/18 21:30:14 Can you use a non-opaque quad on top?
achaulk 2015/03/23 19:16:03 Done.
795 pass->shared_quad_state_list.back(),
796 pass.get());
797
798 RenderPassList pass_list;
799 pass_list.push_back(pass.Pass());
800
801 OverlayCandidateList candidate_list;
802 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
803 EXPECT_EQ(1U, pass_list.size());
804 ASSERT_EQ(2U, candidate_list.size());
805 EXPECT_EQ(0, candidate_list[0].plane_z_order);
806 EXPECT_EQ(-1, candidate_list[1].plane_z_order);
807 // The overlay quad should have changed to a SOLID_COLOR quad.
808 EXPECT_EQ(pass_list[0]->quad_list.front()->material, DrawQuad::SOLID_COLOR);
809 }
810
764 class OverlayInfoRendererGL : public GLRenderer { 811 class OverlayInfoRendererGL : public GLRenderer {
765 public: 812 public:
766 OverlayInfoRendererGL(RendererClient* client, 813 OverlayInfoRendererGL(RendererClient* client,
767 const RendererSettings* settings, 814 const RendererSettings* settings,
768 OutputSurface* output_surface, 815 OutputSurface* output_surface,
769 ResourceProvider* resource_provider) 816 ResourceProvider* resource_provider)
770 : GLRenderer(client, 817 : GLRenderer(client,
771 settings, 818 settings,
772 output_surface, 819 output_surface,
773 resource_provider, 820 resource_provider,
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
1048 renderer_->BeginDrawingFrame(&frame3); 1095 renderer_->BeginDrawingFrame(&frame3);
1049 renderer_->FinishDrawingFrame(&frame3); 1096 renderer_->FinishDrawingFrame(&frame3);
1050 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); 1097 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
1051 SwapBuffers(); 1098 SwapBuffers();
1052 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); 1099 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1));
1053 Mock::VerifyAndClearExpectations(&scheduler_); 1100 Mock::VerifyAndClearExpectations(&scheduler_);
1054 } 1101 }
1055 1102
1056 } // namespace 1103 } // namespace
1057 } // namespace cc 1104 } // namespace cc
OLDNEW
« cc/output/overlay_strategy_underlay.cc ('K') | « cc/output/overlay_strategy_underlay.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698