| 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/output/compositor_frame.h" | 5 #include "cc/output/compositor_frame.h" |
| 6 #include "cc/output/delegated_frame_data.h" | 6 #include "cc/output/delegated_frame_data.h" |
| 7 #include "cc/quads/render_pass.h" | 7 #include "cc/quads/render_pass.h" |
| 8 #include "cc/quads/render_pass_draw_quad.h" | 8 #include "cc/quads/render_pass_draw_quad.h" |
| 9 #include "cc/quads/solid_color_draw_quad.h" | 9 #include "cc/quads/solid_color_draw_quad.h" |
| 10 #include "cc/quads/surface_draw_quad.h" | 10 #include "cc/quads/surface_draw_quad.h" |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); | 194 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); |
| 195 | 195 |
| 196 factory_.Destroy(embedded_surface_id); | 196 factory_.Destroy(embedded_surface_id); |
| 197 } | 197 } |
| 198 | 198 |
| 199 // This tests referencing a surface that has multiple render passes. | 199 // This tests referencing a surface that has multiple render passes. |
| 200 TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSurfaceReference) { | 200 TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSurfaceReference) { |
| 201 SurfaceId embedded_surface_id = allocator_.GenerateId(); | 201 SurfaceId embedded_surface_id = allocator_.GenerateId(); |
| 202 factory_.Create(embedded_surface_id, SurfaceSize()); | 202 factory_.Create(embedded_surface_id, SurfaceSize()); |
| 203 | 203 |
| 204 RenderPass::Id pass_ids[] = {RenderPass::Id(1, 1), RenderPass::Id(1, 2), | 204 RenderPassId pass_ids[] = {RenderPassId(1, 1), RenderPassId(1, 2), |
| 205 RenderPass::Id(1, 3)}; | 205 RenderPassId(1, 3)}; |
| 206 | 206 |
| 207 test::Quad embedded_quads[][2] = { | 207 test::Quad embedded_quads[][2] = { |
| 208 {test::Quad::SolidColorQuad(1), test::Quad::SolidColorQuad(2)}, | 208 {test::Quad::SolidColorQuad(1), test::Quad::SolidColorQuad(2)}, |
| 209 {test::Quad::SolidColorQuad(3), test::Quad::RenderPassQuad(pass_ids[0])}, | 209 {test::Quad::SolidColorQuad(3), test::Quad::RenderPassQuad(pass_ids[0])}, |
| 210 {test::Quad::SolidColorQuad(4), test::Quad::RenderPassQuad(pass_ids[1])}}; | 210 {test::Quad::SolidColorQuad(4), test::Quad::RenderPassQuad(pass_ids[1])}}; |
| 211 test::Pass embedded_passes[] = { | 211 test::Pass embedded_passes[] = { |
| 212 test::Pass(embedded_quads[0], arraysize(embedded_quads[0]), pass_ids[0]), | 212 test::Pass(embedded_quads[0], arraysize(embedded_quads[0]), pass_ids[0]), |
| 213 test::Pass(embedded_quads[1], arraysize(embedded_quads[1]), pass_ids[1]), | 213 test::Pass(embedded_quads[1], arraysize(embedded_quads[1]), pass_ids[1]), |
| 214 test::Pass(embedded_quads[2], arraysize(embedded_quads[2]), pass_ids[2])}; | 214 test::Pass(embedded_quads[2], arraysize(embedded_quads[2]), pass_ids[2])}; |
| 215 | 215 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 232 aggregator_.Aggregate(root_surface_id_, &surface_set); | 232 aggregator_.Aggregate(root_surface_id_, &surface_set); |
| 233 | 233 |
| 234 ASSERT_TRUE(aggregated_frame); | 234 ASSERT_TRUE(aggregated_frame); |
| 235 ASSERT_TRUE(aggregated_frame->delegated_frame_data); | 235 ASSERT_TRUE(aggregated_frame->delegated_frame_data); |
| 236 | 236 |
| 237 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); | 237 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); |
| 238 | 238 |
| 239 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; | 239 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; |
| 240 | 240 |
| 241 ASSERT_EQ(5u, aggregated_pass_list.size()); | 241 ASSERT_EQ(5u, aggregated_pass_list.size()); |
| 242 RenderPass::Id actual_pass_ids[] = { | 242 RenderPassId actual_pass_ids[] = { |
| 243 aggregated_pass_list[0]->id, aggregated_pass_list[1]->id, | 243 aggregated_pass_list[0]->id, aggregated_pass_list[1]->id, |
| 244 aggregated_pass_list[2]->id, aggregated_pass_list[3]->id, | 244 aggregated_pass_list[2]->id, aggregated_pass_list[3]->id, |
| 245 aggregated_pass_list[4]->id}; | 245 aggregated_pass_list[4]->id}; |
| 246 for (size_t i = 0; i < 5; ++i) { | 246 for (size_t i = 0; i < 5; ++i) { |
| 247 for (size_t j = 0; j < i; ++j) { | 247 for (size_t j = 0; j < i; ++j) { |
| 248 EXPECT_NE(actual_pass_ids[i], actual_pass_ids[j]); | 248 EXPECT_NE(actual_pass_ids[i], actual_pass_ids[j]); |
| 249 } | 249 } |
| 250 } | 250 } |
| 251 | 251 |
| 252 { | 252 { |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); | 425 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); |
| 426 factory_.Destroy(child_surface_id); | 426 factory_.Destroy(child_surface_id); |
| 427 } | 427 } |
| 428 | 428 |
| 429 // Tests that we map render pass IDs from different surfaces into a unified | 429 // Tests that we map render pass IDs from different surfaces into a unified |
| 430 // namespace and update RenderPassDrawQuad's id references to match. | 430 // namespace and update RenderPassDrawQuad's id references to match. |
| 431 TEST_F(SurfaceAggregatorValidSurfaceTest, RenderPassIdMapping) { | 431 TEST_F(SurfaceAggregatorValidSurfaceTest, RenderPassIdMapping) { |
| 432 SurfaceId child_surface_id = allocator_.GenerateId(); | 432 SurfaceId child_surface_id = allocator_.GenerateId(); |
| 433 factory_.Create(child_surface_id, SurfaceSize()); | 433 factory_.Create(child_surface_id, SurfaceSize()); |
| 434 | 434 |
| 435 RenderPass::Id child_pass_id[] = {RenderPass::Id(1, 1), RenderPass::Id(1, 2)}; | 435 RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)}; |
| 436 test::Quad child_quad[][1] = {{test::Quad::SolidColorQuad(SK_ColorGREEN)}, | 436 test::Quad child_quad[][1] = {{test::Quad::SolidColorQuad(SK_ColorGREEN)}, |
| 437 {test::Quad::RenderPassQuad(child_pass_id[0])}}; | 437 {test::Quad::RenderPassQuad(child_pass_id[0])}}; |
| 438 test::Pass surface_passes[] = { | 438 test::Pass surface_passes[] = { |
| 439 test::Pass(child_quad[0], arraysize(child_quad[0]), child_pass_id[0]), | 439 test::Pass(child_quad[0], arraysize(child_quad[0]), child_pass_id[0]), |
| 440 test::Pass(child_quad[1], arraysize(child_quad[1]), child_pass_id[1])}; | 440 test::Pass(child_quad[1], arraysize(child_quad[1]), child_pass_id[1])}; |
| 441 | 441 |
| 442 SubmitFrame(surface_passes, arraysize(surface_passes), child_surface_id); | 442 SubmitFrame(surface_passes, arraysize(surface_passes), child_surface_id); |
| 443 | 443 |
| 444 // Pass IDs from the parent surface may collide with ones from the child. | 444 // Pass IDs from the parent surface may collide with ones from the child. |
| 445 RenderPass::Id parent_pass_id[] = {RenderPass::Id(2, 1), | 445 RenderPassId parent_pass_id[] = {RenderPassId(2, 1), RenderPassId(1, 2)}; |
| 446 RenderPass::Id(1, 2)}; | |
| 447 test::Quad parent_quad[][1] = { | 446 test::Quad parent_quad[][1] = { |
| 448 {test::Quad::SurfaceQuad(child_surface_id)}, | 447 {test::Quad::SurfaceQuad(child_surface_id)}, |
| 449 {test::Quad::RenderPassQuad(parent_pass_id[0])}}; | 448 {test::Quad::RenderPassQuad(parent_pass_id[0])}}; |
| 450 test::Pass parent_passes[] = { | 449 test::Pass parent_passes[] = { |
| 451 test::Pass(parent_quad[0], arraysize(parent_quad[0]), parent_pass_id[0]), | 450 test::Pass(parent_quad[0], arraysize(parent_quad[0]), parent_pass_id[0]), |
| 452 test::Pass(parent_quad[1], arraysize(parent_quad[1]), parent_pass_id[1])}; | 451 test::Pass(parent_quad[1], arraysize(parent_quad[1]), parent_pass_id[1])}; |
| 453 | 452 |
| 454 SubmitFrame(parent_passes, arraysize(parent_passes), root_surface_id_); | 453 SubmitFrame(parent_passes, arraysize(parent_passes), root_surface_id_); |
| 455 std::set<SurfaceId> surface_set; | 454 std::set<SurfaceId> surface_set; |
| 456 scoped_ptr<CompositorFrame> aggregated_frame = | 455 scoped_ptr<CompositorFrame> aggregated_frame = |
| 457 aggregator_.Aggregate(root_surface_id_, &surface_set); | 456 aggregator_.Aggregate(root_surface_id_, &surface_set); |
| 458 | 457 |
| 459 ASSERT_TRUE(aggregated_frame); | 458 ASSERT_TRUE(aggregated_frame); |
| 460 ASSERT_TRUE(aggregated_frame->delegated_frame_data); | 459 ASSERT_TRUE(aggregated_frame->delegated_frame_data); |
| 461 | 460 |
| 462 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); | 461 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); |
| 463 | 462 |
| 464 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; | 463 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; |
| 465 | 464 |
| 466 ASSERT_EQ(3u, aggregated_pass_list.size()); | 465 ASSERT_EQ(3u, aggregated_pass_list.size()); |
| 467 RenderPass::Id actual_pass_ids[] = {aggregated_pass_list[0]->id, | 466 RenderPassId actual_pass_ids[] = {aggregated_pass_list[0]->id, |
| 468 aggregated_pass_list[1]->id, | 467 aggregated_pass_list[1]->id, |
| 469 aggregated_pass_list[2]->id}; | 468 aggregated_pass_list[2]->id}; |
| 470 // Make sure the aggregated frame's pass IDs are all unique. | 469 // Make sure the aggregated frame's pass IDs are all unique. |
| 471 for (size_t i = 0; i < 3; ++i) { | 470 for (size_t i = 0; i < 3; ++i) { |
| 472 for (size_t j = 0; j < i; ++j) { | 471 for (size_t j = 0; j < i; ++j) { |
| 473 EXPECT_NE(actual_pass_ids[j], actual_pass_ids[i]) << "pass ids " << i | 472 EXPECT_NE(actual_pass_ids[j], actual_pass_ids[i]) << "pass ids " << i |
| 474 << " and " << j; | 473 << " and " << j; |
| 475 } | 474 } |
| 476 } | 475 } |
| 477 | 476 |
| 478 // Make sure the render pass quads reference the remapped pass IDs. | 477 // Make sure the render pass quads reference the remapped pass IDs. |
| 479 DrawQuad* render_pass_quads[] = {aggregated_pass_list[1]->quad_list[0], | 478 DrawQuad* render_pass_quads[] = {aggregated_pass_list[1]->quad_list[0], |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateSharedQuadStateProperties) { | 550 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateSharedQuadStateProperties) { |
| 552 const SkXfermode::Mode blend_modes[] = {SkXfermode::kClear_Mode, // 0 | 551 const SkXfermode::Mode blend_modes[] = {SkXfermode::kClear_Mode, // 0 |
| 553 SkXfermode::kSrc_Mode, // 1 | 552 SkXfermode::kSrc_Mode, // 1 |
| 554 SkXfermode::kDst_Mode, // 2 | 553 SkXfermode::kDst_Mode, // 2 |
| 555 SkXfermode::kSrcOver_Mode, // 3 | 554 SkXfermode::kSrcOver_Mode, // 3 |
| 556 SkXfermode::kDstOver_Mode, // 4 | 555 SkXfermode::kDstOver_Mode, // 4 |
| 557 SkXfermode::kSrcIn_Mode, // 5 | 556 SkXfermode::kSrcIn_Mode, // 5 |
| 558 SkXfermode::kDstIn_Mode, // 6 | 557 SkXfermode::kDstIn_Mode, // 6 |
| 559 }; | 558 }; |
| 560 | 559 |
| 561 RenderPass::Id pass_id(1, 1); | 560 RenderPassId pass_id(1, 1); |
| 562 SurfaceId grandchild_surface_id = allocator_.GenerateId(); | 561 SurfaceId grandchild_surface_id = allocator_.GenerateId(); |
| 563 factory_.Create(grandchild_surface_id, SurfaceSize()); | 562 factory_.Create(grandchild_surface_id, SurfaceSize()); |
| 564 scoped_ptr<RenderPass> grandchild_pass = RenderPass::Create(); | 563 scoped_ptr<RenderPass> grandchild_pass = RenderPass::Create(); |
| 565 gfx::Rect output_rect(SurfaceSize()); | 564 gfx::Rect output_rect(SurfaceSize()); |
| 566 gfx::Rect damage_rect(SurfaceSize()); | 565 gfx::Rect damage_rect(SurfaceSize()); |
| 567 gfx::Transform transform_to_root_target; | 566 gfx::Transform transform_to_root_target; |
| 568 grandchild_pass->SetNew( | 567 grandchild_pass->SetNew( |
| 569 pass_id, output_rect, damage_rect, transform_to_root_target); | 568 pass_id, output_rect, damage_rect, transform_to_root_target); |
| 570 AddSolidColorQuadWithBlendMode( | 569 AddSolidColorQuadWithBlendMode( |
| 571 SurfaceSize(), grandchild_pass.get(), blend_modes[2]); | 570 SurfaceSize(), grandchild_pass.get(), blend_modes[2]); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 // of +5 in the x direction. The second pass has a reference to the first pass' | 660 // of +5 in the x direction. The second pass has a reference to the first pass' |
| 662 // pass id and a transform of +8 in the x direction. | 661 // pass id and a transform of +8 in the x direction. |
| 663 // | 662 // |
| 664 // After aggregation, the child surface's root pass quad should have both | 663 // After aggregation, the child surface's root pass quad should have both |
| 665 // transforms concatenated for a total transform of +8 x, +10 y. The | 664 // transforms concatenated for a total transform of +8 x, +10 y. The |
| 666 // contributing render pass' transform in the aggregate frame should not be | 665 // contributing render pass' transform in the aggregate frame should not be |
| 667 // affected. | 666 // affected. |
| 668 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateMultiplePassWithTransform) { | 667 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateMultiplePassWithTransform) { |
| 669 SurfaceId child_surface_id = allocator_.GenerateId(); | 668 SurfaceId child_surface_id = allocator_.GenerateId(); |
| 670 factory_.Create(child_surface_id, SurfaceSize()); | 669 factory_.Create(child_surface_id, SurfaceSize()); |
| 671 RenderPass::Id child_pass_id[] = {RenderPass::Id(1, 1), RenderPass::Id(1, 2)}; | 670 RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)}; |
| 672 test::Quad child_quads[][1] = { | 671 test::Quad child_quads[][1] = { |
| 673 {test::Quad::SolidColorQuad(SK_ColorGREEN)}, | 672 {test::Quad::SolidColorQuad(SK_ColorGREEN)}, |
| 674 {test::Quad::RenderPassQuad(child_pass_id[0])}}; | 673 {test::Quad::RenderPassQuad(child_pass_id[0])}}; |
| 675 test::Pass child_passes[] = { | 674 test::Pass child_passes[] = { |
| 676 test::Pass(child_quads[0], arraysize(child_quads[0]), child_pass_id[0]), | 675 test::Pass(child_quads[0], arraysize(child_quads[0]), child_pass_id[0]), |
| 677 test::Pass(child_quads[1], arraysize(child_quads[1]), child_pass_id[1])}; | 676 test::Pass(child_quads[1], arraysize(child_quads[1]), child_pass_id[1])}; |
| 678 | 677 |
| 679 RenderPassList child_pass_list; | 678 RenderPassList child_pass_list; |
| 680 AddPasses(&child_pass_list, | 679 AddPasses(&child_pass_list, |
| 681 gfx::Rect(SurfaceSize()), | 680 gfx::Rect(SurfaceSize()), |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 845 | 844 |
| 846 DISALLOW_COPY_AND_ASSIGN(ResourceTrackingSurfaceFactoryClient); | 845 DISALLOW_COPY_AND_ASSIGN(ResourceTrackingSurfaceFactoryClient); |
| 847 }; | 846 }; |
| 848 | 847 |
| 849 void SubmitFrameWithResources(ResourceProvider::ResourceId* resource_ids, | 848 void SubmitFrameWithResources(ResourceProvider::ResourceId* resource_ids, |
| 850 size_t num_resource_ids, | 849 size_t num_resource_ids, |
| 851 SurfaceFactory* factory, | 850 SurfaceFactory* factory, |
| 852 SurfaceId surface_id) { | 851 SurfaceId surface_id) { |
| 853 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | 852 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
| 854 scoped_ptr<RenderPass> pass = RenderPass::Create(); | 853 scoped_ptr<RenderPass> pass = RenderPass::Create(); |
| 855 pass->id = RenderPass::Id(1, 1); | 854 pass->id = RenderPassId(1, 1); |
| 856 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); | 855 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); |
| 857 for (size_t i = 0u; i < num_resource_ids; ++i) { | 856 for (size_t i = 0u; i < num_resource_ids; ++i) { |
| 858 TransferableResource resource; | 857 TransferableResource resource; |
| 859 resource.id = resource_ids[i]; | 858 resource.id = resource_ids[i]; |
| 860 resource.is_software = true; | 859 resource.is_software = true; |
| 861 frame_data->resource_list.push_back(resource); | 860 frame_data->resource_list.push_back(resource); |
| 862 TextureDrawQuad* quad = pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 861 TextureDrawQuad* quad = pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
| 863 const gfx::Rect rect; | 862 const gfx::Rect rect; |
| 864 const gfx::Rect opaque_rect; | 863 const gfx::Rect opaque_rect; |
| 865 const gfx::Rect visible_rect; | 864 const gfx::Rect visible_rect; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 918 returned_ids[i] = client.returned_resources()[i].id; | 917 returned_ids[i] = client.returned_resources()[i].id; |
| 919 } | 918 } |
| 920 EXPECT_THAT(returned_ids, | 919 EXPECT_THAT(returned_ids, |
| 921 testing::WhenSorted(testing::ElementsAreArray(ids))); | 920 testing::WhenSorted(testing::ElementsAreArray(ids))); |
| 922 factory.Destroy(surface_id); | 921 factory.Destroy(surface_id); |
| 923 } | 922 } |
| 924 | 923 |
| 925 } // namespace | 924 } // namespace |
| 926 } // namespace cc | 925 } // namespace cc |
| 927 | 926 |
| OLD | NEW |