1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/file_util.h" 6 #include "cc/output/gl_renderer.h" 7 #include "cc/output/software_renderer.h" 8 #include "cc/quads/render_pass.h" 9 #include "cc/test/pixel_comparator.h" 10 #include "testing/gtest/include/gtest/gtest.h" 11 #include "ui/gfx/size.h" 12 #include "ui/gl/gl_implementation.h" 13 14 #ifndef CC_TEST_PIXEL_TEST_H_ 15 #define CC_TEST_PIXEL_TEST_H_ 16 17 namespace cc { 18 class CopyOutputResult; 19 class DirectRenderer; 20 class FakeOutputSurfaceClient; 21 class OutputSurface; 22 class ResourceProvider; 23 class SoftwareRenderer; 24 class SharedBitmapManager; 25 26 class PixelTest : public testing::Test, RendererClient { 27 protected: 28 PixelTest(); 29 virtual ~PixelTest(); 30 31 bool RunPixelTest(RenderPassList* pass_list, 32 const base::FilePath& ref_file, 33 const PixelComparator& comparator); 34 35 bool RunPixelTestWithReadbackTarget( 36 RenderPassList* pass_list, 37 RenderPass* target, 38 const base::FilePath& ref_file, 39 const PixelComparator& comparator); 40 41 LayerTreeSettings settings_; 42 gfx::Size device_viewport_size_; 43 bool disable_picture_quad_image_filtering_; 44 class PixelTestRendererClient; 45 scoped_ptr<FakeOutputSurfaceClient> output_surface_client_; 46 scoped_ptr<OutputSurface> output_surface_; 47 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 48 scoped_ptr<ResourceProvider> resource_provider_; 49 scoped_ptr<TextureMailboxDeleter> texture_mailbox_deleter_; 50 scoped_ptr<DirectRenderer> renderer_; 51 scoped_ptr<SkBitmap> result_bitmap_; 52 gfx::Vector2d external_device_viewport_offset_; 53 gfx::Rect external_device_clip_rect_; 54 55 void SetUpGLRenderer(bool use_skia_gpu_backend); 56 void SetUpSoftwareRenderer(); 57 58 void ForceExpandedViewport(const gfx::Size& surface_expansion); 59 void ForceViewportOffset(const gfx::Vector2d& viewport_offset); 60 void ForceDeviceClip(const gfx::Rect& clip); 61 void EnableExternalStencilTest(); 62 63 // RendererClient implementation. 64 virtual void SetFullRootLayerDamage() OVERRIDE {} 65 virtual void RunOnDemandRasterTask(Task* on_demand_raster_task) OVERRIDE; 66 67 private: 68 void ReadbackResult(base::Closure quit_run_loop, 69 scoped_ptr<CopyOutputResult> result); 70 71 bool PixelsMatchReference(const base::FilePath& ref_file, 72 const PixelComparator& comparator); 73 74 scoped_ptr<gfx::DisableNullDrawGLBindings> enable_pixel_output_; 75 }; 76 77 template<typename RendererType> 78 class RendererPixelTest : public PixelTest { 79 public: 80 RendererType* renderer() { 81 return static_cast<RendererType*>(renderer_.get()); 82 } 83 84 bool UseSkiaGPUBackend() const; 85 bool ExpandedViewport() const; 86 87 protected: 88 virtual void SetUp() OVERRIDE; 89 }; 90 91 // Wrappers to differentiate renderers where the the output surface and viewport 92 // have an externally determined size and offset. 93 class GLRendererWithExpandedViewport : public GLRenderer { 94 public: 95 GLRendererWithExpandedViewport(RendererClient* client, 96 const LayerTreeSettings* settings, 97 OutputSurface* output_surface, 98 ResourceProvider* resource_provider, 99 TextureMailboxDeleter* texture_mailbox_deleter, 100 int highp_threshold_min) 101 : GLRenderer(client, 102 settings, 103 output_surface, 104 resource_provider, 105 texture_mailbox_deleter, 106 highp_threshold_min) {} 107 }; 108 109 class SoftwareRendererWithExpandedViewport : public SoftwareRenderer { 110 public: 111 SoftwareRendererWithExpandedViewport(RendererClient* client, 112 const LayerTreeSettings* settings, 113 OutputSurface* output_surface, 114 ResourceProvider* resource_provider) 115 : SoftwareRenderer(client, settings, output_surface, resource_provider) {} 116 }; 117 118 template<> 119 inline void RendererPixelTest<GLRenderer>::SetUp() { 120 SetUpGLRenderer(false); 121 } 122 123 template<> 124 inline bool RendererPixelTest<GLRenderer>::UseSkiaGPUBackend() const { 125 return false; 126 } 127 128 template<> 129 inline bool RendererPixelTest<GLRenderer>::ExpandedViewport() const { 130 return false; 131 } 132 133 template<> 134 inline void RendererPixelTest<GLRendererWithExpandedViewport>::SetUp() { 135 SetUpGLRenderer(false); 136 ForceExpandedViewport(gfx::Size(50, 50)); 137 ForceViewportOffset(gfx::Vector2d(10, 20)); 138 } 139 140 template <> 141 inline bool 142 RendererPixelTest<GLRendererWithExpandedViewport>::UseSkiaGPUBackend() const { 143 return false; 144 } 145 146 template <> 147 inline bool 148 RendererPixelTest<GLRendererWithExpandedViewport>::ExpandedViewport() const { 149 return true; 150 } 151 152 template<> 153 inline void RendererPixelTest<SoftwareRenderer>::SetUp() { 154 SetUpSoftwareRenderer(); 155 } 156 157 template<> 158 inline bool RendererPixelTest<SoftwareRenderer>::UseSkiaGPUBackend() const { 159 return false; 160 } 161 162 template <> 163 inline bool RendererPixelTest<SoftwareRenderer>::ExpandedViewport() const { 164 return false; 165 } 166 167 template<> 168 inline void RendererPixelTest<SoftwareRendererWithExpandedViewport>::SetUp() { 169 SetUpSoftwareRenderer(); 170 ForceExpandedViewport(gfx::Size(50, 50)); 171 ForceViewportOffset(gfx::Vector2d(10, 20)); 172 } 173 174 template <> 175 inline bool RendererPixelTest< 176 SoftwareRendererWithExpandedViewport>::UseSkiaGPUBackend() const { 177 return false; 178 } 179 180 template <> 181 inline bool RendererPixelTest< 182 SoftwareRendererWithExpandedViewport>::ExpandedViewport() const { 183 return true; 184 } 185 186 typedef RendererPixelTest<GLRenderer> GLRendererPixelTest; 187 typedef RendererPixelTest<SoftwareRenderer> SoftwareRendererPixelTest; 188 189 } // namespace cc 190 191 #endif // CC_TEST_PIXEL_TEST_H_ 192