Title: [126956] trunk/Source
Revision
126956
Author
[email protected]
Date
2012-08-28 21:25:17 -0700 (Tue, 28 Aug 2012)

Log Message

[Chromium] Scheduler will never process a commit until it receives a vsync tick.
https://bugs.webkit.org/show_bug.cgi?id=94721

Patch by David Reveman <[email protected]> on 2012-08-28
Reviewed by James Robinson.

Source/WebCore:

Add updateResourcesComplete callback to CCScheduler and use this to
indicate completion of texture updates instead of calling
CCSchedulerClient::hasMoreResourceUpdates when receiving a vsync tick.

Unit tests: CCTextureUpdateControllerTest.UpdateMoreTextures
            CCTextureUpdateControllerTest.HasMoreUpdates
            CCTextureUpdateControllerTest.UpdatesCompleteInFiniteTime

* platform/graphics/chromium/cc/CCScheduler.cpp:
(WebCore::CCScheduler::CCScheduler):
(WebCore::CCScheduler::beginFrameComplete):
(WebCore::CCScheduler::vsyncTick):
(WebCore::CCScheduler::updateResourcesComplete):
(WebCore):
(WebCore::CCScheduler::processScheduledActions):
* platform/graphics/chromium/cc/CCScheduler.h:
(CCSchedulerClient):
(CCScheduler):
* platform/graphics/chromium/cc/CCTextureUpdateController.cpp:
(WebCore::CCTextureUpdateController::CCTextureUpdateController):
(WebCore::CCTextureUpdateController::updateMoreTextures):
(WebCore::CCTextureUpdateController::discardUploads):
(WebCore::CCTextureUpdateController::onTimerFired):
(WebCore::CCTextureUpdateController::updateMoreTexturesIfEnoughTimeRemaining):
* platform/graphics/chromium/cc/CCTextureUpdateController.h:
(CCTextureUpdateControllerClient):
(WebCore::CCTextureUpdateControllerClient::~CCTextureUpdateControllerClient):
(WebCore):
(WebCore::CCTextureUpdateController::create):
(CCTextureUpdateController):
* platform/graphics/chromium/cc/CCThreadProxy.cpp:
(WebCore::CCThreadProxy::didLoseContextOnImplThread):
(WebCore::CCThreadProxy::beginFrameCompleteOnImplThread):
(WebCore::CCThreadProxy::scheduledActionCommit):
(WebCore::CCThreadProxy::updateTexturesCompleted):
(WebCore):
* platform/graphics/chromium/cc/CCThreadProxy.h:
(WebCore):

Source/WebKit/chromium:

* tests/CCSchedulerTest.cpp:
(WebKitTests::FakeCCSchedulerClient::reset):
(WebKitTests::TEST):
* tests/CCTextureUpdateControllerTest.cpp:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (126955 => 126956)


