| OLD | NEW | 
|     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/region.h" | 
|     5 #include "cc/base/scoped_ptr_vector.h" |     6 #include "cc/base/scoped_ptr_vector.h" | 
|     6 #include "cc/output/compositor_frame_metadata.h" |     7 #include "cc/output/compositor_frame_metadata.h" | 
|     7 #include "cc/output/gl_renderer.h" |     8 #include "cc/output/gl_renderer.h" | 
|     8 #include "cc/output/output_surface.h" |     9 #include "cc/output/output_surface.h" | 
|     9 #include "cc/output/output_surface_client.h" |    10 #include "cc/output/output_surface_client.h" | 
|    10 #include "cc/output/overlay_candidate_validator.h" |    11 #include "cc/output/overlay_candidate_validator.h" | 
|    11 #include "cc/output/overlay_processor.h" |    12 #include "cc/output/overlay_processor.h" | 
|    12 #include "cc/output/overlay_strategy_sandwich.h" |    13 #include "cc/output/overlay_strategy_sandwich.h" | 
|    13 #include "cc/output/overlay_strategy_single_on_top.h" |    14 #include "cc/output/overlay_strategy_single_on_top.h" | 
|    14 #include "cc/output/overlay_strategy_underlay.h" |    15 #include "cc/output/overlay_strategy_underlay.h" | 
|    15 #include "cc/quads/render_pass.h" |    16 #include "cc/quads/render_pass.h" | 
|    16 #include "cc/quads/solid_color_draw_quad.h" |    17 #include "cc/quads/solid_color_draw_quad.h" | 
|    17 #include "cc/quads/stream_video_draw_quad.h" |    18 #include "cc/quads/stream_video_draw_quad.h" | 
|    18 #include "cc/quads/texture_draw_quad.h" |    19 #include "cc/quads/texture_draw_quad.h" | 
|    19 #include "cc/resources/resource_provider.h" |    20 #include "cc/resources/resource_provider.h" | 
|    20 #include "cc/resources/texture_mailbox.h" |    21 #include "cc/resources/texture_mailbox.h" | 
|    21 #include "cc/test/fake_output_surface_client.h" |    22 #include "cc/test/fake_output_surface_client.h" | 
|    22 #include "cc/test/fake_resource_provider.h" |    23 #include "cc/test/fake_resource_provider.h" | 
|    23 #include "cc/test/geometry_test_utils.h" |    24 #include "cc/test/geometry_test_utils.h" | 
|    24 #include "cc/test/test_context_provider.h" |    25 #include "cc/test/test_context_provider.h" | 
|    25 #include "cc/test/test_shared_bitmap_manager.h" |    26 #include "cc/test/test_shared_bitmap_manager.h" | 
|    26 #include "testing/gmock/include/gmock/gmock.h" |    27 #include "testing/gmock/include/gmock/gmock.h" | 
|    27 #include "testing/gtest/include/gtest/gtest.h" |    28 #include "testing/gtest/include/gtest/gtest.h" | 
 |    29 #include "ui/gfx/geometry/rect_conversions.h" | 
