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, &copy_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, &copy_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