Title: [121172] trunk/Source
Revision
121172
Author
[email protected]
Date
2012-06-25 11:49:38 -0700 (Mon, 25 Jun 2012)

Log Message

[Chromium] RenderPass textures are evicted at the end of every frame
https://bugs.webkit.org/show_bug.cgi?id=89786

Patch by Zeev Lieber <[email protected]> on 2012-06-25
Reviewed by Adrienne Walker.

Source/WebCore:

Removed calls to TextureManager::reduceMemoryToLimit inside
finishDrawingFrame() method.

Added unit tests to verify new behavior.

* platform/graphics/chromium/LayerRendererChromium.cpp:
(WebCore::LayerRendererChromium::finishDrawingFrame):

Source/WebKit/chromium:

Added unit tests to verify large textures are staying in memory
and available for render pass optimization.

* tests/CCLayerTreeHostImplTest.cpp:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (121171 => 121172)


--- trunk/Source/WebCore/ChangeLog	2012-06-25 18:05:13 UTC (rev 121171)
+++ trunk/Source/WebCore/ChangeLog	2012-06-25 18:49:38 UTC (rev 121172)
@@ -1,3 +1,18 @@
+2012-06-25  Zeev Lieber  <[email protected]>
+
+        [Chromium] RenderPass textures are evicted at the end of every frame
+        https://bugs.webkit.org/show_bug.cgi?id=89786
+
+        Reviewed by Adrienne Walker.
+
+        Removed calls to TextureManager::reduceMemoryToLimit inside
+        finishDrawingFrame() method.
+
+        Added unit tests to verify new behavior.
+
+        * platform/graphics/chromium/LayerRendererChromium.cpp:
+        (WebCore::LayerRendererChromium::finishDrawingFrame):
+
 2012-06-25  Allan Xavier  <[email protected]>
 
         [GTK] Add graphviz debug output for the gstreamer video pipeline.

Modified: trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp (121171 => 121172)


--- trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2012-06-25 18:05:13 UTC (rev 121171)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2012-06-25 18:49:38 UTC (rev 121172)
@@ -1184,12 +1184,6 @@
     GLC(m_context, m_context->disable(GraphicsContext3D::BLEND));
 
     m_implTextureManager->unprotectAllTextures();
-
-    size_t contentsMemoryUseBytes = m_contentsTextureAllocator->currentMemoryUseBytes();
-    size_t reclaimLimit = TextureManager::reclaimLimitBytes(viewportSize());
-    size_t preferredLimit = reclaimLimit > contentsMemoryUseBytes ? reclaimLimit - contentsMemoryUseBytes : 0;
-    m_implTextureManager->setPreferredMemoryLimitBytes(preferredLimit);
-    m_implTextureManager->reduceMemoryToLimit(preferredLimit);
     m_implTextureManager->deleteEvictedTextures(m_implTextureAllocator.get());
 }
 

Modified: trunk/Source/WebKit/chromium/ChangeLog (121171 => 121172)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-06-25 18:05:13 UTC (rev 121171)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-06-25 18:49:38 UTC (rev 121172)
@@ -1,3 +1,15 @@
+2012-06-25  Zeev Lieber  <[email protected]>
+
+        [Chromium] RenderPass textures are evicted at the end of every frame
+        https://bugs.webkit.org/show_bug.cgi?id=89786
+
+        Reviewed by Adrienne Walker.
+
+        Added unit tests to verify large textures are staying in memory
+        and available for render pass optimization.
+
+        * tests/CCLayerTreeHostImplTest.cpp:
+
 2012-06-25  Kinuko Yasuda  <[email protected]>
 
         Heap-use-after-free in WebKit::MainThreadFileSystemCallbacks

Modified: trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp (121171 => 121172)


--- trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp	2012-06-25 18:05:13 UTC (rev 121171)
+++ trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp	2012-06-25 18:49:38 UTC (rev 121172)
@@ -1804,6 +1804,13 @@
     {
         return WebString("GL_CHROMIUM_post_sub_buffer");
     }
+
+    // Unlimited texture size.
+    virtual void getIntegerv(WGC3Denum pname, WGC3Dint* value)
+    {
+        if (pname == WebCore::GraphicsContext3D::MAX_TEXTURE_SIZE)
+            *value = 8192;
+    }
 };
 
 static PassOwnPtr<CCLayerTreeHostImpl> setupLayersForOpacity(bool partialSwap, CCLayerTreeHostImplClient* client)
@@ -2422,21 +2429,21 @@
     Mock::VerifyAndClearExpectations(&mockContext);
 }
 
