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