Chromium Code Reviews| 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 |