Title: [91599] trunk/Source/WebCore
Revision
91599
Author
al...@chromium.org
Date
2011-07-22 13:04:56 -0700 (Fri, 22 Jul 2011)

Log Message

Use software rendering for small canvas
https://bugs.webkit.org/show_bug.cgi?id=64958

Reviewed by Stephen White.

No new tests. Does not affect rendering output, just canvas backing.
If there is a regression, they should be caught by existing canvas tests.

* html/HTMLCanvasElement.cpp:
(WebCore::HTMLCanvasElement::reset):
* html/canvas/CanvasRenderingContext2D.cpp:
(WebCore::shouldAccelerateCanvas):
(WebCore::CanvasRenderingContext2D::CanvasRenderingContext2D):
(WebCore::CanvasRenderingContext2D::reset):
(WebCore::CanvasRenderingContext2D::platformLayer):
(WebCore::CanvasRenderingContext2D::clearAcceleration):
(WebCore::CanvasRenderingContext2D::resetAcceleration):
* html/canvas/CanvasRenderingContext2D.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (91598 => 91599)


--- trunk/Source/WebCore/ChangeLog	2011-07-22 19:57:42 UTC (rev 91598)
+++ trunk/Source/WebCore/ChangeLog	2011-07-22 20:04:56 UTC (rev 91599)
@@ -1,3 +1,24 @@
+2011-07-22  Alok Priyadarshi  <al...@chromium.org>
+
+        Use software rendering for small canvas
+        https://bugs.webkit.org/show_bug.cgi?id=64958
+
+        Reviewed by Stephen White.
+
+        No new tests. Does not affect rendering output, just canvas backing.
+        If there is a regression, they should be caught by existing canvas tests.
+
+        * html/HTMLCanvasElement.cpp:
+        (WebCore::HTMLCanvasElement::reset):
+        * html/canvas/CanvasRenderingContext2D.cpp:
+        (WebCore::shouldAccelerateCanvas):
+        (WebCore::CanvasRenderingContext2D::CanvasRenderingContext2D):
+        (WebCore::CanvasRenderingContext2D::reset):
+        (WebCore::CanvasRenderingContext2D::platformLayer):
+        (WebCore::CanvasRenderingContext2D::clearAcceleration):
+        (WebCore::CanvasRenderingContext2D::resetAcceleration):
+        * html/canvas/CanvasRenderingContext2D.h:
+
 2011-07-21  Adrienne Walker  <e...@google.com>
 
         Fix repainting of composited fixed position elements in iframes

Modified: trunk/Source/WebCore/html/HTMLCanvasElement.cpp (91598 => 91599)


--- trunk/Source/WebCore/html/HTMLCanvasElement.cpp	2011-07-22 19:57:42 UTC (rev 91598)
+++ trunk/Source/WebCore/html/HTMLCanvasElement.cpp	2011-07-22 20:04:56 UTC (rev 91599)
@@ -245,8 +245,18 @@
         static_cast<WebGLRenderingContext*>(m_context.get())->reshape(width(), height());
 #endif
 