-static void setupLayersForTextureCaching(CCLayerTreeHostImpl* layerTreeHostImpl, CCLayerImpl*& rootPtr, CCLayerImpl*& intermediateLayerPtr, CCLayerImpl*& surfaceLayerPtr, CCLayerImpl*& childPtr)
+static void setupLayersForTextureCaching(CCLayerTreeHostImpl* layerTreeHostImpl, CCLayerImpl*& rootPtr, CCLayerImpl*& intermediateLayerPtr, CCLayerImpl*& surfaceLayerPtr, CCLayerImpl*& childPtr, const IntSize& rootSize)
 {
     RefPtr<CCGraphicsContext> context = CCGraphicsContext::create3D(GraphicsContext3DPrivate::createGraphicsContextFromWebContext(adoptPtr(new PartialSwapContext()), GraphicsContext3D::RenderDirectlyToHostWindow));
 
     layerTreeHostImpl->initializeLayerRenderer(context.release(), UnthrottledUploader);
-    layerTreeHostImpl->setViewportSize(IntSize(100, 100));
+    layerTreeHostImpl->setViewportSize(rootSize);
 
     OwnPtr<CCLayerImpl> root = CCLayerImpl::create(1);
     rootPtr = root.get();
 
     root->setAnchorPoint(FloatPoint(0, 0));
     root->setPosition(FloatPoint(0, 0));
-    root->setBounds(IntSize(100, 100));
-    root->setContentBounds(IntSize(100, 100));
-    root->setVisibleLayerRect(IntRect(0, 0, 100, 100));
+    root->setBounds(rootSize);
+    root->setContentBounds(rootSize);
+    root->setVisibleLayerRect(IntRect(IntPoint(0, 0), rootSize));
     root->setDrawsContent(true);
     layerTreeHostImpl->setRootLayer(root.release());
 
@@ -2446,9 +2453,9 @@
 
     intermediateLayerPtr->setAnchorPoint(FloatPoint(0, 0));
     intermediateLayerPtr->setPosition(FloatPoint(10, 10));
-    intermediateLayerPtr->setBounds(IntSize(100, 100));
-    intermediateLayerPtr->setContentBounds(IntSize(100, 100));
-    intermediateLayerPtr->setVisibleLayerRect(IntRect(0, 0, 100, 100));
+    intermediateLayerPtr->setBounds(rootSize);
+    intermediateLayerPtr->setContentBounds(rootSize);
+    intermediateLayerPtr->setVisibleLayerRect(IntRect(IntPoint(0, 0), rootSize));
     intermediateLayerPtr->setDrawsContent(false); // only children draw content
     rootPtr->addChild(intermediateLayer.release());
 
@@ -2457,11 +2464,12 @@
 
     // Surface layer is the layer that changes its opacity
     // It will contain other layers that draw content.
+    IntSize surfaceSize(rootSize.width(), rootSize.height());
     surfaceLayerPtr->setAnchorPoint(FloatPoint(0, 0));
     surfaceLayerPtr->setPosition(FloatPoint(10, 10));
-    surfaceLayerPtr->setBounds(IntSize(50, 50));
-    surfaceLayerPtr->setContentBounds(IntSize(50, 50));
-    surfaceLayerPtr->setVisibleLayerRect(IntRect(0, 0, 50, 50));
+    surfaceLayerPtr->setBounds(surfaceSize);
+    surfaceLayerPtr->setContentBounds(surfaceSize);
+    surfaceLayerPtr->setVisibleLayerRect(IntRect(IntPoint(0, 0), surfaceSize));
     surfaceLayerPtr->setDrawsContent(false); // only children draw content
     surfaceLayerPtr->setOpacity(0.5f); // This will cause it to have a surface
     intermediateLayerPtr->addChild(surfaceLayer.release());
@@ -2470,11 +2478,12 @@
     OwnPtr<FakeLayerWithQuads> child = FakeLayerWithQuads::create(4);
     childPtr = child.get();
 
+    IntSize childSize(rootSize.width(), rootSize.height());
     childPtr->setAnchorPoint(FloatPoint(0, 0));
     childPtr->setPosition(FloatPoint(5, 5));
-    childPtr->setBounds(IntSize(10, 10));
-    childPtr->setContentBounds(IntSize(10, 10));
-    childPtr->setVisibleLayerRect(IntRect(0, 0, 10, 10));
+    childPtr->setBounds(childSize);
+    childPtr->setContentBounds(childSize);
+    childPtr->setVisibleLayerRect(IntRect(IntPoint(0, 0), childSize));
     childPtr->setDrawsContent(true);
 
     surfaceLayerPtr->addChild(child.release());
@@ -2492,7 +2501,7 @@
     CCLayerImpl* surfaceLayerPtr;
     CCLayerImpl* childPtr;
 
-    setupLayersForTextureCaching(myHostImpl.get(), rootPtr, intermediateLayerPtr, surfaceLayerPtr, childPtr);
+    setupLayersForTextureCaching(myHostImpl.get(), rootPtr, intermediateLayerPtr, surfaceLayerPtr, childPtr, IntSize(100, 100));
 
     {
         CCLayerTreeHostImpl::FrameData frame;
@@ -2649,7 +2658,7 @@
     CCLayerImpl* surfaceLayerPtr;
     CCLayerImpl* childPtr;
 
-    setupLayersForTextureCaching(myHostImpl.get(), rootPtr, intermediateLayerPtr, surfaceLayerPtr, childPtr);
+    setupLayersForTextureCaching(myHostImpl.get(), rootPtr, intermediateLayerPtr, surfaceLayerPtr, childPtr, IntSize(100, 100));
 
     {
         CCLayerTreeHostImpl::FrameData frame;
@@ -2796,6 +2805,80 @@
     }
 }
 
+// FIXME: This test is temporary until memory management in render surfaces gets refactored.
+// It depends on implementation of TextureManager and needs to get removed as
+// it will become meaningless with a different implementation.
+TEST_F(CCLayerTreeHostImplTest, surfaceTextureCachingMemoryLimit)
+{
+    CCSettings::setPartialSwapEnabled(true);
+
+    CCLayerTreeSettings settings;
+    OwnPtr<CCLayerTreeHostImpl> myHostImpl = CCLayerTreeHostImpl::create(settings, this);
+
+    CCLayerImpl* rootPtr;
+    CCLayerImpl* intermediateLayerPtr;
+    CCLayerImpl* surfaceLayerPtr;
+    CCLayerImpl* childPtr;
+
+    // FIXME: The number 4200 is the "magic" number which will cause render surface size
+    // to go above 64M. This will bring it above reclaimLimitBytes().
+    // We could compute this number from return value of reclaimLimitBytes(), however
+    // it takes a viewport, so it's no better as it still contains same kind of assumption
+    // (namely that reclaimLimitBytes() ignores viewport size).
+    IntSize largeSurfaceSize(4200, 4200);
+    setupLayersForTextureCaching(myHostImpl.get(), rootPtr, intermediateLayerPtr, surfaceLayerPtr, childPtr, largeSurfaceSize);
+
+    {
+        CCLayerTreeHostImpl::FrameData frame;
+        EXPECT_TRUE(myHostImpl->prepareToDraw(frame));
+
+        // Must receive two render passes, each with one quad
+        ASSERT_EQ(2U, frame.renderPasses.size());
+        EXPECT_EQ(1U, frame.renderPasses[0]->quadList().size());
+        EXPECT_EQ(1U, frame.renderPasses[1]->quadList().size());
+
+        EXPECT_EQ(CCDrawQuad::RenderPass, frame.renderPasses[1]->quadList()[0]->material());
+        CCRenderPassDrawQuad* quad = static_cast<CCRenderPassDrawQuad*>(frame.renderPasses[1]->quadList()[0].get());
+        EXPECT_TRUE(quad->renderPass()->targetSurface()->contentsChanged());
+
+        myHostImpl->drawLayers(frame);
+        myHostImpl->didDrawAllLayers(frame);
+    }
+
+    // Draw without any change
+    {
+        CCLayerTreeHostImpl::FrameData frame;
+        EXPECT_TRUE(myHostImpl->prepareToDraw(frame));
+
+        // Must receive two EMPTY render passes
+        ASSERT_EQ(2U, frame.renderPasses.size());
+        EXPECT_EQ(0U, frame.renderPasses[0]->quadList().size());
+        EXPECT_EQ(0U, frame.renderPasses[1]->quadList().size());
+
+        myHostImpl->drawLayers(frame);
+        myHostImpl->didDrawAllLayers(frame);
+    }
+
+    // Change opacity and draw.
+    // If all goes well, the texture must still be available, even though it's really big.
+    surfaceLayerPtr->setOpacity(0.6f);
+    {
+        CCLayerTreeHostImpl::FrameData frame;
+        EXPECT_TRUE(myHostImpl->prepareToDraw(frame));
+
+        // Must receive one render pass, as the other one should be culled
+        ASSERT_EQ(1U, frame.renderPasses.size());
+
+        EXPECT_EQ(1U, frame.renderPasses[0]->quadList().size());
+        EXPECT_EQ(CCDrawQuad::RenderPass, frame.renderPasses[0]->quadList()[0]->material());
+        CCRenderPassDrawQuad* quad = static_cast<CCRenderPassDrawQuad*>(frame.renderPasses[0]->quadList()[0].get());
+        EXPECT_FALSE(quad->renderPass()->targetSurface()->contentsChanged());
+
+        myHostImpl->drawLayers(frame);
+        myHostImpl->didDrawAllLayers(frame);
+    }
+}
+
 struct RenderPassCacheEntry {
     mutable OwnPtr<CCRenderPass> renderPassPtr;
     CCRenderPass* renderPass;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to