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; 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class FakeOutputSurfaceClient; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OutputSurface; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceProvider; 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class SoftwareRenderer; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class PixelTest : public testing::Test, RendererClient { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PixelTest(); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~PixelTest(); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) enum OffscreenContextOption { 30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) NoOffscreenContext, 31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) WithOffscreenContext 32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) }; 33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool RunPixelTest(RenderPassList* pass_list, 35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) OffscreenContextOption provide_offscreen_context, 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& ref_file, 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const PixelComparator& comparator); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool RunPixelTestWithReadbackTarget( 40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderPassList* pass_list, 41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderPass* target, 42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) OffscreenContextOption provide_offscreen_context, 43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const base::FilePath& ref_file, 44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const PixelComparator& comparator); 45b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeSettings settings_; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size device_viewport_size_; 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool disable_picture_quad_image_filtering_; 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) class PixelTestRendererClient; 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<FakeOutputSurfaceClient> output_surface_client_; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OutputSurface> output_surface_; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourceProvider> resource_provider_; 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<TextureMailboxDeleter> texture_mailbox_deleter_; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<DirectRenderer> renderer_; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<SkBitmap> result_bitmap_; 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Vector2d external_device_viewport_offset_; 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect external_device_clip_rect_; 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetUpGLRenderer(bool use_skia_gpu_backend); 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetUpSoftwareRenderer(); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void ForceExpandedViewport(gfx::Size surface_expansion); 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void ForceViewportOffset(gfx::Vector2d viewport_offset); 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ForceDeviceClip(gfx::Rect clip); 65fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch void EnableExternalStencilTest(); 66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // RendererClient implementation. 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SetFullRootLayerDamage() OVERRIDE {} 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void ReadbackResult(base::Closure quit_run_loop, 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<CopyOutputResult> result); 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool PixelsMatchReference(const base::FilePath& ref_file, 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const PixelComparator& comparator); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<typename RendererType> 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RendererPixelTest : public PixelTest { 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RendererType* renderer() { 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return static_cast<RendererType*>(renderer_.get()); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool UseSkiaGPUBackend() const; 86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool ExpandedViewport() const; 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE; 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Wrappers to differentiate renderers where the the output surface and viewport 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// have an externally determined size and offset. 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class GLRendererWithExpandedViewport : public GLRenderer { 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GLRendererWithExpandedViewport(RendererClient* client, 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const LayerTreeSettings* settings, 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OutputSurface* output_surface, 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ResourceProvider* resource_provider, 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TextureMailboxDeleter* texture_mailbox_deleter, 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int highp_threshold_min) 102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : GLRenderer(client, 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings, 104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) output_surface, 105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) resource_provider, 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) texture_mailbox_deleter, 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) highp_threshold_min) {} 108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class SoftwareRendererWithExpandedViewport : public SoftwareRenderer { 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SoftwareRendererWithExpandedViewport(RendererClient* client, 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const LayerTreeSettings* settings, 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OutputSurface* output_surface, 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ResourceProvider* resource_provider) 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : SoftwareRenderer(client, settings, output_surface, resource_provider) {} 117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<> 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline void RendererPixelTest<GLRenderer>::SetUp() { 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetUpGLRenderer(false); 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<> 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)inline bool RendererPixelTest<GLRenderer>::UseSkiaGPUBackend() const { 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<> 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest<GLRenderer>::ExpandedViewport() const { 131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template<> 135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline void RendererPixelTest<GLRendererWithExpandedViewport>::SetUp() { 136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetUpGLRenderer(false); 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ForceExpandedViewport(gfx::Size(50, 50)); 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ForceViewportOffset(gfx::Vector2d(10, 20)); 139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool 143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RendererPixelTest<GLRendererWithExpandedViewport>::UseSkiaGPUBackend() const { 144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool 149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RendererPixelTest<GLRendererWithExpandedViewport>::ExpandedViewport() const { 150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<> 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline void RendererPixelTest<SoftwareRenderer>::SetUp() { 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetUpSoftwareRenderer(); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<> 15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)inline bool RendererPixelTest<SoftwareRenderer>::UseSkiaGPUBackend() const { 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest<SoftwareRenderer>::ExpandedViewport() const { 165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template<> 169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline void RendererPixelTest<SoftwareRendererWithExpandedViewport>::SetUp() { 170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetUpSoftwareRenderer(); 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ForceExpandedViewport(gfx::Size(50, 50)); 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ForceViewportOffset(gfx::Vector2d(10, 20)); 173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest< 177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SoftwareRendererWithExpandedViewport>::UseSkiaGPUBackend() const { 178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest< 183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SoftwareRendererWithExpandedViewport>::ExpandedViewport() const { 184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef RendererPixelTest<GLRenderer> GLRendererPixelTest; 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef RendererPixelTest<SoftwareRenderer> SoftwareRendererPixelTest; 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_TEST_PIXEL_TEST_H_ 193