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/output/software_renderer.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/quad_sink.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame_metadata.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/software_output_device.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/render_pass.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/render_pass_draw_quad.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/solid_color_draw_quad.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/tile_draw_quad.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/animation_test_common.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h"
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_output_surface_client.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_common.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_utils.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/skia/include/core/SkDevice.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SoftwareRendererTest : public testing::Test, public RendererClient {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void InitializeRenderer(
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      scoped_ptr<SoftwareOutputDevice> software_output_device) {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    output_surface_ = FakeOutputSurface::CreateSoftware(
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        software_output_device.Pass());
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    CHECK(output_surface_->BindToClient(&output_surface_client_));
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    resource_provider_ =
370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        ResourceProvider::Create(output_surface_.get(), NULL, 0, false, 1);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    renderer_ = SoftwareRenderer::Create(
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        this, &settings_, output_surface_.get(), resource_provider());
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceProvider* resource_provider() const {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return resource_provider_.get();
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SoftwareRenderer* renderer() const { return renderer_.get(); }
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RendererClient implementation.
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetFullRootLayerDamage() OVERRIDE {}
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeSettings settings_;
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client_;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeOutputSurface> output_surface_;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ResourceProvider> resource_provider_;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SoftwareRenderer> renderer_;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SoftwareRendererTest, SolidColorQuad) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size outer_size(100, 100);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size inner_size(98, 98);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect outer_rect(outer_size);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect inner_rect(gfx::Point(1, 1), inner_size);
64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Rect visible_rect(gfx::Point(1, 2), gfx::Size(98, 97));
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice));
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create();
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shared_quad_state->SetAll(gfx::Transform(),
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            outer_size,
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            outer_rect,
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            outer_rect,
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            false,
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            1.0,
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            SkXfermode::kSrcOver_Mode);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create();
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_render_pass->SetNew(
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      root_render_pass_id, outer_rect, outer_rect, gfx::Transform());
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> outer_quad = SolidColorDrawQuad::Create();
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  outer_quad->SetNew(
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      shared_quad_state.get(), outer_rect, SK_ColorYELLOW, false);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> inner_quad = SolidColorDrawQuad::Create();
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  inner_quad->SetNew(shared_quad_state.get(), inner_rect, SK_ColorCYAN, false);
85424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  inner_quad->visible_rect = visible_rect;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>());
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>());
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPassList list;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  list.push_back(root_render_pass.PassAs<RenderPass>());
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  float device_scale_factor = 1.f;
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect device_viewport_rect(outer_size);
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer()->DrawFrame(&list,
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        NULL,
96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        device_scale_factor,
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        device_viewport_rect,
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        device_viewport_rect,
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        true,
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        false);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  SkBitmap output;
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  output.setConfig(
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      SkBitmap::kARGB_8888_Config, outer_rect.width(), outer_rect.height());
105b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  output.allocPixels();
106b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  renderer()->GetFramebufferPixels(output.getPixels(), outer_rect);
107b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
108b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0));
109b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(SK_ColorYELLOW,
110b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            output.getColor(outer_size.width() - 1, outer_size.height() - 1));
111424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(SK_ColorYELLOW, output.getColor(1, 1));
112424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 2));
113b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(SK_ColorCYAN,
114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            output.getColor(inner_size.width() - 1, inner_size.height() - 1));
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SoftwareRendererTest, TileQuad) {
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size outer_size(100, 100);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size inner_size(98, 98);
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect outer_rect(outer_size);
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect inner_rect(gfx::Point(1, 1), inner_size);
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice));
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceProvider::ResourceId resource_yellow =
125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      resource_provider()->CreateResource(outer_size,
126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                          GL_CLAMP_TO_EDGE,
127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                          ResourceProvider::TextureUsageAny,
128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                          RGBA_8888);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceProvider::ResourceId resource_cyan =
130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      resource_provider()->CreateResource(inner_size,
131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                          GL_CLAMP_TO_EDGE,
132d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                          ResourceProvider::TextureUsageAny,
133d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                          RGBA_8888);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  SkBitmap yellow_tile;
136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  yellow_tile.setConfig(
137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      SkBitmap::kARGB_8888_Config, outer_size.width(), outer_size.height());
138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  yellow_tile.allocPixels();
139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  yellow_tile.eraseColor(SK_ColorYELLOW);
140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
141b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  SkBitmap cyan_tile;
142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  cyan_tile.setConfig(
143b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      SkBitmap::kARGB_8888_Config, inner_size.width(), inner_size.height());
144b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  cyan_tile.allocPixels();
145b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  cyan_tile.eraseColor(SK_ColorCYAN);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource_provider()->SetPixels(
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource_yellow,
149b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      static_cast<uint8_t*>(yellow_tile.getPixels()),
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect(outer_size),
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect(outer_size),
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Vector2d());
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource_provider()->SetPixels(resource_cyan,
154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                 static_cast<uint8_t*>(cyan_tile.getPixels()),
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 gfx::Rect(inner_size),
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 gfx::Rect(inner_size),
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 gfx::Vector2d());
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect root_rect = outer_rect;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create();
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shared_quad_state->SetAll(gfx::Transform(),
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            outer_size,
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            outer_rect,
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            outer_rect,
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            false,
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            1.0,
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            SkXfermode::kSrcOver_Mode);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create();
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_render_pass->SetNew(
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      root_render_pass_id, root_rect, root_rect, gfx::Transform());
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TileDrawQuad> outer_quad = TileDrawQuad::Create();
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  outer_quad->SetNew(shared_quad_state.get(),
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     outer_rect,
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     outer_rect,
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     resource_yellow,
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     gfx::RectF(outer_size),
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     outer_size,
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     false);
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TileDrawQuad> inner_quad = TileDrawQuad::Create();
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  inner_quad->SetNew(shared_quad_state.get(),
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     inner_rect,
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     inner_rect,
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     resource_cyan,
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     gfx::RectF(inner_size),
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     inner_size,
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     false);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>());
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>());
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPassList list;
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  list.push_back(root_render_pass.PassAs<RenderPass>());
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  float device_scale_factor = 1.f;
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect device_viewport_rect(outer_size);
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer()->DrawFrame(&list,
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        NULL,
199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        device_scale_factor,
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        device_viewport_rect,
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        device_viewport_rect,
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        true,
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        false);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
205b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  SkBitmap output;
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  output.setConfig(
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      SkBitmap::kARGB_8888_Config, outer_size.width(), outer_size.height());
208b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  output.allocPixels();
209b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  renderer()->GetFramebufferPixels(output.getPixels(), outer_rect);
210b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
211b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0));
212b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(SK_ColorYELLOW,
213b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            output.getColor(outer_size.width() - 1, outer_size.height() - 1));
214b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 1));
215b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(SK_ColorCYAN,
216b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            output.getColor(inner_size.width() - 1, inner_size.height() - 1));
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
219424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(SoftwareRendererTest, TileQuadVisibleRect) {
220424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Size tile_size(100, 100);
221424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Rect tile_rect(tile_size);
222424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Rect visible_rect = tile_rect;
223424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  visible_rect.Inset(1, 2, 3, 4);
224424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice));
225424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
226424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ResourceProvider::ResourceId resource_cyan =
227d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      resource_provider()->CreateResource(tile_size,
228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                          GL_CLAMP_TO_EDGE,
229d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                          ResourceProvider::TextureUsageAny,
230d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                          RGBA_8888);
231424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
232424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SkBitmap cyan_tile;  // The lowest five rows are yellow.
233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  cyan_tile.setConfig(
234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      SkBitmap::kARGB_8888_Config, tile_size.width(), tile_size.height());
235424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  cyan_tile.allocPixels();
236424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  cyan_tile.eraseColor(SK_ColorCYAN);
237424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  cyan_tile.eraseArea(
238424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      SkIRect::MakeLTRB(
239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          0, visible_rect.bottom() - 1, tile_rect.width(), tile_rect.bottom()),
240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      SK_ColorYELLOW);
241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  resource_provider()->SetPixels(resource_cyan,
243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                 static_cast<uint8_t*>(cyan_tile.getPixels()),
244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                 gfx::Rect(tile_size),
245424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                 gfx::Rect(tile_size),
246424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                 gfx::Vector2d());
247424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect root_rect(tile_size);
249424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
250424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create();
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shared_quad_state->SetAll(gfx::Transform(),
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            tile_size,
253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            tile_rect,
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            tile_rect,
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            false,
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            1.0,
257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            SkXfermode::kSrcOver_Mode);
258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1);
259424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create();
260424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  root_render_pass->SetNew(
261424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      root_render_pass_id, root_rect, root_rect, gfx::Transform());
262424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<TileDrawQuad> quad = TileDrawQuad::Create();
263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  quad->SetNew(shared_quad_state.get(),
264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)               tile_rect,
265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)               tile_rect,
266424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)               resource_cyan,
267424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)               gfx::RectF(tile_size),
268424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)               tile_size,
269424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)               false);
270424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  quad->visible_rect = visible_rect;
271424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  root_render_pass->AppendQuad(quad.PassAs<DrawQuad>());
272424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
273424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RenderPassList list;
274424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  list.push_back(root_render_pass.PassAs<RenderPass>());
27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  float device_scale_factor = 1.f;
277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect device_viewport_rect(tile_size);
278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer()->DrawFrame(&list,
279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        NULL,
280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        device_scale_factor,
281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        device_viewport_rect,
282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        device_viewport_rect,
283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        true,
284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        false);
285424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
286424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SkBitmap output;
287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  output.setConfig(
288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      SkBitmap::kARGB_8888_Config, tile_size.width(), tile_size.height());
289424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  output.allocPixels();
290424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  renderer()->GetFramebufferPixels(output.getPixels(), tile_rect);
291424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
292424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Check portion of tile not in visible rect isn't drawn.
293424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const unsigned int kTransparent = SK_ColorTRANSPARENT;
294424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(kTransparent, output.getColor(0, 0));
295424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(kTransparent,
296424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            output.getColor(tile_rect.width() - 1, tile_rect.height() - 1));
297424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(kTransparent,
298424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            output.getColor(visible_rect.x() - 1, visible_rect.y() - 1));
299424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(kTransparent,
300424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            output.getColor(visible_rect.right(), visible_rect.bottom()));
301424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Ensure visible part is drawn correctly.
302424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(SK_ColorCYAN, output.getColor(visible_rect.x(), visible_rect.y()));
303424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(
304424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      SK_ColorCYAN,
305424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      output.getColor(visible_rect.right() - 2, visible_rect.bottom() - 2));
306424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Ensure last visible line is correct.
307424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(
308424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      SK_ColorYELLOW,
309424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      output.getColor(visible_rect.right() - 1, visible_rect.bottom() - 1));
310424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
311424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) {
31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  float device_scale_factor = 1.f;
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect viewport_rect(0, 0, 100, 100);
31558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
31658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  settings_.should_clear_root_render_pass = false;
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice));
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPassList list;
320b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
321b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  SkBitmap output;
322b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  output.setConfig(SkBitmap::kARGB_8888_Config,
323b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                   viewport_rect.width(),
324b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                   viewport_rect.height());
325b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  output.allocPixels();
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Draw a fullscreen green quad in a first frame.
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPass::Id root_clear_pass_id(1, 0);
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestRenderPass* root_clear_pass = AddRenderPass(
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &list, root_clear_pass_id, viewport_rect, gfx::Transform());
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN);
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderer()->DecideRenderPassAllocationsForFrame(list);
334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer()->DrawFrame(&list,
335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        NULL,
336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        device_scale_factor,
337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        viewport_rect,
338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        viewport_rect,
339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        true,
340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        false);
341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect);
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
343b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0));
344b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(SK_ColorGREEN,
345b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1));
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  list.clear();
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Draw a smaller magenta rect without filling the viewport in a separate
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // frame.
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect smaller_rect(20, 20, 60, 60);
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderPass::Id root_smaller_pass_id(2, 0);
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestRenderPass* root_smaller_pass = AddRenderPass(
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &list, root_smaller_pass_id, viewport_rect, gfx::Transform());
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddQuad(root_smaller_pass, smaller_rect, SK_ColorMAGENTA);
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderer()->DecideRenderPassAllocationsForFrame(list);
359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer()->DrawFrame(&list,
360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        NULL,
361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        device_scale_factor,
362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        viewport_rect,
363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        viewport_rect,
364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        true,
365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        false);
366b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect);
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we didn't clear, the borders should still be green.
369b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0));
370b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(SK_ColorGREEN,
371b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1));
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(SK_ColorMAGENTA,
374b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            output.getColor(smaller_rect.x(), smaller_rect.y()));
375b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(SK_ColorMAGENTA,
376b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1));
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
379424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(SoftwareRendererTest, RenderPassVisibleRect) {
38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  float device_scale_factor = 1.f;
381424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Rect viewport_rect(0, 0, 100, 100);
382424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice));
383424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
384424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RenderPassList list;
385424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
386424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SkBitmap output;
387424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  output.setConfig(SkBitmap::kARGB_8888_Config,
388424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                   viewport_rect.width(),
389424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                   viewport_rect.height());
390424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  output.allocPixels();
391424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
392424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Pass drawn as inner quad is magenta.
393424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Rect smaller_rect(20, 20, 60, 60);
394424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RenderPass::Id smaller_pass_id(2, 1);
395424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  TestRenderPass* smaller_pass =
396424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      AddRenderPass(&list, smaller_pass_id, smaller_rect, gfx::Transform());
397424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  AddQuad(smaller_pass, smaller_rect, SK_ColorMAGENTA);
398424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
399424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Root pass is green.
400424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RenderPass::Id root_clear_pass_id(1, 0);
401424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  TestRenderPass* root_clear_pass =
402424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      AddRenderPass(&list, root_clear_pass_id, viewport_rect, gfx::Transform());
403424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  AddRenderPassQuad(root_clear_pass, smaller_pass);
404424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN);
405424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
406424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Interior pass quad has smaller visible rect.
407424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Rect interior_visible_rect(30, 30, 40, 40);
408424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  root_clear_pass->quad_list[0]->visible_rect = interior_visible_rect;
409424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
410424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  renderer()->DecideRenderPassAllocationsForFrame(list);
411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer()->DrawFrame(&list,
412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        NULL,
413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        device_scale_factor,
414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        viewport_rect,
415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        viewport_rect,
416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        true,
417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        false);
418424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect);
419424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
420424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0));
421424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(
422424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      SK_ColorGREEN,
423424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1));
424424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
425424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Part outside visible rect should remain green.
426424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(SK_ColorGREEN, output.getColor(smaller_rect.x(), smaller_rect.y()));
427424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(
428424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      SK_ColorGREEN,
429424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1));
430424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
431424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(
432424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      SK_ColorMAGENTA,
433424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      output.getColor(interior_visible_rect.x(), interior_visible_rect.y()));
434424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(SK_ColorMAGENTA,
435424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            output.getColor(interior_visible_rect.right() - 1,
436424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                            interior_visible_rect.bottom() - 1));
437424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
438424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
441