12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/render_pass.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/math_util.h" 890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/base/scoped_ptr_vector.h" 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/output/copy_output_request.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/checkerboard_draw_quad.h" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/quads/render_pass_draw_quad.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_common.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/effects/SkBlurImageFilter.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using cc::TestRenderPass; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct RenderPassSize { 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If you add a new field to this class, make sure to add it to the 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Copy() tests. 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId id; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadList quad_list; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SharedQuadStateList shared_quad_state_list; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform transform_to_root_target; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect output_rect; 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::Rect damage_rect; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_transparent_background; 3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScopedPtrVector<CopyOutputRequest> copy_callbacks; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)static void CompareRenderPassLists(const RenderPassList& expected_list, 371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const RenderPassList& actual_list) { 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(expected_list.size(), actual_list.size()); 391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (size_t i = 0; i < actual_list.size(); ++i) { 401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderPass* expected = expected_list[i]; 411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderPass* actual = actual_list[i]; 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(expected->id, actual->id); 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_RECT_EQ(expected->output_rect, actual->output_rect); 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(expected->transform_to_root_target, 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) actual->transform_to_root_target); 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_RECT_EQ(expected->damage_rect, actual->damage_rect); 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(expected->has_transparent_background, 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) actual->has_transparent_background); 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(expected->shared_quad_state_list.size(), 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) actual->shared_quad_state_list.size()); 531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(expected->quad_list.size(), actual->quad_list.size()); 541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (QuadList::Iterator exp_iter = expected->quad_list.begin(), 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci act_iter = actual->quad_list.begin(); 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci exp_iter != expected->quad_list.end(); 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++exp_iter, ++act_iter) { 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(exp_iter->rect.ToString(), act_iter->rect.ToString()); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(exp_iter->shared_quad_state->content_bounds.ToString(), 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci act_iter->shared_quad_state->content_bounds.ToString()); 621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(RenderPassTest, CopyShouldBeIdenticalExceptIdAndQuads) { 6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId id(3, 2); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect output_rect(45, 22, 120, 13); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform transform_to_root = 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform(1.0, 0.5, 0.5, -0.5, -1.0, 0.0); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect damage_rect(56, 123, 19, 43); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_transparent_background = true; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRenderPass> pass = TestRenderPass::Create(); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass->SetAll(id, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_rect, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform_to_root, 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch has_transparent_background); 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pass->copy_requests.push_back(CopyOutputRequest::CreateEmptyRequest()); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Stick a quad in the pass, this should not get copied. 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState(); 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shared_state->SetAll(gfx::Transform(), 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Size(), 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) false, 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1, 906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SkXfermode::kSrcOver_Mode, 916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 0); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckerboardDrawQuad* checkerboard_quad = 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>(); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) checkerboard_quad->SetNew( 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) pass->shared_quad_state_list.back(), gfx::Rect(), gfx::Rect(), SkColor()); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId new_id(63, 4); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RenderPass> copy = pass->Copy(new_id); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(new_id, copy->id); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_RECT_EQ(pass->output_rect, copy->output_rect); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(pass->transform_to_root_target, copy->transform_to_root_target); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_RECT_EQ(pass->damage_rect, copy->damage_rect); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(pass->has_transparent_background, copy->has_transparent_background); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, copy->quad_list.size()); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The copy request should not be copied/duplicated. 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1u, pass->copy_requests.size()); 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0u, copy->copy_requests.size()); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(sizeof(RenderPassSize), sizeof(RenderPass)); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(RenderPassTest, CopyAllShouldBeIdentical) { 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RenderPassList pass_list; 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId id(3, 2); 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Rect output_rect(45, 22, 120, 13); 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Transform transform_to_root = 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Transform(1.0, 0.5, 0.5, -0.5, -1.0, 0.0); 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Rect damage_rect(56, 123, 19, 43); 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool has_transparent_background = true; 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<TestRenderPass> pass = TestRenderPass::Create(); 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) pass->SetAll(id, 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) output_rect, 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) damage_rect, 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) transform_to_root, 130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch has_transparent_background); 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Two quads using one shared state. 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SharedQuadState* shared_state1 = pass->CreateAndAppendSharedQuadState(); 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shared_state1->SetAll(gfx::Transform(), 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Size(1, 1), 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) false, 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1, 1406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SkXfermode::kSrcOver_Mode, 1416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 0); 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckerboardDrawQuad* checkerboard_quad1 = 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>(); 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) checkerboard_quad1->SetNew(pass->shared_quad_state_list.back(), 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(1, 1, 1, 1), 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(1, 1, 1, 1), 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkColor()); 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckerboardDrawQuad* checkerboard_quad2 = 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>(); 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) checkerboard_quad2->SetNew(pass->shared_quad_state_list.back(), 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(2, 2, 2, 2), 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(2, 2, 2, 2), 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkColor()); 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // And two quads using another shared state. 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SharedQuadState* shared_state2 = pass->CreateAndAppendSharedQuadState(); 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shared_state2->SetAll(gfx::Transform(), 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Size(2, 2), 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) false, 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1, 1656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SkXfermode::kSrcOver_Mode, 1666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 0); 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckerboardDrawQuad* checkerboard_quad3 = 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>(); 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) checkerboard_quad3->SetNew(pass->shared_quad_state_list.back(), 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(3, 3, 3, 3), 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(3, 3, 3, 3), 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkColor()); 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckerboardDrawQuad* checkerboard_quad4 = 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>(); 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) checkerboard_quad4->SetNew(pass->shared_quad_state_list.back(), 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(4, 4, 4, 4), 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(4, 4, 4, 4), 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkColor()); 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // A second render pass with a quad. 18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId contrib_id(4, 1); 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Rect contrib_output_rect(10, 15, 12, 17); 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Transform contrib_transform_to_root = 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Transform(1.0, 0.5, 0.5, -0.5, -1.0, 0.0); 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Rect contrib_damage_rect(11, 16, 10, 15); 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool contrib_has_transparent_background = true; 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<TestRenderPass> contrib = TestRenderPass::Create(); 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) contrib->SetAll(contrib_id, 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) contrib_output_rect, 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) contrib_damage_rect, 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) contrib_transform_to_root, 195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch contrib_has_transparent_background); 1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SharedQuadState* contrib_shared_state = 198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) contrib->CreateAndAppendSharedQuadState(); 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) contrib_shared_state->SetAll(gfx::Transform(), 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Size(2, 2), 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) false, 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1, 2056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SkXfermode::kSrcOver_Mode, 2066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 0); 2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckerboardDrawQuad* contrib_quad = 209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch contrib->CreateAndAppendDrawQuad<CheckerboardDrawQuad>(); 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) contrib_quad->SetNew(contrib->shared_quad_state_list.back(), 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(3, 3, 3, 3), 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(3, 3, 3, 3), 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkColor()); 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // And a RenderPassDrawQuad for the contributing pass. 216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<RenderPassDrawQuad> pass_quad = 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch make_scoped_ptr(new RenderPassDrawQuad); 2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) pass_quad->SetNew(pass->shared_quad_state_list.back(), 2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) contrib_output_rect, 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) contrib_output_rect, 2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) contrib_id, 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0, // mask_resource_id 2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::RectF(), // mask_uv_rect 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FilterOperations(), 2256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::Vector2dF(), // filters_scale 2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FilterOperations()); 2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) pass_list.push_back(pass.PassAs<RenderPass>()); 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) pass_list.push_back(contrib.PassAs<RenderPass>()); 2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Make a copy with CopyAll(). 2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RenderPassList copy_list; 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RenderPass::CopyAll(pass_list, ©_list); 2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CompareRenderPassLists(pass_list, copy_list); 2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST(RenderPassTest, CopyAllWithCulledQuads) { 2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderPassList pass_list; 2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId id(3, 2); 2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::Rect output_rect(45, 22, 120, 13); 2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::Transform transform_to_root = 2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::Transform(1.0, 0.5, 0.5, -0.5, -1.0, 0.0); 2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::Rect damage_rect(56, 123, 19, 43); 2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool has_transparent_background = true; 2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<TestRenderPass> pass = TestRenderPass::Create(); 2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) pass->SetAll(id, 2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) output_rect, 2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) damage_rect, 2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) transform_to_root, 253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch has_transparent_background); 2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // A shared state with a quad. 256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SharedQuadState* shared_state1 = pass->CreateAndAppendSharedQuadState(); 257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shared_state1->SetAll(gfx::Transform(), 258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Size(1, 1), 259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) false, 262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1, 2636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SkXfermode::kSrcOver_Mode, 2646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 0); 2651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckerboardDrawQuad* checkerboard_quad1 = 267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>(); 268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) checkerboard_quad1->SetNew(pass->shared_quad_state_list.back(), 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(1, 1, 1, 1), 270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(1, 1, 1, 1), 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkColor()); 2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // A shared state with no quads, they were culled. 274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SharedQuadState* shared_state2 = pass->CreateAndAppendSharedQuadState(); 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shared_state2->SetAll(gfx::Transform(), 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Size(2, 2), 277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) false, 280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1, 2816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SkXfermode::kSrcOver_Mode, 2826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 0); 2831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // A second shared state with no quads. 285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SharedQuadState* shared_state3 = pass->CreateAndAppendSharedQuadState(); 286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shared_state3->SetAll(gfx::Transform(), 287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Size(2, 2), 288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) false, 291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1, 2926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SkXfermode::kSrcOver_Mode, 2936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 0); 2941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // A last shared state with a quad again. 296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SharedQuadState* shared_state4 = pass->CreateAndAppendSharedQuadState(); 297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shared_state4->SetAll(gfx::Transform(), 298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Size(2, 2), 299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect(), 301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) false, 302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1, 3036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SkXfermode::kSrcOver_Mode, 3046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 0); 3051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckerboardDrawQuad* checkerboard_quad2 = 307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>(); 308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) checkerboard_quad2->SetNew(pass->shared_quad_state_list.back(), 309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(3, 3, 3, 3), 310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(3, 3, 3, 3), 311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkColor()); 3121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) pass_list.push_back(pass.PassAs<RenderPass>()); 3141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Make a copy with CopyAll(). 3161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderPassList copy_list; 3171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderPass::CopyAll(pass_list, ©_list); 3181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CompareRenderPassLists(pass_list, copy_list); 3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 324