--- trunk/Source/WebCore/ChangeLog	2012-08-29 03:57:52 UTC (rev 126955)
+++ trunk/Source/WebCore/ChangeLog	2012-08-29 04:25:17 UTC (rev 126956)
@@ -1,3 +1,49 @@
+2012-08-28  David Reveman  <[email protected]>
+
+        [Chromium] Scheduler will never process a commit until it receives a vsync tick.
+        https://bugs.webkit.org/show_bug.cgi?id=94721
+
+        Reviewed by James Robinson.
+
+        Add updateResourcesComplete callback to CCScheduler and use this to
+        indicate completion of texture updates instead of calling
+        CCSchedulerClient::hasMoreResourceUpdates when receiving a vsync tick.
+
+        Unit tests: CCTextureUpdateControllerTest.UpdateMoreTextures
+                    CCTextureUpdateControllerTest.HasMoreUpdates
+                    CCTextureUpdateControllerTest.UpdatesCompleteInFiniteTime
+
+        * platform/graphics/chromium/cc/CCScheduler.cpp:
+        (WebCore::CCScheduler::CCScheduler):
+        (WebCore::CCScheduler::beginFrameComplete):
+        (WebCore::CCScheduler::vsyncTick):
+        (WebCore::CCScheduler::updateResourcesComplete):
+        (WebCore):
+        (WebCore::CCScheduler::processScheduledActions):
+        * platform/graphics/chromium/cc/CCScheduler.h:
+        (CCSchedulerClient):
+        (CCScheduler):
+        * platform/graphics/chromium/cc/CCTextureUpdateController.cpp:
+        (WebCore::CCTextureUpdateController::CCTextureUpdateController):
+        (WebCore::CCTextureUpdateController::updateMoreTextures):
+        (WebCore::CCTextureUpdateController::discardUploads):
+        (WebCore::CCTextureUpdateController::onTimerFired):
+        (WebCore::CCTextureUpdateController::updateMoreTexturesIfEnoughTimeRemaining):
+        * platform/graphics/chromium/cc/CCTextureUpdateController.h:
+        (CCTextureUpdateControllerClient):
+        (WebCore::CCTextureUpdateControllerClient::~CCTextureUpdateControllerClient):
+        (WebCore):
+        (WebCore::CCTextureUpdateController::create):
+        (CCTextureUpdateController):
+        * platform/graphics/chromium/cc/CCThreadProxy.cpp:
+        (WebCore::CCThreadProxy::didLoseContextOnImplThread):
+        (WebCore::CCThreadProxy::beginFrameCompleteOnImplThread):
+        (WebCore::CCThreadProxy::scheduledActionCommit):
+        (WebCore::CCThreadProxy::updateTexturesCompleted):
+        (WebCore):
+        * platform/graphics/chromium/cc/CCThreadProxy.h:
+        (WebCore):
+
 2012-08-28  John Bates  <[email protected]>
 
         [Chromium] Update some compositor trace events

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCScheduler.cpp (126955 => 126956)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCScheduler.cpp	2012-08-29 03:57:52 UTC (rev 126955)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCScheduler.cpp	2012-08-29 04:25:17 UTC (rev 126956)
@@ -33,6 +33,7 @@
 CCScheduler::CCScheduler(CCSchedulerClient* client, PassOwnPtr<CCFrameRateController> frameRateController)
     : m_client(client)
     , m_frameRateController(frameRateController)
+    , m_hasMoreResourceUpdates(false)
     , m_updateMoreResourcesPending(false)
 {
     ASSERT(m_client);
@@ -87,9 +88,10 @@
     processScheduledActions();
 }
 
-void CCScheduler::beginFrameComplete()
+void CCScheduler::beginFrameComplete(bool hasResourceUpdates)
 {
     TRACE_EVENT0("cc", "CCScheduler::beginFrameComplete");
+    m_hasMoreResourceUpdates = hasResourceUpdates;
     m_stateMachine.beginFrameComplete();
     processScheduledActions();
 }
@@ -136,7 +138,8 @@
 {
     if (m_updateMoreResourcesPending) {
         m_updateMoreResourcesPending = false;
-        m_stateMachine.beginUpdateMoreResourcesComplete(m_client->hasMoreResourceUpdates());
+        ASSERT(m_hasMoreResourceUpdates);
+        m_stateMachine.beginUpdateMoreResourcesComplete(true);
     }
     TRACE_EVENT0("cc", "CCScheduler::vsyncTick");
 
@@ -145,6 +148,17 @@
     m_stateMachine.didLeaveVSync();
 }
 
