render_pass_unittest.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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.
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPass::Id 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)
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (size_t i = 0; i < expected->quad_list.size(); ++i) {
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(expected->quad_list[i]->rect.ToString(),
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                actual->quad_list[i]->rect.ToString());
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          expected->quad_list[i]->shared_quad_state->content_bounds.ToString(),
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          actual->quad_list[i]->shared_quad_state->content_bounds.ToString());
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(RenderPassTest, CopyShouldBeIdenticalExceptIdAndQuads) {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPass::Id id(3, 2);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect output_rect(45, 22, 120, 13);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform transform_to_root =
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Transform(1.0, 0.5, 0.5, -0.5, -1.0, 0.0);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect damage_rect(56, 123, 19, 43);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_transparent_background = true;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TestRenderPass> pass = TestRenderPass::Create();
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pass->SetAll(id,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               output_rect,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               damage_rect,
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               transform_to_root,
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               has_transparent_background);
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  pass->copy_requests.push_back(CopyOutputRequest::CreateEmptyRequest());
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Stick a quad in the pass, this should not get copied.
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shared_state->SetAll(gfx::Transform(),
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       gfx::Size(),
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       gfx::Rect(),
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       gfx::Rect(),
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       false,
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       1,
896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                       SkXfermode::kSrcOver_Mode,
906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                       0);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckerboardDrawQuad* checkerboard_quad =
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkerboard_quad->SetNew(
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      pass->shared_quad_state_list.back(), gfx::Rect(), gfx::Rect(), SkColor());
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPass::Id new_id(63, 4);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RenderPass> copy = pass->Copy(new_id);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(new_id, copy->id);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_RECT_EQ(pass->output_rect, copy->output_rect);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(pass->transform_to_root_target, copy->transform_to_root_target);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_RECT_EQ(pass->damage_rect, copy->damage_rect);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(pass->has_transparent_background, copy->has_transparent_background);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, copy->quad_list.size());
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The copy request should not be copied/duplicated.
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1u, pass->copy_requests.size());
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0u, copy->copy_requests.size());
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(sizeof(RenderPassSize), sizeof(RenderPass));
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(RenderPassTest, CopyAllShouldBeIdentical) {
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderPassList pass_list;
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderPass::Id id(3, 2);
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect output_rect(45, 22, 120, 13);
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Transform transform_to_root =
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      gfx::Transform(1.0, 0.5, 0.5, -0.5, -1.0, 0.0);
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect damage_rect(56, 123, 19, 43);
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool has_transparent_background = true;
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<TestRenderPass> pass = TestRenderPass::Create();
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass->SetAll(id,
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               output_rect,
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               damage_rect,
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               transform_to_root,
129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               has_transparent_background);
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Two quads using one shared state.
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state1 = pass->CreateAndAppendSharedQuadState();
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shared_state1->SetAll(gfx::Transform(),
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Size(1, 1),
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Rect(),
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Rect(),
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        false,
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        1,
1396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        SkXfermode::kSrcOver_Mode,
1406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        0);
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckerboardDrawQuad* checkerboard_quad1 =
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  checkerboard_quad1->SetNew(pass->shared_quad_state_list.back(),
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(1, 1, 1, 1),
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(1, 1, 1, 1),
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             SkColor());
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckerboardDrawQuad* checkerboard_quad2 =
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  checkerboard_quad2->SetNew(pass->shared_quad_state_list.back(),
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(2, 2, 2, 2),
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(2, 2, 2, 2),
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             SkColor());
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // And two quads using another shared state.
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state2 = pass->CreateAndAppendSharedQuadState();
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shared_state2->SetAll(gfx::Transform(),
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Size(2, 2),
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Rect(),
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Rect(),
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        false,
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        1,
1646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        SkXfermode::kSrcOver_Mode,
1656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        0);
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckerboardDrawQuad* checkerboard_quad3 =
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  checkerboard_quad3->SetNew(pass->shared_quad_state_list.back(),
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(3, 3, 3, 3),
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(3, 3, 3, 3),
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             SkColor());
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckerboardDrawQuad* checkerboard_quad4 =
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  checkerboard_quad4->SetNew(pass->shared_quad_state_list.back(),
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(4, 4, 4, 4),
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(4, 4, 4, 4),
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             SkColor());
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // A second render pass with a quad.
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderPass::Id contrib_id(4, 1);
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect contrib_output_rect(10, 15, 12, 17);
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Transform contrib_transform_to_root =
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      gfx::Transform(1.0, 0.5, 0.5, -0.5, -1.0, 0.0);
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect contrib_damage_rect(11, 16, 10, 15);
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool contrib_has_transparent_background = true;
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<TestRenderPass> contrib = TestRenderPass::Create();
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  contrib->SetAll(contrib_id,
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  contrib_output_rect,
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  contrib_damage_rect,
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  contrib_transform_to_root,
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                  contrib_has_transparent_background);
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* contrib_shared_state =
197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      contrib->CreateAndAppendSharedQuadState();
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  contrib_shared_state->SetAll(gfx::Transform(),
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               gfx::Size(2, 2),
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               gfx::Rect(),
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               gfx::Rect(),
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               false,
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               1,
2046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                               SkXfermode::kSrcOver_Mode,
2056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                               0);
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckerboardDrawQuad* contrib_quad =
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      contrib->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  contrib_quad->SetNew(contrib->shared_quad_state_list.back(),
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       gfx::Rect(3, 3, 3, 3),
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       gfx::Rect(3, 3, 3, 3),
212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       SkColor());
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // And a RenderPassDrawQuad for the contributing pass.
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<RenderPassDrawQuad> pass_quad =
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      make_scoped_ptr(new RenderPassDrawQuad);
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass_quad->SetNew(pass->shared_quad_state_list.back(),
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    contrib_output_rect,
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    contrib_output_rect,
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    contrib_id,
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    false,  // is_replica
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    0,      // mask_resource_id
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    contrib_damage_rect,
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    gfx::RectF(),  // mask_uv_rect
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    FilterOperations(),
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)
2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RenderPass::Id 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