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