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