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