diff options
-rw-r--r-- | cc/cc_tests.gyp | 5 | ||||
-rw-r--r-- | cc/gl_renderer_pixeltest.cc | 123 | ||||
-rw-r--r-- | cc/layer_tree_host_impl.h | 2 | ||||
-rw-r--r-- | cc/layer_tree_host_pixeltest_filters.cc | 39 | ||||
-rw-r--r-- | cc/test/layer_tree_pixel_test.cc | 104 | ||||
-rw-r--r-- | cc/test/layer_tree_pixel_test.h | 55 | ||||
-rw-r--r-- | cc/test/layer_tree_test_common.cc | 7 | ||||
-rw-r--r-- | cc/test/layer_tree_test_common.h | 2 | ||||
-rw-r--r-- | cc/test/pixel_test.cc | 99 | ||||
-rw-r--r-- | cc/test/pixel_test.h | 36 |
10 files changed, 365 insertions, 107 deletions
diff --git a/cc/cc_tests.gyp b/cc/cc_tests.gyp index c2a8e5d..5ed02bba 100644 --- a/cc/cc_tests.gyp +++ b/cc/cc_tests.gyp @@ -28,6 +28,7 @@ 'layer_sorter_unittest.cc', 'layer_tree_host_common_unittest.cc', 'layer_tree_host_impl_unittest.cc', + 'layer_tree_host_pixeltest_filters.cc', 'layer_tree_host_unittest.cc', 'layer_tree_host_unittest_animation.cc', 'layer_tree_host_unittest_context.cc', @@ -115,6 +116,8 @@ 'test/geometry_test_utils.h', 'test/layer_test_common.cc', 'test/layer_test_common.h', + 'test/layer_tree_pixel_test.cc', + 'test/layer_tree_pixel_test.h', 'test/layer_tree_test_common.cc', 'test/layer_tree_test_common.h', 'test/layer_tree_json_parser.cc', @@ -124,6 +127,8 @@ 'test/occlusion_tracker_test_common.h', 'test/paths.cc', 'test/paths.h', + 'test/pixel_test.cc', + 'test/pixel_test.h', 'test/render_pass_test_common.cc', 'test/render_pass_test_common.h', 'test/render_pass_test_utils.cc', diff --git a/cc/gl_renderer_pixeltest.cc b/cc/gl_renderer_pixeltest.cc index ed154c6..71e89b3 100644 --- a/cc/gl_renderer_pixeltest.cc +++ b/cc/gl_renderer_pixeltest.cc @@ -4,101 +4,13 @@ #include "cc/gl_renderer.h" -#include "base/file_util.h" -#include "base/path_service.h" -#include "cc/compositor_frame_metadata.h" #include "cc/draw_quad.h" -#include "cc/prioritized_resource_manager.h" -#include "cc/resource_provider.h" -#include "cc/test/paths.h" -#include "cc/test/pixel_test_utils.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "ui/gfx/codec/png_codec.h" -#include "ui/gl/gl_implementation.h" -#include "webkit/gpu/context_provider_in_process.h" -#include "webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h" +#include "cc/test/pixel_test.h" namespace cc { namespace { -const int kDeviceViewportWidth = 200; -const int kDeviceViewportHeight = 200; - -class FakeRendererClient : public RendererClient { - public: - FakeRendererClient() - { - } - - // RendererClient methods. - virtual gfx::Size DeviceViewportSize() const OVERRIDE { - return gfx::Size(kDeviceViewportWidth, kDeviceViewportHeight); - } - virtual const LayerTreeSettings& Settings() const OVERRIDE { - static LayerTreeSettings fake_settings; - return fake_settings; - } - virtual void DidLoseOutputSurface() OVERRIDE { } - virtual void OnSwapBuffersComplete() OVERRIDE { } - virtual void SetFullRootLayerDamage() OVERRIDE { } - virtual void SetManagedMemoryPolicy(const ManagedMemoryPolicy&) OVERRIDE {} - virtual void EnforceManagedMemoryPolicy( - const ManagedMemoryPolicy&) OVERRIDE {} - virtual bool HasImplThread() const OVERRIDE { return false; } - virtual bool ShouldClearRootRenderPass() const OVERRIDE { return true; } - virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const - OVERRIDE { return CompositorFrameMetadata(); } -}; - -class GLRendererPixelTest : public testing::Test { - protected: - GLRendererPixelTest() {} - - virtual void SetUp() { - gfx::InitializeGLBindings(gfx::kGLImplementationOSMesaGL); - scoped_ptr<webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl> - context3d( - new webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl); - context3d->Initialize(WebKit::WebGraphicsContext3D::Attributes(), NULL); - output_surface_.reset(new OutputSurface( - context3d.PassAs<WebKit::WebGraphicsContext3D>())); - resource_provider_ = ResourceProvider::Create(output_surface_.get()); - renderer_ = GLRenderer::Create(&fake_client_, - output_surface_.get(), - resource_provider_.get()); - - scoped_refptr<cc::ContextProvider> offscreen_contexts = - new webkit::gpu::ContextProviderInProcess( - webkit::gpu::ContextProviderInProcess::IN_PROCESS_COMMAND_BUFFER); - ASSERT_TRUE(offscreen_contexts->InitializeOnMainThread()); - resource_provider_->SetOffscreenContextProvider(offscreen_contexts); - } - - bool PixelsMatchReference(base::FilePath ref_file) { - gfx::Rect viewport_rect(kDeviceViewportWidth, kDeviceViewportHeight); - - SkBitmap bitmap; - bitmap.setConfig(SkBitmap::kARGB_8888_Config, - viewport_rect.width(), viewport_rect.height()); - bitmap.allocPixels(); - unsigned char* pixels = static_cast<unsigned char*>(bitmap.getPixels()); - renderer_->GetFramebufferPixels(pixels, viewport_rect); - - base::FilePath test_data_dir; - if (!PathService::Get(cc::DIR_TEST_DATA, &test_data_dir)) - return false; - - // To rebaseline: - //return WritePNGFile(bitmap, test_data_dir.Append(ref_file)); - - return IsSameAsPNGFile(bitmap, test_data_dir.Append(ref_file)); - } - - scoped_ptr<OutputSurface> output_surface_; - FakeRendererClient fake_client_; - scoped_ptr<ResourceProvider> resource_provider_; - scoped_ptr<GLRenderer> renderer_; -}; +class GLRendererPixelTest : public PixelTest {}; scoped_ptr<RenderPass> CreateTestRootRenderPass(RenderPass::Id id, gfx::Rect rect) { @@ -158,7 +70,7 @@ scoped_ptr<DrawQuad> CreateTestRenderPassDrawQuad( #if !defined(OS_ANDROID) TEST_F(GLRendererPixelTest, simpleGreenRect) { - gfx::Rect rect(kDeviceViewportWidth, kDeviceViewportHeight); + gfx::Rect rect(device_viewport_size_); RenderPass::Id id(1, 1); scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); @@ -182,14 +94,14 @@ TEST_F(GLRendererPixelTest, simpleGreenRect) { } TEST_F(GLRendererPixelTest, RenderPassChangesSize) { - gfx::Rect viewport_rect(kDeviceViewportWidth, kDeviceViewportHeight); + gfx::Rect viewport_rect(device_viewport_size_); RenderPass::Id root_pass_id(1, 1); scoped_ptr<RenderPass> root_pass = CreateTestRootRenderPass(root_pass_id, viewport_rect); RenderPass::Id child_pass_id(2, 2); - gfx::Rect pass_rect(kDeviceViewportWidth, kDeviceViewportHeight); + gfx::Rect pass_rect(device_viewport_size_); gfx::Transform transform_to_root; scoped_ptr<RenderPass> child_pass = CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root); @@ -202,15 +114,15 @@ TEST_F(GLRendererPixelTest, RenderPassChangesSize) { blue->SetNew(shared_state.get(), gfx::Rect(0, 0, - kDeviceViewportWidth / 2, - kDeviceViewportHeight), + device_viewport_size_.width() / 2, + device_viewport_size_.height()), SK_ColorBLUE); scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); yellow->SetNew(shared_state.get(), - gfx::Rect(kDeviceViewportWidth / 2, - 0, - kDeviceViewportWidth / 2, - kDeviceViewportHeight), + gfx::Rect(device_viewport_size_.width() / 2, + 0, + device_viewport_size_.width() / 2, + device_viewport_size_.height()), SK_ColorYELLOW); child_pass->quad_list.push_back(blue.PassAs<DrawQuad>()); @@ -238,7 +150,7 @@ TEST_F(GLRendererPixelTest, RenderPassChangesSize) { class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest { protected: void DrawFrame() { - gfx::Rect device_viewport_rect(kDeviceViewportWidth, kDeviceViewportHeight); + gfx::Rect device_viewport_rect(device_viewport_size_); RenderPass::Id root_id(1, 1); scoped_ptr<RenderPass> root_pass = @@ -288,10 +200,10 @@ class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest { root_pass->shared_quad_state_list.push_back(shared_state.Pass()); } - const int kColumnWidth = kDeviceViewportWidth / 3; + const int kColumnWidth = device_viewport_rect.width() / 3; gfx::Rect left_rect = gfx::Rect(0, 0, kColumnWidth, 20); - for (int i = 0; left_rect.y() < kDeviceViewportHeight; ++i) { + for (int i = 0; left_rect.y() < device_viewport_rect.height(); ++i) { scoped_ptr<SharedQuadState> shared_state = CreateTestSharedQuadState(identity_content_to_target_transform, left_rect); @@ -303,7 +215,7 @@ class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest { } gfx::Rect middle_rect = gfx::Rect(kColumnWidth+1, 0, kColumnWidth, 20); - for (int i = 0; middle_rect.y() < kDeviceViewportHeight; ++i) { + for (int i = 0; middle_rect.y() < device_viewport_rect.height(); ++i) { scoped_ptr<SharedQuadState> shared_state = CreateTestSharedQuadState(identity_content_to_target_transform, middle_rect); @@ -315,7 +227,7 @@ class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest { } gfx::Rect right_rect = gfx::Rect((kColumnWidth+1)*2, 0, kColumnWidth, 20); - for (int i = 0; right_rect.y() < kDeviceViewportHeight; ++i) { + for (int i = 0; right_rect.y() < device_viewport_rect.height(); ++i) { scoped_ptr<SharedQuadState> shared_state = CreateTestSharedQuadState(identity_content_to_target_transform, right_rect); @@ -354,8 +266,7 @@ TEST_F(GLRendererPixelTestWithBackgroundFilter, InvertFilter) { background_filters_.append( WebKit::WebFilterOperation::createInvertFilter(1.f)); - filter_pass_content_rect_ = - gfx::Rect(kDeviceViewportWidth, kDeviceViewportHeight); + filter_pass_content_rect_ = gfx::Rect(device_viewport_size_); filter_pass_content_rect_.Inset(12, 14, 16, 18); DrawFrame(); diff --git a/cc/layer_tree_host_impl.h b/cc/layer_tree_host_impl.h index 6e90e93..51cb18f 100644 --- a/cc/layer_tree_host_impl.h +++ b/cc/layer_tree_host_impl.h @@ -187,7 +187,7 @@ class CC_EXPORT LayerTreeHostImpl : public InputHandlerClient, Renderer* renderer() { return renderer_.get(); } const RendererCapabilities& GetRendererCapabilities() const; - bool SwapBuffers(); + virtual bool SwapBuffers(); void Readback(void* pixels, gfx::Rect rect_in_device_viewport); diff --git a/cc/layer_tree_host_pixeltest_filters.cc b/cc/layer_tree_host_pixeltest_filters.cc new file mode 100644 index 0000000..37d2931 --- /dev/null +++ b/cc/layer_tree_host_pixeltest_filters.cc @@ -0,0 +1,39 @@ +// 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 "cc/test/layer_tree_pixel_test.h" + +#if !defined(OS_ANDROID) + +namespace cc { +namespace { + +class LayerTreeHostFiltersPixelTest : public LayerTreePixelTest {}; + +TEST_F(LayerTreeHostFiltersPixelTest, BackgroundFilterBlur) { + scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer( + gfx::Rect(200, 200), SK_ColorWHITE); + + // The green box is entirely behind a layer with background blur, so it + // should appear blurred on its edges. + scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer( + gfx::Rect(50, 50, 100, 100), kCSSGreen); + scoped_refptr<SolidColorLayer> blur = CreateSolidColorLayer( + gfx::Rect(30, 30, 140, 140), SK_ColorTRANSPARENT); + background->AddChild(green); + background->AddChild(blur); + + WebKit::WebFilterOperations filters; + filters.append(WebKit::WebFilterOperation::createBlurFilter(2)); + blur->SetBackgroundFilters(filters); + + RunPixelTest(background, + base::FilePath(FILE_PATH_LITERAL( + "background_filter_blur.png"))); +} + +} // namespace +} // namespace cc + +#endif // OS_ANDROID diff --git a/cc/test/layer_tree_pixel_test.cc b/cc/test/layer_tree_pixel_test.cc new file mode 100644 index 0000000..63cfd6f --- /dev/null +++ b/cc/test/layer_tree_pixel_test.cc @@ -0,0 +1,104 @@ +// 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 "cc/test/layer_tree_pixel_test.h" + +#include "base/path_service.h" +#include "cc/layer_tree_impl.h" +#include "cc/test/paths.h" +#include "cc/test/pixel_test_utils.h" +#include "ui/gl/gl_implementation.h" +#include "webkit/gpu/context_provider_in_process.h" +#include "webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h" + +namespace cc { + +LayerTreePixelTest::LayerTreePixelTest() {} + +LayerTreePixelTest::~LayerTreePixelTest() {} + +scoped_ptr<OutputSurface> LayerTreePixelTest::createOutputSurface() { + CHECK(gfx::InitializeGLBindings(gfx::kGLImplementationOSMesaGL)); + + using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl; + scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> context3d( + new WebGraphicsContext3DInProcessCommandBufferImpl); + context3d->Initialize(WebKit::WebGraphicsContext3D::Attributes(), NULL); + return make_scoped_ptr( + new OutputSurface(context3d.PassAs<WebKit::WebGraphicsContext3D>())); +} + +scoped_refptr<cc::ContextProvider> +LayerTreePixelTest::OffscreenContextProviderForMainThread() { + return new webkit::gpu::ContextProviderInProcess( + webkit::gpu::ContextProviderInProcess::IN_PROCESS_COMMAND_BUFFER); +} + +scoped_refptr<cc::ContextProvider> +LayerTreePixelTest::OffscreenContextProviderForCompositorThread() { + return new webkit::gpu::ContextProviderInProcess( + webkit::gpu::ContextProviderInProcess::IN_PROCESS_COMMAND_BUFFER); +} + +void LayerTreePixelTest::swapBuffersOnThread(LayerTreeHostImpl* host_impl, + bool result) { + EXPECT_TRUE(result); + + gfx::Rect device_viewport_rect( + host_impl->active_tree()->device_viewport_size()); + + SkBitmap bitmap; + bitmap.setConfig(SkBitmap::kARGB_8888_Config, + device_viewport_rect.width(), + device_viewport_rect.height()); + bitmap.allocPixels(); + unsigned char* pixels = static_cast<unsigned char*>(bitmap.getPixels()); + host_impl->Readback(pixels, device_viewport_rect); + + base::FilePath test_data_dir; + EXPECT_TRUE(PathService::Get(cc::DIR_TEST_DATA, &test_data_dir)); + + // To rebaseline: + //EXPECT_TRUE(WritePNGFile(bitmap, test_data_dir.Append(ref_file_))); + + EXPECT_TRUE(IsSameAsPNGFile(bitmap, test_data_dir.Append(ref_file_))); + + endTest(); +} + +void LayerTreePixelTest::beginTest() { + postSetNeedsCommitToMainThread(); +} + +void LayerTreePixelTest::afterTest() {} + +scoped_refptr<SolidColorLayer> LayerTreePixelTest::CreateSolidColorLayer( + gfx::Rect rect, SkColor color) { + scoped_refptr<SolidColorLayer> layer = SolidColorLayer::Create(); + layer->SetIsDrawable(true); + layer->SetAnchorPoint(gfx::PointF()); + layer->SetBounds(rect.size()); + layer->SetPosition(rect.origin()); + layer->SetBackgroundColor(color); + return layer; +} + +void LayerTreePixelTest::RunPixelTest( + scoped_refptr<Layer> content_root, + base::FilePath file_name) +{ + content_root_ = content_root; + ref_file_ = file_name; + runTest(true); +} + +void LayerTreePixelTest::setupTree() { + scoped_refptr<Layer> root = Layer::Create(); + root->SetBounds(content_root_->bounds()); + root->AddChild(content_root_); + m_layerTreeHost->SetRootLayer(root); + ThreadedTest::setupTree(); +} + +} // namespace cc diff --git a/cc/test/layer_tree_pixel_test.h b/cc/test/layer_tree_pixel_test.h new file mode 100644 index 0000000..4682d9e --- /dev/null +++ b/cc/test/layer_tree_pixel_test.h @@ -0,0 +1,55 @@ +// 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/files/file_path.h" +#include "cc/solid_color_layer.h" +#include "cc/test/layer_tree_test_common.h" + +#ifndef CC_TEST_LAYER_TREE_PIXEL_TEST_H_ +#define CC_TEST_LAYER_TREE_PIXEL_TEST_H_ + +namespace cc { +class LayerTreeHost; + +class LayerTreePixelTest : public ThreadedTest { + protected: + LayerTreePixelTest(); + virtual ~LayerTreePixelTest(); + + bool RunTest(scoped_refptr<Layer> root_layer, + const base::FilePath::StringType& file_name); + + virtual scoped_ptr<OutputSurface> createOutputSurface() OVERRIDE; + virtual scoped_refptr<cc::ContextProvider> + OffscreenContextProviderForMainThread() OVERRIDE; + virtual scoped_refptr<cc::ContextProvider> + OffscreenContextProviderForCompositorThread() OVERRIDE; + virtual void swapBuffersOnThread(LayerTreeHostImpl* host_impl, + bool result) OVERRIDE; + + virtual void beginTest() OVERRIDE; + virtual void setupTree() OVERRIDE; + virtual void afterTest() OVERRIDE; + + scoped_refptr<SolidColorLayer> CreateSolidColorLayer(gfx::Rect rect, + SkColor color); + + void RunPixelTest(scoped_refptr<Layer> content_root, + base::FilePath file_name); + + // Common CSS colors defined for tests to use. + enum Colors { + kCSSOrange = 0xffffa500, + kCSSBrown = 0xffa52a2a, + kCSSGreen = 0xff008000, + }; + + private: + scoped_refptr<Layer> content_root_; + base::FilePath ref_file_; +}; + +} // namespace cc + +#endif // CC_TEST_LAYER_TREE_PIXEL_TEST_H_ diff --git a/cc/test/layer_tree_test_common.cc b/cc/test/layer_tree_test_common.cc index def1820..f24c6b0 100644 --- a/cc/test/layer_tree_test_common.cc +++ b/cc/test/layer_tree_test_common.cc @@ -98,6 +98,13 @@ void MockLayerTreeHostImpl::DrawLayers(FrameData* frame) m_testHooks->drawLayersOnThread(this); } +bool MockLayerTreeHostImpl::SwapBuffers() +{ + bool result = LayerTreeHostImpl::SwapBuffers(); + m_testHooks->swapBuffersOnThread(this, result); + return result; +} + bool MockLayerTreeHostImpl::ActivatePendingTreeIfNeeded() { if (!pending_tree()) diff --git a/cc/test/layer_tree_test_common.h b/cc/test/layer_tree_test_common.h index ac9534e3..28991b3 100644 --- a/cc/test/layer_tree_test_common.h +++ b/cc/test/layer_tree_test_common.h @@ -37,6 +37,7 @@ public: virtual bool prepareToDrawOnThread( LayerTreeHostImpl*, LayerTreeHostImpl::FrameData*, bool result); virtual void drawLayersOnThread(LayerTreeHostImpl*) { } + virtual void swapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) { } virtual void animateLayers(LayerTreeHostImpl*, base::TimeTicks monotonicTime) { } virtual void updateAnimationState(LayerTreeHostImpl*, bool hasUnfinishedAnimation) { } virtual void willAnimateLayers(LayerTreeHostImpl*, base::TimeTicks monotonicTime) { } @@ -167,6 +168,7 @@ public: virtual void CommitComplete() OVERRIDE; virtual bool PrepareToDraw(FrameData* frame) OVERRIDE; virtual void DrawLayers(FrameData* frame) OVERRIDE; + virtual bool SwapBuffers() OVERRIDE; virtual bool ActivatePendingTreeIfNeeded() OVERRIDE; virtual bool InitializeRenderer(scoped_ptr<OutputSurface> outputSurface) OVERRIDE; virtual void SetVisible(bool visible) OVERRIDE; diff --git a/cc/test/pixel_test.cc b/cc/test/pixel_test.cc new file mode 100644 index 0000000..59ea9bb --- /dev/null +++ b/cc/test/pixel_test.cc @@ -0,0 +1,99 @@ +// 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 "cc/test/pixel_test.h" + +#include "base/path_service.h" +#include "cc/compositor_frame_metadata.h" +#include "cc/gl_renderer.h" +#include "cc/output_surface.h" +#include "cc/resource_provider.h" +#include "cc/test/paths.h" +#include "cc/test/pixel_test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/gl_implementation.h" +#include "webkit/gpu/context_provider_in_process.h" +#include "webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h" + +namespace cc { + +class PixelTest::PixelTestRendererClient : public RendererClient { + public: + PixelTestRendererClient(gfx::Size device_viewport_size) + : device_viewport_size_(device_viewport_size) {} + + // RendererClient implementation. + virtual gfx::Size DeviceViewportSize() const OVERRIDE { + return device_viewport_size_; + } + virtual const LayerTreeSettings& Settings() const OVERRIDE { + return settings_; + } + virtual void DidLoseOutputSurface() OVERRIDE {} + virtual void OnSwapBuffersComplete() OVERRIDE {} + virtual void SetFullRootLayerDamage() OVERRIDE {} + virtual void SetManagedMemoryPolicy( + const ManagedMemoryPolicy& policy) OVERRIDE {} + virtual void EnforceManagedMemoryPolicy( + const ManagedMemoryPolicy& policy) OVERRIDE {} + virtual bool HasImplThread() const OVERRIDE { return false; } + virtual bool ShouldClearRootRenderPass() const OVERRIDE { return true; } + virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const + OVERRIDE { + return CompositorFrameMetadata(); + } + + private: + gfx::Size device_viewport_size_; + LayerTreeSettings settings_; +}; + +PixelTest::PixelTest() : device_viewport_size_(gfx::Size(200, 200)) {} + +PixelTest::~PixelTest() {} + +void PixelTest::SetUp() { + gfx::InitializeGLBindings(gfx::kGLImplementationOSMesaGL); + scoped_ptr<webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl> + context3d( + new webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl); + context3d->Initialize(WebKit::WebGraphicsContext3D::Attributes(), NULL); + output_surface_.reset(new OutputSurface( + context3d.PassAs<WebKit::WebGraphicsContext3D>())); + resource_provider_ = ResourceProvider::Create(output_surface_.get()); + fake_client_ = + make_scoped_ptr(new PixelTestRendererClient(device_viewport_size_)); + renderer_ = GLRenderer::Create(fake_client_.get(), + output_surface_.get(), + resource_provider_.get()); + + scoped_refptr<cc::ContextProvider> offscreen_contexts = + new webkit::gpu::ContextProviderInProcess( + webkit::gpu::ContextProviderInProcess::IN_PROCESS_COMMAND_BUFFER); + ASSERT_TRUE(offscreen_contexts->InitializeOnMainThread()); + resource_provider_->SetOffscreenContextProvider(offscreen_contexts); +} + +bool PixelTest::PixelsMatchReference(const base::FilePath& ref_file) { + gfx::Rect device_viewport_rect(device_viewport_size_); + + SkBitmap bitmap; + bitmap.setConfig(SkBitmap::kARGB_8888_Config, + device_viewport_rect.width(), + device_viewport_rect.height()); + bitmap.allocPixels(); + unsigned char* pixels = static_cast<unsigned char*>(bitmap.getPixels()); + renderer_->GetFramebufferPixels(pixels, device_viewport_rect); + + base::FilePath test_data_dir; + if (!PathService::Get(cc::DIR_TEST_DATA, &test_data_dir)) + return false; + + // To rebaseline: + //return WritePNGFile(bitmap, test_data_dir.Append(ref_file)); + + return IsSameAsPNGFile(bitmap, test_data_dir.Append(ref_file)); +} + +} // namespace cc diff --git a/cc/test/pixel_test.h b/cc/test/pixel_test.h new file mode 100644 index 0000000..40acb33 --- /dev/null +++ b/cc/test/pixel_test.h @@ -0,0 +1,36 @@ +// 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 "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 GLRenderer; +class OutputSurface; +class ResourceProvider; + +class PixelTest : public testing::Test { + protected: + PixelTest(); + virtual ~PixelTest(); + + virtual void SetUp() OVERRIDE; + + bool PixelsMatchReference(const base::FilePath& ref_file); + + gfx::Size device_viewport_size_; + scoped_ptr<OutputSurface> output_surface_; + scoped_ptr<ResourceProvider> resource_provider_; + class PixelTestRendererClient; + scoped_ptr<PixelTestRendererClient> fake_client_; + scoped_ptr<GLRenderer> renderer_; +}; + +} // namespace cc + +#endif // CC_TEST_PIXEL_TEST_H_ |