+void CCScheduler::updateResourcesComplete()
+{
+    TRACE_EVENT0("cc", "CCScheduler::updateResourcesComplete");
+    if (m_updateMoreResourcesPending) {
+        m_updateMoreResourcesPending = false;
+        m_stateMachine.beginUpdateMoreResourcesComplete(false);
+    }
+    m_hasMoreResourceUpdates = false;
+    processScheduledActions();
+}
+
 CCSchedulerStateMachine::Action CCScheduler::nextAction()
 {
     m_stateMachine.setCanDraw(m_client->canDraw());
@@ -174,7 +188,7 @@
             m_client->scheduledActionBeginFrame();
             break;
         case CCSchedulerStateMachine::ACTION_BEGIN_UPDATE_MORE_RESOURCES:
-            if (m_client->hasMoreResourceUpdates()) {
+            if (m_hasMoreResourceUpdates) {
                 m_client->scheduledActionUpdateMoreResources(m_frameRateController->nextTickTimeIfActivated());
                 m_updateMoreResourcesPending = true;
             } else

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCScheduler.h (126955 => 126956)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCScheduler.h	2012-08-29 03:57:52 UTC (rev 126955)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCScheduler.h	2012-08-29 04:25:17 UTC (rev 126956)
@@ -53,7 +53,6 @@
 class CCSchedulerClient {
 public:
     virtual bool canDraw() = 0;
-    virtual bool hasMoreResourceUpdates() const = 0;
 
     virtual void scheduledActionBeginFrame() = 0;
     virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() = 0;
@@ -93,7 +92,7 @@
     // Like setNeedsRedraw(), but ensures the draw will definitely happen even if we are not visible.
     void setNeedsForcedRedraw();
 
-    void beginFrameComplete();
+    void beginFrameComplete(bool hasResourceUpdates);
     void beginFrameAborted();
 
     void setMaxFramesPending(int);
@@ -110,6 +109,8 @@
     // CCFrameRateControllerClient implementation
     virtual void vsyncTick() OVERRIDE;
 
+    void updateResourcesComplete();
+
 private:
     CCScheduler(CCSchedulerClient*, PassOwnPtr<CCFrameRateController>);
 
@@ -119,6 +120,7 @@
     CCSchedulerClient* m_client;
     OwnPtr<CCFrameRateController> m_frameRateController;
     CCSchedulerStateMachine m_stateMachine;
+    bool m_hasMoreResourceUpdates;
     bool m_updateMoreResourcesPending;
 };
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdateController.cpp (126955 => 126956)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdateController.cpp	2012-08-29 03:57:52 UTC (rev 126955)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdateController.cpp	2012-08-29 04:25:17 UTC (rev 126956)
@@ -113,8 +113,9 @@
         copier->flush();
 }
 
-CCTextureUpdateController::CCTextureUpdateController(CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
-    : m_timer(adoptPtr(new CCTimer(thread, this)))
+CCTextureUpdateController::CCTextureUpdateController(CCTextureUpdateControllerClient* client, CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
+    : m_client(client)
+    , m_timer(adoptPtr(new CCTimer(thread, this)))
     , m_queue(queue)
     , m_resourceProvider(resourceProvider)
     , m_copier(copier)
@@ -128,34 +129,40 @@
 {
 }
 
-bool CCTextureUpdateController::hasMoreUpdates() const
-{
-    return m_queue->hasMoreUpdates();
-}
-
 void CCTextureUpdateController::updateMoreTextures(double monotonicTimeLimit)
 {
+    ASSERT(monotonicTimeLimit >= m_monotonicTimeLimit);
     m_monotonicTimeLimit = monotonicTimeLimit;
 
-    if (!m_queue->hasMoreUpdates())
+    // Update already in progress.
+    if (m_timer->isActive())
         return;
 
     // Call updateMoreTexturesNow() directly unless it's the first update
     // attempt. This ensures that we empty the update queue in a finite
     // amount of time.
     if (m_firstUpdateAttempt) {
-        updateMoreTexturesIfEnoughTimeRemaining();
+        // Post a 0-delay task when no updates were left. When it runs,
+        // updateTexturesCompleted() will be called.
+        if (!updateMoreTexturesIfEnoughTimeRemaining())
+            m_timer->startOneShot(0);
+
         m_firstUpdateAttempt = false;
     } else
         updateMoreTexturesNow();
 }
 
+void CCTextureUpdateController::discardUploads()
+{
+    // CCTextureUpdateControllerClient::updateTexturesCompleted will be
+    // called when all remaining texture copies are done.
+    m_queue->clearUploads();
+}
+
 void CCTextureUpdateController::onTimerFired()
 {
-    if (!m_queue->hasMoreUpdates())
-        return;
-
-    updateMoreTexturesIfEnoughTimeRemaining();
+    if (!updateMoreTexturesIfEnoughTimeRemaining())
+        m_client->updateTexturesCompleted();
 }
 
 double CCTextureUpdateController::monotonicTimeNow() const
@@ -173,11 +180,16 @@
     return textureUpdatesPerTick;
 }
 
-void CCTextureUpdateController::updateMoreTexturesIfEnoughTimeRemaining()
+bool CCTextureUpdateController::updateMoreTexturesIfEnoughTimeRemaining()
 {
+    if (!m_queue->hasMoreUpdates())
+        return false;
+
     bool hasTimeRemaining = monotonicTimeNow() < m_monotonicTimeLimit - updateMoreTexturesTime();
     if (hasTimeRemaining)
         updateMoreTexturesNow();
+
+    return true;
 }
 
 void CCTextureUpdateController::updateMoreTexturesNow()

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdateController.h (126955 => 126956)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdateController.h	2012-08-29 03:57:52 UTC (rev 126955)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdateController.h	2012-08-29 04:25:17 UTC (rev 126956)
@@ -36,21 +36,31 @@
 class TextureCopier;
 class TextureUploader;
 
+class CCTextureUpdateControllerClient {
+public:
+    virtual void updateTexturesCompleted() = 0;
+
+protected:
+    virtual ~CCTextureUpdateControllerClient() { }
+};
+
 class CCTextureUpdateController : public CCTimerClient {
     WTF_MAKE_NONCOPYABLE(CCTextureUpdateController);
 public:
-    static PassOwnPtr<CCTextureUpdateController> create(CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
+    static PassOwnPtr<CCTextureUpdateController> create(CCTextureUpdateControllerClient* client, CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
     {
-        return adoptPtr(new CCTextureUpdateController(thread, queue, resourceProvider, copier, uploader));
+        return adoptPtr(new CCTextureUpdateController(client, thread, queue, resourceProvider, copier, uploader));
     }
     static size_t maxPartialTextureUpdates();
     static void updateTextures(CCResourceProvider*, TextureCopier*, TextureUploader*, CCTextureUpdateQueue*, size_t count);
 
     virtual ~CCTextureUpdateController();
 
-    bool hasMoreUpdates() const;
     void updateMoreTextures(double monotonicTimeLimit);
 
+    // Discard all remaining uploads.
+    void discardUploads();
+
     // CCTimerClient implementation.
     virtual void onTimerFired() OVERRIDE;
 
@@ -60,11 +70,13 @@
     virtual size_t updateMoreTexturesSize() const;
 
 protected:
-    CCTextureUpdateController(CCThread*, PassOwnPtr<CCTextureUpdateQueue>, CCResourceProvider*, TextureCopier*, TextureUploader*);
+    CCTextureUpdateController(CCTextureUpdateControllerClient*, CCThread*, PassOwnPtr<CCTextureUpdateQueue>, CCResourceProvider*, TextureCopier*, TextureUploader*);
 
-    void updateMoreTexturesIfEnoughTimeRemaining();
+    // This returns true when there were textures left to update.
+    bool updateMoreTexturesIfEnoughTimeRemaining();
     void updateMoreTexturesNow();
 
+    CCTextureUpdateControllerClient* m_client;
     OwnPtr<CCTimer> m_timer;
     OwnPtr<CCTextureUpdateQueue> m_queue;
     bool m_contentsTexturesPurged;

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp (126955 => 126956)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp	2012-08-29 03:57:52 UTC (rev 126955)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp	2012-08-29 04:25:17 UTC (rev 126956)
@@ -34,7 +34,6 @@
 #include "CCLayerTreeHost.h"
 #include "CCScheduler.h"
 #include "CCScopedThreadProxy.h"
-#include "CCTextureUpdateController.h"
 #include "CCThreadTask.h"
 #include "TraceEvent.h"
 #include <public/WebSharedGraphicsContext3D.h>
@@ -314,7 +313,8 @@
 {
     ASSERT(isImplThread());
     TRACE_EVENT0("cc", "CCThreadProxy::didLoseContextOnImplThread");
-    m_currentTextureUpdateControllerOnImplThread.clear();
+    if (m_currentTextureUpdateControllerOnImplThread)
+        m_currentTextureUpdateControllerOnImplThread->discardUploads();
     m_schedulerOnImplThread->didLoseContext();
 }
 
@@ -578,10 +578,12 @@
     } else
         m_resetContentsTexturesPurgedAfterCommitOnImplThread = true;
 
-    m_currentTextureUpdateControllerOnImplThread = CCTextureUpdateController::create(CCProxy::implThread(), queue, m_layerTreeHostImpl->resourceProvider(), m_layerTreeHostImpl->renderer()->textureCopier(), m_layerTreeHostImpl->renderer()->textureUploader());
+    bool hasResourceUpdates = queue->hasMoreUpdates();
+    if (hasResourceUpdates)
+        m_currentTextureUpdateControllerOnImplThread = CCTextureUpdateController::create(this, CCProxy::implThread(), queue, m_layerTreeHostImpl->resourceProvider(), m_layerTreeHostImpl->renderer()->textureCopier(), m_layerTreeHostImpl->renderer()->textureUploader());
     m_commitCompletionEventOnImplThread = completion;
 
-    m_schedulerOnImplThread->beginFrameComplete();
+    m_schedulerOnImplThread->beginFrameComplete(hasResourceUpdates);
 }
 
 void CCThreadProxy::beginFrameAbortedOnImplThread()
@@ -594,13 +596,6 @@
     m_schedulerOnImplThread->beginFrameAborted();
 }
 
-bool CCThreadProxy::hasMoreResourceUpdates() const
-{
-    if (!m_currentTextureUpdateControllerOnImplThread)
-        return false;
-    return m_currentTextureUpdateControllerOnImplThread->hasMoreUpdates();
-}
-
 bool CCThreadProxy::canDraw()
 {
     ASSERT(isImplThread());
@@ -620,7 +615,6 @@
 {
     TRACE_EVENT0("cc", "CCThreadProxy::scheduledActionCommit");
     ASSERT(isImplThread());
-    ASSERT(!hasMoreResourceUpdates());
     ASSERT(m_commitCompletionEventOnImplThread);
 
     m_currentTextureUpdateControllerOnImplThread.clear();
@@ -758,6 +752,12 @@
     return scheduledActionDrawAndSwapInternal(true);
 }
 
+void CCThreadProxy::updateTexturesCompleted()
+{
+    ASSERT(isImplThread());
+    m_schedulerOnImplThread->updateResourcesComplete();
+}
+
 void CCThreadProxy::didCommitAndDrawFrame()
 {
     ASSERT(isMainThread());

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.h (126955 => 126956)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.h	2012-08-29 03:57:52 UTC (rev 126955)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.h	2012-08-29 04:25:17 UTC (rev 126956)
@@ -30,6 +30,7 @@
 #include "CCLayerTreeHostImpl.h"
 #include "CCProxy.h"
 #include "CCScheduler.h"
+#include "CCTextureUpdateController.h"
 #include <wtf/OwnPtr.h>
 
 namespace WebCore {
@@ -39,11 +40,10 @@
 class CCScheduler;
 class CCScopedThreadProxy;
 class CCTextureUpdateQueue;
-class CCTextureUpdateController;
 class CCThread;
 class CCThreadProxyContextRecreationTimer;
 
-class CCThreadProxy : public CCProxy, CCLayerTreeHostImplClient, CCSchedulerClient {
+class CCThreadProxy : public CCProxy, CCLayerTreeHostImplClient, CCSchedulerClient, CCTextureUpdateControllerClient {
 public:
     static PassOwnPtr<CCProxy> create(CCLayerTreeHost*);
 
@@ -84,7 +84,6 @@
 
     // CCSchedulerClient implementation
     virtual bool canDraw() OVERRIDE;
-    virtual bool hasMoreResourceUpdates() const OVERRIDE;
     virtual void scheduledActionBeginFrame() OVERRIDE;
     virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() OVERRIDE;
     virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced() OVERRIDE;
@@ -93,6 +92,9 @@
     virtual void scheduledActionBeginContextRecreation() OVERRIDE;
     virtual void scheduledActionAcquireLayerTexturesForMainThread() OVERRIDE;
 
+    // CCTextureUpdateControllerClient implementation
+    virtual void updateTexturesCompleted() OVERRIDE;
+
 private:
     explicit CCThreadProxy(CCLayerTreeHost*);
     friend class CCThreadProxyContextRecreationTimer;

Modified: trunk/Source/WebKit/chromium/ChangeLog (126955 => 126956)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-08-29 03:57:52 UTC (rev 126955)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-08-29 04:25:17 UTC (rev 126956)
@@ -1,3 +1,15 @@
+2012-08-28  David Reveman  <[email protected]>
+
+        [Chromium] Scheduler will never process a commit until it receives a vsync tick.
+        https://bugs.webkit.org/show_bug.cgi?id=94721
+
+        Reviewed by James Robinson.
+
+        * tests/CCSchedulerTest.cpp:
+        (WebKitTests::FakeCCSchedulerClient::reset):
+        (WebKitTests::TEST):
+        * tests/CCTextureUpdateControllerTest.cpp:
+
 2012-08-28  Adam Barth  <[email protected]>
 
         Fix ASSERT in fast/events/touch/gesture/context-menu-on-two-finger-tap.html

Modified: trunk/Source/WebKit/chromium/tests/CCSchedulerTest.cpp (126955 => 126956)


--- trunk/Source/WebKit/chromium/tests/CCSchedulerTest.cpp	2012-08-29 03:57:52 UTC (rev 126955)
+++ trunk/Source/WebKit/chromium/tests/CCSchedulerTest.cpp	2012-08-29 04:25:17 UTC (rev 126956)
@@ -43,14 +43,12 @@
     void reset()
     {
         m_actions.clear();
-        m_hasMoreResourceUpdates = false;
         m_canDraw = true;
         m_drawWillHappen = true;
         m_swapWillHappenIfDrawHappens = true;
         m_numDraws = 0;
     }
 
-    void setHasMoreResourceUpdates(bool b) { m_hasMoreResourceUpdates = b; }
     void setCanDraw(bool b) { m_canDraw = b; }
 
     int numDraws() const { return m_numDraws; }
@@ -66,7 +64,6 @@
     }
 
     virtual bool canDraw() OVERRIDE { return m_canDraw; }
-    virtual bool hasMoreResourceUpdates() const OVERRIDE { return m_hasMoreResourceUpdates; }
     virtual void scheduledActionBeginFrame() OVERRIDE { m_actions.push_back("scheduledActionBeginFrame"); }
     virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() OVERRIDE
     {
@@ -113,9 +110,9 @@
     EXPECT_FALSE(timeSource->active());
     client.reset();
 
-    // Since, hasMoreResourceUpdates is set to false,
+    // Since, hasResourceUpdates is false,
     // beginFrameComplete should commit
-    scheduler->beginFrameComplete();
+    scheduler->beginFrameComplete(false);
     EXPECT_EQ(1, client.numActions());
     EXPECT_STREQ("scheduledActionCommit", client.action(0));
     EXPECT_TRUE(timeSource->active());
@@ -149,9 +146,9 @@
     // Now setNeedsCommit again. Calling here means we need a second frame.
     scheduler->setNeedsCommit();
 
-    // Since, hasMoreResourceUpdates is set to false, and another commit is
+    // Since, hasResourceUpdates is false, and another commit is
     // needed, beginFrameComplete should commit, then begin another frame.
-    scheduler->beginFrameComplete();
+    scheduler->beginFrameComplete(false);
     EXPECT_EQ(1, client.numActions());
     EXPECT_STREQ("scheduledActionCommit", client.action(0));
     client.reset();
@@ -184,7 +181,7 @@
     EXPECT_FALSE(timeSource->active());
 
     // Trigger the commit
-    scheduler->beginFrameComplete();
+    scheduler->beginFrameComplete(false);
     EXPECT_TRUE(timeSource->active());
     client.reset();
 
@@ -212,7 +209,7 @@
     scheduler->setVisible(true);
 
     scheduler->setNeedsCommit();
-    scheduler->beginFrameComplete();
+    scheduler->beginFrameComplete(false);
     scheduler->setMainThreadNeedsLayerTextures();
     client.reset();
     // Verify that pending texture acquisition fires when visibility
@@ -381,7 +378,7 @@
     EXPECT_FALSE(timeSource->active());
     EXPECT_EQ(1, client.numDraws());
     EXPECT_TRUE(scheduler->commitPending());
-    scheduler->beginFrameComplete();
+    scheduler->beginFrameComplete(false);
 
     timeSource->tick();
     EXPECT_EQ(2, client.numDraws());

Modified: trunk/Source/WebKit/chromium/tests/CCTextureUpdateControllerTest.cpp (126955 => 126956)


--- trunk/Source/WebKit/chromium/tests/CCTextureUpdateControllerTest.cpp	2012-08-29 03:57:52 UTC (rev 126955)
+++ trunk/Source/WebKit/chromium/tests/CCTextureUpdateControllerTest.cpp	2012-08-29 04:25:17 UTC (rev 126956)
@@ -541,11 +541,23 @@
     EXPECT_EQ(kFullUploads + kPartialUploads, m_numTotalUploads);
 }
 
+class FakeCCTextureUpdateControllerClient : public WebCore::CCTextureUpdateControllerClient {
+public:
+    FakeCCTextureUpdateControllerClient() { reset(); }
+    void reset() { m_completedCalled = false; }
+    bool completedCalled() const { return m_completedCalled; }
+
+    virtual void updateTexturesCompleted() OVERRIDE { m_completedCalled = true; }
+
+protected:
+    bool m_completedCalled;
+};
+
 class FakeCCTextureUpdateController : public WebCore::CCTextureUpdateController {
 public:
-    static PassOwnPtr<FakeCCTextureUpdateController> create(WebCore::CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
+    static PassOwnPtr<FakeCCTextureUpdateController> create(WebCore::CCTextureUpdateControllerClient* client, WebCore::CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
     {
-        return adoptPtr(new FakeCCTextureUpdateController(thread, queue, resourceProvider, copier, uploader));
+        return adoptPtr(new FakeCCTextureUpdateController(client, thread, queue, resourceProvider, copier, uploader));
     }
 
     void setMonotonicTimeNow(double time) { m_monotonicTimeNow = time; }
@@ -556,8 +568,8 @@
     virtual size_t updateMoreTexturesSize() const OVERRIDE { return m_updateMoreTexturesSize; }
 
 protected:
-    FakeCCTextureUpdateController(WebCore::CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
-        : WebCore::CCTextureUpdateController(thread, queue, resourceProvider, copier, uploader)
+    FakeCCTextureUpdateController(WebCore::CCTextureUpdateControllerClient* client, WebCore::CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
+        : WebCore::CCTextureUpdateController(client, thread, queue, resourceProvider, copier, uploader)
         , m_monotonicTimeNow(0)
         , m_updateMoreTexturesTime(0)
         , m_updateMoreTexturesSize(0) { }
@@ -567,8 +579,17 @@
     size_t m_updateMoreTexturesSize;
 };
 
+static void runPendingTasks(FakeCCThread* thread, FakeCCTextureUpdateController* controller)
+{
+    while (thread->hasPendingTask()) {
+        controller->setMonotonicTimeNow(controller->monotonicTimeNow() + thread->pendingDelayMs() / 1000.0);
+        thread->runPendingTask();
+    }
+}
+
 TEST_F(CCTextureUpdateControllerTest, UpdateMoreTextures)
 {
+    FakeCCTextureUpdateControllerClient client;
     FakeCCThread thread;
 
     setMaxUploadCountPerUpdate(1);
@@ -576,39 +597,34 @@
     appendPartialUploadsToUpdateQueue(0);
 
     DebugScopedSetImplThread implThread;
-    OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateController::create(&thread, m_queue.release(), m_resourceProvider.get(), &m_copier, &m_uploader));
+    OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateController::create(&client, &thread, m_queue.release(), m_resourceProvider.get(), &m_copier, &m_uploader));
 
     controller->setMonotonicTimeNow(0);
     controller->setUpdateMoreTexturesTime(0.1);
     controller->setUpdateMoreTexturesSize(1);
     // Not enough time for any updates.
     controller->updateMoreTextures(0.09);
-    EXPECT_FALSE(thread.hasPendingTask());
+    runPendingTasks(&thread, controller.get());
     EXPECT_EQ(0, m_numBeginUploads);
     EXPECT_EQ(0, m_numEndUploads);
 
-    thread.reset();
     controller->setMonotonicTimeNow(0);
     controller->setUpdateMoreTexturesTime(0.1);
     controller->setUpdateMoreTexturesSize(1);
     // Only enough time for 1 update.
     controller->updateMoreTextures(0.12);
-    EXPECT_TRUE(thread.hasPendingTask());
-    controller->setMonotonicTimeNow(thread.pendingDelayMs() / 1000.0);
-    thread.runPendingTask();
+    runPendingTasks(&thread, controller.get());
     EXPECT_EQ(1, m_numBeginUploads);
     EXPECT_EQ(1, m_numEndUploads);
     EXPECT_EQ(1, m_numTotalUploads);
 
-    thread.reset();
     controller->setMonotonicTimeNow(0);
     controller->setUpdateMoreTexturesTime(0.1);
     controller->setUpdateMoreTexturesSize(1);
     // Enough time for 2 updates.
     controller->updateMoreTextures(0.22);
-    EXPECT_TRUE(thread.hasPendingTask());
-    controller->setMonotonicTimeNow(controller->monotonicTimeNow() + thread.pendingDelayMs() / 1000.0);
-    thread.runPendingTask();
+    runPendingTasks(&thread, controller.get());
+    EXPECT_TRUE(client.completedCalled());
     EXPECT_EQ(3, m_numBeginUploads);
     EXPECT_EQ(3, m_numEndUploads);
     EXPECT_EQ(3, m_numTotalUploads);
@@ -616,6 +632,7 @@
 
 TEST_F(CCTextureUpdateControllerTest, NoMoreUpdates)
 {
+    FakeCCTextureUpdateControllerClient client;
     FakeCCThread thread;
 
     setMaxUploadCountPerUpdate(1);
@@ -623,30 +640,26 @@
     appendPartialUploadsToUpdateQueue(0);
 
     DebugScopedSetImplThread implThread;
-    OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateController::create(&thread, m_queue.release(), m_resourceProvider.get(), &m_copier, &m_uploader));
+    OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateController::create(&client, &thread, m_queue.release(), m_resourceProvider.get(), &m_copier, &m_uploader));
 
     controller->setMonotonicTimeNow(0);
     controller->setUpdateMoreTexturesTime(0.1);
     controller->setUpdateMoreTexturesSize(1);
     // Enough time for 3 updates but only 2 necessary.
     controller->updateMoreTextures(0.31);
-    EXPECT_TRUE(thread.hasPendingTask());
-    controller->setMonotonicTimeNow(controller->monotonicTimeNow() + thread.pendingDelayMs() / 1000.0);
-    thread.runPendingTask();
-    EXPECT_TRUE(thread.hasPendingTask());
-    controller->setMonotonicTimeNow(controller->monotonicTimeNow() + thread.pendingDelayMs() / 1000.0);
-    thread.runPendingTask();
+    runPendingTasks(&thread, controller.get());
+    EXPECT_TRUE(client.completedCalled());
     EXPECT_EQ(2, m_numBeginUploads);
     EXPECT_EQ(2, m_numEndUploads);
     EXPECT_EQ(2, m_numTotalUploads);
 
-    thread.reset();
     controller->setMonotonicTimeNow(0);
     controller->setUpdateMoreTexturesTime(0.1);
     controller->setUpdateMoreTexturesSize(1);
     // Enough time for updates but no more updates left.
     controller->updateMoreTextures(0.31);
-    EXPECT_FALSE(thread.hasPendingTask());
+    runPendingTasks(&thread, controller.get());
+    EXPECT_TRUE(client.completedCalled());
     EXPECT_EQ(2, m_numBeginUploads);
     EXPECT_EQ(2, m_numEndUploads);
     EXPECT_EQ(2, m_numTotalUploads);
@@ -654,6 +667,7 @@
 
 TEST_F(CCTextureUpdateControllerTest, UpdatesCompleteInFiniteTime)
 {
+    FakeCCTextureUpdateControllerClient client;
     FakeCCThread thread;
 
     setMaxUploadCountPerUpdate(1);
@@ -661,25 +675,22 @@
     appendPartialUploadsToUpdateQueue(0);
 
     DebugScopedSetImplThread implThread;
-    OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateController::create(&thread, m_queue.release(), m_resourceProvider.get(), &m_copier, &m_uploader));
+    OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateController::create(&client, &thread, m_queue.release(), m_resourceProvider.get(), &m_copier, &m_uploader));
 
     controller->setMonotonicTimeNow(0);
     controller->setUpdateMoreTexturesTime(0.5);
     controller->setUpdateMoreTexturesSize(1);
 
     for (int i = 0; i < 100; i++) {
-        if (!controller->hasMoreUpdates())
+        if (client.completedCalled())
             break;
 
         // Not enough time for any updates.
         controller->updateMoreTextures(0.4);
-
-        if (thread.hasPendingTask()) {
-            controller->setMonotonicTimeNow(controller->monotonicTimeNow() + thread.pendingDelayMs() / 1000.0);
-            thread.runPendingTask();
-        }
+        runPendingTasks(&thread, controller.get());
     }
 
+    EXPECT_TRUE(client.completedCalled());
     EXPECT_EQ(2, m_numBeginUploads);
     EXPECT_EQ(2, m_numEndUploads);
     EXPECT_EQ(2, m_numTotalUploads);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to