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, ©_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, ©_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