Changeset 116351 in webkit


Ignore:
Timestamp:
May 7, 2012 1:40:51 PM (12 years ago)
Author:
commit-queue@webkit.org
Message:

[Chromium] Use GL_CHROMIUM_command_buffer_query to throttle texture uploads.
https://bugs.webkit.org/show_bug.cgi?id=81004

Patch by David Reveman <reveman@chromium.org> on 2012-05-07
Reviewed by Adrienne Walker.

Source/WebCore:

Add ThrottledTextureUploader class that uses GL_CHROMIUM_command_buffer_query
to throttle texture uploads based on number of currently pending queries.

Unit test: ThrottledTextureUploaderTest.IsBusy

  • WebCore.gypi:
  • platform/graphics/chromium/LayerRendererChromium.cpp:

(WebCore::LayerRendererChromium::create):
(WebCore::LayerRendererChromium::LayerRendererChromium):
(WebCore::LayerRendererChromium::initializeSharedObjects):

  • platform/graphics/chromium/LayerRendererChromium.h:

(LayerRendererChromium):

  • platform/graphics/chromium/TextureUploader.cpp: Removed.
  • platform/graphics/chromium/TextureUploader.h:

(TextureUploader):

  • platform/graphics/chromium/ThrottledTextureUploader.cpp: Added.

(WebCore):
(WebCore::ThrottledTextureUploader::Query::Query):
(WebCore::ThrottledTextureUploader::Query::~Query):
(WebCore::ThrottledTextureUploader::Query::begin):
(WebCore::ThrottledTextureUploader::Query::end):
(WebCore::ThrottledTextureUploader::Query::isPending):
(WebCore::ThrottledTextureUploader::Query::wait):
(WebCore::ThrottledTextureUploader::ThrottledTextureUploader):
(WebCore::ThrottledTextureUploader::~ThrottledTextureUploader):
(WebCore::ThrottledTextureUploader::isBusy):
(WebCore::ThrottledTextureUploader::beginUploads):
(WebCore::ThrottledTextureUploader::endUploads):
(WebCore::ThrottledTextureUploader::uploadTexture):
(WebCore::ThrottledTextureUploader::processQueries):

  • platform/graphics/chromium/ThrottledTextureUploader.h: Copied from Source/WebCore/platform/graphics/chromium/TextureUploader.h.

(WebCore):
(ThrottledTextureUploader):
(WebCore::ThrottledTextureUploader::create):
(Query):
(WebCore::ThrottledTextureUploader::Query::create):

  • platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:

(WebCore::CCLayerTreeHostImpl::initializeLayerRenderer):

  • platform/graphics/chromium/cc/CCLayerTreeHostImpl.h:

(CCLayerTreeHostImpl):

  • platform/graphics/chromium/cc/CCSingleThreadProxy.cpp:

(UnthrottledTextureUploader):
(WebCore::UnthrottledTextureUploader::create):
(WebCore::UnthrottledTextureUploader::~UnthrottledTextureUploader):
(WebCore::UnthrottledTextureUploader::isBusy):
(WebCore::UnthrottledTextureUploader::beginUploads):
(WebCore::UnthrottledTextureUploader::endUploads):
(WebCore::UnthrottledTextureUploader::uploadTexture):
(WebCore::UnthrottledTextureUploader::UnthrottledTextureUploader):
(WebCore):
(WebCore::CCSingleThreadProxy::initializeLayerRenderer):
(WebCore::CCSingleThreadProxy::recreateContext):
(WebCore::CCSingleThreadProxy::doCommit):

  • platform/graphics/chromium/cc/CCTextureUpdater.cpp:

(WebCore::CCTextureUpdater::update):

  • platform/graphics/chromium/cc/CCTextureUpdater.h:

(CCTextureUpdater):

  • platform/graphics/chromium/cc/CCThreadProxy.cpp:

(WebCore):
(UnthrottledTextureUploader):
(WebCore::UnthrottledTextureUploader::create):
(WebCore::UnthrottledTextureUploader::~UnthrottledTextureUploader):
(WebCore::UnthrottledTextureUploader::isBusy):
(WebCore::UnthrottledTextureUploader::beginUploads):
(WebCore::UnthrottledTextureUploader::endUploads):
(WebCore::UnthrottledTextureUploader::uploadTexture):
(WebCore::UnthrottledTextureUploader::UnthrottledTextureUploader):
(WebCore::CCThreadProxy::initializeLayerRendererOnImplThread):
(WebCore::CCThreadProxy::recreateContextOnImplThread):

Source/WebKit/chromium:

  • WebKit.gypi:
  • tests/CCLayerTreeHostImplTest.cpp:

(WebKitTests::TEST_F):

  • tests/CCTiledLayerTestCommon.h:

(WebKitTests::FakeTextureUploader::isBusy):
(WebKitTests::FakeTextureUploader::beginUploads):
(WebKitTests::FakeTextureUploader::endUploads):

  • tests/Canvas2DLayerChromiumTest.cpp:
  • tests/LayerRendererChromiumTest.cpp:

(FakeLayerRendererChromium::FakeLayerRendererChromium):
(LayerRendererChromiumTest::LayerRendererChromiumTest):
(TEST):

  • tests/ThrottledTextureUploaderTest.cpp: Added.

(WebKit):
(FakeWebGraphicsContext3DWithQueryTesting):
(WebKit::FakeWebGraphicsContext3DWithQueryTesting::FakeWebGraphicsContext3DWithQueryTesting):
(WebKit::FakeWebGraphicsContext3DWithQueryTesting::getQueryObjectuivEXT):
(WebKit::FakeWebGraphicsContext3DWithQueryTesting::setResultAvailable):
(WebKit::TEST):

  • tests/TiledLayerChromiumTest.cpp:

