12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 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 "base/file_util.h" 690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/output/gl_renderer.h" 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/output/software_renderer.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/quads/render_pass.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/pixel_comparator.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_TEST_PIXEL_TEST_H_ 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_TEST_PIXEL_TEST_H_ 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class CopyOutputResult; 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DirectRenderer; 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SoftwareRenderer; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OutputSurface; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceProvider; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PixelTest : public testing::Test { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PixelTest(); 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~PixelTest(); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool RunPixelTest(RenderPassList* pass_list, 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& ref_file, 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const PixelComparator& comparator); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool RunPixelTestWithReadbackTarget(RenderPassList* pass_list, 33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) RenderPass* target, 34b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const base::FilePath& ref_file, 35b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const PixelComparator& comparator); 36b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size device_viewport_size_; 3874e8edfcf043ca9542cfaea3aa69e6bb2e1054baAlexandre Elias bool disable_picture_quad_image_filtering_; 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) class PixelTestRendererClient; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OutputSurface> output_surface_; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourceProvider> resource_provider_; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<PixelTestRendererClient> fake_client_; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<DirectRenderer> renderer_; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<SkBitmap> result_bitmap_; 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetUpGLRenderer(bool use_skia_gpu_backend); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetUpSoftwareRenderer(); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void ForceExpandedViewport(gfx::Size surface_expansion, 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gfx::Vector2d viewport_offset); 51fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch void EnableExternalStencilTest(); 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void ReadbackResult(base::Closure quit_run_loop, 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<CopyOutputResult> result); 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool PixelsMatchReference(const base::FilePath& ref_file, 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const PixelComparator& comparator); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<typename RendererType> 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RendererPixelTest : public PixelTest { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RendererType* renderer() { 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return static_cast<RendererType*>(renderer_.get()); 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool UseSkiaGPUBackend() const; 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool ExpandedViewport() const; 7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE; 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// A simple wrapper to differentiate a renderer that should use ganesh 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// and one that shouldn't in templates. 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class GLRendererWithSkiaGPUBackend : public GLRenderer { 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GLRendererWithSkiaGPUBackend(RendererClient* client, 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OutputSurface* output_surface, 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ResourceProvider* resource_provider, 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int highp_threshold_min) 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : GLRenderer(client, 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) output_surface, 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) resource_provider, 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) highp_threshold_min) {} 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Wrappers to differentiate renderers where the the output surface and viewport 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// have an externally determined size and offset. 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class GLRendererWithExpandedViewport : public GLRenderer { 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GLRendererWithExpandedViewport(RendererClient* client, 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OutputSurface* output_surface, 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ResourceProvider* resource_provider, 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int highp_threshold_min) 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : GLRenderer(client, 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) output_surface, 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) resource_provider, 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) highp_threshold_min) {} 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class SoftwareRendererWithExpandedViewport : public SoftwareRenderer { 104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SoftwareRendererWithExpandedViewport(RendererClient* client, 106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OutputSurface* output_surface, 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ResourceProvider* resource_provider) 108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : SoftwareRenderer(client, 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) output_surface, 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) resource_provider) {} 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<> 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline void RendererPixelTest<GLRenderer>::SetUp() { 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetUpGLRenderer(false); 11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!renderer()->CanUseSkiaGPUBackend()); 11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<> 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)inline bool RendererPixelTest<GLRenderer>::UseSkiaGPUBackend() const { 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<> 126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest<GLRenderer>::ExpandedViewport() const { 127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template<> 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)inline void RendererPixelTest<GLRendererWithSkiaGPUBackend>::SetUp() { 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetUpGLRenderer(true); 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(renderer()->CanUseSkiaGPUBackend()); 13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <> 13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)inline bool 13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)RendererPixelTest<GLRendererWithSkiaGPUBackend>::UseSkiaGPUBackend() const { 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest<GLRendererWithSkiaGPUBackend>::ExpandedViewport() 144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const { 145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template<> 149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline void RendererPixelTest<GLRendererWithExpandedViewport>::SetUp() { 150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetUpGLRenderer(false); 151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ForceExpandedViewport(gfx::Size(50, 50), gfx::Vector2d(10, 20)); 152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool 156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RendererPixelTest<GLRendererWithExpandedViewport>::UseSkiaGPUBackend() const { 157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool 162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RendererPixelTest<GLRendererWithExpandedViewport>::ExpandedViewport() const { 163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<> 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline void RendererPixelTest<SoftwareRenderer>::SetUp() { 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetUpSoftwareRenderer(); 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<> 17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)inline bool RendererPixelTest<SoftwareRenderer>::UseSkiaGPUBackend() const { 17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest<SoftwareRenderer>::ExpandedViewport() const { 178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template<> 182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline void RendererPixelTest<SoftwareRendererWithExpandedViewport>::SetUp() { 183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetUpSoftwareRenderer(); 184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ForceExpandedViewport(gfx::Size(50, 50), gfx::Vector2d(10, 20)); 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest< 189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SoftwareRendererWithExpandedViewport>::UseSkiaGPUBackend() const { 190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest< 195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SoftwareRendererWithExpandedViewport>::ExpandedViewport() const { 196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef RendererPixelTest<GLRenderer> GLRendererPixelTest; 20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef RendererPixelTest<GLRendererWithSkiaGPUBackend> 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GLRendererSkiaGPUBackendPixelTest; 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef RendererPixelTest<SoftwareRenderer> SoftwareRendererPixelTest; 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_TEST_PIXEL_TEST_H_ 207