Changeset 91599 in webkit


Ignore:
Timestamp:
Jul 22, 2011 1:04:56 PM (13 years ago)
Author:
alokp@chromium.org
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:
Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r91597 r91599  
     12011-07-22  Alok Priyadarshi  <alokp@chromium.org>
     2
     3        Use software rendering for small canvas
     4        https://bugs.webkit.org/show_bug.cgi?id=64958
     5
     6        Reviewed by Stephen White.
     7
     8        No new tests. Does not affect rendering output, just canvas backing.
     9        If there is a regression, they should be caught by existing canvas tests.
     10
     11        * html/HTMLCanvasElement.cpp:
     12        (WebCore::HTMLCanvasElement::reset):
     13        * html/canvas/CanvasRenderingContext2D.cpp:
     14        (WebCore::shouldAccelerateCanvas):
     15        (WebCore::CanvasRenderingContext2D::CanvasRenderingContext2D):
     16        (WebCore::CanvasRenderingContext2D::reset):
     17        (WebCore::CanvasRenderingContext2D::platformLayer):
     18        (WebCore::CanvasRenderingContext2D::clearAcceleration):
     19        (WebCore::CanvasRenderingContext2D::resetAcceleration):
     20        * html/canvas/CanvasRenderingContext2D.h:
     21
    1222011-07-21  Adrienne Walker  <enne@google.com>
    223
  • trunk/Source/WebCore/html/HTMLCanvasElement.cpp

    r91496 r91599  
    246246#endif
    247247
    248     if (m_context && m_context->is2d())
    249         static_cast<CanvasRenderingContext2D*>(m_context.get())->reset();
     248    if (m_context && m_context->is2d()) {
     249        CanvasRenderingContext2D* context2D = static_cast<CanvasRenderingContext2D*>(m_context.get());
     250        bool wasAccelerated = context2D->isAccelerated();
     251        context2D->reset();
     252#if USE(IOSURFACE_CANVAS_BACKING_STORE) || (ENABLE(ACCELERATED_2D_CANVAS) && USE(ACCELERATED_COMPOSITING))
     253        // Recalculate compositing requirements if acceleration state changed.
     254        if (context2D->isAccelerated() != wasAccelerated)
     255            setNeedsStyleRecalc(SyntheticStyleChange);
     256#else
     257        UNUSED_PARAM(wasAccelerated);
     258#endif
     259    }
    250260
    251261    if (RenderObject* renderer = this->renderer()) {
  • trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp

    r90872 r91599  
    9898}
    9999
     100#if ENABLE(ACCELERATED_2D_CANVAS)
     101// Number of pixels in a canvas below which we use software
     102// rendering. This is obviously an arbitrary number. A more precise
     103// number would depend on machine architecture and canvas contents.
     104static const int numPixelsThreshold = 128 * 128;
     105
     106static bool shouldAccelerateCanvas(const HTMLCanvasElement* canvas)
     107{
     108    const Page* page = canvas->document()->page();
     109    if (!page)
     110        return false;
     111
     112    const Settings* settings = page->settings();
     113    if (!settings->accelerated2dCanvasEnabled())
     114        return false;
     115
     116    // Do not use acceleration for small canvas.
     117    // For every accelerated canvas there is an extra back-buffer and a texture copy.
     118    // Small canvases are also widely used for stylized fonts. Anti-aliasing
     119    // text in hardware at that scale is generally slower.
     120    if (canvas->width() * canvas->height() < numPixelsThreshold)
     121        return false;
     122
     123    return true;
     124}
     125#endif
     126
    100127class CanvasStrokeStyleApplier : public StrokeStyleApplier {
    101128public:
     
    137164
    138165#if ENABLE(ACCELERATED_2D_CANVAS)
    139     Page* p = canvas->document()->page();
    140     if (!p)
    141         return;
    142     if (!(p->settings()->accelerated2dCanvasEnabled() || p->settings()->legacyAccelerated2dCanvasEnabled()))
    143         return;
    144     if (GraphicsContext* c = drawingContext()) {
    145         m_context3D = p->sharedGraphicsContext3D();
    146         if (m_context3D) {
    147             m_drawingBuffer = m_context3D->createDrawingBuffer(IntSize(canvas->width(), canvas->height()));
    148             if (!m_drawingBuffer) {
    149                 c->setGraphicsContext3D(0, 0, IntSize());
    150                 m_context3D.clear();
    151             } else
    152                 c->setGraphicsContext3D(m_context3D.get(), m_drawingBuffer.get(), IntSize(canvas->width(), canvas->height()));
    153         }
    154     }
     166    resetAcceleration();
    155167#endif
    156168}
     
    204216    m_path.clear();
    205217#if ENABLE(ACCELERATED_2D_CANVAS)
    206     if (GraphicsContext* c = drawingContext()) {
    207         if (m_context3D && m_drawingBuffer) {
    208             if (m_drawingBuffer->reset(IntSize(canvas()->width(), canvas()->height()))) {
    209                 c->setGraphicsContext3D(m_context3D.get(), m_drawingBuffer.get(), IntSize(canvas()->width(), canvas()->height()));
    210             } else {
    211                 c->setGraphicsContext3D(0, 0, IntSize());
    212                 m_drawingBuffer.clear();
    213                 m_context3D.clear();
    214             }
     218    resetAcceleration();
    215219#if USE(ACCELERATED_COMPOSITING)
    216             RenderBox* renderBox = canvas()->renderBox();
    217             if (renderBox && renderBox->hasLayer() && renderBox->layer()->hasAcceleratedCompositing())
    218                 renderBox->layer()->contentChanged(RenderLayer::CanvasChanged);
    219 #endif
    220         }
    221     }
     220    RenderBox* renderBox = canvas()->renderBox();
     221    if (renderBox && renderBox->hasLayer() && renderBox->layer()->hasAcceleratedCompositing())
     222        renderBox->layer()->contentChanged(RenderLayer::CanvasChanged);
     223#endif
    222224#endif
    223225}
     
    20242026}
    20252027
    2026 #if ENABLE(ACCELERATED_2D_CANVAS) && USE(ACCELERATED_COMPOSITING)
     2028#if ENABLE(ACCELERATED_2D_CANVAS)
     2029#if USE(ACCELERATED_COMPOSITING)
    20272030PlatformLayer* CanvasRenderingContext2D::platformLayer() const
    20282031{
     
    20312034#endif
    20322035
     2036void CanvasRenderingContext2D::clearAcceleration()
     2037{
     2038    if (GraphicsContext* ctx = drawingContext())
     2039        ctx->setGraphicsContext3D(0, 0, IntSize());
     2040
     2041    m_drawingBuffer.clear();
     2042    m_context3D.clear();
     2043}
     2044
     2045void CanvasRenderingContext2D::resetAcceleration()
     2046{
     2047    if (!shouldAccelerateCanvas(canvas())) {
     2048        clearAcceleration();
     2049        return;
     2050    }
     2051
     2052    // Try to accelerate.
     2053    GraphicsContext* ctx = drawingContext();
     2054    if (!ctx) {
     2055        clearAcceleration();
     2056        return;
     2057    }
     2058
     2059    if (!m_context3D) {
     2060        Page* page = canvas()->document()->page();
     2061        m_context3D = page->sharedGraphicsContext3D();
     2062        if (!m_context3D) {
     2063            clearAcceleration();
     2064            return;
     2065        }
     2066    }
     2067
     2068    if (m_drawingBuffer) {
     2069        if (!m_drawingBuffer->reset(canvas()->size())) {
     2070            clearAcceleration();
     2071            return;
     2072        }
     2073    } else {
     2074        m_drawingBuffer = m_context3D->createDrawingBuffer(canvas()->size());
     2075        if (!m_drawingBuffer) {
     2076            clearAcceleration();
     2077            return;
     2078        }
     2079    }
     2080
     2081    ctx->setGraphicsContext3D(m_context3D.get(), m_drawingBuffer.get(), canvas()->size());
     2082}
     2083#endif
     2084
    20332085} // namespace WebCore
  • trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.h

    r90872 r91599  
    296296    void prepareGradientForDashboard(CanvasGradient* gradient) const;
    297297
     298#if ENABLE(ACCELERATED_2D_CANVAS)
     299    void clearAcceleration();
     300    void resetAcceleration();
     301#endif
     302
    298303    Vector<State, 1> m_stateStack;
    299304    bool m_usesCSSCompatibilityParseMode;
Note: See TracChangeset for help on using the changeset viewer.