| Index: cc/CCRendererSoftwareTest.cpp
|
| diff --git a/cc/CCRendererSoftwareTest.cpp b/cc/CCRendererSoftwareTest.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fee24cd6963f03c97ef012e4e0bf1e6b1dc51d95
|
| --- /dev/null
|
| +++ b/cc/CCRendererSoftwareTest.cpp
|
| @@ -0,0 +1,162 @@
|
| +// Copyright 2012 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 "config.h"
|
| +
|
| +#include "CCRendererSoftware.h"
|
| +
|
| +#include "CCAnimationTestCommon.h"
|
| +#include "CCGeometryTestUtils.h"
|
| +#include "CCQuadSink.h"
|
| +#include "CCRenderPass.h"
|
| +#include "CCRenderPassDrawQuad.h"
|
| +#include "CCSettings.h"
|
| +#include "CCSingleThreadProxy.h" // For DebugScopedSetImplThread
|
| +#include "CCSolidColorDrawQuad.h"
|
| +#include "CCTestCommon.h"
|
| +#include "CCTileDrawQuad.h"
|
| +#include "FakeWebCompositorSoftwareOutputDevice.h"
|
| +#include "FakeWebCompositorOutputSurface.h"
|
| +#include <gmock/gmock.h>
|
| +#include <gtest/gtest.h>
|
| +#include <wtf/OwnArrayPtr.h>
|
| +
|
| +using namespace cc;
|
| +using namespace WebKit;
|
| +using namespace WebKitTests;
|
| +
|
| +namespace {
|
| +
|
| +class CCRendererSoftwareTest : public testing::Test, public CCRendererClient {
|
| +public:
|
| + void initializeRenderer() {
|
| + m_outputSurface = FakeWebCompositorOutputSurface::createSoftware(adoptPtr(new FakeWebCompositorSoftwareOutputDevice));
|
| + m_resourceProvider = CCResourceProvider::create(m_outputSurface.get());
|
| + m_renderer = CCRendererSoftware::create(this, resourceProvider(), softwareDevice());
|
| + }
|
| +
|
| + WebCompositorSoftwareOutputDevice* softwareDevice() const { return m_outputSurface->softwareDevice(); }
|
| + FakeWebCompositorOutputSurface* outputSurface() const { return m_outputSurface.get(); }
|
| + CCResourceProvider* resourceProvider() const { return m_resourceProvider.get(); }
|
| + CCRendererSoftware* renderer() const { return m_renderer.get(); }
|
| + void setViewportSize(IntSize viewportSize) { m_viewportSize = viewportSize; }
|
| +
|
| + // CCRendererClient implementation.
|
| + virtual const IntSize& deviceViewportSize() const OVERRIDE { return m_viewportSize; }
|
| + virtual const CCLayerTreeSettings& settings() const OVERRIDE { return m_settings; }
|
| + virtual void didLoseContext() OVERRIDE { }
|
| + virtual void onSwapBuffersComplete() OVERRIDE { }
|
| + virtual void setFullRootLayerDamage() OVERRIDE { }
|
| + virtual void releaseContentsTextures() OVERRIDE { }
|
| + virtual void setMemoryAllocationLimitBytes(size_t) OVERRIDE { }
|
| +
|
| +protected:
|
| + DebugScopedSetImplThread m_alwaysImplThread;
|
| +
|
| + OwnPtr<FakeWebCompositorOutputSurface> m_outputSurface;
|
| + OwnPtr<CCResourceProvider> m_resourceProvider;
|
| + OwnPtr<CCRendererSoftware> m_renderer;
|
| + IntSize m_viewportSize;
|
| + CCLayerTreeSettings m_settings;
|
| +};
|
| +
|
| +class CCTestRenderPass : public CCRenderPass {
|
| +public:
|
| + static PassOwnPtr<CCTestRenderPass> create(CCRenderPass::Id id, IntRect outputRect, const WebTransformationMatrix& rootTransform) { return adoptPtr(new CCTestRenderPass(id, outputRect, rootTransform)); }
|
| +
|
| + void appendQuad(PassOwnPtr<CCDrawQuad> quad) { m_quadList.append(quad); }
|
| +
|
| +protected:
|
| + CCTestRenderPass(CCRenderPass::Id id, IntRect outputRect, const WebTransformationMatrix& rootTransform) : CCRenderPass(id, outputRect, rootTransform) { }
|
| +};
|
| +
|
| +
|
| +TEST_F(CCRendererSoftwareTest, solidColorQuad)
|
| +{
|
| + IntSize outerSize(100, 100);
|
| + int outerPixels = outerSize.width() * outerSize.height();
|
| + IntSize innerSize(98, 98);
|
| + IntRect outerRect(IntPoint(), outerSize);
|
| + IntRect innerRect(IntPoint(1, 1), innerSize);
|
| + setViewportSize(outerSize);
|
| +
|
| + initializeRenderer();
|
| +
|
| + OwnPtr<CCSharedQuadState> sharedQuadState = CCSharedQuadState::create(WebTransformationMatrix(), outerRect, outerRect, 1.0, true);
|
| + CCRenderPass::Id rootRenderPassId = CCRenderPass::Id(1, 1);
|
| + OwnPtr<CCRenderPass> rootRenderPass = CCTestRenderPass::create(rootRenderPassId, outerRect, WebTransformationMatrix());
|
| + CCTestRenderPass* testRenderPass = static_cast<CCTestRenderPass*>(rootRenderPass.get());
|
| + OwnPtr<CCDrawQuad> outerQuad = CCSolidColorDrawQuad::create(sharedQuadState.get(), outerRect, SK_ColorYELLOW);
|
| + OwnPtr<CCDrawQuad> innerQuad = CCSolidColorDrawQuad::create(sharedQuadState.get(), innerRect, SK_ColorCYAN);
|
| + testRenderPass->appendQuad(innerQuad.release());
|
| + testRenderPass->appendQuad(outerQuad.release());
|
| +
|
| + CCRenderPassList list;
|
| + CCRenderPassIdHashMap hashmap;
|
| + list.append(rootRenderPass.get());
|
| + hashmap.add(rootRenderPassId, rootRenderPass.release());
|
| + renderer()->drawFrame(list, hashmap);
|
| +
|
| + OwnArrayPtr<SkColor> pixels = adoptArrayPtr(new SkColor[deviceViewportSize().width() * deviceViewportSize().height()]);
|
| + renderer()->getFramebufferPixels(pixels.get(), outerRect);
|
| +
|
| + EXPECT_EQ(SK_ColorYELLOW, pixels[0]);
|
| + EXPECT_EQ(SK_ColorYELLOW, pixels[outerPixels - 1]);
|
| + EXPECT_EQ(SK_ColorCYAN, pixels[outerSize.width() + 1]);
|
| + EXPECT_EQ(SK_ColorCYAN, pixels[outerPixels - outerSize.width() - 2]);
|
| +}
|
| +
|
| +TEST_F(CCRendererSoftwareTest, tileQuad)
|
| +{
|
| + IntSize outerSize(100, 100);
|
| + int outerPixels = outerSize.width() * outerSize.height();
|
| + IntSize innerSize(98, 98);
|
| + int innerPixels = innerSize.width() * innerSize.height();
|
| + IntRect outerRect(IntPoint(), outerSize);
|
| + IntRect innerRect(IntPoint(1, 1), innerSize);
|
| + setViewportSize(outerSize);
|
| + initializeRenderer();
|
| +
|
| + CCResourceProvider::ResourceId resourceYellow = resourceProvider()->createResource(1, outerSize, GraphicsContext3D::RGBA, CCResourceProvider::TextureUsageAny);
|
| + CCResourceProvider::ResourceId resourceCyan = resourceProvider()->createResource(1, innerSize, GraphicsContext3D::RGBA, CCResourceProvider::TextureUsageAny);
|
| +
|
| + SkColor yellow = SK_ColorYELLOW;
|
| + SkColor cyan = SK_ColorCYAN;
|
| + OwnArrayPtr<SkColor> yellowPixels = adoptArrayPtr(new SkColor[outerPixels]);
|
| + OwnArrayPtr<SkColor> cyanPixels = adoptArrayPtr(new SkColor[innerPixels]);
|
| + for (int i = 0; i < outerPixels; i++)
|
| + yellowPixels[i] = yellow;
|
| + for (int i = 0; i < innerPixels; i++)
|
| + cyanPixels[i] = cyan;
|
| +
|
| + resourceProvider()->upload(resourceYellow, reinterpret_cast<uint8_t*>(yellowPixels.get()), IntRect(IntPoint(), outerSize), IntRect(IntPoint(), outerSize), IntSize());
|
| + resourceProvider()->upload(resourceCyan, reinterpret_cast<uint8_t*>(cyanPixels.get()), IntRect(IntPoint(), innerSize), IntRect(IntPoint(), innerSize), IntSize());
|
| +
|
| + IntRect rect = IntRect(IntPoint(), deviceViewportSize());
|
| +
|
| + OwnPtr<CCSharedQuadState> sharedQuadState = CCSharedQuadState::create(WebTransformationMatrix(), outerRect, outerRect, 1.0, true);
|
| + CCRenderPass::Id rootRenderPassId = CCRenderPass::Id(1, 1);
|
| + OwnPtr<CCRenderPass> rootRenderPass = CCTestRenderPass::create(rootRenderPassId, IntRect(IntPoint(), deviceViewportSize()), WebTransformationMatrix());
|
| + CCTestRenderPass* testRenderPass = static_cast<CCTestRenderPass*>(rootRenderPass.get());
|
| + OwnPtr<CCDrawQuad> outerQuad = CCTileDrawQuad::create(sharedQuadState.get(), outerRect, outerRect, resourceYellow, IntPoint(), outerSize, 0, false, false, false, false, false);
|
| + OwnPtr<CCDrawQuad> innerQuad = CCTileDrawQuad::create(sharedQuadState.get(), innerRect, innerRect, resourceCyan, IntPoint(), innerSize, 0, false, false, false, false, false);
|
| + testRenderPass->appendQuad(innerQuad.release());
|
| + testRenderPass->appendQuad(outerQuad.release());
|
| +
|
| + CCRenderPassList list;
|
| + CCRenderPassIdHashMap hashmap;
|
| + list.append(rootRenderPass.get());
|
| + hashmap.add(rootRenderPassId, rootRenderPass.release());
|
| + renderer()->drawFrame(list, hashmap);
|
| +
|
| + OwnArrayPtr<SkColor> pixels = adoptArrayPtr(new SkColor[deviceViewportSize().width() * deviceViewportSize().height()]);
|
| + renderer()->getFramebufferPixels(pixels.get(), outerRect);
|
| +
|
| + EXPECT_EQ(SK_ColorYELLOW, pixels[0]);
|
| + EXPECT_EQ(SK_ColorYELLOW, pixels[outerPixels - 1]);
|
| + EXPECT_EQ(SK_ColorCYAN, pixels[outerSize.width() + 1]);
|
| + EXPECT_EQ(SK_ColorCYAN, pixels[outerPixels - outerSize.width() - 2]);
|
| +}
|
| +
|
| +} // namespace
|
|
|