Changeset 160894 in webkit


Ignore:
Timestamp:
Dec 19, 2013 7:48:10 PM (10 years ago)
Author:
Simon Fraser
Message:

Clarify the behavior of composited canvases
https://bugs.webkit.org/show_bug.cgi?id=126042

Reviewed by Tim Horton.

Different platforms composite 2D and 3D canvases in different ways.

"Accelerated 2D" canvases, and WebGL are always set as GraphicsLayer
contents.

"IOSurface" canvases (Mac and iOS-only) get a compositing layer, but
paint into it (because this is fast, and a convenient way to get
synchronization).

So make these behaviors explicit in RenderLayerBacking and RenderLayerCompositor.
No behavior changes on OS X, bug fix on iOS.

  • rendering/RenderLayerBacking.cpp:

(WebCore::canvasCompositingStrategy):
(WebCore::RenderLayerBacking::updateGraphicsLayerConfiguration):
(WebCore::RenderLayerBacking::containsPaintedContent):
(WebCore::RenderLayerBacking::contentChanged):

  • rendering/RenderLayerBacking.h:
  • rendering/RenderLayerCompositor.cpp:

(WebCore::RenderLayerCompositor::requiresCompositingForCanvas):

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r160887 r160894  
     12013-12-19  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Clarify the behavior of composited canvases
     4        https://bugs.webkit.org/show_bug.cgi?id=126042
     5
     6        Reviewed by Tim Horton.
     7
     8        Different platforms composite 2D and 3D canvases in different ways.
     9       
     10        "Accelerated 2D" canvases, and WebGL are always set as GraphicsLayer
     11        contents.
     12       
     13        "IOSurface" canvases (Mac and iOS-only) get a compositing layer, but
     14        paint into it (because this is fast, and a convenient way to get
     15        synchronization).
     16       
     17        So make these behaviors explicit in RenderLayerBacking and RenderLayerCompositor.
     18        No behavior changes on OS X, bug fix on iOS.
     19
     20        * rendering/RenderLayerBacking.cpp:
     21        (WebCore::canvasCompositingStrategy):
     22        (WebCore::RenderLayerBacking::updateGraphicsLayerConfiguration):
     23        (WebCore::RenderLayerBacking::containsPaintedContent):
     24        (WebCore::RenderLayerBacking::contentChanged):
     25        * rendering/RenderLayerBacking.h:
     26        * rendering/RenderLayerCompositor.cpp:
     27        (WebCore::RenderLayerCompositor::requiresCompositingForCanvas):
     28
    1292013-12-19  Joseph Pecoraro  <pecoraro@apple.com>
    230
  • trunk/Source/WebCore/rendering/RenderLayerBacking.cpp

    r160595 r160894  
    8282static IntRect clipBox(RenderBox& renderer);
    8383
    84 static inline bool isAcceleratedCanvas(RenderObject* renderer)
    85 {
    86 #if ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS)
    87     if (renderer->isCanvas()) {
    88         const HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer->node());
    89         if (CanvasRenderingContext* context = canvas->renderingContext())
    90             return context->isAccelerated();
    91     }
     84CanvasCompositingStrategy canvasCompositingStrategy(const RenderObject& renderer)
     85{
     86    ASSERT(renderer.isCanvas());
     87   
     88    const HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer.node());
     89    CanvasRenderingContext* context = canvas->renderingContext();
     90    if (!context || !context->isAccelerated())
     91        return UnacceleratedCanvas;
     92   
     93    if (context->is3d())
     94        return CanvasAsLayerContents;
     95
     96#if ENABLE(ACCELERATED_2D_CANVAS)
     97    return CanvasAsLayerContents;
    9298#else
    93     UNUSED_PARAM(renderer);
    94 #endif
    95     return false;
     99    return CanvasPaintedToLayer; // On Mac and iOS we paint accelerated canvases into their layers.
     100#endif
    96101}
    97102
     
    627632#endif
    628633#if ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS)
    629     else if (isAcceleratedCanvas(&renderer())) {
     634    else if (renderer().isCanvas() && canvasCompositingStrategy(renderer()) == CanvasAsLayerContents) {
    630635        const HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer().element());
    631636        if (CanvasRenderingContext* context = canvas->renderingContext())
     
    18331838        return m_owningLayer.hasBoxDecorationsOrBackground();
    18341839#endif
    1835 #if PLATFORM(MAC) && !PLATFORM(IOS) && USE(CA)
    1836 #elif ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS) || PLATFORM(IOS_SIMULATOR)
    1837     if (isAcceleratedCanvas(&renderer()))
     1840
     1841#if ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS)
     1842    if (renderer().isCanvas() && canvasCompositingStrategy(renderer()) == CanvasAsLayerContents)
    18381843        return m_owningLayer.hasBoxDecorationsOrBackground();
    18391844#endif
     
    18841889
    18851890#if ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS)
    1886     if ((changeType == CanvasChanged || changeType == CanvasPixelsChanged) && isAcceleratedCanvas(&renderer())) {
     1891    if ((changeType == CanvasChanged || changeType == CanvasPixelsChanged) && renderer().isCanvas() && canvasCompositingStrategy(renderer()) == CanvasAsLayerContents) {
    18871892        m_graphicsLayer->setContentsNeedsDisplay();
    18881893        return;
  • trunk/Source/WebCore/rendering/RenderLayerBacking.h

    r160236 r160894  
    329329};
    330330
     331enum CanvasCompositingStrategy {
     332    UnacceleratedCanvas,
     333    CanvasPaintedToLayer,
     334    CanvasAsLayerContents
     335};
     336CanvasCompositingStrategy canvasCompositingStrategy(const RenderObject&);
     337
    331338} // namespace WebCore
    332339
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp

    r160672 r160894  
    22642264
    22652265    if (renderer.isCanvas()) {
    2266         HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer.element());
    22672266#if USE(COMPOSITING_FOR_SMALL_CANVASES)
    22682267        bool isCanvasLargeEnoughToForceCompositing = true;
    22692268#else
     2269        HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer.element());
    22702270        bool isCanvasLargeEnoughToForceCompositing = canvas->size().area() >= canvasAreaThresholdRequiringCompositing;
    22712271#endif
    2272         return canvas->renderingContext() && canvas->renderingContext()->isAccelerated() && (canvas->renderingContext()->is3d() || isCanvasLargeEnoughToForceCompositing);
     2272        CanvasCompositingStrategy compositingStrategy = canvasCompositingStrategy(renderer);
     2273        return compositingStrategy == CanvasAsLayerContents || (compositingStrategy == CanvasPaintedToLayer && isCanvasLargeEnoughToForceCompositing);
    22732274    }
    22742275
Note: See TracChangeset for help on using the changeset viewer.