OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 | 6 |
7 #include "CCLayerTreeHostImpl.h" | 7 #include "CCLayerTreeHostImpl.h" |
8 | 8 |
9 #include "CCAnimationTestCommon.h" | 9 #include "CCAnimationTestCommon.h" |
10 #include "CCDelegatedRendererLayerImpl.h" | 10 #include "CCDelegatedRendererLayerImpl.h" |
(...skipping 2512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2523 setThumbResourceId(provider->createResource(pool, size, format, hint)); | 2523 setThumbResourceId(provider->createResource(pool, size, format, hint)); |
2524 } | 2524 } |
2525 | 2525 |
2526 protected: | 2526 protected: |
2527 explicit FakeScrollbarLayerImpl(int id) | 2527 explicit FakeScrollbarLayerImpl(int id) |
2528 : CCScrollbarLayerImpl(id) | 2528 : CCScrollbarLayerImpl(id) |
2529 { | 2529 { |
2530 } | 2530 } |
2531 }; | 2531 }; |
2532 | 2532 |
2533 static inline PassOwnPtr<CCRenderPass> createRenderPassWithResource(CCResourcePr
ovider* provider) | 2533 static inline scoped_ptr<CCRenderPass> createRenderPassWithResource(CCResourcePr
ovider* provider) |
2534 { | 2534 { |
2535 CCResourceProvider::ResourceId resourceId = provider->createResource(0, IntS
ize(1, 1), GraphicsContext3D::RGBA, CCResourceProvider::TextureUsageAny); | 2535 CCResourceProvider::ResourceId resourceId = provider->createResource(0, IntS
ize(1, 1), GraphicsContext3D::RGBA, CCResourceProvider::TextureUsageAny); |
2536 | 2536 |
2537 OwnPtr<CCRenderPass> pass = CCRenderPass::create(CCRenderPass::Id(1, 1), Int
Rect(0, 0, 1, 1), WebTransformationMatrix()); | 2537 scoped_ptr<CCRenderPass> pass = CCRenderPass::create(CCRenderPass::Id(1, 1),
IntRect(0, 0, 1, 1), WebTransformationMatrix()); |
2538 OwnPtr<CCSharedQuadState> sharedState = CCSharedQuadState::create(WebTransfo
rmationMatrix(), IntRect(0, 0, 1, 1), IntRect(0, 0, 1, 1), 1, false); | 2538 OwnPtr<CCSharedQuadState> sharedState = CCSharedQuadState::create(WebTransfo
rmationMatrix(), IntRect(0, 0, 1, 1), IntRect(0, 0, 1, 1), 1, false); |
2539 OwnPtr<CCTextureDrawQuad> quad = CCTextureDrawQuad::create(sharedState.get()
, IntRect(0, 0, 1, 1), resourceId, false, FloatRect(0, 0, 1, 1), false); | 2539 OwnPtr<CCTextureDrawQuad> quad = CCTextureDrawQuad::create(sharedState.get()
, IntRect(0, 0, 1, 1), resourceId, false, FloatRect(0, 0, 1, 1), false); |
2540 | 2540 |
2541 static_cast<CCTestRenderPass*>(pass.get())->appendSharedQuadState(sharedStat
e.release()); | 2541 static_cast<CCTestRenderPass*>(pass.get())->appendSharedQuadState(sharedStat
e.release()); |
2542 static_cast<CCTestRenderPass*>(pass.get())->appendQuad(quad.release()); | 2542 static_cast<CCTestRenderPass*>(pass.get())->appendQuad(quad.release()); |
2543 | 2543 |
2544 return pass.release(); | 2544 return pass.Pass(); |
2545 } | 2545 } |
2546 | 2546 |
2547 TEST_F(CCLayerTreeHostImplTest, dontUseOldResourcesAfterLostContext) | 2547 TEST_F(CCLayerTreeHostImplTest, dontUseOldResourcesAfterLostContext) |
2548 { | 2548 { |
2549 int layerId = 1; | 2549 int layerId = 1; |
2550 | 2550 |
2551 OwnPtr<CCLayerImpl> rootLayer(CCLayerImpl::create(layerId++)); | 2551 OwnPtr<CCLayerImpl> rootLayer(CCLayerImpl::create(layerId++)); |
2552 rootLayer->setBounds(IntSize(10, 10)); | 2552 rootLayer->setBounds(IntSize(10, 10)); |
2553 rootLayer->setAnchorPoint(FloatPoint(0, 0)); | 2553 rootLayer->setAnchorPoint(FloatPoint(0, 0)); |
2554 | 2554 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2635 scrollbarLayer->setDrawsContent(true); | 2635 scrollbarLayer->setDrawsContent(true); |
2636 scrollbarLayer->setLayerTreeHostImpl(m_hostImpl.get()); | 2636 scrollbarLayer->setLayerTreeHostImpl(m_hostImpl.get()); |
2637 scrollbarLayer->createResources(m_hostImpl->resourceProvider()); | 2637 scrollbarLayer->createResources(m_hostImpl->resourceProvider()); |
2638 rootLayer->addChild(scrollbarLayer.release()); | 2638 rootLayer->addChild(scrollbarLayer.release()); |
2639 | 2639 |
2640 OwnPtr<CCDelegatedRendererLayerImpl> delegatedRendererLayer(CCDelegatedRende
rerLayerImpl::create(layerId++)); | 2640 OwnPtr<CCDelegatedRendererLayerImpl> delegatedRendererLayer(CCDelegatedRende
rerLayerImpl::create(layerId++)); |
2641 delegatedRendererLayer->setBounds(IntSize(10, 10)); | 2641 delegatedRendererLayer->setBounds(IntSize(10, 10)); |
2642 delegatedRendererLayer->setContentBounds(IntSize(10, 10)); | 2642 delegatedRendererLayer->setContentBounds(IntSize(10, 10)); |
2643 delegatedRendererLayer->setDrawsContent(true); | 2643 delegatedRendererLayer->setDrawsContent(true); |
2644 delegatedRendererLayer->setLayerTreeHostImpl(m_hostImpl.get()); | 2644 delegatedRendererLayer->setLayerTreeHostImpl(m_hostImpl.get()); |
2645 OwnPtrVector<CCRenderPass> passList; | 2645 ScopedPtrVector<CCRenderPass> passList; |
2646 passList.append(createRenderPassWithResource(m_hostImpl->resourceProvider())
); | 2646 passList.append(createRenderPassWithResource(m_hostImpl->resourceProvider())
); |
2647 delegatedRendererLayer->setRenderPasses(passList); | 2647 delegatedRendererLayer->setRenderPasses(passList); |
2648 EXPECT_TRUE(passList.isEmpty()); | 2648 EXPECT_TRUE(passList.isEmpty()); |
2649 rootLayer->addChild(delegatedRendererLayer.release()); | 2649 rootLayer->addChild(delegatedRendererLayer.release()); |
2650 | 2650 |
2651 // Use a context that supports IOSurfaces | 2651 // Use a context that supports IOSurfaces |
2652 m_hostImpl->initializeRenderer(FakeWebCompositorOutputSurface::create(adoptP
tr(new FakeWebGraphicsContext3DWithIOSurface))); | 2652 m_hostImpl->initializeRenderer(FakeWebCompositorOutputSurface::create(adoptP
tr(new FakeWebGraphicsContext3DWithIOSurface))); |
2653 | 2653 |
2654 hwVideoFrame.setTextureId(m_hostImpl->resourceProvider()->graphicsContext3D(
)->createTexture()); | 2654 hwVideoFrame.setTextureId(m_hostImpl->resourceProvider()->graphicsContext3D(
)->createTexture()); |
2655 | 2655 |
(...skipping 1260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3916 myHostImpl->didDrawAllLayers(frame); | 3916 myHostImpl->didDrawAllLayers(frame); |
3917 } | 3917 } |
3918 } | 3918 } |
3919 | 3919 |
3920 TEST_F(CCLayerTreeHostImplTest, releaseContentsTextureShouldTriggerCommit) | 3920 TEST_F(CCLayerTreeHostImplTest, releaseContentsTextureShouldTriggerCommit) |
3921 { | 3921 { |
3922 m_hostImpl->releaseContentsTextures(); | 3922 m_hostImpl->releaseContentsTextures(); |
3923 EXPECT_TRUE(m_didRequestCommit); | 3923 EXPECT_TRUE(m_didRequestCommit); |
3924 } | 3924 } |
3925 | 3925 |
3926 struct RenderPassCacheEntry { | |
3927 mutable OwnPtr<CCRenderPass> renderPassPtr; | |
3928 CCRenderPass* renderPass; | |
3929 | |
3930 RenderPassCacheEntry(PassOwnPtr<CCRenderPass> r) | |
3931 : renderPassPtr(r), | |
3932 renderPass(renderPassPtr.get()) | |
3933 { | |
3934 } | |
3935 | |
3936 RenderPassCacheEntry() | |
3937 { | |
3938 } | |
3939 | |
3940 RenderPassCacheEntry(const RenderPassCacheEntry& entry) | |
3941 : renderPassPtr(entry.renderPassPtr.release()), | |
3942 renderPass(entry.renderPass) | |
3943 { | |
3944 } | |
3945 | |
3946 RenderPassCacheEntry& operator=(const RenderPassCacheEntry& entry) | |
3947 { | |
3948 renderPassPtr = entry.renderPassPtr.release(); | |
3949 renderPass = entry.renderPass; | |
3950 return *this; | |
3951 } | |
3952 }; | |
3953 | |
3954 struct RenderPassRemovalTestData : public CCLayerTreeHostImpl::FrameData { | 3926 struct RenderPassRemovalTestData : public CCLayerTreeHostImpl::FrameData { |
3955 std::map<CCRenderPass::Id, RenderPassCacheEntry> renderPassCache; | 3927 ScopedPtrHashMap<CCRenderPass::Id, CCRenderPass> renderPassCache; |
3956 OwnPtr<CCSharedQuadState> sharedQuadState; | 3928 OwnPtr<CCSharedQuadState> sharedQuadState; |
3957 }; | 3929 }; |
3958 | 3930 |
3959 class CCTestRenderer : public CCRendererGL, public CCRendererClient { | 3931 class CCTestRenderer : public CCRendererGL, public CCRendererClient { |
3960 public: | 3932 public: |
3961 static PassOwnPtr<CCTestRenderer> create(CCResourceProvider* resourceProvide
r) | 3933 static PassOwnPtr<CCTestRenderer> create(CCResourceProvider* resourceProvide
r) |
3962 { | 3934 { |
3963 OwnPtr<CCTestRenderer> renderer(adoptPtr(new CCTestRenderer(resourceProv
ider))); | 3935 OwnPtr<CCTestRenderer> renderer(adoptPtr(new CCTestRenderer(resourceProv
ider))); |
3964 if (!renderer->initialize()) | 3936 if (!renderer->initialize()) |
3965 return nullptr; | 3937 return nullptr; |
3966 | 3938 |
3967 return renderer.release(); | 3939 return renderer.release(); |
3968 } | 3940 } |
3969 | 3941 |
3970 void clearCachedTextures() { m_textures.clear(); } | 3942 void clearCachedTextures() { m_textures.clear(); } |
3971 void setHaveCachedResourcesForRenderPassId(CCRenderPass::Id id) { m_textures
.add(id); } | 3943 void setHaveCachedResourcesForRenderPassId(CCRenderPass::Id id) { m_textures
.insert(id); } |
3972 | 3944 |
3973 virtual bool haveCachedResourcesForRenderPassId(CCRenderPass::Id id) const O
VERRIDE { return m_textures.contains(id); } | 3945 virtual bool haveCachedResourcesForRenderPassId(CCRenderPass::Id id) const O
VERRIDE { return m_textures.count(id); } |
3974 | 3946 |
3975 // CCRendererClient implementation. | 3947 // CCRendererClient implementation. |
3976 virtual const IntSize& deviceViewportSize() const OVERRIDE { return m_viewpo
rtSize; } | 3948 virtual const IntSize& deviceViewportSize() const OVERRIDE { return m_viewpo
rtSize; } |
3977 virtual const CCLayerTreeSettings& settings() const OVERRIDE { return m_sett
ings; } | 3949 virtual const CCLayerTreeSettings& settings() const OVERRIDE { return m_sett
ings; } |
3978 virtual void didLoseContext() OVERRIDE { } | 3950 virtual void didLoseContext() OVERRIDE { } |
3979 virtual void onSwapBuffersComplete() OVERRIDE { } | 3951 virtual void onSwapBuffersComplete() OVERRIDE { } |
3980 virtual void setFullRootLayerDamage() OVERRIDE { } | 3952 virtual void setFullRootLayerDamage() OVERRIDE { } |
3981 virtual void releaseContentsTextures() OVERRIDE { } | 3953 virtual void releaseContentsTextures() OVERRIDE { } |
3982 virtual void setMemoryAllocationLimitBytes(size_t) OVERRIDE { } | 3954 virtual void setMemoryAllocationLimitBytes(size_t) OVERRIDE { } |
3983 | 3955 |
3984 protected: | 3956 protected: |
3985 CCTestRenderer(CCResourceProvider* resourceProvider) : CCRendererGL(this, re
sourceProvider) { } | 3957 CCTestRenderer(CCResourceProvider* resourceProvider) : CCRendererGL(this, re
sourceProvider) { } |
3986 | 3958 |
3987 private: | 3959 private: |
3988 CCLayerTreeSettings m_settings; | 3960 CCLayerTreeSettings m_settings; |
3989 IntSize m_viewportSize; | 3961 IntSize m_viewportSize; |
3990 HashSet<CCRenderPass::Id> m_textures; | 3962 base::hash_set<CCRenderPass::Id> m_textures; |
3991 }; | 3963 }; |
3992 | 3964 |
3993 static void configureRenderPassTestData(const char* testScript, RenderPassRemova
lTestData& testData, CCTestRenderer* renderer) | 3965 static void configureRenderPassTestData(const char* testScript, RenderPassRemova
lTestData& testData, CCTestRenderer* renderer) |
3994 { | 3966 { |
3995 renderer->clearCachedTextures(); | 3967 renderer->clearCachedTextures(); |
3996 | 3968 |
3997 // One shared state for all quads - we don't need the correct details | 3969 // One shared state for all quads - we don't need the correct details |
3998 testData.sharedQuadState = CCSharedQuadState::create(WebTransformationMatrix
(), IntRect(), IntRect(), 1.0, true); | 3970 testData.sharedQuadState = CCSharedQuadState::create(WebTransformationMatrix
(), IntRect(), IntRect(), 1.0, true); |
3999 | 3971 |
4000 const char* currentChar = testScript; | 3972 const char* currentChar = testScript; |
4001 | 3973 |
4002 // Pre-create root pass | 3974 // Pre-create root pass |
4003 CCRenderPass::Id rootRenderPassId = CCRenderPass::Id(testScript[0], testScri
pt[1]); | 3975 CCRenderPass::Id rootRenderPassId = CCRenderPass::Id(testScript[0], testScri
pt[1]); |
4004 OwnPtr<CCRenderPass> rootRenderPass = CCRenderPass::create(rootRenderPassId,
IntRect(), WebTransformationMatrix()); | 3976 testData.renderPassCache.add(rootRenderPassId, CCRenderPass::create(rootRend
erPassId, IntRect(), WebTransformationMatrix())); |
4005 testData.renderPassCache.insert(std::pair<CCRenderPass::Id, RenderPassCacheE
ntry>(rootRenderPassId, RenderPassCacheEntry(rootRenderPass.release()))); | |
4006 while (*currentChar) { | 3977 while (*currentChar) { |
4007 int layerId = *currentChar; | 3978 int layerId = *currentChar; |
4008 currentChar++; | 3979 currentChar++; |
4009 ASSERT_TRUE(currentChar); | 3980 ASSERT_TRUE(currentChar); |
4010 int index = *currentChar; | 3981 int index = *currentChar; |
4011 currentChar++; | 3982 currentChar++; |
4012 | 3983 |
4013 CCRenderPass::Id renderPassId = CCRenderPass::Id(layerId, index); | 3984 CCRenderPass::Id renderPassId = CCRenderPass::Id(layerId, index); |
4014 | 3985 |
4015 OwnPtr<CCRenderPass> renderPass; | |
4016 | |
4017 bool isReplica = false; | 3986 bool isReplica = false; |
4018 if (!testData.renderPassCache[renderPassId].renderPassPtr.get()) | 3987 if (!testData.renderPassCache.contains(renderPassId)) |
4019 isReplica = true; | 3988 isReplica = true; |
4020 | 3989 |
4021 renderPass = testData.renderPassCache[renderPassId].renderPassPtr.releas
e(); | 3990 scoped_ptr<CCRenderPass> renderPass = testData.renderPassCache.take(rend
erPassId); |
4022 | 3991 |
4023 // Cycle through quad data and create all quads | 3992 // Cycle through quad data and create all quads |
4024 while (*currentChar && *currentChar != '\n') { | 3993 while (*currentChar && *currentChar != '\n') { |
4025 if (*currentChar == 's') { | 3994 if (*currentChar == 's') { |
4026 // Solid color draw quad | 3995 // Solid color draw quad |
4027 OwnPtr<CCDrawQuad> quad = CCSolidColorDrawQuad::create(testData.
sharedQuadState.get(), IntRect(0, 0, 10, 10), SK_ColorWHITE); | 3996 OwnPtr<CCDrawQuad> quad = CCSolidColorDrawQuad::create(testData.
sharedQuadState.get(), IntRect(0, 0, 10, 10), SK_ColorWHITE); |
4028 | 3997 |
4029 static_cast<CCTestRenderPass*>(renderPass.get())->appendQuad(qua
d.release()); | 3998 static_cast<CCTestRenderPass*>(renderPass.get())->appendQuad(qua
d.release()); |
4030 currentChar++; | 3999 currentChar++; |
4031 } else if ((*currentChar >= 'A') && (*currentChar <= 'Z')) { | 4000 } else if ((*currentChar >= 'A') && (*currentChar <= 'Z')) { |
(...skipping 22 matching lines...) Expand all Loading... |
4054 currentChar++; | 4023 currentChar++; |
4055 } | 4024 } |
4056 if (*currentChar == ']') | 4025 if (*currentChar == ']') |
4057 currentChar++; | 4026 currentChar++; |
4058 } | 4027 } |
4059 | 4028 |
4060 if (testData.renderPassCache.find(newRenderPassId) == testData.r
enderPassCache.end()) { | 4029 if (testData.renderPassCache.find(newRenderPassId) == testData.r
enderPassCache.end()) { |
4061 if (hasTexture) | 4030 if (hasTexture) |
4062 renderer->setHaveCachedResourcesForRenderPassId(newRende
rPassId); | 4031 renderer->setHaveCachedResourcesForRenderPassId(newRende
rPassId); |
4063 | 4032 |
4064 OwnPtr<CCRenderPass> renderPass = CCTestRenderPass::create(n
ewRenderPassId, IntRect(), WebTransformationMatrix()); | 4033 testData.renderPassCache.add(newRenderPassId, CCTestRenderPa
ss::create(newRenderPassId, IntRect(), WebTransformationMatrix())); |
4065 testData.renderPassCache.insert(std::pair<CCRenderPass::Id,
RenderPassCacheEntry>(newRenderPassId, RenderPassCacheEntry(renderPass.release()
))); | |
4066 } | 4034 } |
4067 | 4035 |
4068 IntRect quadRect = IntRect(0, 0, 1, 1); | 4036 IntRect quadRect = IntRect(0, 0, 1, 1); |
4069 IntRect contentsChangedRect = contentsChanged ? quadRect : IntRe
ct(); | 4037 IntRect contentsChangedRect = contentsChanged ? quadRect : IntRe
ct(); |
4070 OwnPtr<CCRenderPassDrawQuad> quad = CCRenderPassDrawQuad::create
(testData.sharedQuadState.get(), quadRect, newRenderPassId, isReplica, 1, conten
tsChangedRect, 1, 1, 0, 0); | 4038 OwnPtr<CCRenderPassDrawQuad> quad = CCRenderPassDrawQuad::create
(testData.sharedQuadState.get(), quadRect, newRenderPassId, isReplica, 1, conten
tsChangedRect, 1, 1, 0, 0); |
4071 static_cast<CCTestRenderPass*>(renderPass.get())->appendQuad(qua
d.release()); | 4039 static_cast<CCTestRenderPass*>(renderPass.get())->appendQuad(qua
d.release()); |
4072 } | 4040 } |
4073 } | 4041 } |
4074 testData.renderPasses.insert(0, renderPass.get()); | 4042 testData.renderPasses.insert(0, renderPass.get()); |
4075 testData.renderPassesById.add(renderPassId, renderPass.release()); | 4043 testData.renderPassesById.add(renderPassId, renderPass.Pass()); |
4076 if (*currentChar) | 4044 if (*currentChar) |
4077 currentChar++; | 4045 currentChar++; |
4078 } | 4046 } |
4079 } | 4047 } |
4080 | 4048 |
4081 void dumpRenderPassTestData(const RenderPassRemovalTestData& testData, char* buf
fer) | 4049 void dumpRenderPassTestData(const RenderPassRemovalTestData& testData, char* buf
fer) |
4082 { | 4050 { |
4083 char* pos = buffer; | 4051 char* pos = buffer; |
4084 for (CCRenderPassList::const_reverse_iterator it = testData.renderPasses.rbe
gin(); it != testData.renderPasses.rend(); ++it) { | 4052 for (CCRenderPassList::const_reverse_iterator it = testData.renderPasses.rbe
gin(); it != testData.renderPasses.rend(); ++it) { |
4085 const CCRenderPass* currentPass = *it; | 4053 const CCRenderPass* currentPass = *it; |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4276 while (removeRenderPassesCases[testCaseIndex].name) { | 4244 while (removeRenderPassesCases[testCaseIndex].name) { |
4277 RenderPassRemovalTestData testData; | 4245 RenderPassRemovalTestData testData; |
4278 configureRenderPassTestData(removeRenderPassesCases[testCaseIndex].initS
cript, testData, renderer.get()); | 4246 configureRenderPassTestData(removeRenderPassesCases[testCaseIndex].initS
cript, testData, renderer.get()); |
4279 CCLayerTreeHostImpl::removeRenderPasses(CCLayerTreeHostImpl::CullRenderP
assesWithCachedTextures(*renderer), testData); | 4247 CCLayerTreeHostImpl::removeRenderPasses(CCLayerTreeHostImpl::CullRenderP
assesWithCachedTextures(*renderer), testData); |
4280 verifyRenderPassTestData(removeRenderPassesCases[testCaseIndex], testDat
a); | 4248 verifyRenderPassTestData(removeRenderPassesCases[testCaseIndex], testDat
a); |
4281 testCaseIndex++; | 4249 testCaseIndex++; |
4282 } | 4250 } |
4283 } | 4251 } |
4284 | 4252 |
4285 } // namespace | 4253 } // namespace |
OLD | NEW |