OLD | NEW |
(Empty) | |
| 1 // Copyright 2012 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 "config.h" |
| 6 |
| 7 #include "CCRendererSoftware.h" |
| 8 |
| 9 #include "CCAnimationTestCommon.h" |
| 10 #include "CCGeometryTestUtils.h" |
| 11 #include "CCQuadSink.h" |
| 12 #include "CCRenderPass.h" |
| 13 #include "CCRenderPassDrawQuad.h" |
| 14 #include "CCSettings.h" |
| 15 #include "CCSingleThreadProxy.h" // For DebugScopedSetImplThread |
| 16 #include "CCSolidColorDrawQuad.h" |
| 17 #include "CCTestCommon.h" |
| 18 #include "CCTileDrawQuad.h" |
| 19 #include "FakeWebCompositorSoftwareOutputDevice.h" |
| 20 #include "FakeWebCompositorOutputSurface.h" |
| 21 #include <gmock/gmock.h> |
| 22 #include <gtest/gtest.h> |
| 23 #include <wtf/OwnArrayPtr.h> |
| 24 |
| 25 using namespace cc; |
| 26 using namespace WebKit; |
| 27 using namespace WebKitTests; |
| 28 |
| 29 namespace { |
| 30 |
| 31 class CCRendererSoftwareTest : public testing::Test, public CCRendererClient { |
| 32 public: |
| 33 void initializeRenderer() { |
| 34 m_outputSurface = FakeWebCompositorOutputSurface::createSoftware(adoptPt
r(new FakeWebCompositorSoftwareOutputDevice)); |
| 35 m_resourceProvider = CCResourceProvider::create(m_outputSurface.get()); |
| 36 m_renderer = CCRendererSoftware::create(this, resourceProvider(), softwa
reDevice()); |
| 37 } |
| 38 |
| 39 WebCompositorSoftwareOutputDevice* softwareDevice() const { return m_outputS
urface->softwareDevice(); } |
| 40 FakeWebCompositorOutputSurface* outputSurface() const { return m_outputSurfa
ce.get(); } |
| 41 CCResourceProvider* resourceProvider() const { return m_resourceProvider.get
(); } |
| 42 CCRendererSoftware* renderer() const { return m_renderer.get(); } |
| 43 void setViewportSize(IntSize viewportSize) { m_viewportSize = viewportSize;
} |
| 44 |
| 45 // CCRendererClient implementation. |
| 46 virtual const IntSize& deviceViewportSize() const OVERRIDE { return m_viewpo
rtSize; } |
| 47 virtual const CCLayerTreeSettings& settings() const OVERRIDE { return m_sett
ings; } |
| 48 virtual void didLoseContext() OVERRIDE { } |
| 49 virtual void onSwapBuffersComplete() OVERRIDE { } |
| 50 virtual void setFullRootLayerDamage() OVERRIDE { } |
| 51 virtual void releaseContentsTextures() OVERRIDE { } |
| 52 virtual void setMemoryAllocationLimitBytes(size_t) OVERRIDE { } |
| 53 |
| 54 protected: |
| 55 DebugScopedSetImplThread m_alwaysImplThread; |
| 56 |
| 57 OwnPtr<FakeWebCompositorOutputSurface> m_outputSurface; |
| 58 OwnPtr<CCResourceProvider> m_resourceProvider; |
| 59 OwnPtr<CCRendererSoftware> m_renderer; |
| 60 IntSize m_viewportSize; |
| 61 CCLayerTreeSettings m_settings; |
| 62 }; |
| 63 |
| 64 class CCTestRenderPass : public CCRenderPass { |
| 65 public: |
| 66 static PassOwnPtr<CCTestRenderPass> create(CCRenderPass::Id id, IntRect outp
utRect, const WebTransformationMatrix& rootTransform) { return adoptPtr(new CCTe
stRenderPass(id, outputRect, rootTransform)); } |
| 67 |
| 68 void appendQuad(PassOwnPtr<CCDrawQuad> quad) { m_quadList.append(quad); } |
| 69 |
| 70 protected: |
| 71 CCTestRenderPass(CCRenderPass::Id id, IntRect outputRect, const WebTransform
ationMatrix& rootTransform) : CCRenderPass(id, outputRect, rootTransform) { } |
| 72 }; |
| 73 |
| 74 |
| 75 TEST_F(CCRendererSoftwareTest, solidColorQuad) |
| 76 { |
| 77 IntSize outerSize(100, 100); |
| 78 int outerPixels = outerSize.width() * outerSize.height(); |
| 79 IntSize innerSize(98, 98); |
| 80 IntRect outerRect(IntPoint(), outerSize); |
| 81 IntRect innerRect(IntPoint(1, 1), innerSize); |
| 82 setViewportSize(outerSize); |
| 83 |
| 84 initializeRenderer(); |
| 85 |
| 86 OwnPtr<CCSharedQuadState> sharedQuadState = CCSharedQuadState::create(WebTra
nsformationMatrix(), outerRect, outerRect, 1.0, true); |
| 87 CCRenderPass::Id rootRenderPassId = CCRenderPass::Id(1, 1); |
| 88 OwnPtr<CCRenderPass> rootRenderPass = CCTestRenderPass::create(rootRenderPas
sId, outerRect, WebTransformationMatrix()); |
| 89 CCTestRenderPass* testRenderPass = static_cast<CCTestRenderPass*>(rootRender
Pass.get()); |
| 90 OwnPtr<CCDrawQuad> outerQuad = CCSolidColorDrawQuad::create(sharedQuadState.
get(), outerRect, SK_ColorYELLOW); |
| 91 OwnPtr<CCDrawQuad> innerQuad = CCSolidColorDrawQuad::create(sharedQuadState.
get(), innerRect, SK_ColorCYAN); |
| 92 testRenderPass->appendQuad(innerQuad.release()); |
| 93 testRenderPass->appendQuad(outerQuad.release()); |
| 94 |
| 95 CCRenderPassList list; |
| 96 CCRenderPassIdHashMap hashmap; |
| 97 list.append(rootRenderPass.get()); |
| 98 hashmap.add(rootRenderPassId, rootRenderPass.release()); |
| 99 renderer()->drawFrame(list, hashmap); |
| 100 |
| 101 OwnArrayPtr<SkColor> pixels = adoptArrayPtr(new SkColor[deviceViewportSize()
.width() * deviceViewportSize().height()]); |
| 102 renderer()->getFramebufferPixels(pixels.get(), outerRect); |
| 103 |
| 104 EXPECT_EQ(SK_ColorYELLOW, pixels[0]); |
| 105 EXPECT_EQ(SK_ColorYELLOW, pixels[outerPixels - 1]); |
| 106 EXPECT_EQ(SK_ColorCYAN, pixels[outerSize.width() + 1]); |
| 107 EXPECT_EQ(SK_ColorCYAN, pixels[outerPixels - outerSize.width() - 2]); |
| 108 } |
| 109 |
| 110 TEST_F(CCRendererSoftwareTest, tileQuad) |
| 111 { |
| 112 IntSize outerSize(100, 100); |
| 113 int outerPixels = outerSize.width() * outerSize.height(); |
| 114 IntSize innerSize(98, 98); |
| 115 int innerPixels = innerSize.width() * innerSize.height(); |
| 116 IntRect outerRect(IntPoint(), outerSize); |
| 117 IntRect innerRect(IntPoint(1, 1), innerSize); |
| 118 setViewportSize(outerSize); |
| 119 initializeRenderer(); |
| 120 |
| 121 CCResourceProvider::ResourceId resourceYellow = resourceProvider()->createRe
source(1, outerSize, GraphicsContext3D::RGBA, CCResourceProvider::TextureUsageAn
y); |
| 122 CCResourceProvider::ResourceId resourceCyan = resourceProvider()->createReso
urce(1, innerSize, GraphicsContext3D::RGBA, CCResourceProvider::TextureUsageAny)
; |
| 123 |
| 124 SkColor yellow = SK_ColorYELLOW; |
| 125 SkColor cyan = SK_ColorCYAN; |
| 126 OwnArrayPtr<SkColor> yellowPixels = adoptArrayPtr(new SkColor[outerPixels]); |
| 127 OwnArrayPtr<SkColor> cyanPixels = adoptArrayPtr(new SkColor[innerPixels]); |
| 128 for (int i = 0; i < outerPixels; i++) |
| 129 yellowPixels[i] = yellow; |
| 130 for (int i = 0; i < innerPixels; i++) |
| 131 cyanPixels[i] = cyan; |
| 132 |
| 133 resourceProvider()->upload(resourceYellow, reinterpret_cast<uint8_t*>(yellow
Pixels.get()), IntRect(IntPoint(), outerSize), IntRect(IntPoint(), outerSize), I
ntSize()); |
| 134 resourceProvider()->upload(resourceCyan, reinterpret_cast<uint8_t*>(cyanPixe
ls.get()), IntRect(IntPoint(), innerSize), IntRect(IntPoint(), innerSize), IntSi
ze()); |
| 135 |
| 136 IntRect rect = IntRect(IntPoint(), deviceViewportSize()); |
| 137 |
| 138 OwnPtr<CCSharedQuadState> sharedQuadState = CCSharedQuadState::create(WebTra
nsformationMatrix(), outerRect, outerRect, 1.0, true); |
| 139 CCRenderPass::Id rootRenderPassId = CCRenderPass::Id(1, 1); |
| 140 OwnPtr<CCRenderPass> rootRenderPass = CCTestRenderPass::create(rootRenderPas
sId, IntRect(IntPoint(), deviceViewportSize()), WebTransformationMatrix()); |
| 141 CCTestRenderPass* testRenderPass = static_cast<CCTestRenderPass*>(rootRender
Pass.get()); |
| 142 OwnPtr<CCDrawQuad> outerQuad = CCTileDrawQuad::create(sharedQuadState.get(),
outerRect, outerRect, resourceYellow, IntPoint(), outerSize, 0, false, false, f
alse, false, false); |
| 143 OwnPtr<CCDrawQuad> innerQuad = CCTileDrawQuad::create(sharedQuadState.get(),
innerRect, innerRect, resourceCyan, IntPoint(), innerSize, 0, false, false, fal
se, false, false); |
| 144 testRenderPass->appendQuad(innerQuad.release()); |
| 145 testRenderPass->appendQuad(outerQuad.release()); |
| 146 |
| 147 CCRenderPassList list; |
| 148 CCRenderPassIdHashMap hashmap; |
| 149 list.append(rootRenderPass.get()); |
| 150 hashmap.add(rootRenderPassId, rootRenderPass.release()); |
| 151 renderer()->drawFrame(list, hashmap); |
| 152 |
| 153 OwnArrayPtr<SkColor> pixels = adoptArrayPtr(new SkColor[deviceViewportSize()
.width() * deviceViewportSize().height()]); |
| 154 renderer()->getFramebufferPixels(pixels.get(), outerRect); |
| 155 |
| 156 EXPECT_EQ(SK_ColorYELLOW, pixels[0]); |
| 157 EXPECT_EQ(SK_ColorYELLOW, pixels[outerPixels - 1]); |
| 158 EXPECT_EQ(SK_ColorCYAN, pixels[outerSize.width() + 1]); |
| 159 EXPECT_EQ(SK_ColorCYAN, pixels[outerPixels - outerSize.width() - 2]); |
| 160 } |
| 161 |
| 162 } // namespace |
OLD | NEW |