// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/file_util.h" #include "cc/output/gl_renderer.h" #include "cc/output/software_renderer.h" #include "cc/quads/render_pass.h" #include "cc/test/pixel_comparator.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/size.h" #ifndef CC_TEST_PIXEL_TEST_H_ #define CC_TEST_PIXEL_TEST_H_ namespace cc { class CopyOutputResult; class DirectRenderer; class SoftwareRenderer; class OutputSurface; class ResourceProvider; class PixelTest : public testing::Test { protected: PixelTest(); virtual ~PixelTest(); enum OffscreenContextOption { NoOffscreenContext, WithOffscreenContext }; bool RunPixelTest(RenderPassList* pass_list, OffscreenContextOption provide_offscreen_context, const base::FilePath& ref_file, const PixelComparator& comparator); bool RunPixelTestWithReadbackTarget( RenderPassList* pass_list, RenderPass* target, OffscreenContextOption provide_offscreen_context, const base::FilePath& ref_file, const PixelComparator& comparator); LayerTreeSettings settings_; gfx::Size device_viewport_size_; class PixelTestRendererClient; scoped_ptr output_surface_; scoped_ptr resource_provider_; scoped_ptr texture_mailbox_deleter_; scoped_ptr fake_client_; scoped_ptr renderer_; scoped_ptr result_bitmap_; void SetUpGLRenderer(bool use_skia_gpu_backend); void SetUpSoftwareRenderer(); void ForceExpandedViewport(gfx::Size surface_expansion, gfx::Vector2d viewport_offset); void ForceDeviceClip(gfx::Rect clip); void EnableExternalStencilTest(); private: void ReadbackResult(base::Closure quit_run_loop, scoped_ptr result); bool PixelsMatchReference(const base::FilePath& ref_file, const PixelComparator& comparator); }; template class RendererPixelTest : public PixelTest { public: RendererType* renderer() { return static_cast(renderer_.get()); } bool UseSkiaGPUBackend() const; bool ExpandedViewport() const; protected: virtual void SetUp() OVERRIDE; }; // A simple wrapper to differentiate a renderer that should use ganesh // and one that shouldn't in templates. class GLRendererWithSkiaGPUBackend : public GLRenderer { public: GLRendererWithSkiaGPUBackend(RendererClient* client, const LayerTreeSettings* settings, OutputSurface* output_surface, ResourceProvider* resource_provider, TextureMailboxDeleter* texture_mailbox_deleter, int highp_threshold_min) : GLRenderer(client, settings, output_surface, resource_provider, texture_mailbox_deleter, highp_threshold_min) {} }; // Wrappers to differentiate renderers where the the output surface and viewport // have an externally determined size and offset. class GLRendererWithExpandedViewport : public GLRenderer { public: GLRendererWithExpandedViewport(RendererClient* client, const LayerTreeSettings* settings, OutputSurface* output_surface, ResourceProvider* resource_provider, TextureMailboxDeleter* texture_mailbox_deleter, int highp_threshold_min) : GLRenderer(client, settings, output_surface, resource_provider, texture_mailbox_deleter, highp_threshold_min) {} }; class SoftwareRendererWithExpandedViewport : public SoftwareRenderer { public: SoftwareRendererWithExpandedViewport(RendererClient* client, const LayerTreeSettings* settings, OutputSurface* output_surface, ResourceProvider* resource_provider) : SoftwareRenderer(client, settings, output_surface, resource_provider) {} }; template<> inline void RendererPixelTest::SetUp() { SetUpGLRenderer(false); DCHECK(!renderer()->CanUseSkiaGPUBackend()); } template<> inline bool RendererPixelTest::UseSkiaGPUBackend() const { return false; } template<> inline bool RendererPixelTest::ExpandedViewport() const { return false; } template<> inline void RendererPixelTest::SetUp() { SetUpGLRenderer(true); DCHECK(renderer()->CanUseSkiaGPUBackend()); } template <> inline bool RendererPixelTest::UseSkiaGPUBackend() const { return true; } template <> inline bool RendererPixelTest::ExpandedViewport() const { return false; } template<> inline void RendererPixelTest::SetUp() { SetUpGLRenderer(false); ForceExpandedViewport(gfx::Size(50, 50), gfx::Vector2d(10, 20)); } template <> inline bool RendererPixelTest::UseSkiaGPUBackend() const { return false; } template <> inline bool RendererPixelTest::ExpandedViewport() const { return true; } template<> inline void RendererPixelTest::SetUp() { SetUpSoftwareRenderer(); } template<> inline bool RendererPixelTest::UseSkiaGPUBackend() const { return false; } template <> inline bool RendererPixelTest::ExpandedViewport() const { return false; } template<> inline void RendererPixelTest::SetUp() { SetUpSoftwareRenderer(); ForceExpandedViewport(gfx::Size(50, 50), gfx::Vector2d(10, 20)); } template <> inline bool RendererPixelTest< SoftwareRendererWithExpandedViewport>::UseSkiaGPUBackend() const { return false; } template <> inline bool RendererPixelTest< SoftwareRendererWithExpandedViewport>::ExpandedViewport() const { return true; } typedef RendererPixelTest GLRendererPixelTest; typedef RendererPixelTest GLRendererSkiaGPUBackendPixelTest; typedef RendererPixelTest SoftwareRendererPixelTest; } // namespace cc #endif // CC_TEST_PIXEL_TEST_H_