Title: [100500] trunk/Source
Revision
100500
Author
[email protected]
Date
2011-11-16 13:54:54 -0800 (Wed, 16 Nov 2011)

Log Message

Page/layer flashes after GPU-accelerated CSS transition
https://bugs.webkit.org/show_bug.cgi?id=72343

LayerRendererChromium was resizing the window to 1x1 at initialization.
In some cases, there is no drawLayers before switching back to
software rendering. This left the window resized to 1x1 and the
following software paints would therefore not be visible. This change
moves the reshape call into drawLayers so that it will only be called
if rendering will occur.

Patch by John Bates <[email protected]> on 2011-11-16
Reviewed by James Robinson.

New test: CCLayerTreeHostImplTest.reshapeNotCalledUntilDraw.

* platform/graphics/chromium/LayerRendererChromium.cpp:
(WebCore::LayerRendererChromium::viewportChanged):
(WebCore::LayerRendererChromium::doViewportChanged):
(WebCore::LayerRendererChromium::drawLayersInternal):
* platform/graphics/chromium/LayerRendererChromium.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (100499 => 100500)


--- trunk/Source/WebCore/ChangeLog	2011-11-16 21:51:15 UTC (rev 100499)
+++ trunk/Source/WebCore/ChangeLog	2011-11-16 21:54:54 UTC (rev 100500)
@@ -1,3 +1,25 @@
+2011-11-16  John Bates  <[email protected]>
+
+        Page/layer flashes after GPU-accelerated CSS transition
+        https://bugs.webkit.org/show_bug.cgi?id=72343
+
+        LayerRendererChromium was resizing the window to 1x1 at initialization.
+        In some cases, there is no drawLayers before switching back to
+        software rendering. This left the window resized to 1x1 and the
+        following software paints would therefore not be visible. This change
+        moves the reshape call into drawLayers so that it will only be called
+        if rendering will occur.
+
+        Reviewed by James Robinson.
+
+        New test: CCLayerTreeHostImplTest.reshapeNotCalledUntilDraw.
+
+        * platform/graphics/chromium/LayerRendererChromium.cpp:
+        (WebCore::LayerRendererChromium::viewportChanged):
+        (WebCore::LayerRendererChromium::doViewportChanged):
+        (WebCore::LayerRendererChromium::drawLayersInternal):
+        * platform/graphics/chromium/LayerRendererChromium.h:
+
 2011-11-16  Alexandre Elias  <[email protected]>
 
         [chromium] Add null pointer check in setDeviceScaleFactor

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


--- trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2011-11-16 21:51:15 UTC (rev 100499)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2011-11-16 21:54:54 UTC (rev 100500)
@@ -174,6 +174,7 @@
     , m_context(context)
     , m_defaultRenderSurface(0)
     , m_sharedGeometryQuad(FloatRect(-0.5f, -0.5f, 1.0f, 1.0f))
+    , m_isViewportChanged(false)
 {
 }
 
@@ -275,8 +276,7 @@
 
 void LayerRendererChromium::viewportChanged()
 {
-    if (m_context)
-        m_context->reshape(std::max(1, viewportWidth()), std::max(1, viewportHeight()));
+    m_isViewportChanged = true;
 
     // Reset the current render surface to force an update of the viewport and
     // projection matrix next time useRenderSurface is called.
@@ -352,6 +352,14 @@
         return;
 
     TRACE_EVENT("LayerRendererChromium::drawLayers", this, 0);
+    if (m_isViewportChanged) {
+        // Only reshape when we know we are going to draw. Otherwise, the reshape
+        // can leave the window at the wrong size if we never draw and the proper
+        // viewport size is never set.
+        m_isViewportChanged = false;
+        m_context->reshape(viewportWidth(), viewportHeight());
+    }
+
     CCLayerImpl* rootDrawLayer = rootLayer();
     makeContextCurrent();
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h (100499 => 100500)


--- trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h	2011-11-16 21:51:15 UTC (rev 100499)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h	2011-11-16 21:54:54 UTC (rev 100500)
@@ -231,6 +231,8 @@
     CCLayerSorter m_layerSorter;
 
     FloatQuad m_sharedGeometryQuad;
+
+    bool m_isViewportChanged;
 };
 
 // Setting DEBUG_GL_CALLS to 1 will call glGetError() after almost every GL

Modified: trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp (100499 => 100500)


--- trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp	2011-11-16 21:51:15 UTC (rev 100499)
+++ trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp	2011-11-16 21:54:54 UTC (rev 100500)
@@ -292,5 +292,50 @@
     EXPECT_TRUE(layer2->drawn());
 }
 
+class ReshapeTrackerContext: public MockWebGraphicsContext3D {
+public:
+    ReshapeTrackerContext() : m_reshapeCalled(false) { }
 
+    virtual bool initialize(Attributes, WebView*, bool renderDirectlyToWebView) { return true; }
+
+    virtual void reshape(int width, int height)
+    {
+        m_reshapeCalled = true;
+    }
+
+    bool reshapeCalled() const { return m_reshapeCalled; }
+
+private:
+    bool m_reshapeCalled;
+};
+
+class FakeDrawableCCLayerImpl: public CCLayerImpl {
+public:
+    FakeDrawableCCLayerImpl() : CCLayerImpl(0) { }
+    virtual void draw(LayerRendererChromium* renderer) { }
+};
+
+// Only reshape when we know we are going to draw. Otherwise, the reshape
+// can leave the window at the wrong size if we never draw and the proper
+// viewport size is never set.
+TEST_F(CCLayerTreeHostImplTest, reshapeNotCalledUntilDraw)
+{
+    GraphicsContext3D::Attributes attrs;
+    ReshapeTrackerContext* reshapeTracker = new ReshapeTrackerContext();
+    RefPtr<GraphicsContext3D> context = GraphicsContext3DPrivate::createGraphicsContextFromWebContext(adoptPtr(reshapeTracker), attrs, 0, GraphicsContext3D::RenderDirectlyToHostWindow, GraphicsContext3DPrivate::ForUseOnThisThread);
+    m_hostImpl->initializeLayerRenderer(context);
+    m_hostImpl->setViewport(IntSize(10, 10));
+
+    RefPtr<CCLayerImpl> root = adoptRef(new FakeDrawableCCLayerImpl());
+    root->setAnchorPoint(FloatPoint(0, 0));
+    root->setBounds(IntSize(10, 10));
+    root->setDrawsContent(true);
+    m_hostImpl->setRootLayer(root);
+    EXPECT_FALSE(reshapeTracker->reshapeCalled());
+
+    m_hostImpl->drawLayers();
+    EXPECT_TRUE(reshapeTracker->reshapeCalled());
+}
+
+
 } // namespace
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to