Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Unified Diff: Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp

Issue 10836250: Merge 125577 - [chromium] race between CCLayerTreeHostImpl::releaseContentsTextures and CCThreadPro… (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1229/
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp
===================================================================
--- Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp (revision 125598)
+++ Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp (working copy)
@@ -2349,4 +2349,251 @@
SINGLE_AND_MULTI_THREAD_TEST_F(CCLayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit)
+
+class EvictionTrackingTexture : public LayerTextureUpdater::Texture {
+public:
+ static PassOwnPtr<EvictionTrackingTexture> create(PassOwnPtr<CCPrioritizedTexture> texture) { return adoptPtr(new EvictionTrackingTexture(texture)); }
+ virtual ~EvictionTrackingTexture() { }
+
+ virtual void updateRect(CCResourceProvider* resourceProvider, const IntRect&, const IntRect&) OVERRIDE
+ {
+ ASSERT_TRUE(!texture()->haveBackingTexture() || resourceProvider->numResources() > 0);
+ texture()->acquireBackingTexture(resourceProvider);
+ m_updated = true;
+ }
+ void resetUpdated() { m_updated = false; }
+ bool updated() const { return m_updated; }
+
+private:
+ explicit EvictionTrackingTexture(PassOwnPtr<CCPrioritizedTexture> texture)
+ : LayerTextureUpdater::Texture(texture)
+ , m_updated(false)
+ { }
+ bool m_updated;
+};
+
+class EvictionTestLayer : public LayerChromium {
+public:
+ static PassRefPtr<EvictionTestLayer> create() { return adoptRef(new EvictionTestLayer()); }
+
+ virtual void update(CCTextureUpdateQueue&, const CCOcclusionTracker*, CCRenderingStats&) OVERRIDE;
+ virtual bool drawsContent() const OVERRIDE { return true; }
+
+ virtual PassOwnPtr<CCLayerImpl> createCCLayerImpl() OVERRIDE;
+ virtual void pushPropertiesTo(CCLayerImpl*) OVERRIDE;
+ virtual void setTexturePriorities(const CCPriorityCalculator&) OVERRIDE;
+
+ void resetUpdated()
+ {
+ if (m_texture.get())
+ m_texture->resetUpdated();
+ }
+ bool updated() const { return m_texture.get() ? m_texture->updated() : false; }
+
+private:
+ EvictionTestLayer() : LayerChromium() { }
+
+ void createTextureIfNeeded()
+ {
+ if (m_texture.get())
+ return;
+ m_texture = EvictionTrackingTexture::create(CCPrioritizedTexture::create(layerTreeHost()->contentsTextureManager()));
+ m_texture->texture()->setDimensions(WebCore::IntSize(10, 10), WebCore::GraphicsContext3D::RGBA);
+ }
+
+ OwnPtr<EvictionTrackingTexture> m_texture;
+};
+
+class EvictionTestLayerImpl : public CCLayerImpl {
+public:
+ static PassOwnPtr<EvictionTestLayerImpl> create(int id)
+ {
+ return adoptPtr(new EvictionTestLayerImpl(id));
+ }
+ virtual ~EvictionTestLayerImpl() { }
+ virtual void appendQuads(CCQuadSink&, const CCSharedQuadState*, bool& hadMissingTiles)
+ {
+ ASSERT_TRUE(m_hasTexture);
+ ASSERT_NE(0u, layerTreeHostImpl()->resourceProvider()->numResources());
+ }
+ void setHasTexture(bool hasTexture) { m_hasTexture = hasTexture; }
+
+private:
+ explicit EvictionTestLayerImpl(int id)
+ : CCLayerImpl(id)
+ , m_hasTexture(false) { }
+
+ bool m_hasTexture;
+};
+
+void EvictionTestLayer::setTexturePriorities(const CCPriorityCalculator&)
+{
+ createTextureIfNeeded();
+ if (!m_texture.get())
+ return;
+ m_texture->texture()->setRequestPriority(CCPriorityCalculator::uiPriority(true));
+}
+
+void EvictionTestLayer::update(CCTextureUpdateQueue& queue, const CCOcclusionTracker*, CCRenderingStats&)
+{
+ createTextureIfNeeded();
+ if (!m_texture.get())
+ return;
+ IntRect fullRect(0, 0, 10, 10);
+ TextureUploader::Parameters parameters = { m_texture.get(), fullRect, fullRect };
+ queue.appendFullUpload(parameters);
+}
+
+PassOwnPtr<CCLayerImpl> EvictionTestLayer::createCCLayerImpl()
+{
+ return EvictionTestLayerImpl::create(m_layerId);
+}
+
+void EvictionTestLayer::pushPropertiesTo(CCLayerImpl* layerImpl)
+{
+ LayerChromium::pushPropertiesTo(layerImpl);
+
+ EvictionTestLayerImpl* testLayerImpl = static_cast<EvictionTestLayerImpl*>(layerImpl);
+ testLayerImpl->setHasTexture(m_texture->texture()->haveBackingTexture());
+}
+
+class CCLayerTreeHostTestEvictTextures : public CCLayerTreeHostTest {
+public:
+ CCLayerTreeHostTestEvictTextures()
+ : m_layer(EvictionTestLayer::create())
+ , m_implForEvictTextures(0)
+ , m_numCommits(0)
+ {
+ }
+
+ virtual void beginTest()
+ {
+ m_layerTreeHost->setRootLayer(m_layer);
+ m_layerTreeHost->setViewportSize(IntSize(10, 20), IntSize(10, 20));
+
+ WebTransformationMatrix identityMatrix;
+ setLayerPropertiesForTesting(m_layer.get(), 0, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 20), true);
+ }
+
+ class EvictTexturesTask : public WebKit::WebThread::Task {
+ public:
+ EvictTexturesTask(CCLayerTreeHostTestEvictTextures* test) : m_test(test) { }
+ virtual ~EvictTexturesTask() { }
+ virtual void run()
+ {
+ ASSERT(m_test->m_implForEvictTextures);
+ m_test->m_implForEvictTextures->releaseContentsTextures();
+ }
+
+ private:
+ CCLayerTreeHostTestEvictTextures* m_test;
+ };
+
+ void postEvictTextures()
+ {
+ ASSERT(webThread());
+ webThread()->postTask(new EvictTexturesTask(this));
+ }
+
+ // Commit 1: Just commit and draw normally, then post an eviction at the end
+ // that will trigger a commit.
+ // Commit 2: Triggered by the eviction, let it go through and then set
+ // needsCommit.
+ // Commit 3: Triggered by the setNeedsCommit. In layout(), post an eviction
+ // task, which will be handled before the commit. Don't set needsCommit, it
+ // should have been posted. A frame should not be drawn (note,
+ // didCommitAndDrawFrame may be called anyway).
+ // Commit 4: Triggered by the eviction, let it go through and then set
+ // needsCommit.
+ // Commit 5: Triggered by the setNeedsCommit, post an eviction task in
+ // layout(), a frame should not be drawn but a commit will be posted.
+ // Commit 6: Triggered by the eviction, post an eviction task in
+ // layout(), which will be a noop, letting the commit (which recreates the
+ // textures) go through and draw a frame, then end the test.
+ //
+ // Commits 1+2 test the eviction recovery path where eviction happens outside
+ // of the beginFrame/commit pair.
+ // Commits 3+4 test the eviction recovery path where eviction happens inside
+ // the beginFrame/commit pair.
+ // Commits 5+6 test the path where an eviction happens during the eviction
+ // recovery path.
+ virtual void didCommitAndDrawFrame()
+ {
+ switch (m_numCommits) {
+ case 1:
+ EXPECT_TRUE(m_layer->updated());
+ postEvictTextures();
+ break;
+ case 2:
+ EXPECT_TRUE(m_layer->updated());
+ m_layerTreeHost->setNeedsCommit();
+ break;
+ case 3:
+ break;
+ case 4:
+ EXPECT_TRUE(m_layer->updated());
+ m_layerTreeHost->setNeedsCommit();
+ break;
+ case 5:
+ break;
+ case 6:
+ EXPECT_TRUE(m_layer->updated());
+ endTest();
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ break;
+ }
+ }
+
+ virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl* impl)
+ {
+ m_implForEvictTextures = impl;
+ }
+
+ virtual void layout()
+ {
+ ++m_numCommits;
+ switch (m_numCommits) {
+ case 1:
+ case 2:
+ break;
+ case 3:
+ postEvictTextures();
+ break;
+ case 4:
+ // We couldn't check in didCommitAndDrawFrame on commit 3, so check here.
+ EXPECT_FALSE(m_layer->updated());
+ break;
+ case 5:
+ postEvictTextures();
+ break;
+ case 6:
+ // We couldn't check in didCommitAndDrawFrame on commit 5, so check here.
+ EXPECT_FALSE(m_layer->updated());
+ postEvictTextures();
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ break;
+ }
+ m_layer->resetUpdated();
+ }
+
+ virtual void afterTest()
+ {
+ }
+
+private:
+ MockContentLayerDelegate m_delegate;
+ RefPtr<EvictionTestLayer> m_layer;
+ CCLayerTreeHostImpl* m_implForEvictTextures;
+ int m_numCommits;
+};
+
+TEST_F(CCLayerTreeHostTestEvictTextures, runMultiThread)
+{
+ runTest(true);
+}
+
} // namespace
« no previous file with comments | « Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp ('k') | Source/WebKit/chromium/tests/CCThreadedTest.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698