15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/output/compositor_frame.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/quads/render_pass.h" 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/quads/solid_color_draw_quad.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/quads/surface_draw_quad.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/surfaces/surface.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/surfaces/surface_aggregator.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/surface_factory.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/surface_factory_client.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/surface_id_allocator.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/surfaces/surface_manager.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/test/pixel_comparator.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/test/pixel_test.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_ANDROID) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace cc { 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass EmptySurfaceFactoryClient : public SurfaceFactoryClient { 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void ReturnResources( 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ReturnedResourceArray& resources) OVERRIDE {} 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SurfacesPixelTest : public RendererPixelTest<GLRenderer> { 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfacesPixelTest() : allocator_(1u), factory_(&manager_, &client_) {} 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SurfaceManager manager_; 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceIdAllocator allocator_; 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EmptySurfaceFactoryClient client_; 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceFactory factory_; 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)SharedQuadState* CreateAndAppendTestSharedQuadState( 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderPass* render_pass, 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Transform& transform, 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& size) { 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size content_bounds = size; 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect visible_content_rect = gfx::Rect(size); 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect clip_rect = gfx::Rect(size); 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_clipped = false; 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float opacity = 1.f; 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const SkXfermode::Mode blend_mode = SkXfermode::kSrcOver_Mode; 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SharedQuadState* shared_state = render_pass->CreateAndAppendSharedQuadState(); 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shared_state->SetAll(transform, 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content_bounds, 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) visible_content_rect, 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) clip_rect, 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_clipped, 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) opacity, 586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) blend_mode, 596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 0); 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return shared_state; 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Draws a very simple frame with no surface references. 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(SurfacesPixelTest, DrawSimpleFrame) { 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect rect(device_viewport_size_); 6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId id(1, 1); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<RenderPass> pass = RenderPass::Create(); 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pass->SetNew(id, rect, rect, gfx::Transform()); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CreateAndAppendTestSharedQuadState( 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pass.get(), gfx::Transform(), device_viewport_size_); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SolidColorDrawQuad* color_quad = 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool force_anti_aliasing_off = false; 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) color_quad->SetNew(pass->shared_quad_state_list.back(), 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rect, 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rect, 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SK_ColorGREEN, 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) force_anti_aliasing_off); 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData); 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegated_frame_data->render_pass_list.push_back(pass.Pass()); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_frame->delegated_frame_data = delegated_frame_data.Pass(); 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceId root_surface_id = allocator_.GenerateId(); 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.Create(root_surface_id, device_viewport_size_); 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory_.SubmitFrame(root_surface_id, root_frame.Pass(), base::Closure()); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceAggregator aggregator(&manager_, resource_provider_.get()); 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<CompositorFrame> aggregated_frame = 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aggregator.Aggregate(root_surface_id); 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.Destroy(root_surface_id); 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool discard_alpha = false; 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExactPixelComparator pixel_comparator(discard_alpha); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderPassList* pass_list = 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &aggregated_frame->delegated_frame_data->render_pass_list; 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(RunPixelTest(pass_list, 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("green.png")), 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pixel_comparator)); 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Draws a frame with simple surface embedding. 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(SurfacesPixelTest, DrawSimpleAggregatedFrame) { 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size child_size(200, 100); 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceId child_surface_id = allocator_.GenerateId(); 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceId root_surface_id = allocator_.GenerateId(); 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.Create(child_surface_id, child_size); 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.Create(root_surface_id, device_viewport_size_); 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect rect(device_viewport_size_); 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId id(1, 1); 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<RenderPass> pass = RenderPass::Create(); 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pass->SetNew(id, rect, rect, gfx::Transform()); 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CreateAndAppendTestSharedQuadState( 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pass.get(), gfx::Transform(), device_viewport_size_); 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceDrawQuad* surface_quad = 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) surface_quad->SetNew(pass->shared_quad_state_list.back(), 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect(child_size), 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(child_size), 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch child_surface_id); 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SolidColorDrawQuad* color_quad = 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool force_anti_aliasing_off = false; 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) color_quad->SetNew(pass->shared_quad_state_list.back(), 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rect, 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rect, 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SK_ColorYELLOW, 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) force_anti_aliasing_off); 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData); 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegated_frame_data->render_pass_list.push_back(pass.Pass()); 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_frame->delegated_frame_data = delegated_frame_data.Pass(); 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory_.SubmitFrame(root_surface_id, root_frame.Pass(), base::Closure()); 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect rect(child_size); 14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId id(1, 1); 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<RenderPass> pass = RenderPass::Create(); 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pass->SetNew(id, rect, rect, gfx::Transform()); 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CreateAndAppendTestSharedQuadState( 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pass.get(), gfx::Transform(), child_size); 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SolidColorDrawQuad* color_quad = 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool force_anti_aliasing_off = false; 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) color_quad->SetNew(pass->shared_quad_state_list.back(), 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rect, 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rect, 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SK_ColorBLUE, 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) force_anti_aliasing_off); 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData); 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegated_frame_data->render_pass_list.push_back(pass.Pass()); 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_frame->delegated_frame_data = delegated_frame_data.Pass(); 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory_.SubmitFrame(child_surface_id, child_frame.Pass(), base::Closure()); 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceAggregator aggregator(&manager_, resource_provider_.get()); 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<CompositorFrame> aggregated_frame = 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aggregator.Aggregate(root_surface_id); 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool discard_alpha = false; 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExactPixelComparator pixel_comparator(discard_alpha); 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderPassList* pass_list = 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &aggregated_frame->delegated_frame_data->render_pass_list; 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(RunPixelTest(pass_list, 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")), 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pixel_comparator)); 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.Destroy(root_surface_id); 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.Destroy(child_surface_id); 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tests a surface quad that has a non-identity transform into its pass. 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(SurfacesPixelTest, DrawAggregatedFrameWithSurfaceTransforms) { 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size child_size(100, 200); 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size quad_size(100, 100); 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Structure: 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // root (200x200) -> left_child (100x200 @ 0x0, 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // right_child (100x200 @ 0x100) 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // left_child -> top_green_quad (100x100 @ 0x0), 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // bottom_blue_quad (100x100 @ 0x100) 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // right_child -> top_blue_quad (100x100 @ 0x0), 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // bottom_green_quad (100x100 @ 0x100) 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceId left_child_id = allocator_.GenerateId(); 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceId right_child_id = allocator_.GenerateId(); 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceId root_surface_id = allocator_.GenerateId(); 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.Create(left_child_id, child_size); 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.Create(right_child_id, child_size); 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.Create(root_surface_id, device_viewport_size_); 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect rect(device_viewport_size_); 20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId id(1, 1); 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<RenderPass> pass = RenderPass::Create(); 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pass->SetNew(id, rect, rect, gfx::Transform()); 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Transform surface_transform; 214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CreateAndAppendTestSharedQuadState( 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pass.get(), surface_transform, device_viewport_size_); 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceDrawQuad* left_surface_quad = 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) left_surface_quad->SetNew(pass->shared_quad_state_list.back(), 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect(child_size), 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(child_size), 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch left_child_id); 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) surface_transform.Translate(100, 0); 225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CreateAndAppendTestSharedQuadState( 226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pass.get(), surface_transform, device_viewport_size_); 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceDrawQuad* right_surface_quad = 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) right_surface_quad->SetNew(pass->shared_quad_state_list.back(), 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect(child_size), 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(child_size), 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch right_child_id); 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData); 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegated_frame_data->render_pass_list.push_back(pass.Pass()); 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_frame->delegated_frame_data = delegated_frame_data.Pass(); 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory_.SubmitFrame(root_surface_id, root_frame.Pass(), base::Closure()); 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect rect(child_size); 24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId id(1, 1); 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<RenderPass> pass = RenderPass::Create(); 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pass->SetNew(id, rect, rect, gfx::Transform()); 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CreateAndAppendTestSharedQuadState( 251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pass.get(), gfx::Transform(), child_size); 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SolidColorDrawQuad* top_color_quad = 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool force_anti_aliasing_off = false; 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) top_color_quad->SetNew(pass->shared_quad_state_list.back(), 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect(quad_size), 258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(quad_size), 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SK_ColorGREEN, 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) force_anti_aliasing_off); 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SolidColorDrawQuad* bottom_color_quad = 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bottom_color_quad->SetNew(pass->shared_quad_state_list.back(), 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect(0, 100, 100, 100), 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(0, 100, 100, 100), 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SK_ColorBLUE, 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) force_anti_aliasing_off); 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData); 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegated_frame_data->render_pass_list.push_back(pass.Pass()); 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_frame->delegated_frame_data = delegated_frame_data.Pass(); 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory_.SubmitFrame(left_child_id, child_frame.Pass(), base::Closure()); 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect rect(child_size); 28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId id(1, 1); 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<RenderPass> pass = RenderPass::Create(); 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pass->SetNew(id, rect, rect, gfx::Transform()); 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CreateAndAppendTestSharedQuadState( 286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pass.get(), gfx::Transform(), child_size); 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SolidColorDrawQuad* top_color_quad = 289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool force_anti_aliasing_off = false; 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) top_color_quad->SetNew(pass->shared_quad_state_list.back(), 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect(quad_size), 293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(quad_size), 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SK_ColorBLUE, 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) force_anti_aliasing_off); 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SolidColorDrawQuad* bottom_color_quad = 298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bottom_color_quad->SetNew(pass->shared_quad_state_list.back(), 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect(0, 100, 100, 100), 301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(0, 100, 100, 100), 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SK_ColorGREEN, 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) force_anti_aliasing_off); 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData); 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegated_frame_data->render_pass_list.push_back(pass.Pass()); 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_frame->delegated_frame_data = delegated_frame_data.Pass(); 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory_.SubmitFrame(right_child_id, child_frame.Pass(), base::Closure()); 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceAggregator aggregator(&manager_, resource_provider_.get()); 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<CompositorFrame> aggregated_frame = 3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aggregator.Aggregate(root_surface_id); 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool discard_alpha = false; 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExactPixelComparator pixel_comparator(discard_alpha); 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderPassList* pass_list = 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &aggregated_frame->delegated_frame_data->render_pass_list; 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(RunPixelTest( 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pass_list, 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")), 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pixel_comparator)); 326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.Destroy(root_surface_id); 328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.Destroy(left_child_id); 329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.Destroy(right_child_id); 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace cc 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // !defined(OS_ANDROID) 336