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) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/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" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gl/gl_implementation.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_TEST_PIXEL_TEST_H_ 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_TEST_PIXEL_TEST_H_ 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class CopyOutputResult; 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DirectRenderer; 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class FakeOutputSurfaceClient; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OutputSurface; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceProvider; 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class SoftwareRenderer; 2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class SharedBitmapManager; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class PixelTest : public testing::Test, RendererClient { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PixelTest(); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~PixelTest(); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool RunPixelTest(RenderPassList* pass_list, 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& ref_file, 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const PixelComparator& comparator); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool RunPixelTestWithReadbackTarget( 36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderPassList* pass_list, 37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderPass* target, 38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const base::FilePath& ref_file, 39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const PixelComparator& comparator); 40b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeSettings settings_; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size device_viewport_size_; 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool disable_picture_quad_image_filtering_; 44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) class PixelTestRendererClient; 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<FakeOutputSurfaceClient> output_surface_client_; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OutputSurface> output_surface_; 4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<BlockingTaskRunner> main_thread_task_runner_; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourceProvider> resource_provider_; 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<TextureMailboxDeleter> texture_mailbox_deleter_; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<DirectRenderer> renderer_; 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<SkBitmap> result_bitmap_; 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Vector2d external_device_viewport_offset_; 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect external_device_clip_rect_; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetUpGLRenderer(bool use_skia_gpu_backend); 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetUpSoftwareRenderer(); 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ForceExpandedViewport(const gfx::Size& surface_expansion); 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ForceViewportOffset(const gfx::Vector2d& viewport_offset); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ForceDeviceClip(const gfx::Rect& clip); 62fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch void EnableExternalStencilTest(); 63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // RendererClient implementation. 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SetFullRootLayerDamage() OVERRIDE {} 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void ReadbackResult(base::Closure quit_run_loop, 697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<CopyOutputResult> result); 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool PixelsMatchReference(const base::FilePath& ref_file, 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const PixelComparator& comparator); 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<gfx::DisableNullDrawGLBindings> enable_pixel_output_; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<typename RendererType> 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RendererPixelTest : public PixelTest { 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RendererType* renderer() { 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return static_cast<RendererType*>(renderer_.get()); 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool UseSkiaGPUBackend() const; 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool ExpandedViewport() const; 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE; 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Wrappers to differentiate renderers where the the output surface and viewport 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// have an externally determined size and offset. 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class GLRendererWithExpandedViewport : public GLRenderer { 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GLRendererWithExpandedViewport(RendererClient* client, 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const LayerTreeSettings* settings, 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OutputSurface* output_surface, 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ResourceProvider* resource_provider, 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TextureMailboxDeleter* texture_mailbox_deleter, 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int highp_threshold_min) 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : GLRenderer(client, 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings, 103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) output_surface, 104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) resource_provider, 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) texture_mailbox_deleter, 106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) highp_threshold_min) {} 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class SoftwareRendererWithExpandedViewport : public SoftwareRenderer { 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SoftwareRendererWithExpandedViewport(RendererClient* client, 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const LayerTreeSettings* settings, 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OutputSurface* output_surface, 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ResourceProvider* resource_provider) 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : SoftwareRenderer(client, settings, output_surface, resource_provider) {} 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<> 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline void RendererPixelTest<GLRenderer>::SetUp() { 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetUpGLRenderer(false); 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<> 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)inline bool RendererPixelTest<GLRenderer>::UseSkiaGPUBackend() const { 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<> 129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest<GLRenderer>::ExpandedViewport() const { 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template<> 134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline void RendererPixelTest<GLRendererWithExpandedViewport>::SetUp() { 135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetUpGLRenderer(false); 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ForceExpandedViewport(gfx::Size(50, 50)); 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ForceViewportOffset(gfx::Vector2d(10, 20)); 138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RendererPixelTest<GLRendererWithExpandedViewport>::UseSkiaGPUBackend() const { 143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool 148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RendererPixelTest<GLRendererWithExpandedViewport>::ExpandedViewport() const { 149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<> 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline void RendererPixelTest<SoftwareRenderer>::SetUp() { 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetUpSoftwareRenderer(); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<> 15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)inline bool RendererPixelTest<SoftwareRenderer>::UseSkiaGPUBackend() const { 15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest<SoftwareRenderer>::ExpandedViewport() const { 164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template<> 168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline void RendererPixelTest<SoftwareRendererWithExpandedViewport>::SetUp() { 169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetUpSoftwareRenderer(); 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ForceExpandedViewport(gfx::Size(50, 50)); 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ForceViewportOffset(gfx::Vector2d(10, 20)); 172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest< 176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SoftwareRendererWithExpandedViewport>::UseSkiaGPUBackend() const { 177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <> 181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)inline bool RendererPixelTest< 182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SoftwareRendererWithExpandedViewport>::ExpandedViewport() const { 183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef RendererPixelTest<GLRenderer> GLRendererPixelTest; 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef RendererPixelTest<SoftwareRenderer> SoftwareRendererPixelTest; 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_TEST_PIXEL_TEST_H_ 192