|    28  |    30  | 
|    29 using testing::_; |    31 using testing::_; | 
|    30 using testing::Mock; |    32 using testing::Mock; | 
|    31  |    33  | 
|    32 namespace cc { |    34 namespace cc { | 
|    33 namespace { |    35 namespace { | 
|    34  |    36  | 
|    35 const gfx::Size kDisplaySize(256, 256); |    37 const gfx::Size kDisplaySize(256, 256); | 
|    36 const gfx::Rect kOverlayRect(0, 0, 128, 128); |    38 const gfx::Rect kOverlayRect(0, 0, 128, 128); | 
|    37 const gfx::Rect kOverlayTopLeftRect(0, 0, 64, 64); |    39 const gfx::Rect kOverlayTopLeftRect(0, 0, 64, 64); | 
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   535   RenderPassList pass_list; |   537   RenderPassList pass_list; | 
|   536   pass_list.push_back(pass.Pass()); |   538   pass_list.push_back(pass.Pass()); | 
|   537  |   539  | 
|   538   OverlayCandidateList candidate_list; |   540   OverlayCandidateList candidate_list; | 
|   539   overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |   541   overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 
|   540  |   542  | 
|   541   ASSERT_EQ(1U, pass_list.size()); |   543   ASSERT_EQ(1U, pass_list.size()); | 
|   542   ASSERT_EQ(0U, candidate_list.size()); |   544   ASSERT_EQ(0U, candidate_list.size()); | 
|   543 } |   545 } | 
|   544  |   546  | 
 |   547 TEST_F(SandwichTest, MultiQuadOverlay) { | 
 |   548   scoped_ptr<RenderPass> pass = CreateRenderPass(); | 
 |   549  | 
 |   550   // Put two non-intersecting quads on top. | 
 |   551   const gfx::Rect rect1(gfx::Rect(0, 0, 32, 32)); | 
 |   552   const gfx::Rect rect2(gfx::Rect(32, 32, 32, 32)); | 
 |   553   Region covered_region; | 
 |   554   covered_region.Union(rect1); | 
 |   555   covered_region.Union(rect2); | 
 |   556   CreateOpaqueQuadAt(resource_provider_.get(), | 
 |   557                      pass->shared_quad_state_list.back(), pass.get(), rect1); | 
 |   558   CreateOpaqueQuadAt(resource_provider_.get(), | 
 |   559                      pass->shared_quad_state_list.back(), pass.get(), rect2); | 
 |   560  | 
 |   561   // Then a candidate that we'll turn into an overlay. | 
 |   562   unsigned candidate_id = | 
 |   563       CreateCandidateQuadAt(resource_provider_.get(), | 
 |   564                             pass->shared_quad_state_list.back(), pass.get(), | 
 |   565                             gfx::Rect(0, 0, 64, 64)) | 
 |   566           ->resource_id(); | 
 |   567  | 
 |   568   // Then some opaque background. | 
 |   569   CreateOpaqueQuadAt(resource_provider_.get(), | 
 |   570                      pass->shared_quad_state_list.back(), pass.get(), | 
 |   571                      gfx::Rect(kDisplaySize)); | 
 |   572  | 
 |   573   RenderPassList pass_list; | 
 |   574   pass_list.push_back(pass.Pass()); | 
 |   575  | 
 |   576   // Run the overlay strategy on that input. | 
 |   577   RenderPass* main_pass = pass_list.back(); | 
 |   578   OverlayCandidateList candidate_list; | 
 |   579   EXPECT_EQ(4U, main_pass->quad_list.size()); | 
 |   580   overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 
 |   581   ASSERT_EQ(1U, pass_list.size()); | 
 |   582   ASSERT_EQ(4U, candidate_list.size()); | 
 |   583  | 
 |   584   // Check that the candidate quad is gone and that we now have two transparent | 
 |   585   // quads for the same region that was covered on the overlay. | 
 |   586   EXPECT_EQ(5U, main_pass->quad_list.size()); | 
 |   587   const QuadList& quad_list = main_pass->quad_list; | 
 |   588   Region transparent_quad_region; | 
 |   589   for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin(); | 
 |   590        it != quad_list.BackToFrontEnd(); ++it) { | 
 |   591     EXPECT_NE(DrawQuad::TEXTURE_CONTENT, it->material); | 
 |   592     if (it->material == DrawQuad::SOLID_COLOR) { | 
 |   593       const SolidColorDrawQuad* solid_color_quad = | 
 |   594           SolidColorDrawQuad::MaterialCast(*it); | 
 |   595       if (solid_color_quad->color == SK_ColorTRANSPARENT) | 
 |   596         transparent_quad_region.Union(solid_color_quad->rect); | 
 |   597     } | 
 |   598   } | 
 |   599   DCHECK(covered_region == transparent_quad_region); | 
 |   600  | 
 |   601   // Check that overlays cover the same region that the quads covered. | 
 |   602   EXPECT_FALSE(candidate_list[0].use_output_surface_for_resource); | 
 |   603   EXPECT_EQ(candidate_id, candidate_list[1].resource_id); | 
 |   604   EXPECT_EQ(gfx::Rect(0, 0, 64, 64), candidate_list[1].display_rect); | 
 |   605   EXPECT_TRUE(candidate_list[2].use_output_surface_for_resource); | 
 |   606   EXPECT_TRUE(candidate_list[3].use_output_surface_for_resource); | 
 |   607   Region overlay_region; | 
 |   608   overlay_region.Union(gfx::ToEnclosingRect(candidate_list[2].display_rect)); | 
 |   609   overlay_region.Union(gfx::ToEnclosingRect(candidate_list[3].display_rect)); | 
 |   610   DCHECK(covered_region == overlay_region); | 
 |   611 } | 
 |   612  | 
|   545 TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { |   613 TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { | 
|   546   scoped_ptr<RenderPass> pass = CreateRenderPass(); |   614   scoped_ptr<RenderPass> pass = CreateRenderPass(); | 
|   547   TextureDrawQuad* original_quad = |   615   TextureDrawQuad* original_quad = | 
|   548       CreateFullscreenCandidateQuad(resource_provider_.get(), |   616       CreateFullscreenCandidateQuad(resource_provider_.get(), | 
|   549                                     pass->shared_quad_state_list.back(), |   617                                     pass->shared_quad_state_list.back(), | 
|   550                                     pass.get()); |   618                                     pass.get()); | 
|   551   unsigned original_resource_id = original_quad->resource_id(); |   619   unsigned original_resource_id = original_quad->resource_id(); | 
|   552  |   620  | 
|   553   // Add something behind it. |   621   // Add something behind it. | 
|   554   CreateFullscreenOpaqueQuad(resource_provider_.get(), |   622   CreateFullscreenOpaqueQuad(resource_provider_.get(), | 
| (...skipping 810 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1365   renderer_->BeginDrawingFrame(&frame3); |  1433   renderer_->BeginDrawingFrame(&frame3); | 
|  1366   renderer_->FinishDrawingFrame(&frame3); |  1434   renderer_->FinishDrawingFrame(&frame3); | 
|  1367   EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); |  1435   EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); | 
|  1368   SwapBuffers(); |  1436   SwapBuffers(); | 
|  1369   EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); |  1437   EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); | 
|  1370   Mock::VerifyAndClearExpectations(&scheduler_); |  1438   Mock::VerifyAndClearExpectations(&scheduler_); | 
|  1371 } |  1439 } | 
|  1372  |  1440  | 
|  1373 }  // namespace |  1441 }  // namespace | 
|  1374 }  // namespace cc |  1442 }  // namespace cc | 
| OLD | NEW |