| 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 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 // quad embedded into the root surface's second pass. | 262 // quad embedded into the root surface's second pass. |
| 263 // First, there's the first embedded pass which doesn't reference anything | 263 // First, there's the first embedded pass which doesn't reference anything |
| 264 // else. | 264 // else. |
| 265 TestPassMatchesExpectations(embedded_passes[0], aggregated_pass_list[1]); | 265 TestPassMatchesExpectations(embedded_passes[0], aggregated_pass_list[1]); |
| 266 } | 266 } |
| 267 | 267 |
| 268 { | 268 { |
| 269 SCOPED_TRACE("Third pass"); | 269 SCOPED_TRACE("Third pass"); |
| 270 const QuadList& third_pass_quad_list = aggregated_pass_list[2]->quad_list; | 270 const QuadList& third_pass_quad_list = aggregated_pass_list[2]->quad_list; |
| 271 ASSERT_EQ(2u, third_pass_quad_list.size()); | 271 ASSERT_EQ(2u, third_pass_quad_list.size()); |
| 272 TestQuadMatchesExpectations(embedded_quads[1][0], | 272 QuadList::ConstIterator iter = third_pass_quad_list.begin(); |
| 273 third_pass_quad_list.at(0u)); | 273 TestQuadMatchesExpectations(embedded_quads[1][0], &*iter); |
| 274 | 274 |
| 275 // This render pass pass quad will reference the first pass from the | 275 // This render pass pass quad will reference the first pass from the |
| 276 // embedded surface, which is the second pass in the aggregated frame. | 276 // embedded surface, which is the second pass in the aggregated frame. |
| 277 ASSERT_EQ(DrawQuad::RENDER_PASS, third_pass_quad_list.at(1u)->material); | 277 ++iter; |
| 278 ASSERT_EQ(DrawQuad::RENDER_PASS, iter->material); |
| 278 const RenderPassDrawQuad* third_pass_render_pass_draw_quad = | 279 const RenderPassDrawQuad* third_pass_render_pass_draw_quad = |
| 279 RenderPassDrawQuad::MaterialCast(third_pass_quad_list.at(1u)); | 280 RenderPassDrawQuad::MaterialCast(&*iter); |
| 280 EXPECT_EQ(actual_pass_ids[1], | 281 EXPECT_EQ(actual_pass_ids[1], |
| 281 third_pass_render_pass_draw_quad->render_pass_id); | 282 third_pass_render_pass_draw_quad->render_pass_id); |
| 282 } | 283 } |
| 283 | 284 |
| 284 { | 285 { |
| 285 SCOPED_TRACE("Fourth pass"); | 286 SCOPED_TRACE("Fourth pass"); |
| 286 // The fourth pass will have aggregated quads from the root surface's second | 287 // The fourth pass will have aggregated quads from the root surface's second |
| 287 // pass and the embedded surface's first pass. | 288 // pass and the embedded surface's first pass. |
| 288 const QuadList& fourth_pass_quad_list = aggregated_pass_list[3]->quad_list; | 289 const QuadList& fourth_pass_quad_list = aggregated_pass_list[3]->quad_list; |
| 289 ASSERT_EQ(3u, fourth_pass_quad_list.size()); | 290 ASSERT_EQ(3u, fourth_pass_quad_list.size()); |
| 290 | 291 |
| 291 // The first quad will be the yellow quad from the embedded surface's last | 292 // The first quad will be the yellow quad from the embedded surface's last |
| 292 // pass. | 293 // pass. |
| 293 TestQuadMatchesExpectations(embedded_quads[2][0], | 294 QuadList::ConstIterator iter = fourth_pass_quad_list.begin(); |
| 294 fourth_pass_quad_list.at(0u)); | 295 TestQuadMatchesExpectations(embedded_quads[2][0], &*iter); |
| 295 | 296 |
| 296 // The next quad will be a render pass quad referencing the second pass from | 297 // The next quad will be a render pass quad referencing the second pass from |
| 297 // the embedded surface, which is the third pass in the aggregated frame. | 298 // the embedded surface, which is the third pass in the aggregated frame. |
| 298 ASSERT_EQ(DrawQuad::RENDER_PASS, fourth_pass_quad_list.at(1u)->material); | 299 ++iter; |
| 300 ASSERT_EQ(DrawQuad::RENDER_PASS, iter->material); |
| 299 const RenderPassDrawQuad* fourth_pass_first_render_pass_draw_quad = | 301 const RenderPassDrawQuad* fourth_pass_first_render_pass_draw_quad = |
| 300 RenderPassDrawQuad::MaterialCast(fourth_pass_quad_list.at(1u)); | 302 RenderPassDrawQuad::MaterialCast(&*iter); |
| 301 EXPECT_EQ(actual_pass_ids[2], | 303 EXPECT_EQ(actual_pass_ids[2], |
| 302 fourth_pass_first_render_pass_draw_quad->render_pass_id); | 304 fourth_pass_first_render_pass_draw_quad->render_pass_id); |
| 303 | 305 |
| 304 // The last quad will be a render pass quad referencing the first pass from | 306 // The last quad will be a render pass quad referencing the first pass from |
| 305 // the root surface, which is the first pass overall. | 307 // the root surface, which is the first pass overall. |
| 306 ASSERT_EQ(DrawQuad::RENDER_PASS, fourth_pass_quad_list.at(2u)->material); | 308 ++iter; |
| 309 ASSERT_EQ(DrawQuad::RENDER_PASS, iter->material); |
| 307 const RenderPassDrawQuad* fourth_pass_second_render_pass_draw_quad = | 310 const RenderPassDrawQuad* fourth_pass_second_render_pass_draw_quad = |
| 308 RenderPassDrawQuad::MaterialCast(fourth_pass_quad_list.at(2u)); | 311 RenderPassDrawQuad::MaterialCast(&*iter); |
| 309 EXPECT_EQ(actual_pass_ids[0], | 312 EXPECT_EQ(actual_pass_ids[0], |
| 310 fourth_pass_second_render_pass_draw_quad->render_pass_id); | 313 fourth_pass_second_render_pass_draw_quad->render_pass_id); |
| 311 } | 314 } |
| 312 | 315 |
| 313 { | 316 { |
| 314 SCOPED_TRACE("Fifth pass"); | 317 SCOPED_TRACE("Fifth pass"); |
| 315 const QuadList& fifth_pass_quad_list = aggregated_pass_list[4]->quad_list; | 318 const QuadList& fifth_pass_quad_list = aggregated_pass_list[4]->quad_list; |
| 316 ASSERT_EQ(2u, fifth_pass_quad_list.size()); | 319 ASSERT_EQ(2u, fifth_pass_quad_list.size()); |
| 317 | 320 |
| 318 TestQuadMatchesExpectations(root_quads[2][0], fifth_pass_quad_list.at(0)); | 321 QuadList::ConstIterator iter = fifth_pass_quad_list.begin(); |
| 322 TestQuadMatchesExpectations(root_quads[2][0], &*iter); |
| 319 | 323 |
| 320 // The last quad in the last pass will reference the second pass from the | 324 // The last quad in the last pass will reference the second pass from the |
| 321 // root surface, which after aggregating is the fourth pass in the overall | 325 // root surface, which after aggregating is the fourth pass in the overall |
| 322 // list. | 326 // list. |
| 323 ASSERT_EQ(DrawQuad::RENDER_PASS, fifth_pass_quad_list.at(1u)->material); | 327 ++iter; |
| 328 ASSERT_EQ(DrawQuad::RENDER_PASS, iter->material); |
| 324 const RenderPassDrawQuad* fifth_pass_render_pass_draw_quad = | 329 const RenderPassDrawQuad* fifth_pass_render_pass_draw_quad = |
| 325 RenderPassDrawQuad::MaterialCast(fifth_pass_quad_list.at(1u)); | 330 RenderPassDrawQuad::MaterialCast(&*iter); |
| 326 EXPECT_EQ(actual_pass_ids[3], | 331 EXPECT_EQ(actual_pass_ids[3], |
| 327 fifth_pass_render_pass_draw_quad->render_pass_id); | 332 fifth_pass_render_pass_draw_quad->render_pass_id); |
| 328 } | 333 } |
| 329 factory_.Destroy(embedded_surface_id); | 334 factory_.Destroy(embedded_surface_id); |
| 330 } | 335 } |
| 331 | 336 |
| 332 // Tests an invalid surface reference in a frame. The surface quad should just | 337 // Tests an invalid surface reference in a frame. The surface quad should just |
| 333 // be dropped. | 338 // be dropped. |
| 334 TEST_F(SurfaceAggregatorValidSurfaceTest, InvalidSurfaceReference) { | 339 TEST_F(SurfaceAggregatorValidSurfaceTest, InvalidSurfaceReference) { |
| 335 test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), | 340 test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 aggregated_pass_list[2]->id}; | 471 aggregated_pass_list[2]->id}; |
| 467 // Make sure the aggregated frame's pass IDs are all unique. | 472 // Make sure the aggregated frame's pass IDs are all unique. |
| 468 for (size_t i = 0; i < 3; ++i) { | 473 for (size_t i = 0; i < 3; ++i) { |
| 469 for (size_t j = 0; j < i; ++j) { | 474 for (size_t j = 0; j < i; ++j) { |
| 470 EXPECT_NE(actual_pass_ids[j], actual_pass_ids[i]) << "pass ids " << i | 475 EXPECT_NE(actual_pass_ids[j], actual_pass_ids[i]) << "pass ids " << i |
| 471 << " and " << j; | 476 << " and " << j; |
| 472 } | 477 } |
| 473 } | 478 } |
| 474 | 479 |
| 475 // Make sure the render pass quads reference the remapped pass IDs. | 480 // Make sure the render pass quads reference the remapped pass IDs. |
| 476 DrawQuad* render_pass_quads[] = {aggregated_pass_list[1]->quad_list[0], | 481 DrawQuad* render_pass_quads[] = {aggregated_pass_list[1]->quad_list.front(), |
| 477 aggregated_pass_list[2]->quad_list[0]}; | 482 aggregated_pass_list[2]->quad_list.front()}; |
| 478 ASSERT_EQ(render_pass_quads[0]->material, DrawQuad::RENDER_PASS); | 483 ASSERT_EQ(render_pass_quads[0]->material, DrawQuad::RENDER_PASS); |
| 479 EXPECT_EQ( | 484 EXPECT_EQ( |
| 480 actual_pass_ids[0], | 485 actual_pass_ids[0], |
| 481 RenderPassDrawQuad::MaterialCast(render_pass_quads[0])->render_pass_id); | 486 RenderPassDrawQuad::MaterialCast(render_pass_quads[0])->render_pass_id); |
| 482 | 487 |
| 483 ASSERT_EQ(render_pass_quads[1]->material, DrawQuad::RENDER_PASS); | 488 ASSERT_EQ(render_pass_quads[1]->material, DrawQuad::RENDER_PASS); |
| 484 EXPECT_EQ( | 489 EXPECT_EQ( |
| 485 actual_pass_ids[1], | 490 actual_pass_ids[1], |
| 486 RenderPassDrawQuad::MaterialCast(render_pass_quads[1])->render_pass_id); | 491 RenderPassDrawQuad::MaterialCast(render_pass_quads[1])->render_pass_id); |
| 487 factory_.Destroy(child_surface_id); | 492 factory_.Destroy(child_surface_id); |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); | 635 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); |
| 631 | 636 |
| 632 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; | 637 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; |
| 633 | 638 |
| 634 ASSERT_EQ(1u, aggregated_pass_list.size()); | 639 ASSERT_EQ(1u, aggregated_pass_list.size()); |
| 635 | 640 |
| 636 const QuadList& aggregated_quad_list = aggregated_pass_list[0]->quad_list; | 641 const QuadList& aggregated_quad_list = aggregated_pass_list[0]->quad_list; |
| 637 | 642 |
| 638 ASSERT_EQ(7u, aggregated_quad_list.size()); | 643 ASSERT_EQ(7u, aggregated_quad_list.size()); |
| 639 | 644 |
| 640 for (size_t i = 0; i < aggregated_quad_list.size(); ++i) { | 645 size_t i = 0; |
| 641 DrawQuad* quad = aggregated_quad_list[i]; | 646 for (QuadList::ConstIterator iter = aggregated_quad_list.begin(); |
| 642 EXPECT_EQ(blend_modes[i], quad->shared_quad_state->blend_mode) << i; | 647 iter != aggregated_quad_list.end(); |
| 648 ++iter) { |
| 649 EXPECT_EQ(blend_modes[i], iter->shared_quad_state->blend_mode) << i; |
| 650 ++i; |
| 643 } | 651 } |
| 644 factory_.Destroy(child_one_surface_id); | 652 factory_.Destroy(child_one_surface_id); |
| 645 factory_.Destroy(child_two_surface_id); | 653 factory_.Destroy(child_two_surface_id); |
| 646 factory_.Destroy(grandchild_surface_id); | 654 factory_.Destroy(grandchild_surface_id); |
| 647 } | 655 } |
| 648 | 656 |
| 649 // This tests that when aggregating a frame with multiple render passes that we | 657 // This tests that when aggregating a frame with multiple render passes that we |
| 650 // map the transforms for the root pass but do not modify the transform on child | 658 // map the transforms for the root pass but do not modify the transform on child |
| 651 // passes. | 659 // passes. |
| 652 // | 660 // |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 767 gfx::Transform expected_root_pass_quad_transforms[2]; | 775 gfx::Transform expected_root_pass_quad_transforms[2]; |
| 768 // The first quad in the root pass is the solid color quad from the original | 776 // The first quad in the root pass is the solid color quad from the original |
| 769 // root surface. Its transform should be unaffected by the aggregation and | 777 // root surface. Its transform should be unaffected by the aggregation and |
| 770 // still be +7 in the y direction. | 778 // still be +7 in the y direction. |
| 771 expected_root_pass_quad_transforms[0].Translate(0, 7); | 779 expected_root_pass_quad_transforms[0].Translate(0, 7); |
| 772 // The second quad in the root pass is aggregated from the child surface so | 780 // The second quad in the root pass is aggregated from the child surface so |
| 773 // its transform should be the combination of its original translation (0, 10) | 781 // its transform should be the combination of its original translation (0, 10) |
| 774 // and the child surface draw quad's translation (8, 0). | 782 // and the child surface draw quad's translation (8, 0). |
| 775 expected_root_pass_quad_transforms[1].Translate(8, 10); | 783 expected_root_pass_quad_transforms[1].Translate(8, 10); |
| 776 | 784 |
| 777 for (size_t i = 0; i < 2; ++i) { | 785 size_t i = 0; |
| 778 DrawQuad* quad = aggregated_pass_list[1]->quad_list.at(i); | 786 for (QuadList::Iterator iter = aggregated_pass_list[1]->quad_list.begin(); |
| 787 iter != aggregated_pass_list[1]->quad_list.end(); |
| 788 ++iter) { |
| 779 EXPECT_EQ(expected_root_pass_quad_transforms[i].ToString(), | 789 EXPECT_EQ(expected_root_pass_quad_transforms[i].ToString(), |
| 780 quad->quadTransform().ToString()) | 790 iter->quadTransform().ToString()) |
| 781 << i; | 791 << i; |
| 792 i++; |
| 782 } | 793 } |
| 783 | 794 |
| 784 EXPECT_EQ(true, | 795 EXPECT_EQ(true, |
| 785 aggregated_pass_list[1]->shared_quad_state_list[1]->is_clipped); | 796 aggregated_pass_list[1]->shared_quad_state_list[1]->is_clipped); |
| 786 | 797 |
| 787 // The second quad in the root pass is aggregated from the child, so its | 798 // The second quad in the root pass is aggregated from the child, so its |
| 788 // clip rect must be transformed by the child's translation. | 799 // clip rect must be transformed by the child's translation. |
| 789 EXPECT_EQ( | 800 EXPECT_EQ( |
| 790 gfx::Rect(0, 10, 5, 5).ToString(), | 801 gfx::Rect(0, 10, 5, 5).ToString(), |
| 791 aggregated_pass_list[1]->shared_quad_state_list[1]->clip_rect.ToString()); | 802 aggregated_pass_list[1]->shared_quad_state_list[1]->clip_rect.ToString()); |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1078 returned_ids[i] = client.returned_resources()[i].id; | 1089 returned_ids[i] = client.returned_resources()[i].id; |
| 1079 } | 1090 } |
| 1080 EXPECT_THAT(returned_ids, | 1091 EXPECT_THAT(returned_ids, |
| 1081 testing::WhenSorted(testing::ElementsAreArray(ids))); | 1092 testing::WhenSorted(testing::ElementsAreArray(ids))); |
| 1082 factory.Destroy(surface_id); | 1093 factory.Destroy(surface_id); |
| 1083 } | 1094 } |
| 1084 | 1095 |
| 1085 } // namespace | 1096 } // namespace |
| 1086 } // namespace cc | 1097 } // namespace cc |
| 1087 | 1098 |
| OLD | NEW |