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 2465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2476 setThumbResourceId(provider->createResource(pool, size, format, hint)); | 2476 setThumbResourceId(provider->createResource(pool, size, format, hint)); |
2477 } | 2477 } |
2478 | 2478 |
2479 protected: | 2479 protected: |
2480 explicit FakeScrollbarLayerImpl(int id) | 2480 explicit FakeScrollbarLayerImpl(int id) |
2481 : CCScrollbarLayerImpl(id) | 2481 : CCScrollbarLayerImpl(id) |
2482 { | 2482 { |
2483 } | 2483 } |
2484 }; | 2484 }; |
2485 | 2485 |
2486 static inline PassOwnPtr<CCRenderPass> createRenderPassWithResource(CCResourcePr ovider* provider) | 2486 static inline scoped_ptr<CCRenderPass> createRenderPassWithResource(CCResourcePr ovider* provider) |
2487 { | 2487 { |
2488 CCResourceProvider::ResourceId resourceId = provider->createResource(0, IntS ize(1, 1), GraphicsContext3D::RGBA, CCResourceProvider::TextureUsageAny); | 2488 CCResourceProvider::ResourceId resourceId = provider->createResource(0, IntS ize(1, 1), GraphicsContext3D::RGBA, CCResourceProvider::TextureUsageAny); |
2489 | 2489 |
2490 OwnPtr<CCRenderPass> pass = CCRenderPass::create(CCRenderPass::Id(1, 1), Int Rect(0, 0, 1, 1), WebTransformationMatrix()); | 2490 scoped_ptr<CCRenderPass> pass = CCRenderPass::create(CCRenderPass::Id(1, 1), IntRect(0, 0, 1, 1), WebTransformationMatrix()); |
2491 OwnPtr<CCSharedQuadState> sharedState = CCSharedQuadState::create(WebTransfo rmationMatrix(), IntRect(0, 0, 1, 1), IntRect(0, 0, 1, 1), 1, false); | 2491 OwnPtr<CCSharedQuadState> sharedState = CCSharedQuadState::create(WebTransfo rmationMatrix(), IntRect(0, 0, 1, 1), IntRect(0, 0, 1, 1), 1, false); |
2492 OwnPtr<CCTextureDrawQuad> quad = CCTextureDrawQuad::create(sharedState.get() , IntRect(0, 0, 1, 1), resourceId, false, FloatRect(0, 0, 1, 1), false); | 2492 OwnPtr<CCTextureDrawQuad> quad = CCTextureDrawQuad::create(sharedState.get() , IntRect(0, 0, 1, 1), resourceId, false, FloatRect(0, 0, 1, 1), false); |
2493 | 2493 |
2494 static_cast<CCTestRenderPass*>(pass.get())->appendSharedQuadState(sharedStat e.release()); | 2494 static_cast<CCTestRenderPass*>(pass.get())->appendSharedQuadState(sharedStat e.release()); |
2495 static_cast<CCTestRenderPass*>(pass.get())->appendQuad(quad.release()); | 2495 static_cast<CCTestRenderPass*>(pass.get())->appendQuad(quad.release()); |
2496 | 2496 |
2497 return pass.release(); | 2497 return pass.Pass(); |
2498 } | 2498 } |
2499 | 2499 |
2500 TEST_F(CCLayerTreeHostImplTest, dontUseOldResourcesAfterLostContext) | 2500 TEST_F(CCLayerTreeHostImplTest, dontUseOldResourcesAfterLostContext) |
2501 { | 2501 { |
2502 int layerId = 1; | 2502 int layerId = 1; |
2503 | 2503 |
2504 OwnPtr<CCLayerImpl> rootLayer(CCLayerImpl::create(layerId++)); | 2504 OwnPtr<CCLayerImpl> rootLayer(CCLayerImpl::create(layerId++)); |
2505 rootLayer->setBounds(IntSize(10, 10)); | 2505 rootLayer->setBounds(IntSize(10, 10)); |
2506 rootLayer->setAnchorPoint(FloatPoint(0, 0)); | 2506 rootLayer->setAnchorPoint(FloatPoint(0, 0)); |
2507 | 2507 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2588 scrollbarLayer->setDrawsContent(true); | 2588 scrollbarLayer->setDrawsContent(true); |
2589 scrollbarLayer->setLayerTreeHostImpl(m_hostImpl.get()); | 2589 scrollbarLayer->setLayerTreeHostImpl(m_hostImpl.get()); |
2590 scrollbarLayer->createResources(m_hostImpl->resourceProvider()); | 2590 scrollbarLayer->createResources(m_hostImpl->resourceProvider()); |
2591 rootLayer->addChild(scrollbarLayer.release()); | 2591 rootLayer->addChild(scrollbarLayer.release()); |
2592 | 2592 |
2593 OwnPtr<CCDelegatedRendererLayerImpl> delegatedRendererLayer(CCDelegatedRende rerLayerImpl::create(layerId++)); | 2593 OwnPtr<CCDelegatedRendererLayerImpl> delegatedRendererLayer(CCDelegatedRende rerLayerImpl::create(layerId++)); |
2594 delegatedRendererLayer->setBounds(IntSize(10, 10)); | 2594 delegatedRendererLayer->setBounds(IntSize(10, 10)); |
2595 delegatedRendererLayer->setContentBounds(IntSize(10, 10)); | 2595 delegatedRendererLayer->setContentBounds(IntSize(10, 10)); |
2596 delegatedRendererLayer->setDrawsContent(true); | 2596 delegatedRendererLayer->setDrawsContent(true); |
2597 delegatedRendererLayer->setLayerTreeHostImpl(m_hostImpl.get()); | 2597 delegatedRendererLayer->setLayerTreeHostImpl(m_hostImpl.get()); |
2598 OwnPtrVector<CCRenderPass> passList; | 2598 ScopedPtrVector<CCRenderPass> passList; |
2599 passList.append(createRenderPassWithResource(m_hostImpl->resourceProvider()) ); | 2599 passList.append(createRenderPassWithResource(m_hostImpl->resourceProvider()) ); |
2600 delegatedRendererLayer->setRenderPasses(passList); | 2600 delegatedRendererLayer->setRenderPasses(passList); |
2601 EXPECT_TRUE(passList.isEmpty()); | 2601 EXPECT_TRUE(passList.isEmpty()); |
2602 rootLayer->addChild(delegatedRendererLayer.release()); | 2602 rootLayer->addChild(delegatedRendererLayer.release()); |
2603 | 2603 |
2604 // Use a context that supports IOSurfaces | 2604 // Use a context that supports IOSurfaces |
2605 m_hostImpl->initializeRenderer(FakeWebCompositorOutputSurface::create(adoptP tr(new FakeWebGraphicsContext3DWithIOSurface))); | 2605 m_hostImpl->initializeRenderer(FakeWebCompositorOutputSurface::create(adoptP tr(new FakeWebGraphicsContext3DWithIOSurface))); |
2606 | 2606 |
2607 hwVideoFrame.setTextureId(m_hostImpl->resourceProvider()->graphicsContext3D( )->createTexture()); | 2607 hwVideoFrame.setTextureId(m_hostImpl->resourceProvider()->graphicsContext3D( )->createTexture()); |
2608 | 2608 |
(...skipping 1260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3869 myHostImpl->didDrawAllLayers(frame); | 3869 myHostImpl->didDrawAllLayers(frame); |
3870 } | 3870 } |
3871 } | 3871 } |
3872 | 3872 |
3873 TEST_F(CCLayerTreeHostImplTest, releaseContentsTextureShouldTriggerCommit) | 3873 TEST_F(CCLayerTreeHostImplTest, releaseContentsTextureShouldTriggerCommit) |
3874 { | 3874 { |
3875 m_hostImpl->releaseContentsTextures(); | 3875 m_hostImpl->releaseContentsTextures(); |
3876 EXPECT_TRUE(m_didRequestCommit); | 3876 EXPECT_TRUE(m_didRequestCommit); |
3877 } | 3877 } |
3878 | 3878 |
3879 struct RenderPassCacheEntry { | |
3880 mutable OwnPtr<CCRenderPass> renderPassPtr; | |
3881 CCRenderPass* renderPass; | |
3882 | |
3883 RenderPassCacheEntry(PassOwnPtr<CCRenderPass> r) | |
3884 : renderPassPtr(r), | |
3885 renderPass(renderPassPtr.get()) | |
3886 { | |
3887 } | |
3888 | |
3889 RenderPassCacheEntry() | |
3890 { | |
3891 } | |
3892 | |
3893 RenderPassCacheEntry(const RenderPassCacheEntry& entry) | |
3894 : renderPassPtr(entry.renderPassPtr.release()), | |
3895 renderPass(entry.renderPass) | |
3896 { | |
3897 } | |
3898 | |
3899 RenderPassCacheEntry& operator=(const RenderPassCacheEntry& entry) | |
3900 { | |
3901 renderPassPtr = entry.renderPassPtr.release(); | |
3902 renderPass = entry.renderPass; | |
3903 return *this; | |
3904 } | |
3905 }; | |
3906 | |
3907 struct RenderPassRemovalTestData : public CCLayerTreeHostImpl::FrameData { | 3879 struct RenderPassRemovalTestData : public CCLayerTreeHostImpl::FrameData { |
3908 std::map<CCRenderPass::Id, RenderPassCacheEntry> renderPassCache; | 3880 ScopedPtrHashMap<CCRenderPass::Id, CCRenderPass> renderPassCache; |
3909 OwnPtr<CCSharedQuadState> sharedQuadState; | 3881 OwnPtr<CCSharedQuadState> sharedQuadState; |
3910 }; | 3882 }; |
3911 | 3883 |
3912 class CCTestRenderer : public CCRendererGL, public CCRendererClient { | 3884 class CCTestRenderer : public CCRendererGL, public CCRendererClient { |
3913 public: | 3885 public: |
3914 static PassOwnPtr<CCTestRenderer> create(CCResourceProvider* resourceProvide r) | 3886 static PassOwnPtr<CCTestRenderer> create(CCResourceProvider* resourceProvide r) |
3915 { | 3887 { |
3916 OwnPtr<CCTestRenderer> renderer(adoptPtr(new CCTestRenderer(resourceProv ider))); | 3888 OwnPtr<CCTestRenderer> renderer(adoptPtr(new CCTestRenderer(resourceProv ider))); |
3917 if (!renderer->initialize()) | 3889 if (!renderer->initialize()) |
3918 return nullptr; | 3890 return nullptr; |
3919 | 3891 |
3920 return renderer.release(); | 3892 return renderer.release(); |
3921 } | 3893 } |
3922 | 3894 |
3923 void clearCachedTextures() { m_textures.clear(); } | 3895 void clearCachedTextures() { m_textures.clear(); } |
3924 void setHaveCachedResourcesForRenderPassId(CCRenderPass::Id id) { m_textures .add(id); } | 3896 void setHaveCachedResourcesForRenderPassId(CCRenderPass::Id id) { m_textures .insert(id); } |
3925 | 3897 |
3926 virtual bool haveCachedResourcesForRenderPassId(CCRenderPass::Id id) const O VERRIDE { return m_textures.contains(id); } | 3898 virtual bool haveCachedResourcesForRenderPassId(CCRenderPass::Id id) const O VERRIDE { return m_textures.count(id); } |
3927 | 3899 |
3928 // CCRendererClient implementation. | 3900 // CCRendererClient implementation. |
3929 virtual const IntSize& deviceViewportSize() const OVERRIDE { return m_viewpo rtSize; } | 3901 virtual const IntSize& deviceViewportSize() const OVERRIDE { return m_viewpo rtSize; } |
3930 virtual const CCLayerTreeSettings& settings() const OVERRIDE { return m_sett ings; } | 3902 virtual const CCLayerTreeSettings& settings() const OVERRIDE { return m_sett ings; } |
3931 virtual void didLoseContext() OVERRIDE { } | 3903 virtual void didLoseContext() OVERRIDE { } |
3932 virtual void onSwapBuffersComplete() OVERRIDE { } | 3904 virtual void onSwapBuffersComplete() OVERRIDE { } |
3933 virtual void setFullRootLayerDamage() OVERRIDE { } | 3905 virtual void setFullRootLayerDamage() OVERRIDE { } |
3934 virtual void releaseContentsTextures() OVERRIDE { } | 3906 virtual void releaseContentsTextures() OVERRIDE { } |
3935 virtual void setMemoryAllocationLimitBytes(size_t) OVERRIDE { } | 3907 virtual void setMemoryAllocationLimitBytes(size_t) OVERRIDE { } |
3936 | 3908 |
3937 protected: | 3909 protected: |
3938 CCTestRenderer(CCResourceProvider* resourceProvider) : CCRendererGL(this, re sourceProvider) { } | 3910 CCTestRenderer(CCResourceProvider* resourceProvider) : CCRendererGL(this, re sourceProvider) { } |
3939 | 3911 |
3940 private: | 3912 private: |
3941 CCLayerTreeSettings m_settings; | 3913 CCLayerTreeSettings m_settings; |
3942 IntSize m_viewportSize; | 3914 IntSize m_viewportSize; |
3943 HashSet<CCRenderPass::Id> m_textures; | 3915 base::hash_set<CCRenderPass::Id> m_textures; |
3944 }; | 3916 }; |
3945 | 3917 |
3946 static void configureRenderPassTestData(const char* testScript, RenderPassRemova lTestData& testData, CCTestRenderer* renderer) | 3918 static void configureRenderPassTestData(const char* testScript, RenderPassRemova lTestData& testData, CCTestRenderer* renderer) |
3947 { | 3919 { |
3948 renderer->clearCachedTextures(); | 3920 renderer->clearCachedTextures(); |
3949 | 3921 |
3950 // One shared state for all quads - we don't need the correct details | 3922 // One shared state for all quads - we don't need the correct details |
3951 testData.sharedQuadState = CCSharedQuadState::create(WebTransformationMatrix (), IntRect(), IntRect(), 1.0, true); | 3923 testData.sharedQuadState = CCSharedQuadState::create(WebTransformationMatrix (), IntRect(), IntRect(), 1.0, true); |
3952 | 3924 |
3953 const char* currentChar = testScript; | 3925 const char* currentChar = testScript; |
3954 | 3926 |
3955 // Pre-create root pass | 3927 // Pre-create root pass |
3956 CCRenderPass::Id rootRenderPassId = CCRenderPass::Id(testScript[0], testScri pt[1]); | 3928 CCRenderPass::Id rootRenderPassId = CCRenderPass::Id(testScript[0], testScri pt[1]); |
3957 OwnPtr<CCRenderPass> rootRenderPass = CCRenderPass::create(rootRenderPassId, IntRect(), WebTransformationMatrix()); | 3929 testData.renderPassCache.add(rootRenderPassId, CCRenderPass::create(rootRend erPassId, IntRect(), WebTransformationMatrix())); |
3958 testData.renderPassCache.insert(std::pair<CCRenderPass::Id, RenderPassCacheE ntry>(rootRenderPassId, RenderPassCacheEntry(rootRenderPass.release()))); | |
3959 while (*currentChar) { | 3930 while (*currentChar) { |
3960 int layerId = *currentChar; | 3931 int layerId = *currentChar; |
3961 currentChar++; | 3932 currentChar++; |
3962 ASSERT_TRUE(currentChar); | 3933 ASSERT_TRUE(currentChar); |
3963 int index = *currentChar; | 3934 int index = *currentChar; |
3964 currentChar++; | 3935 currentChar++; |
3965 | 3936 |
3966 CCRenderPass::Id renderPassId = CCRenderPass::Id(layerId, index); | 3937 CCRenderPass::Id renderPassId = CCRenderPass::Id(layerId, index); |
3967 | 3938 |
3968 OwnPtr<CCRenderPass> renderPass; | |
3969 | |
3970 bool isReplica = false; | 3939 bool isReplica = false; |
3971 if (!testData.renderPassCache[renderPassId].renderPassPtr.get()) | 3940 if (!testData.renderPassCache.get(renderPassId)) |
jamesr
2012/09/25 03:53:50
.contains(renderPassId) ?
danakj
2012/09/25 16:13:51
oh absolutely.
| |
3972 isReplica = true; | 3941 isReplica = true; |
3973 | 3942 |
3974 renderPass = testData.renderPassCache[renderPassId].renderPassPtr.releas e(); | 3943 scoped_ptr<CCRenderPass> renderPass = testData.renderPassCache.take(rend erPassId); |
jamesr
2012/09/25 03:53:50
the old code would leave a null entry in place in
danakj
2012/09/25 16:13:51
i think it doesn't really matter which one we do,
| |
3975 | 3944 |
3976 // Cycle through quad data and create all quads | 3945 // Cycle through quad data and create all quads |
3977 while (*currentChar && *currentChar != '\n') { | 3946 while (*currentChar && *currentChar != '\n') { |
3978 if (*currentChar == 's') { | 3947 if (*currentChar == 's') { |
3979 // Solid color draw quad | 3948 // Solid color draw quad |
3980 OwnPtr<CCDrawQuad> quad = CCSolidColorDrawQuad::create(testData. sharedQuadState.get(), IntRect(0, 0, 10, 10), SK_ColorWHITE); | 3949 OwnPtr<CCDrawQuad> quad = CCSolidColorDrawQuad::create(testData. sharedQuadState.get(), IntRect(0, 0, 10, 10), SK_ColorWHITE); |
3981 | 3950 |
3982 static_cast<CCTestRenderPass*>(renderPass.get())->appendQuad(qua d.release()); | 3951 static_cast<CCTestRenderPass*>(renderPass.get())->appendQuad(qua d.release()); |
3983 currentChar++; | 3952 currentChar++; |
3984 } else if ((*currentChar >= 'A') && (*currentChar <= 'Z')) { | 3953 } else if ((*currentChar >= 'A') && (*currentChar <= 'Z')) { |
(...skipping 22 matching lines...) Expand all Loading... | |
4007 currentChar++; | 3976 currentChar++; |
4008 } | 3977 } |
4009 if (*currentChar == ']') | 3978 if (*currentChar == ']') |
4010 currentChar++; | 3979 currentChar++; |
4011 } | 3980 } |
4012 | 3981 |
4013 if (testData.renderPassCache.find(newRenderPassId) == testData.r enderPassCache.end()) { | 3982 if (testData.renderPassCache.find(newRenderPassId) == testData.r enderPassCache.end()) { |
4014 if (hasTexture) | 3983 if (hasTexture) |
4015 renderer->setHaveCachedResourcesForRenderPassId(newRende rPassId); | 3984 renderer->setHaveCachedResourcesForRenderPassId(newRende rPassId); |
4016 | 3985 |
4017 OwnPtr<CCRenderPass> renderPass = CCTestRenderPass::create(n ewRenderPassId, IntRect(), WebTransformationMatrix()); | 3986 testData.renderPassCache.add(newRenderPassId, CCTestRenderPa ss::create(newRenderPassId, IntRect(), WebTransformationMatrix())); |
4018 testData.renderPassCache.insert(std::pair<CCRenderPass::Id, RenderPassCacheEntry>(newRenderPassId, RenderPassCacheEntry(renderPass.release() ))); | |
4019 } | 3987 } |
4020 | 3988 |
4021 IntRect quadRect = IntRect(0, 0, 1, 1); | 3989 IntRect quadRect = IntRect(0, 0, 1, 1); |
4022 IntRect contentsChangedRect = contentsChanged ? quadRect : IntRe ct(); | 3990 IntRect contentsChangedRect = contentsChanged ? quadRect : IntRe ct(); |
4023 OwnPtr<CCRenderPassDrawQuad> quad = CCRenderPassDrawQuad::create (testData.sharedQuadState.get(), quadRect, newRenderPassId, isReplica, 1, conten tsChangedRect, 1, 1, 0, 0); | 3991 OwnPtr<CCRenderPassDrawQuad> quad = CCRenderPassDrawQuad::create (testData.sharedQuadState.get(), quadRect, newRenderPassId, isReplica, 1, conten tsChangedRect, 1, 1, 0, 0); |
4024 static_cast<CCTestRenderPass*>(renderPass.get())->appendQuad(qua d.release()); | 3992 static_cast<CCTestRenderPass*>(renderPass.get())->appendQuad(qua d.release()); |
4025 } | 3993 } |
4026 } | 3994 } |
4027 testData.renderPasses.insert(0, renderPass.get()); | 3995 testData.renderPasses.insert(0, renderPass.get()); |
4028 testData.renderPassesById.add(renderPassId, renderPass.release()); | 3996 testData.renderPassesById.add(renderPassId, renderPass.Pass()); |
4029 if (*currentChar) | 3997 if (*currentChar) |
4030 currentChar++; | 3998 currentChar++; |
4031 } | 3999 } |
4032 } | 4000 } |
4033 | 4001 |
4034 void dumpRenderPassTestData(const RenderPassRemovalTestData& testData, char* buf fer) | 4002 void dumpRenderPassTestData(const RenderPassRemovalTestData& testData, char* buf fer) |
4035 { | 4003 { |
4036 char* pos = buffer; | 4004 char* pos = buffer; |
4037 for (CCRenderPassList::const_reverse_iterator it = testData.renderPasses.rbe gin(); it != testData.renderPasses.rend(); ++it) { | 4005 for (CCRenderPassList::const_reverse_iterator it = testData.renderPasses.rbe gin(); it != testData.renderPasses.rend(); ++it) { |
4038 const CCRenderPass* currentPass = *it; | 4006 const CCRenderPass* currentPass = *it; |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4229 while (removeRenderPassesCases[testCaseIndex].name) { | 4197 while (removeRenderPassesCases[testCaseIndex].name) { |
4230 RenderPassRemovalTestData testData; | 4198 RenderPassRemovalTestData testData; |
4231 configureRenderPassTestData(removeRenderPassesCases[testCaseIndex].initS cript, testData, renderer.get()); | 4199 configureRenderPassTestData(removeRenderPassesCases[testCaseIndex].initS cript, testData, renderer.get()); |
4232 CCLayerTreeHostImpl::removeRenderPasses(CCLayerTreeHostImpl::CullRenderP assesWithCachedTextures(*renderer), testData); | 4200 CCLayerTreeHostImpl::removeRenderPasses(CCLayerTreeHostImpl::CullRenderP assesWithCachedTextures(*renderer), testData); |
4233 verifyRenderPassTestData(removeRenderPassesCases[testCaseIndex], testDat a); | 4201 verifyRenderPassTestData(removeRenderPassesCases[testCaseIndex], testDat a); |
4234 testCaseIndex++; | 4202 testCaseIndex++; |
4235 } | 4203 } |
4236 } | 4204 } |
4237 | 4205 |
4238 } // namespace | 4206 } // namespace |
OLD | NEW |