Changeset 83552 in webkit


Ignore:
Timestamp:
Apr 11, 2011 7:30:01 PM (13 years ago)
Author:
commit-queue@webkit.org
Message:

2011-04-11 John Bates <jbates@google.com>

Reviewed by Kenneth Russell.

chromium support for glSetLatch and glWaitLatch between 3D contexts
https://bugs.webkit.org/show_bug.cgi?id=58003

  • platform/graphics/chromium/Canvas2DLayerChromium.cpp: (WebCore::Canvas2DLayerChromium::~Canvas2DLayerChromium): (WebCore::Canvas2DLayerChromium::setDrawingBuffer): (WebCore::Canvas2DLayerChromium::setLayerRenderer):
  • platform/graphics/chromium/Canvas2DLayerChromium.h:
  • platform/graphics/chromium/Extensions3DChromium.h:
  • platform/graphics/chromium/GLES2Canvas.cpp: (WebCore::Cubic::Cubic):
  • platform/graphics/chromium/LayerRendererChromium.cpp: (WebCore::LayerRendererChromium::LayerRendererChromium): (WebCore::LayerRendererChromium::updateAndDrawLayers): (WebCore::LayerRendererChromium::updateLayers): (WebCore::LayerRendererChromium::addChildContext): (WebCore::LayerRendererChromium::removeChildContext):
  • platform/graphics/chromium/LayerRendererChromium.h:
  • platform/graphics/chromium/WebGLLayerChromium.cpp: (WebCore::WebGLLayerChromium::~WebGLLayerChromium): (WebCore::WebGLLayerChromium::updateCompositorResources): (WebCore::WebGLLayerChromium::setContext): (WebCore::WebGLLayerChromium::setLayerRenderer):
  • platform/graphics/chromium/WebGLLayerChromium.h:

2011-04-11 John Bates <jbates@google.com>

Reviewed by Kenneth Russell.

chromium support for glSetLatch and glWaitLatch between 3D contexts
https://bugs.webkit.org/show_bug.cgi?id=58003

  • public/WebGraphicsContext3D.h: (WebKit::WebGraphicsContext3D::getParentToChildLatchCHROMIUM): (WebKit::WebGraphicsContext3D::getChildToParentLatchCHROMIUM): (WebKit::WebGraphicsContext3D::waitLatchCHROMIUM): (WebKit::WebGraphicsContext3D::setLatchCHROMIUM):
  • src/Extensions3DChromium.cpp: (WebCore::Extensions3DChromium::waitLatchCHROMIUM): (WebCore::Extensions3DChromium::setLatchCHROMIUM):
  • src/GraphicsContext3DChromium.cpp:
  • src/GraphicsContext3DInternal.h:
