| 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 |