-    if (m_context && m_context->is2d())
-        static_cast<CanvasRenderingContext2D*>(m_context.get())->reset();
+    if (m_context && m_context->is2d()) {
+        CanvasRenderingContext2D* context2D = static_cast<CanvasRenderingContext2D*>(m_context.get());
+        bool wasAccelerated = context2D->isAccelerated();
+        context2D->reset();
+#if USE(IOSURFACE_CANVAS_BACKING_STORE) || (ENABLE(ACCELERATED_2D_CANVAS) && USE(ACCELERATED_COMPOSITING))
+        // Recalculate compositing requirements if acceleration state changed.
+        if (context2D->isAccelerated() != wasAccelerated)
+            setNeedsStyleRecalc(SyntheticStyleChange);
+#else
+        UNUSED_PARAM(wasAccelerated);
+#endif
+    }
 
     if (RenderObject* renderer = this->renderer()) {
         if (m_rendererIsCanvas) {

Modified: trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp (91598 => 91599)


--- trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp	2011-07-22 19:57:42 UTC (rev 91598)
+++ trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp	2011-07-22 20:04:56 UTC (rev 91599)
@@ -97,6 +97,33 @@
     return !securityOrigin->taintsCanvas(cachedImage->response().url());
 }
 
+#if ENABLE(ACCELERATED_2D_CANVAS)
+// Number of pixels in a canvas below which we use software
+// rendering. This is obviously an arbitrary number. A more precise
+// number would depend on machine architecture and canvas contents.
+static const int numPixelsThreshold = 128 * 128;
+
+static bool shouldAccelerateCanvas(const HTMLCanvasElement* canvas)
+{
+    const Page* page = canvas->document()->page();
+    if (!page)
+        return false;
+
+    const Settings* settings = page->settings();
+    if (!settings->accelerated2dCanvasEnabled())
+        return false;
+
+    // Do not use acceleration for small canvas.
+    // For every accelerated canvas there is an extra back-buffer and a texture copy.
+    // Small canvases are also widely used for stylized fonts. Anti-aliasing
+    // text in hardware at that scale is generally slower.
+    if (canvas->width() * canvas->height() < numPixelsThreshold)
+        return false;
+
+    return true;
+}
+#endif
+
 class CanvasStrokeStyleApplier : public StrokeStyleApplier {
 public:
     CanvasStrokeStyleApplier(CanvasRenderingContext2D* canvasContext)
@@ -136,22 +163,7 @@
     setLineWidth(lineWidth());
 
 #if ENABLE(ACCELERATED_2D_CANVAS)
-    Page* p = canvas->document()->page();
-    if (!p)
-        return;
-    if (!(p->settings()->accelerated2dCanvasEnabled() || p->settings()->legacyAccelerated2dCanvasEnabled()))
-        return;
-    if (GraphicsContext* c = drawingContext()) {
-        m_context3D = p->sharedGraphicsContext3D();
-        if (m_context3D) {
-            m_drawingBuffer = m_context3D->createDrawingBuffer(IntSize(canvas->width(), canvas->height()));
-            if (!m_drawingBuffer) {
-                c->setGraphicsContext3D(0, 0, IntSize());
-                m_context3D.clear();
-            } else
-                c->setGraphicsContext3D(m_context3D.get(), m_drawingBuffer.get(), IntSize(canvas->width(), canvas->height()));
-        }
-    }
+    resetAcceleration();
 #endif
 }
 
@@ -203,22 +215,12 @@
     m_stateStack.first() = State();
     m_path.clear();
 #if ENABLE(ACCELERATED_2D_CANVAS)
-    if (GraphicsContext* c = drawingContext()) {
-        if (m_context3D && m_drawingBuffer) {
-            if (m_drawingBuffer->reset(IntSize(canvas()->width(), canvas()->height()))) {
-                c->setGraphicsContext3D(m_context3D.get(), m_drawingBuffer.get(), IntSize(canvas()->width(), canvas()->height()));
-            } else {
-                c->setGraphicsContext3D(0, 0, IntSize());
-                m_drawingBuffer.clear();
-                m_context3D.clear();
-            }
+    resetAcceleration();
 #if USE(ACCELERATED_COMPOSITING)
-            RenderBox* renderBox = canvas()->renderBox();
-            if (renderBox && renderBox->hasLayer() && renderBox->layer()->hasAcceleratedCompositing())
-                renderBox->layer()->contentChanged(RenderLayer::CanvasChanged);
+    RenderBox* renderBox = canvas()->renderBox();
+    if (renderBox && renderBox->hasLayer() && renderBox->layer()->hasAcceleratedCompositing())
+        renderBox->layer()->contentChanged(RenderLayer::CanvasChanged);
 #endif
-        }
-    }
 #endif
 }
 
@@ -2023,11 +2025,61 @@
     return state().m_font;
 }
 
-#if ENABLE(ACCELERATED_2D_CANVAS) && USE(ACCELERATED_COMPOSITING)
+#if ENABLE(ACCELERATED_2D_CANVAS)
+#if USE(ACCELERATED_COMPOSITING)
 PlatformLayer* CanvasRenderingContext2D::platformLayer() const
 {
     return m_drawingBuffer ? m_drawingBuffer->platformLayer() : 0;
 }
 #endif
 
+void CanvasRenderingContext2D::clearAcceleration()
+{
+    if (GraphicsContext* ctx = drawingContext())
+        ctx->setGraphicsContext3D(0, 0, IntSize());
+
+    m_drawingBuffer.clear();
+    m_context3D.clear();
+}
+
+void CanvasRenderingContext2D::resetAcceleration()
+{
+    if (!shouldAccelerateCanvas(canvas())) {
+        clearAcceleration();
+        return;
+    }
+
+    // Try to accelerate.
+    GraphicsContext* ctx = drawingContext();
+    if (!ctx) {
+        clearAcceleration();
+        return;
+    }
+
+    if (!m_context3D) {
+        Page* page = canvas()->document()->page();
+        m_context3D = page->sharedGraphicsContext3D();
+        if (!m_context3D) {
+            clearAcceleration();
+            return;
+        }
+    }
+
+    if (m_drawingBuffer) {
+        if (!m_drawingBuffer->reset(canvas()->size())) {
+            clearAcceleration();
+            return;
+        }
+    } else {
+        m_drawingBuffer = m_context3D->createDrawingBuffer(canvas()->size());
+        if (!m_drawingBuffer) {
+            clearAcceleration();
+            return;
+        }
+    }
+
+    ctx->setGraphicsContext3D(m_context3D.get(), m_drawingBuffer.get(), canvas()->size());
+}
+#endif
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.h (91598 => 91599)


--- trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.h	2011-07-22 19:57:42 UTC (rev 91598)
+++ trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.h	2011-07-22 20:04:56 UTC (rev 91599)
@@ -295,6 +295,11 @@
 
     void prepareGradientForDashboard(CanvasGradient* gradient) const;
 
+#if ENABLE(ACCELERATED_2D_CANVAS)
+    void clearAcceleration();
+    void resetAcceleration();
+#endif
+
     Vector<State, 1> m_stateStack;
     bool m_usesCSSCompatibilityParseMode;
 #if ENABLE(DASHBOARD_SUPPORT)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to