Location:
trunk/Source
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r83551 r83552  
     12011-04-11  John Bates  <jbates@google.com>
     2
     3        Reviewed by Kenneth Russell.
     4
     5        chromium support for glSetLatch and glWaitLatch between 3D contexts
     6        https://bugs.webkit.org/show_bug.cgi?id=58003
     7
     8        * platform/graphics/chromium/Canvas2DLayerChromium.cpp:
     9        (WebCore::Canvas2DLayerChromium::~Canvas2DLayerChromium):
     10        (WebCore::Canvas2DLayerChromium::setDrawingBuffer):
     11        (WebCore::Canvas2DLayerChromium::setLayerRenderer):
     12        * platform/graphics/chromium/Canvas2DLayerChromium.h:
     13        * platform/graphics/chromium/Extensions3DChromium.h:
     14        * platform/graphics/chromium/GLES2Canvas.cpp:
     15        (WebCore::Cubic::Cubic):
     16        * platform/graphics/chromium/LayerRendererChromium.cpp:
     17        (WebCore::LayerRendererChromium::LayerRendererChromium):
     18        (WebCore::LayerRendererChromium::updateAndDrawLayers):
     19        (WebCore::LayerRendererChromium::updateLayers):
     20        (WebCore::LayerRendererChromium::addChildContext):
     21        (WebCore::LayerRendererChromium::removeChildContext):
     22        * platform/graphics/chromium/LayerRendererChromium.h:
     23        * platform/graphics/chromium/WebGLLayerChromium.cpp:
     24        (WebCore::WebGLLayerChromium::~WebGLLayerChromium):
     25        (WebCore::WebGLLayerChromium::updateCompositorResources):
     26        (WebCore::WebGLLayerChromium::setContext):
     27        (WebCore::WebGLLayerChromium::setLayerRenderer):
     28        * platform/graphics/chromium/WebGLLayerChromium.h:
     29
    1302011-04-11  Alexey Marinichev  <amarinichev@chromium.org>
    231
  • trunk/Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp

    r82006 r83552  
    3737#include "DrawingBuffer.h"
    3838#include "GraphicsContext3D.h"
     39#include "LayerRendererChromium.h"
    3940
    4041namespace WebCore {
     
    5556    if (m_textureId)
    5657        layerRendererContext()->deleteTexture(m_textureId);
     58    if (m_drawingBuffer && layerRenderer())
     59        layerRenderer()->removeChildContext(m_drawingBuffer->graphicsContext3D());
    5760}
    5861
     
    104107{
    105108    if (drawingBuffer != m_drawingBuffer) {
     109        if (m_drawingBuffer && layerRenderer())
     110            layerRenderer()->removeChildContext(m_drawingBuffer->graphicsContext3D());
     111
    106112        m_drawingBuffer = drawingBuffer;
    107113        m_textureChanged = true;
     114
     115        if (drawingBuffer && layerRenderer())
     116            layerRenderer()->addChildContext(m_drawingBuffer->graphicsContext3D());
     117    }
     118}
     119
     120void Canvas2DLayerChromium::setLayerRenderer(LayerRendererChromium* newLayerRenderer)
     121{
     122    if (layerRenderer() != newLayerRenderer) {
     123        if (m_drawingBuffer->graphicsContext3D()) {
     124            if (layerRenderer())
     125                layerRenderer()->removeChildContext(m_drawingBuffer->graphicsContext3D());
     126            if (newLayerRenderer)
     127                newLayerRenderer->addChildContext(m_drawingBuffer->graphicsContext3D());
     128        }
     129
     130        LayerChromium::setLayerRenderer(newLayerRenderer);
    108131    }
    109132}
  • trunk/Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.h

    r82006 r83552  
    5353    void setDrawingBuffer(DrawingBuffer*);
    5454
     55    virtual void setLayerRenderer(LayerRendererChromium*);
     56
    5557private:
    5658    explicit Canvas2DLayerChromium(DrawingBuffer*, GraphicsLayerChromium* owner);
  • trunk/Source/WebCore/platform/graphics/chromium/Extensions3DChromium.h

    r79011 r83552  
    6767    void copyTextureToParentTextureCHROMIUM(unsigned texture, unsigned parentTexture);
    6868
     69    // Latch support
     70    void getParentToChildLatchCHROMIUM(GC3Duint* latchId);
     71    void getChildToParentLatchCHROMIUM(GC3Duint* latchId);
     72    void waitLatchCHROMIUM(GC3Duint latchId);
     73    void setLatchCHROMIUM(GC3Duint latchId);
     74
    6975private:
    7076    // Instances of this class are strictly owned by the GraphicsContext3D implementation and do not
  • trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp

    r83511 r83552  
    3737#include "cc/CCLayerImpl.h"
    3838#include "Canvas2DLayerChromium.h"
     39#include "Extensions3DChromium.h"
    3940#include "FloatQuad.h"
    4041#include "GeometryBinding.h"
     
    116117    , m_compositeOffscreen(false)
    117118    , m_context(context)
     119    , m_childContextsWereCopied(false)
     120    , m_contextSupportsLatch(false)
    118121    , m_defaultRenderSurface(0)
    119122{
     123    m_contextSupportsLatch = m_context->getExtensions()->supports("GL_CHROMIUM_latch");
    120124    m_hardwareCompositing = initializeSharedObjects();
    121125    m_rootLayerContentTiler = LayerTilerChromium::create(this, IntSize(256, 256), LayerTilerChromium::NoBorderTexels);
     
    272276    updateLayers(renderSurfaceLayerList);
    273277
     278    // Before drawLayers:
     279    if (hardwareCompositing() && m_contextSupportsLatch) {
     280        // FIXME: The multithreaded compositor case will not work as long as
     281        // copyTexImage2D resolves to the parent texture, because the main
     282        // thread can execute WebGL calls on the child context at any time,
     283        // potentially clobbering the parent texture that is being renderered
     284        // by the compositor thread.
     285        if (m_childContextsWereCopied) {
     286            Extensions3DChromium* parentExt = static_cast<Extensions3DChromium*>(m_context->getExtensions());
     287            // For each child context:
     288            //   glWaitLatch(Offscreen->Compositor);
     289            ChildContextMap::iterator i = m_childContexts.begin();
     290            for (; i != m_childContexts.end(); ++i) {
     291                Extensions3DChromium* childExt = static_cast<Extensions3DChromium*>(i->first->getExtensions());
     292                GC3Duint latchId;
     293                childExt->getChildToParentLatchCHROMIUM(&latchId);
     294                parentExt->waitLatchCHROMIUM(latchId);
     295            }
     296        }
     297        // Reset to false to indicate that we have consumed the dirty child
     298        // contexts' parent textures. (This is only useful when the compositor
     299        // is multithreaded.)
     300        m_childContextsWereCopied = false;
     301    }
     302
    274303    drawLayers(renderSurfaceLayerList);
     304
     305    // After drawLayers:
     306    if (hardwareCompositing() && m_contextSupportsLatch) {
     307        Extensions3DChromium* parentExt = static_cast<Extensions3DChromium*>(m_context->getExtensions());
     308        // For each child context:
     309        //   glSetLatch(Compositor->Offscreen);
     310        ChildContextMap::iterator i = m_childContexts.begin();
     311        for (; i != m_childContexts.end(); ++i) {
     312            Extensions3DChromium* childExt = static_cast<Extensions3DChromium*>(i->first->getExtensions());
     313            GC3Duint latchId;
     314            childExt->getParentToChildLatchCHROMIUM(&latchId);
     315            parentExt->setLatchCHROMIUM(latchId);
     316        }
     317    }
    275318
    276319    if (isCompositingOffscreen())
     
    310353    paintContentsRecursive(m_rootLayer.get());
    311354
     355    // FIXME: Before updateCompositorResourcesRecursive, when the compositor runs in
     356    // its own thread, and when the copyTexImage2D bug is fixed, insert
     357    // a glWaitLatch(Compositor->Offscreen) on all child contexts here instead
     358    // of after updateCompositorResourcesRecursive.
     359    // Also uncomment the glSetLatch(Compositor->Offscreen) code in addChildContext.
     360//  if (hardwareCompositing() && m_contextSupportsLatch) {
     361//      // For each child context:
     362//      //   glWaitLatch(Compositor->Offscreen);
     363//      ChildContextMap::iterator i = m_childContexts.begin();
     364//      for (; i != m_childContexts.end(); ++i) {
     365//          Extensions3DChromium* ext = static_cast<Extensions3DChromium*>(i->first->getExtensions());
     366//          GC3Duint childToParentLatchId, parentToChildLatchId;
     367//          ext->getParentToChildLatchCHROMIUM(&parentToChildLatchId);
     368//          ext->waitLatchCHROMIUM(parentToChildLatchId);
     369//      }
     370//  }
     371
    312372    updateCompositorResourcesRecursive(m_rootLayer.get());
     373
     374    // After updateCompositorResourcesRecursive, set/wait latches for all child
     375    // contexts. This will prevent the compositor from using any of the child
     376    // parent textures while WebGL commands are executing from javascript *and*
     377    // while the final parent texture is being blit'd. copyTexImage2D
     378    // uses the parent texture as a temporary resolve buffer, so that's why the
     379    // waitLatch is below, to block the compositor from using the parent texture
     380    // until the next WebGL SwapBuffers (or copyTextureToParentTexture for
     381    // Canvas2D).
     382    if (hardwareCompositing() && m_contextSupportsLatch) {
     383        m_childContextsWereCopied = true;
     384        // For each child context:
     385        //   glSetLatch(Offscreen->Compositor);
     386        //   glWaitLatch(Compositor->Offscreen);
     387        ChildContextMap::iterator i = m_childContexts.begin();
     388        for (; i != m_childContexts.end(); ++i) {
     389            Extensions3DChromium* ext = static_cast<Extensions3DChromium*>(i->first->getExtensions());
     390            GC3Duint childToParentLatchId, parentToChildLatchId;
     391            ext->getParentToChildLatchCHROMIUM(&parentToChildLatchId);
     392            ext->getChildToParentLatchCHROMIUM(&childToParentLatchId);
     393            ext->setLatchCHROMIUM(childToParentLatchId);
     394            ext->waitLatchCHROMIUM(parentToChildLatchId);
     395        }
     396    }
    313397}
    314398
     
    10301114}
    10311115
     1116void LayerRendererChromium::addChildContext(PassRefPtr<GraphicsContext3D> pctx)
     1117{
     1118    RefPtr<GraphicsContext3D> ctx = pctx;
     1119    if (!ctx->getExtensions()->supports("GL_CHROMIUM_latch"))
     1120        return;
     1121
     1122    // This is a ref-counting map, because some contexts are shared by multiple
     1123    // layers (specifically, Canvas2DLayerChromium).
     1124
     1125    // Insert the ctx with a count of 1, or return the existing iterator.
     1126    std::pair<ChildContextMap::iterator, bool> insert_result = m_childContexts.add(ctx, 1);
     1127    if (!insert_result.second) {
     1128        // Already present in map, so increment.
     1129        ++insert_result.first->second;
     1130    } else {
     1131// FIXME(jbates): when compositor is multithreaded and copyTexImage2D bug is fixed,
     1132// uncomment this block:
     1133//      // This is a new child context - set the parentToChild latch so that it
     1134//      // can continue past its first wait latch.
     1135//      Extensions3DChromium* ext = static_cast<Extensions3DChromium*>(ctx->getExtensions());
     1136//      GC3Duint latchId;
     1137//      ext->getParentToChildLatchCHROMIUM(&latchId);
     1138//      ext->setLatchCHROMIUM(0, latchId);
     1139    }
     1140}
     1141
     1142void LayerRendererChromium::removeChildContext(PassRefPtr<GraphicsContext3D> pctx)
     1143{
     1144    RefPtr<GraphicsContext3D> ctx = pctx;
     1145    if (!ctx->getExtensions()->supports("GL_CHROMIUM_latch"))
     1146        return;
     1147
     1148    ChildContextMap::iterator i = m_childContexts.find(ctx);
     1149    if (i != m_childContexts.end()) {
     1150        if (--i->second <= 0) {
     1151            // Count reached zero, so remove from map.
     1152            m_childContexts.remove(i);
     1153        }
     1154    } else {
     1155        // error
     1156        ASSERT(0 && "m_childContexts map has mismatched add/remove calls");
     1157    }
     1158}
     1159
    10321160void LayerRendererChromium::dumpRenderSurfaces(TextStream& ts, int indent, LayerChromium* layer) const
    10331161{
  • trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h

    r83511 r83552  
    132132    String layerTreeAsText() const;
    133133
     134    void addChildContext(PassRefPtr<GraphicsContext3D>);
     135    void removeChildContext(PassRefPtr<GraphicsContext3D>);
     136
    134137private:
    135138    typedef Vector<RefPtr<CCLayerImpl> > LayerList;
     139    typedef HashMap<RefPtr<GraphicsContext3D>, int> ChildContextMap;
    136140
    137141    explicit LayerRendererChromium(PassRefPtr<GraphicsContext3D>, PassOwnPtr<TilePaintInterface> contentPaint, PassOwnPtr<TilePaintInterface> scrollbarPaint);
     
    223227
    224228    RefPtr<GraphicsContext3D> m_context;
     229    ChildContextMap m_childContexts;
     230
     231    // If true, the child contexts were copied to the compositor texture targets
     232    // and the compositor will need to wait on the proper latches before using
     233    // the target textures. If false, the compositor is reusing the textures
     234    // from last frame.
     235    bool m_childContextsWereCopied;
     236
     237    bool m_contextSupportsLatch;
    225238
    226239    RenderSurfaceChromium* m_defaultRenderSurface;
  • trunk/Source/WebCore/platform/graphics/chromium/WebGLLayerChromium.cpp

    r82006 r83552  
    5252}
    5353
     54WebGLLayerChromium::~WebGLLayerChromium()
     55{
     56    if (m_context && layerRenderer())
     57        layerRenderer()->removeChildContext(m_context);
     58}
     59
    5460void WebGLLayerChromium::updateCompositorResources()
    5561{
     
    7177    // Update the contents of the texture used by the compositor.
    7278    if (m_contentsDirty && m_textureUpdated) {
     79        // prepareTexture copies the contents of the off-screen render target into the texture
     80        // used by the compositor.
     81        //
    7382        m_context->prepareTexture();
    7483        m_context->markLayerComposited();
     
    8594void WebGLLayerChromium::setContext(const GraphicsContext3D* context)
    8695{
     96    if (m_context != context && layerRenderer()) {
     97        if (m_context)
     98            layerRenderer()->removeChildContext(m_context);
     99        if (context)
     100            layerRenderer()->addChildContext(m_context);
     101    }
     102
    87103    m_context = const_cast<GraphicsContext3D*>(context);
    88104
     
    96112}
    97113
     114void WebGLLayerChromium::setLayerRenderer(LayerRendererChromium* newLayerRenderer)
     115{
     116    if (layerRenderer() != newLayerRenderer) {
     117        if (m_context) {
     118            if (layerRenderer())
     119                layerRenderer()->removeChildContext(m_context);
     120            if (newLayerRenderer)
     121                newLayerRenderer->addChildContext(m_context);
     122        }
     123
     124        LayerChromium::setLayerRenderer(newLayerRenderer);
     125    }
     126}
     127
    98128}
    99129#endif // USE(ACCELERATED_COMPOSITING)
  • trunk/Source/WebCore/platform/graphics/chromium/WebGLLayerChromium.h

    r82006 r83552  
    4545public:
    4646    static PassRefPtr<WebGLLayerChromium> create(GraphicsLayerChromium* owner = 0);
     47
     48    virtual ~WebGLLayerChromium();
     49
    4750    virtual bool drawsContent() const { return m_context; }
    4851    virtual void updateCompositorResources();
     
    5053
    5154    void setContext(const GraphicsContext3D* context);
     55
     56    virtual void setLayerRenderer(LayerRendererChromium*);
    5257
    5358protected:
  • trunk/Source/WebKit/chromium/ChangeLog

    r83548 r83552  
     12011-04-11  John Bates  <jbates@google.com>
     2
     3        Reviewed by Kenneth Russell.
     4
     5        chromium support for glSetLatch and glWaitLatch between 3D contexts
     6        https://bugs.webkit.org/show_bug.cgi?id=58003
     7
     8        * public/WebGraphicsContext3D.h:
     9        (WebKit::WebGraphicsContext3D::getParentToChildLatchCHROMIUM):
     10        (WebKit::WebGraphicsContext3D::getChildToParentLatchCHROMIUM):
     11        (WebKit::WebGraphicsContext3D::waitLatchCHROMIUM):
     12        (WebKit::WebGraphicsContext3D::setLatchCHROMIUM):
     13        * src/Extensions3DChromium.cpp:
     14        (WebCore::Extensions3DChromium::waitLatchCHROMIUM):
     15        (WebCore::Extensions3DChromium::setLatchCHROMIUM):
     16        * src/GraphicsContext3DChromium.cpp:
     17        * src/GraphicsContext3DInternal.h:
     18
    1192011-04-11  Ryosuke Niwa  <rniwa@webkit.org>
    220
  • trunk/Source/WebKit/chromium/public/WebGraphicsContext3D.h

    r77900 r83552  
    169169    virtual void renderbufferStorageMultisampleCHROMIUM(WGC3Denum target, WGC3Dsizei samples, WGC3Denum internalformat, WGC3Dsizei width, WGC3Dsizei height) = 0;
    170170
     171    // GL_CHROMIUM_latch
     172    virtual void getParentToChildLatchCHROMIUM(WGC3Duint* latchId) {} // FIXME: = 0;
     173    virtual void getChildToParentLatchCHROMIUM(WGC3Duint* latchId) {} // FIXME: = 0;
     174    virtual void waitLatchCHROMIUM(WGC3Duint latchId) {} // FIXME: = 0;
     175    virtual void setLatchCHROMIUM(WGC3Duint latchId) {} // FIXME: = 0;
     176
    171177    // The entry points below map directly to the OpenGL ES 2.0 API.
    172178    // See: http://www.khronos.org/registry/gles/
  • trunk/Source/WebKit/chromium/src/Extensions3DChromium.cpp

    r79011 r83552  
    9898}
    9999
     100void Extensions3DChromium::getParentToChildLatchCHROMIUM(GC3Duint* latchId)
     101{
     102    m_internal->getParentToChildLatchCHROMIUM(latchId);
     103}
     104
     105void Extensions3DChromium::getChildToParentLatchCHROMIUM(GC3Duint* latchId)
     106{
     107    m_internal->getChildToParentLatchCHROMIUM(latchId);
     108}
     109
     110void Extensions3DChromium::waitLatchCHROMIUM(GC3Duint latchId)
     111{
     112    m_internal->waitLatchCHROMIUM(latchId);
     113}
     114
     115void Extensions3DChromium::setLatchCHROMIUM(GC3Duint latchId)
     116{
     117    m_internal->setLatchCHROMIUM(latchId);
     118}
     119
    100120Platform3DObject Extensions3DChromium::createVertexArrayOES()
    101121{
  • trunk/Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp

    r81740 r83552  
    801801DELEGATE_TO_IMPL_10(blitFramebufferCHROMIUM, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dbitfield, GC3Denum)
    802802DELEGATE_TO_IMPL_5(renderbufferStorageMultisampleCHROMIUM, GC3Denum, GC3Dsizei, GC3Denum, GC3Dsizei, GC3Dsizei)
     803DELEGATE_TO_IMPL_1(getParentToChildLatchCHROMIUM, GC3Duint*)
     804DELEGATE_TO_IMPL_1(getChildToParentLatchCHROMIUM, GC3Duint*)
     805DELEGATE_TO_IMPL_1(waitLatchCHROMIUM, GC3Duint)
     806DELEGATE_TO_IMPL_1(setLatchCHROMIUM, GC3Duint)
    803807
    804808//----------------------------------------------------------------------
  • trunk/Source/WebKit/chromium/src/GraphicsContext3DInternal.h

    r81740 r83552  
    271271    void renderbufferStorageMultisampleCHROMIUM(GC3Denum target, GC3Dsizei samples, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
    272272
     273    // Latch support
     274    void getParentToChildLatchCHROMIUM(GC3Duint* latchId);
     275    void getChildToParentLatchCHROMIUM(GC3Duint* latchId);
     276    void waitLatchCHROMIUM(GC3Duint latchId);
     277    void setLatchCHROMIUM(GC3Duint latchId);
     278
    273279private:
    274280    OwnPtr<WebKit::WebGraphicsContext3D> m_impl;
Note: See TracChangeset for help on using the changeset viewer.