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 <jbates@google.com> 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:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@100500
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2011-11-16 John Bates <jbates@google.com>
+
+ 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 <aelias@google.com>
[chromium] Add null pointer check in setDeviceScaleFactor
, m_context(context)
, m_defaultRenderSurface(0)
, m_sharedGeometryQuad(FloatRect(-0.5f, -0.5f, 1.0f, 1.0f))
+ , m_isViewportChanged(false)
{
}
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.
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();
CCLayerSorter m_layerSorter;
FloatQuad m_sharedGeometryQuad;
+
+ bool m_isViewportChanged;
};
// Setting DEBUG_GL_CALLS to 1 will call glGetError() after almost every GL
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