render_pass_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::RectF 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,
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               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.
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state = SharedQuadState::Create();
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,
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       SkXfermode::kSrcOver_Mode);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pass->AppendSharedQuadState(shared_state.Pass());
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<CheckerboardDrawQuad> checkerboard_quad =
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CheckerboardDrawQuad::Create();
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkerboard_quad->SetNew(
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      pass->shared_quad_state_list.back(), gfx::Rect(), gfx::Rect(), SkColor());
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pass->quad_list.push_back(checkerboard_quad.PassAs<DrawQuad>());
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPass::Id 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)
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderPass::Id 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,
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               has_transparent_background);
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Two quads using one shared state.
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state1 = SharedQuadState::Create();
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,
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        SkXfermode::kSrcOver_Mode);
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass->AppendSharedQuadState(shared_state1.Pass());
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<CheckerboardDrawQuad> checkerboard_quad1 =
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CheckerboardDrawQuad::Create();
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)  pass->quad_list.push_back(checkerboard_quad1.PassAs<DrawQuad>());
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<CheckerboardDrawQuad> checkerboard_quad2 =
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CheckerboardDrawQuad::Create();
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  checkerboard_quad2->SetNew(pass->shared_quad_state_list.back(),
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(2, 2, 2, 2),
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(2, 2, 2, 2),
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             SkColor());
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass->quad_list.push_back(checkerboard_quad2.PassAs<DrawQuad>());
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // And two quads using another shared state.
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state2 = SharedQuadState::Create();
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shared_state2->SetAll(gfx::Transform(),
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Size(2, 2),
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Rect(),
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Rect(),
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        false,
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        1,
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        SkXfermode::kSrcOver_Mode);
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass->AppendSharedQuadState(shared_state2.Pass());
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<CheckerboardDrawQuad> checkerboard_quad3 =
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CheckerboardDrawQuad::Create();
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  checkerboard_quad3->SetNew(pass->shared_quad_state_list.back(),
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(3, 3, 3, 3),
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(3, 3, 3, 3),
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             SkColor());
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass->quad_list.push_back(checkerboard_quad3.PassAs<DrawQuad>());
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<CheckerboardDrawQuad> checkerboard_quad4 =
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CheckerboardDrawQuad::Create();
180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  checkerboard_quad4->SetNew(pass->shared_quad_state_list.back(),
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(4, 4, 4, 4),
182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(4, 4, 4, 4),
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             SkColor());
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass->quad_list.push_back(checkerboard_quad4.PassAs<DrawQuad>());
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // A second render pass with a quad.
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderPass::Id contrib_id(4, 1);
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect contrib_output_rect(10, 15, 12, 17);
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Transform contrib_transform_to_root =
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      gfx::Transform(1.0, 0.5, 0.5, -0.5, -1.0, 0.0);
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect contrib_damage_rect(11, 16, 10, 15);
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool contrib_has_transparent_background = true;
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<TestRenderPass> contrib = TestRenderPass::Create();
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  contrib->SetAll(contrib_id,
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  contrib_output_rect,
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  contrib_damage_rect,
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  contrib_transform_to_root,
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  contrib_has_transparent_background);
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<SharedQuadState> contrib_shared_state = SharedQuadState::Create();
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  contrib_shared_state->SetAll(gfx::Transform(),
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               gfx::Size(2, 2),
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               gfx::Rect(),
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               gfx::Rect(),
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               false,
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               1,
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               SkXfermode::kSrcOver_Mode);
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  contrib->AppendSharedQuadState(contrib_shared_state.Pass());
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<CheckerboardDrawQuad> contrib_quad =
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CheckerboardDrawQuad::Create();
213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  contrib_quad->SetNew(contrib->shared_quad_state_list.back(),
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       gfx::Rect(3, 3, 3, 3),
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       gfx::Rect(3, 3, 3, 3),
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       SkColor());
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  contrib->quad_list.push_back(contrib_quad.PassAs<DrawQuad>());
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // And a RenderPassDrawQuad for the contributing pass.
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<RenderPassDrawQuad> pass_quad = RenderPassDrawQuad::Create();
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass_quad->SetNew(pass->shared_quad_state_list.back(),
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    contrib_output_rect,
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    contrib_output_rect,
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    contrib_id,
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    false,  // is_replica
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    0,      // mask_resource_id
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    contrib_damage_rect,
2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    gfx::RectF(),  // mask_uv_rect
2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    FilterOperations(),
2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    FilterOperations());
2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass->quad_list.push_back(pass_quad.PassAs<DrawQuad>());
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass_list.push_back(pass.PassAs<RenderPass>());
2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass_list.push_back(contrib.PassAs<RenderPass>());
2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Make a copy with CopyAll().
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderPassList copy_list;
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderPass::CopyAll(pass_list, &copy_list);
2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CompareRenderPassLists(pass_list, copy_list);
2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST(RenderPassTest, CopyAllWithCulledQuads) {
2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RenderPassList pass_list;
2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RenderPass::Id id(3, 2);
2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Rect output_rect(45, 22, 120, 13);
2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Transform transform_to_root =
2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      gfx::Transform(1.0, 0.5, 0.5, -0.5, -1.0, 0.0);
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Rect damage_rect(56, 123, 19, 43);
2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool has_transparent_background = true;
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<TestRenderPass> pass = TestRenderPass::Create();
2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pass->SetAll(id,
2551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)               output_rect,
2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)               damage_rect,
2571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)               transform_to_root,
2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)               has_transparent_background);
2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // A shared state with a quad.
2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state1 = SharedQuadState::Create();
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shared_state1->SetAll(gfx::Transform(),
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Size(1, 1),
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Rect(),
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Rect(),
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        false,
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        1,
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        SkXfermode::kSrcOver_Mode);
2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pass->AppendSharedQuadState(shared_state1.Pass());
2701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<CheckerboardDrawQuad> checkerboard_quad1 =
2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      CheckerboardDrawQuad::Create();
273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  checkerboard_quad1->SetNew(pass->shared_quad_state_list.back(),
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(1, 1, 1, 1),
275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(1, 1, 1, 1),
276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             SkColor());
2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pass->quad_list.push_back(checkerboard_quad1.PassAs<DrawQuad>());
2781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // A shared state with no quads, they were culled.
2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state2 = SharedQuadState::Create();
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shared_state2->SetAll(gfx::Transform(),
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Size(2, 2),
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Rect(),
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Rect(),
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        false,
286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        1,
287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        SkXfermode::kSrcOver_Mode);
2881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pass->AppendSharedQuadState(shared_state2.Pass());
2891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // A second shared state with no quads.
2911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state3 = SharedQuadState::Create();
292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shared_state3->SetAll(gfx::Transform(),
293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Size(2, 2),
294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Rect(),
295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Rect(),
296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        false,
297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        1,
298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        SkXfermode::kSrcOver_Mode);
2991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pass->AppendSharedQuadState(shared_state3.Pass());
3001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // A last shared state with a quad again.
3021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state4 = SharedQuadState::Create();
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shared_state4->SetAll(gfx::Transform(),
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Size(2, 2),
305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Rect(),
306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        gfx::Rect(),
307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        false,
308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        1,
309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        SkXfermode::kSrcOver_Mode);
3101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pass->AppendSharedQuadState(shared_state4.Pass());
3111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<CheckerboardDrawQuad> checkerboard_quad2 =
3131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      CheckerboardDrawQuad::Create();
314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  checkerboard_quad2->SetNew(pass->shared_quad_state_list.back(),
315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(3, 3, 3, 3),
316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             gfx::Rect(3, 3, 3, 3),
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             SkColor());
3181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pass->quad_list.push_back(checkerboard_quad2.PassAs<DrawQuad>());
3191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pass_list.push_back(pass.PassAs<RenderPass>());
3211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Make a copy with CopyAll().
3231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RenderPassList copy_list;
3241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RenderPass::CopyAll(pass_list, &copy_list);
3251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CompareRenderPassLists(pass_list, copy_list);
3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
331