(WTF::TEST):

Location:
trunk/Source
Files:
2 added
1 deleted
18 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r116343 r116351  
     12012-05-07  David Reveman  <reveman@chromium.org>
     2
     3        [Chromium] Use GL_CHROMIUM_command_buffer_query to throttle texture uploads.
     4        https://bugs.webkit.org/show_bug.cgi?id=81004
     5
     6        Reviewed by Adrienne Walker.
     7
     8        Add ThrottledTextureUploader class that uses GL_CHROMIUM_command_buffer_query
     9        to throttle texture uploads based on number of currently pending queries.
     10
     11        Unit test: ThrottledTextureUploaderTest.IsBusy
     12
     13        * WebCore.gypi:
     14        * platform/graphics/chromium/LayerRendererChromium.cpp:
     15        (WebCore::LayerRendererChromium::create):
     16        (WebCore::LayerRendererChromium::LayerRendererChromium):
     17        (WebCore::LayerRendererChromium::initializeSharedObjects):
     18        * platform/graphics/chromium/LayerRendererChromium.h:
     19        (LayerRendererChromium):
     20        * platform/graphics/chromium/TextureUploader.cpp: Removed.
     21        * platform/graphics/chromium/TextureUploader.h:
     22        (TextureUploader):
     23        * platform/graphics/chromium/ThrottledTextureUploader.cpp: Added.
     24        (WebCore):
     25        (WebCore::ThrottledTextureUploader::Query::Query):
     26        (WebCore::ThrottledTextureUploader::Query::~Query):
     27        (WebCore::ThrottledTextureUploader::Query::begin):
     28        (WebCore::ThrottledTextureUploader::Query::end):
     29        (WebCore::ThrottledTextureUploader::Query::isPending):
     30        (WebCore::ThrottledTextureUploader::Query::wait):
     31        (WebCore::ThrottledTextureUploader::ThrottledTextureUploader):
     32        (WebCore::ThrottledTextureUploader::~ThrottledTextureUploader):
     33        (WebCore::ThrottledTextureUploader::isBusy):
     34        (WebCore::ThrottledTextureUploader::beginUploads):
     35        (WebCore::ThrottledTextureUploader::endUploads):
     36        (WebCore::ThrottledTextureUploader::uploadTexture):
     37        (WebCore::ThrottledTextureUploader::processQueries):
     38        * platform/graphics/chromium/ThrottledTextureUploader.h: Copied from Source/WebCore/platform/graphics/chromium/TextureUploader.h.
     39        (WebCore):
     40        (ThrottledTextureUploader):
     41        (WebCore::ThrottledTextureUploader::create):
     42        (Query):
     43        (WebCore::ThrottledTextureUploader::Query::create):
     44        * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
     45        (WebCore::CCLayerTreeHostImpl::initializeLayerRenderer):
     46        * platform/graphics/chromium/cc/CCLayerTreeHostImpl.h:
     47        (CCLayerTreeHostImpl):
     48        * platform/graphics/chromium/cc/CCSingleThreadProxy.cpp:
     49        (UnthrottledTextureUploader):
     50        (WebCore::UnthrottledTextureUploader::create):
     51        (WebCore::UnthrottledTextureUploader::~UnthrottledTextureUploader):
     52        (WebCore::UnthrottledTextureUploader::isBusy):
     53        (WebCore::UnthrottledTextureUploader::beginUploads):
     54        (WebCore::UnthrottledTextureUploader::endUploads):
     55        (WebCore::UnthrottledTextureUploader::uploadTexture):
     56        (WebCore::UnthrottledTextureUploader::UnthrottledTextureUploader):
     57        (WebCore):
     58        (WebCore::CCSingleThreadProxy::initializeLayerRenderer):
     59        (WebCore::CCSingleThreadProxy::recreateContext):
     60        (WebCore::CCSingleThreadProxy::doCommit):
     61        * platform/graphics/chromium/cc/CCTextureUpdater.cpp:
     62        (WebCore::CCTextureUpdater::update):
     63        * platform/graphics/chromium/cc/CCTextureUpdater.h:
     64        (CCTextureUpdater):
     65        * platform/graphics/chromium/cc/CCThreadProxy.cpp:
     66        (WebCore):
     67        (UnthrottledTextureUploader):
     68        (WebCore::UnthrottledTextureUploader::create):
     69        (WebCore::UnthrottledTextureUploader::~UnthrottledTextureUploader):
     70        (WebCore::UnthrottledTextureUploader::isBusy):
     71        (WebCore::UnthrottledTextureUploader::beginUploads):
     72        (WebCore::UnthrottledTextureUploader::endUploads):
     73        (WebCore::UnthrottledTextureUploader::uploadTexture):
     74        (WebCore::UnthrottledTextureUploader::UnthrottledTextureUploader):
     75        (WebCore::CCThreadProxy::initializeLayerRendererOnImplThread):
     76        (WebCore::CCThreadProxy::recreateContextOnImplThread):
     77
    1782012-05-07  Rob Buis  <rbuis@rim.com>
    279
  • trunk/Source/WebCore/WebCore.gypi

    r116342 r116351  
    36043604            'platform/graphics/chromium/TextureManager.cpp',
    36053605            'platform/graphics/chromium/TextureManager.h',
    3606             'platform/graphics/chromium/TextureUploader.cpp',
    36073606            'platform/graphics/chromium/TextureUploader.h',
     3607            'platform/graphics/chromium/ThrottledTextureUploader.cpp',
     3608            'platform/graphics/chromium/ThrottledTextureUploader.h',
    36083609            'platform/graphics/chromium/TiledLayerChromium.cpp',
    36093610            'platform/graphics/chromium/TiledLayerChromium.h',
  • trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp

    r115881 r116351  
    4949#include "TextureCopier.h"
    5050#include "TextureManager.h"
     51#include "ThrottledTextureUploader.h"
    5152#include "TraceEvent.h"
    5253#include "TrackingTextureAllocator.h"
     
    194195
    195196
    196 PassOwnPtr<LayerRendererChromium> LayerRendererChromium::create(LayerRendererChromiumClient* client, PassRefPtr<GraphicsContext3D> context)
    197 {
    198     OwnPtr<LayerRendererChromium> layerRenderer(adoptPtr(new LayerRendererChromium(client, context)));
     197PassOwnPtr<LayerRendererChromium> LayerRendererChromium::create(LayerRendererChromiumClient* client, PassRefPtr<GraphicsContext3D> context, PassOwnPtr<TextureUploader> uploader)
     198{
     199    OwnPtr<LayerRendererChromium> layerRenderer(adoptPtr(new LayerRendererChromium(client, context, uploader)));
    199200    if (!layerRenderer->initialize())
    200201        return nullptr;
     
    204205
    205206LayerRendererChromium::LayerRendererChromium(LayerRendererChromiumClient* client,
    206                                              PassRefPtr<GraphicsContext3D> context)
     207                                             PassRefPtr<GraphicsContext3D> context,
     208                                             PassOwnPtr<TextureUploader> uploader)
    207209    : m_client(client)
    208210    , m_currentRenderSurface(0)
    209211    , m_currentManagedTexture(0)
    210212    , m_offscreenFramebufferId(0)
     213    , m_textureUploader(uploader)
    211214    , m_context(context)
    212215    , m_defaultRenderSurface(0)
     
    13801383                                                           m_capabilities.maxTextureSize);
    13811384    m_textureCopier = AcceleratedTextureCopier::create(m_context.get());
    1382     m_textureUploader = AcceleratedTextureUploader::create(m_context.get());
    13831385    m_contentsTextureAllocator = TrackingTextureAllocator::create(m_context.get());
    13841386    m_renderSurfaceTextureAllocator = TrackingTextureAllocator::create(m_context.get());
  • trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h

    r115881 r116351  
    3838#include "IntRect.h"
    3939#include "TextureCopier.h"
    40 #include "TextureUploader.h"
     40#include "ThrottledTextureUploader.h"
    4141#include "TrackingTextureAllocator.h"
    4242#include "cc/CCLayerTreeHost.h"
     
    7979    WTF_MAKE_NONCOPYABLE(LayerRendererChromium);
    8080public:
    81     static PassOwnPtr<LayerRendererChromium> create(LayerRendererChromiumClient*, PassRefPtr<GraphicsContext3D>);
     81    static PassOwnPtr<LayerRendererChromium> create(LayerRendererChromiumClient*, PassRefPtr<GraphicsContext3D>, PassOwnPtr<TextureUploader>);
    8282
    8383    ~LayerRendererChromium();
     
    145145    bool isFramebufferDiscarded() const { return m_isFramebufferDiscarded; }
    146146
    147     LayerRendererChromium(LayerRendererChromiumClient*, PassRefPtr<GraphicsContext3D>);
     147    LayerRendererChromium(LayerRendererChromiumClient*, PassRefPtr<GraphicsContext3D>, PassOwnPtr<TextureUploader>);
    148148    bool initialize();
    149149
     
    287287    OwnPtr<TextureManager> m_renderSurfaceTextureManager;
    288288    OwnPtr<AcceleratedTextureCopier> m_textureCopier;
    289     OwnPtr<AcceleratedTextureUploader> m_textureUploader;
     289    OwnPtr<TextureUploader> m_textureUploader;
    290290    OwnPtr<TrackingTextureAllocator> m_contentsTextureAllocator;
    291291    OwnPtr<TrackingTextureAllocator> m_renderSurfaceTextureAllocator;
  • trunk/Source/WebCore/platform/graphics/chromium/TextureUploader.h

    r114450 r116351  
    3232class TextureUploader {
    3333public:
     34    virtual ~TextureUploader() { }
     35
     36    virtual bool isBusy() = 0;
     37    virtual void beginUploads() = 0;
     38    virtual void endUploads() = 0;
    3439    virtual void uploadTexture(GraphicsContext3D*, LayerTextureUpdater::Texture*, TextureAllocator*, const IntRect sourceRect, const IntRect destRect) = 0;
    35 
    36 protected:
    37     virtual ~TextureUploader() { }
    38 };
    39 
    40 class AcceleratedTextureUploader : public TextureUploader {
    41     WTF_MAKE_NONCOPYABLE(AcceleratedTextureUploader);
    42 public:
    43     static PassOwnPtr<AcceleratedTextureUploader> create(PassRefPtr<GraphicsContext3D> context)
    44     {
    45         return adoptPtr(new AcceleratedTextureUploader(context));
    46     }
    47     virtual ~AcceleratedTextureUploader();
    48 
    49     virtual void uploadTexture(GraphicsContext3D*, LayerTextureUpdater::Texture*, TextureAllocator*, const IntRect sourceRect, const IntRect destRect);
    50 
    51 protected:
    52     explicit AcceleratedTextureUploader(PassRefPtr<GraphicsContext3D>);
    53 
    54     RefPtr<GraphicsContext3D> m_context;
    5540};
    5641
  • trunk/Source/WebCore/platform/graphics/chromium/ThrottledTextureUploader.h

    r116350 r116351  
    2323 */
    2424
    25 #ifndef TextureUploader_h
    26 #define TextureUploader_h
     25#ifndef ThrottledTextureUploader_h
     26#define ThrottledTextureUploader_h
    2727
    28 #include "LayerTextureUpdater.h"
     28#include "TextureUploader.h"
     29
     30#include <wtf/Deque.h>
    2931
    3032namespace WebCore {
    3133
    32 class TextureUploader {
     34class ThrottledTextureUploader : public TextureUploader {
     35    WTF_MAKE_NONCOPYABLE(ThrottledTextureUploader);
    3336public:
    34     virtual void uploadTexture(GraphicsContext3D*, LayerTextureUpdater::Texture*, TextureAllocator*, const IntRect sourceRect, const IntRect destRect) = 0;
     37    static PassOwnPtr<ThrottledTextureUploader> create(PassRefPtr<GraphicsContext3D> context)
     38    {
     39        return adoptPtr(new ThrottledTextureUploader(context));
     40    }
     41    static PassOwnPtr<ThrottledTextureUploader> create(PassRefPtr<GraphicsContext3D> context, size_t pendingUploadLimit)
     42    {
     43        return adoptPtr(new ThrottledTextureUploader(context, pendingUploadLimit));
     44    }
     45    virtual ~ThrottledTextureUploader();
    3546
    36 protected:
    37     virtual ~TextureUploader() { }
    38 };
     47    virtual bool isBusy() OVERRIDE;
     48    virtual void beginUploads() OVERRIDE;
     49    virtual void endUploads() OVERRIDE;
     50    virtual void uploadTexture(GraphicsContext3D*, LayerTextureUpdater::Texture*, TextureAllocator*, const IntRect sourceRect, const IntRect destRect) OVERRIDE;
    3951
    40 class AcceleratedTextureUploader : public TextureUploader {
    41     WTF_MAKE_NONCOPYABLE(AcceleratedTextureUploader);
    42 public:
    43     static PassOwnPtr<AcceleratedTextureUploader> create(PassRefPtr<GraphicsContext3D> context)
    44     {
    45         return adoptPtr(new AcceleratedTextureUploader(context));
    46     }
    47     virtual ~AcceleratedTextureUploader();
     52private:
     53    class Query {
     54    public:
     55        static PassOwnPtr<Query> create(PassRefPtr<GraphicsContext3D> context) { return adoptPtr(new Query(context)); }
    4856
    49     virtual void uploadTexture(GraphicsContext3D*, LayerTextureUpdater::Texture*, TextureAllocator*, const IntRect sourceRect, const IntRect destRect);
     57        virtual ~Query();
    5058
    51 protected:
    52     explicit AcceleratedTextureUploader(PassRefPtr<GraphicsContext3D>);
     59        void begin();
     60        void end();
     61        bool isPending();
     62        void wait();
     63
     64    private:
     65        explicit Query(PassRefPtr<GraphicsContext3D>);
     66
     67        RefPtr<GraphicsContext3D> m_context;
     68        unsigned m_queryId;
     69    };
     70
     71    ThrottledTextureUploader(PassRefPtr<GraphicsContext3D>);
     72    ThrottledTextureUploader(PassRefPtr<GraphicsContext3D>, size_t pendingUploadLimit);
     73
     74    void processQueries();
    5375
    5476    RefPtr<GraphicsContext3D> m_context;
     77    size_t m_maxPendingQueries;
     78    Deque<OwnPtr<Query> > m_pendingQueries;
     79    Deque<OwnPtr<Query> > m_availableQueries;
    5580};
    5681
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp

    r116152 r116351  
    532532}
    533533
    534 bool CCLayerTreeHostImpl::initializeLayerRenderer(PassRefPtr<GraphicsContext3D> context)
     534bool CCLayerTreeHostImpl::initializeLayerRenderer(PassRefPtr<GraphicsContext3D> context, PassOwnPtr<TextureUploader> uploader)
    535535{
    536536    OwnPtr<LayerRendererChromium> layerRenderer;
    537     layerRenderer = LayerRendererChromium::create(this, context);
     537    layerRenderer = LayerRendererChromium::create(this, context, uploader);
    538538
    539539    // Since we now have a new context/layerRenderer, we cannot continue to use the old
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h

    r116142 r116351  
    123123    int frameNumber() const { return m_frameNumber; }
    124124
    125     bool initializeLayerRenderer(PassRefPtr<GraphicsContext3D>);
     125    bool initializeLayerRenderer(PassRefPtr<GraphicsContext3D>, PassOwnPtr<TextureUploader>);
    126126    bool isContextLost();
    127127    LayerRendererChromium* layerRenderer() { return m_layerRenderer.get(); }
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCSingleThreadProxy.cpp

    r115881 r116351  
    3535#include <wtf/CurrentTime.h>
    3636
    37 using namespace std;
    3837using namespace WTF;
    3938
    4039namespace WebCore {
     40
     41class UnthrottledTextureUploader : public TextureUploader {
     42    WTF_MAKE_NONCOPYABLE(UnthrottledTextureUploader);
     43public:
     44    static PassOwnPtr<UnthrottledTextureUploader> create()
     45    {
     46        return adoptPtr(new UnthrottledTextureUploader());
     47    }
     48    virtual ~UnthrottledTextureUploader() { }
     49
     50    virtual bool isBusy() { return false; }
     51    virtual void beginUploads() { }
     52    virtual void endUploads() { }
     53    virtual void uploadTexture(GraphicsContext3D* context, LayerTextureUpdater::Texture* texture, TextureAllocator* allocator, const IntRect sourceRect, const IntRect destRect) { texture->updateRect(context, allocator, sourceRect, destRect); }
     54
     55protected:
     56    UnthrottledTextureUploader() { }
     57};
    4158
    4259PassOwnPtr<CCProxy> CCSingleThreadProxy::create(CCLayerTreeHost* layerTreeHost)
     
    139156    {
    140157        DebugScopedSetImplThread impl;
    141         bool ok = m_layerTreeHostImpl->initializeLayerRenderer(m_contextBeforeInitialization.release());
     158        bool ok = m_layerTreeHostImpl->initializeLayerRenderer(m_contextBeforeInitialization.release(), UnthrottledTextureUploader::create());
    142159        if (ok) {
    143160            m_layerRendererInitialized = true;
     
    163180        DebugScopedSetImplThread impl;
    164181        m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostImpl->contentsTextureAllocator());
    165         initialized = m_layerTreeHostImpl->initializeLayerRenderer(context);
     182        initialized = m_layerTreeHostImpl->initializeLayerRenderer(context, UnthrottledTextureUploader::create());
    166183        if (initialized) {
    167184            m_layerRendererCapabilitiesForMainThread = m_layerTreeHostImpl->layerRendererCapabilities();
     
    204221
    205222        m_layerTreeHost->beginCommitOnImplThread(m_layerTreeHostImpl.get());
    206         updater.update(m_layerTreeHostImpl->context(), m_layerTreeHostImpl->contentsTextureAllocator(), m_layerTreeHostImpl->layerRenderer()->textureCopier(), m_layerTreeHostImpl->layerRenderer()->textureUploader(), numeric_limits<size_t>::max());
    207         ASSERT(!updater.hasMoreUpdates());
     223
     224        // CCTextureUpdater is non-blocking and will return without updating
     225        // any textures if the uploader is busy. This shouldn't be a problem
     226        // here as the throttled uploader isn't used in single thread mode.
     227        // For correctness, loop until no more updates are pending.
     228        while (updater.hasMoreUpdates())
     229            updater.update(m_layerTreeHostImpl->context(), m_layerTreeHostImpl->contentsTextureAllocator(), m_layerTreeHostImpl->layerRenderer()->textureCopier(), m_layerTreeHostImpl->layerRenderer()->textureUploader(), maxPartialTextureUpdates());
     230
    208231        m_layerTreeHostImpl->setVisible(m_layerTreeHost->visible());
    209232        m_layerTreeHost->finishCommitOnImplThread(m_layerTreeHostImpl.get());
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdater.cpp

    r114450 r116351  
    9393}
    9494
    95 bool CCTextureUpdater::update(GraphicsContext3D* context, TextureAllocator* allocator, TextureCopier* copier, TextureUploader* uploader, size_t count)
     95void CCTextureUpdater::update(GraphicsContext3D* context, TextureAllocator* allocator, TextureCopier* copier, TextureUploader* uploader, size_t count)
    9696{
    9797    size_t index;
    98     size_t maxIndex = min(m_entryIndex + count, m_entries.size());
    99     for (index = m_entryIndex; index < maxIndex; ++index) {
    100         UpdateEntry& entry = m_entries[index];
    101         uploader->uploadTexture(context, entry.texture, allocator, entry.sourceRect, entry.destRect);
    102     }
    10398
    104     bool moreUpdates = maxIndex < m_entries.size();
     99    if (m_entries.size() || m_partialEntries.size()) {
     100        if (uploader->isBusy())
     101            return;
    105102
    106     ASSERT(m_partialEntries.size() <= count);
    107     // Make sure the number of updates including partial updates are not more
    108     // than |count|.
    109     if ((count - (index - m_entryIndex)) < m_partialEntries.size())
    110         moreUpdates = true;
     103        uploader->beginUploads();
    111104
    112     if (moreUpdates) {
    113         m_entryIndex = index;
    114         return true;
    115     }
     105        size_t maxIndex = min(m_entryIndex + count, m_entries.size());
     106        for (index = m_entryIndex; index < maxIndex; ++index) {
     107            UpdateEntry& entry = m_entries[index];
     108            uploader->uploadTexture(context, entry.texture, allocator, entry.sourceRect, entry.destRect);
     109        }
    116110
    117     for (index = 0; index < m_partialEntries.size(); ++index) {
    118         UpdateEntry& entry = m_partialEntries[index];
    119         uploader->uploadTexture(context, entry.texture, allocator, entry.sourceRect, entry.destRect);
     111        bool moreUploads = maxIndex < m_entries.size();
     112
     113        ASSERT(m_partialEntries.size() <= count);
     114        // We need another update batch if the number of updates remaining
     115        // in |count| is greater than the remaining partial entries.
     116        if ((count - (index - m_entryIndex)) < m_partialEntries.size())
     117            moreUploads = true;
     118
     119        if (moreUploads) {
     120            m_entryIndex = index;
     121            uploader->endUploads();
     122            return;
     123        }
     124
     125        for (index = 0; index < m_partialEntries.size(); ++index) {
     126            UpdateEntry& entry = m_partialEntries[index];
     127            uploader->uploadTexture(context, entry.texture, allocator, entry.sourceRect, entry.destRect);
     128        }
     129
     130        uploader->endUploads();
    120131    }
    121132
     
    137148    // If no entries left to process, auto-clear.
    138149    clear();
    139     return false;
    140150}
    141151
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdater.h

    r114450 r116351  
    5050    bool hasMoreUpdates() const;
    5151
    52     // Update some textures. Returns true if more textures left to process.
    53     bool update(GraphicsContext3D*, TextureAllocator*, TextureCopier*, TextureUploader*, size_t count);
     52    // Update some textures.
     53    void update(GraphicsContext3D*, TextureAllocator*, TextureCopier*, TextureUploader*, size_t count);
    5454
    5555    void clear();
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp

    r116152 r116351  
    5858namespace WebCore {
    5959
     60// FIXME: remove when ThrottledTextureUploader is ready to be used.
     61class UnthrottledTextureUploader : public TextureUploader {
     62    WTF_MAKE_NONCOPYABLE(UnthrottledTextureUploader);
     63public:
     64    static PassOwnPtr<UnthrottledTextureUploader> create(PassRefPtr<GraphicsContext3D> context)
     65    {
     66        return adoptPtr(new UnthrottledTextureUploader(context));
     67    }
     68    virtual ~UnthrottledTextureUploader() { }
     69
     70    virtual bool isBusy() { return false; }
     71    virtual void beginUploads() { }
     72    virtual void endUploads() { }
     73    virtual void uploadTexture(GraphicsContext3D* context, LayerTextureUpdater::Texture* texture, TextureAllocator* allocator, const IntRect sourceRect, const IntRect destRect) { texture->updateRect(context, allocator, sourceRect, destRect); }
     74
     75protected:
     76    explicit UnthrottledTextureUploader(PassRefPtr<GraphicsContext3D>) { }
     77};
     78
    6079PassOwnPtr<CCProxy> CCThreadProxy::create(CCLayerTreeHost* layerTreeHost)
    6180{
     
    806825    ASSERT(isImplThread());
    807826    ASSERT(m_contextBeforeInitializationOnImplThread);
    808     *initializeSucceeded = m_layerTreeHostImpl->initializeLayerRenderer(m_contextBeforeInitializationOnImplThread.release());
     827    OwnPtr<TextureUploader> uploader = UnthrottledTextureUploader::create(m_contextBeforeInitializationOnImplThread.get());
     828    *initializeSucceeded = m_layerTreeHostImpl->initializeLayerRenderer(m_contextBeforeInitializationOnImplThread.release(), uploader.release());
    809829    if (*initializeSucceeded) {
    810830        *capabilities = m_layerTreeHostImpl->layerRendererCapabilities();
     
    856876    ASSERT(isImplThread());
    857877    m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostImpl->contentsTextureAllocator());
    858     *recreateSucceeded = m_layerTreeHostImpl->initializeLayerRenderer(adoptRef(contextPtr));
     878    OwnPtr<TextureUploader> uploader = UnthrottledTextureUploader::create(contextPtr);
     879    *recreateSucceeded = m_layerTreeHostImpl->initializeLayerRenderer(adoptRef(contextPtr), uploader.release());
    859880    if (*recreateSucceeded) {
    860881        *capabilities = m_layerTreeHostImpl->layerRendererCapabilities();
  • trunk/Source/WebKit/chromium/ChangeLog

    r116342 r116351  
     12012-05-07  David Reveman  <reveman@chromium.org>
     2
     3        [Chromium] Use GL_CHROMIUM_command_buffer_query to throttle texture uploads.
     4        https://bugs.webkit.org/show_bug.cgi?id=81004
     5
     6        Reviewed by Adrienne Walker.
     7
     8        * WebKit.gypi:
     9        * tests/CCLayerTreeHostImplTest.cpp:
     10        (WebKitTests::TEST_F):
     11        * tests/CCTiledLayerTestCommon.h:
     12        (WebKitTests::FakeTextureUploader::isBusy):
     13        (WebKitTests::FakeTextureUploader::beginUploads):
     14        (WebKitTests::FakeTextureUploader::endUploads):
     15        * tests/Canvas2DLayerChromiumTest.cpp:
     16        * tests/LayerRendererChromiumTest.cpp:
     17        (FakeLayerRendererChromium::FakeLayerRendererChromium):
     18        (LayerRendererChromiumTest::LayerRendererChromiumTest):
     19        (TEST):
     20        * tests/ThrottledTextureUploaderTest.cpp: Added.
     21        (WebKit):
     22        (FakeWebGraphicsContext3DWithQueryTesting):
     23        (WebKit::FakeWebGraphicsContext3DWithQueryTesting::FakeWebGraphicsContext3DWithQueryTesting):
     24        (WebKit::FakeWebGraphicsContext3DWithQueryTesting::getQueryObjectuivEXT):
     25        (WebKit::FakeWebGraphicsContext3DWithQueryTesting::setResultAvailable):
     26        (WebKit::TEST):
     27        * tests/TiledLayerChromiumTest.cpp:
     28        (WTF::TEST):
     29
    1302012-05-07  Sheriff Bot  <webkit.review.bot@gmail.com>
    231
  • trunk/Source/WebKit/chromium/WebKit.gypi

    r116342 r116351  
    128128            'tests/TextureCopierTest.cpp',
    129129            'tests/TextureManagerTest.cpp',
     130            'tests/ThrottledTextureUploaderTest.cpp',
    130131            'tests/TiledLayerChromiumTest.cpp',
    131132            'tests/TilingDataTest.cpp',
  • trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp

    r116142 r116351  
    2929#include "CCAnimationTestCommon.h"
    3030#include "CCLayerTestCommon.h"
     31#include "CCTiledLayerTestCommon.h"
    3132#include "FakeWebGraphicsContext3D.h"
    3233#include "GraphicsContext3DPrivate.h"
     
    255256TEST_F(CCLayerTreeHostImplTest, nonFastScrollableRegionWithOffset)
    256257{
    257     m_hostImpl->initializeLayerRenderer(createContext());
     258    m_hostImpl->initializeLayerRenderer(createContext(), adoptPtr(new FakeTextureUploader));
    258259
    259260    OwnPtr<CCLayerImpl> root = CCLayerImpl::create(0);
     
    441442TEST_F(CCLayerTreeHostImplTest, didDrawNotCalledOnHiddenLayer)
    442443{
    443     m_hostImpl->initializeLayerRenderer(createContext());
     444    m_hostImpl->initializeLayerRenderer(createContext(), adoptPtr(new FakeTextureUploader));
    444445
    445446    // Ensure visibleLayerRect for root layer is empty
     
    481482TEST_F(CCLayerTreeHostImplTest, didDrawCalledOnAllLayers)
    482483{
    483     m_hostImpl->initializeLayerRenderer(createContext());
     484    m_hostImpl->initializeLayerRenderer(createContext(), adoptPtr(new FakeTextureUploader));
    484485    m_hostImpl->setViewportSize(IntSize(10, 10));
    485486
     
    534535TEST_F(CCLayerTreeHostImplTest, prepareToDrawFailsWhenAnimationUsesCheckerboard)
    535536{
    536     m_hostImpl->initializeLayerRenderer(createContext());
     537    m_hostImpl->initializeLayerRenderer(createContext(), adoptPtr(new FakeTextureUploader));
    537538    m_hostImpl->setViewportSize(IntSize(10, 10));
    538539
     
    661662TEST_F(CCLayerTreeHostImplTest, blendingOffWhenDrawingOpaqueLayers)
    662663{
    663     m_hostImpl->initializeLayerRenderer(createContext());
     664    m_hostImpl->initializeLayerRenderer(createContext(), adoptPtr(new FakeTextureUploader));
    664665    m_hostImpl->setViewportSize(IntSize(10, 10));
    665666
     
    879880TEST_F(CCLayerTreeHostImplTest, viewportCovered)
    880881{
    881     m_hostImpl->initializeLayerRenderer(createContext());
     882    m_hostImpl->initializeLayerRenderer(createContext(), adoptPtr(new FakeTextureUploader));
    882883    m_hostImpl->setBackgroundColor(Color::gray);
    883884
     
    990991    ReshapeTrackerContext* reshapeTracker = new ReshapeTrackerContext();
    991992    RefPtr<GraphicsContext3D> context = GraphicsContext3DPrivate::createGraphicsContextFromWebContext(adoptPtr(reshapeTracker), GraphicsContext3D::RenderDirectlyToHostWindow);
    992     m_hostImpl->initializeLayerRenderer(context);
     993    m_hostImpl->initializeLayerRenderer(context, adoptPtr(new FakeTextureUploader));
    993994    m_hostImpl->setViewportSize(IntSize(10, 10));
    994995
     
    10401041    settings.partialSwapEnabled = true;
    10411042    OwnPtr<CCLayerTreeHostImpl> layerTreeHostImpl = CCLayerTreeHostImpl::create(settings, this);
    1042     layerTreeHostImpl->initializeLayerRenderer(context);
     1043    layerTreeHostImpl->initializeLayerRenderer(context, adoptPtr(new FakeTextureUploader()));
    10431044    layerTreeHostImpl->setViewportSize(IntSize(500, 500));
    10441045
     
    11261127TEST_F(CCLayerTreeHostImplTest, contextLostAndRestoredNotificationSentToAllLayers)
    11271128{
    1128     m_hostImpl->initializeLayerRenderer(createContext());
     1129    m_hostImpl->initializeLayerRenderer(createContext(), adoptPtr(new FakeTextureUploader));
    11291130    m_hostImpl->setViewportSize(IntSize(10, 10));
    11301131
     
    11421143    EXPECT_FALSE(layer2->didLoseContextCalled());
    11431144
    1144     m_hostImpl->initializeLayerRenderer(createContext());
     1145    m_hostImpl->initializeLayerRenderer(createContext(), adoptPtr(new FakeTextureUploader));
    11451146
    11461147    EXPECT_TRUE(root->didLoseContextCalled());
     
    11571158{
    11581159    // The context initialization will fail, but we should still be able to call finishAllRendering() without any ill effects.
    1159     m_hostImpl->initializeLayerRenderer(GraphicsContext3DPrivate::createGraphicsContextFromWebContext(adoptPtr(new FakeWebGraphicsContext3DMakeCurrentFails), GraphicsContext3D::RenderDirectlyToHostWindow));
     1160    m_hostImpl->initializeLayerRenderer(GraphicsContext3DPrivate::createGraphicsContextFromWebContext(adoptPtr(new FakeWebGraphicsContext3DMakeCurrentFails), GraphicsContext3D::RenderDirectlyToHostWindow), adoptPtr(new FakeTextureUploader));
    11601161    m_hostImpl->finishAllRendering();
    11611162}
     
    11731174TEST_F(CCLayerTreeHostImplTest, scrollbarLayerLostContext)
    11741175{
    1175     m_hostImpl->initializeLayerRenderer(createContext());
     1176    m_hostImpl->initializeLayerRenderer(createContext(), adoptPtr(new FakeTextureUploader));
    11761177    m_hostImpl->setViewportSize(IntSize(10, 10));
    11771178
     
    11901191        EXPECT_GT(renderPass->quadList().size(), 0u);
    11911192        m_hostImpl->didDrawAllLayers(frame);
    1192         m_hostImpl->initializeLayerRenderer(createContext());
     1193        m_hostImpl->initializeLayerRenderer(createContext(), adoptPtr(new FakeTextureUploader));
    11931194    }
    11941195}
     
    13231324TEST_F(CCLayerTreeHostImplTest, dontUseOldResourcesAfterLostContext)
    13241325{
    1325     m_hostImpl->initializeLayerRenderer(createContext());
     1326    m_hostImpl->initializeLayerRenderer(createContext(), adoptPtr(new FakeTextureUploader));
    13261327    m_hostImpl->setViewportSize(IntSize(10, 10));
    13271328
     
    13681369    // Lose the context, replacing it with a StrictWebGraphicsContext3D, that
    13691370    // will warn if any resource from the previous context gets used.
    1370     m_hostImpl->initializeLayerRenderer(StrictWebGraphicsContext3D::createGraphicsContext());
     1371    m_hostImpl->initializeLayerRenderer(StrictWebGraphicsContext3D::createGraphicsContext(), adoptPtr(new FakeTextureUploader));
    13711372    EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
    13721373    m_hostImpl->drawLayers(frame);
  • trunk/Source/WebKit/chromium/tests/CCTiledLayerTestCommon.h

    r114827 r116351  
    162162class FakeTextureUploader : public WebCore::TextureUploader {
    163163public:
     164    virtual bool isBusy() { return false; }
     165    virtual void beginUploads() { }
     166    virtual void endUploads() { }
    164167    virtual void uploadTexture(WebCore::GraphicsContext3D* context, WebCore::LayerTextureUpdater::Texture* texture, WebCore::TextureAllocator* allocator, const WebCore::IntRect sourceRect, const WebCore::IntRect destRect) { texture->updateRect(context, allocator, sourceRect, destRect); }
    165168};
  • trunk/Source/WebKit/chromium/tests/Canvas2DLayerChromiumTest.cpp

    r115631 r116351  
    9191class MockTextureUploader : public TextureUploader {
    9292public:
     93    MOCK_METHOD0(isBusy, bool());
     94    MOCK_METHOD0(beginUploads, void());
     95    MOCK_METHOD0(endUploads, void());
    9396    MOCK_METHOD5(uploadTexture, void(GraphicsContext3D*, LayerTextureUpdater::Texture*, TextureAllocator*, const IntRect, const IntRect));
    9497};
  • trunk/Source/WebKit/chromium/tests/LayerRendererChromiumTest.cpp

    r115881 r116351  
    2626#include "LayerRendererChromium.h"
    2727
     28#include "CCTiledLayerTestCommon.h"
    2829#include "FakeWebGraphicsContext3D.h"
    2930#include "GraphicsContext3D.h"
     
    3637using namespace WebCore;
    3738using namespace WebKit;
     39using namespace WebKitTests;
    3840
    3941class FrameCountingMemoryAllocationSettingContext : public FakeWebGraphicsContext3D {
     
    9294class FakeLayerRendererChromium : public LayerRendererChromium {
    9395public:
    94     FakeLayerRendererChromium(LayerRendererChromiumClient* client, PassRefPtr<GraphicsContext3D> context) : LayerRendererChromium(client, context) { }
     96    FakeLayerRendererChromium(LayerRendererChromiumClient* client, PassRefPtr<GraphicsContext3D> context, PassOwnPtr<TextureUploader> uploader) : LayerRendererChromium(client, context, uploader) { }
    9597
    9698    // LayerRendererChromium methods.
     
    108110        , m_context(GraphicsContext3DPrivate::createGraphicsContextFromWebContext(adoptPtr(new FrameCountingMemoryAllocationSettingContext()), GraphicsContext3D::RenderDirectlyToHostWindow))
    109111        , m_mockContext(*static_cast<FrameCountingMemoryAllocationSettingContext*>(GraphicsContext3DPrivate::extractWebGraphicsContext3D(m_context.get())))
    110         , m_layerRendererChromium(&m_mockClient, m_context.release())
     112        , m_layerRendererChromium(&m_mockClient, m_context.release(), adoptPtr(new FakeTextureUploader()))
    111113    {
    112114    }
     
    272274{
    273275    FakeLayerRendererChromiumClient mockClient;
    274     FakeLayerRendererChromium layerRendererChromium(&mockClient, GraphicsContext3DPrivate::createGraphicsContextFromWebContext(adoptPtr(new ForbidSynchronousCallContext), GraphicsContext3D::RenderDirectlyToHostWindow));
     276    FakeLayerRendererChromium layerRendererChromium(&mockClient, GraphicsContext3DPrivate::createGraphicsContextFromWebContext(adoptPtr(new ForbidSynchronousCallContext), GraphicsContext3D::RenderDirectlyToHostWindow), adoptPtr(new FakeTextureUploader()));
    275277
    276278    EXPECT_TRUE(layerRendererChromium.initialize());
  • trunk/Source/WebKit/chromium/tests/TiledLayerChromiumTest.cpp

    r114450 r116351  
    958958    ccLayerTreeHost->commitComplete();
    959959
    960     // Partail update of 6 checkerboard tiles.
     960    // Partial update of 6 checkerboard tiles.
    961961    layer->invalidateRect(IntRect(50, 50, 200, 100));
    962962    {
     
    976976    ccLayerTreeHost->commitComplete();
    977977
     978    // Partial update of 4 tiles.
     979    layer->invalidateRect(IntRect(50, 50, 100, 100));
     980    {
     981        DebugScopedSetImplThread implThread;
     982        OwnPtr<FakeCCTiledLayerImpl> layerImpl(adoptPtr(new FakeCCTiledLayerImpl(0)));
     983        ccLayerTreeHost->updateLayers(updater);
     984        updater.update(0, &allocator, &copier, &uploader, 4);
     985        EXPECT_EQ(4, layer->fakeLayerTextureUpdater()->updateCount());
     986        EXPECT_FALSE(updater.hasMoreUpdates());
     987        layer->fakeLayerTextureUpdater()->clearUpdateCount();
     988        layer->pushPropertiesTo(layerImpl.get());
     989    }
     990    ccLayerTreeHost->commitComplete();
     991
    978992    ccLayerTreeHost->setRootLayer(0);
    979993    ccLayerTreeHost.clear();
Note: See TracChangeset for help on using the changeset viewer.