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