Title: [125800] trunk/Source
Revision
125800
Author
[email protected]
Date
2012-08-16 12:42:21 -0700 (Thu, 16 Aug 2012)

Log Message

[Chromium] Schedule texture uploads based on hard-coded timer and vsync.
https://bugs.webkit.org/show_bug.cgi?id=84281

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

Source/WebCore:

Improve interaction between vsync and texture uploads by performing
uploads in smaller batches and use a hard-coded timer to emulate
upload completion. This greatly reduces the chance of the compositor
missing a vsync due to being busy with texture uploads.

The CCScheduler client is now given a time limit when told to update
more resources. This time limit is passed to an instance of the
CCTextureUpdateController class, which is responsible for performing
texture updates until the limit is reached.

Unit tests: CCSchedulerTest.RequestCommit
            CCTextureUpdateControllerTest.UpdateMoreTextures
            CCTextureUpdateControllerTest.HasMoreUpdates

* platform/graphics/chromium/cc/CCFrameRateController.cpp:
(WebCore::CCFrameRateController::nextTickTime):
(WebCore):
* platform/graphics/chromium/cc/CCFrameRateController.h:
(CCFrameRateController):
* platform/graphics/chromium/cc/CCScheduler.cpp:
(WebCore::CCScheduler::processScheduledActions):
* platform/graphics/chromium/cc/CCScheduler.h:
(CCSchedulerClient):
* platform/graphics/chromium/cc/CCTextureUpdateController.cpp:
(WebCore::CCTextureUpdateController::maxPartialTextureUpdates):
(WebCore::CCTextureUpdateController::CCTextureUpdateController):
(WebCore::CCTextureUpdateController::updateMoreTextures):
(WebCore):
(WebCore::CCTextureUpdateController::onTimerFired):
(WebCore::CCTextureUpdateController::monotonicTimeNow):
(WebCore::CCTextureUpdateController::updateMoreTexturesTime):
(WebCore::CCTextureUpdateController::updateMoreTexturesSize):
(WebCore::CCTextureUpdateController::updateMoreTexturesIfEnoughTimeRemaining):
(WebCore::CCTextureUpdateController::updateMoreTexturesNow):
* platform/graphics/chromium/cc/CCTextureUpdateController.h:
(WebCore::CCTextureUpdateController::create):
(CCTextureUpdateController):
* platform/graphics/chromium/cc/CCThreadProxy.cpp:
(WebCore::CCThreadProxy::beginFrameCompleteOnImplThread):
(WebCore::CCThreadProxy::scheduledActionUpdateMoreResources):
* platform/graphics/chromium/cc/CCThreadProxy.h:

Source/WebKit/chromium:

* tests/CCSchedulerTest.cpp:
(WebKitTests::TEST):
* tests/CCSchedulerTestCommon.h:
(WebKitTests::FakeCCTimeSource::FakeCCTimeSource):
(WebKitTests::FakeCCTimeSource::setNextTickTime):
(FakeCCTimeSource):
* tests/CCTextureUpdateControllerTest.cpp:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (125799 => 125800)


--- trunk/Source/WebCore/ChangeLog	2012-08-16 19:35:25 UTC (rev 125799)
+++ trunk/Source/WebCore/ChangeLog	2012-08-16 19:42:21 UTC (rev 125800)
@@ -1,3 +1,52 @@
+2012-08-16  David Reveman  <[email protected]>
+
+        [Chromium] Schedule texture uploads based on hard-coded timer and vsync.
+        https://bugs.webkit.org/show_bug.cgi?id=84281
+
+        Reviewed by James Robinson.
+
+        Improve interaction between vsync and texture uploads by performing
+        uploads in smaller batches and use a hard-coded timer to emulate
+        upload completion. This greatly reduces the chance of the compositor
+        missing a vsync due to being busy with texture uploads.
+
+        The CCScheduler client is now given a time limit when told to update
+        more resources. This time limit is passed to an instance of the
+        CCTextureUpdateController class, which is responsible for performing
+        texture updates until the limit is reached.
+
+        Unit tests: CCSchedulerTest.RequestCommit
+                    CCTextureUpdateControllerTest.UpdateMoreTextures
+                    CCTextureUpdateControllerTest.HasMoreUpdates
+
+        * platform/graphics/chromium/cc/CCFrameRateController.cpp:
+        (WebCore::CCFrameRateController::nextTickTime):
+        (WebCore):
+        * platform/graphics/chromium/cc/CCFrameRateController.h:
+        (CCFrameRateController):
+        * platform/graphics/chromium/cc/CCScheduler.cpp:
+        (WebCore::CCScheduler::processScheduledActions):
+        * platform/graphics/chromium/cc/CCScheduler.h:
+        (CCSchedulerClient):
+        * platform/graphics/chromium/cc/CCTextureUpdateController.cpp:
+        (WebCore::CCTextureUpdateController::maxPartialTextureUpdates):
+        (WebCore::CCTextureUpdateController::CCTextureUpdateController):
+        (WebCore::CCTextureUpdateController::updateMoreTextures):
+        (WebCore):
+        (WebCore::CCTextureUpdateController::onTimerFired):
+        (WebCore::CCTextureUpdateController::monotonicTimeNow):
+        (WebCore::CCTextureUpdateController::updateMoreTexturesTime):
+        (WebCore::CCTextureUpdateController::updateMoreTexturesSize):
+        (WebCore::CCTextureUpdateController::updateMoreTexturesIfEnoughTimeRemaining):
+        (WebCore::CCTextureUpdateController::updateMoreTexturesNow):
+        * platform/graphics/chromium/cc/CCTextureUpdateController.h:
+        (WebCore::CCTextureUpdateController::create):
+        (CCTextureUpdateController):
+        * platform/graphics/chromium/cc/CCThreadProxy.cpp:
+        (WebCore::CCThreadProxy::beginFrameCompleteOnImplThread):
+        (WebCore::CCThreadProxy::scheduledActionUpdateMoreResources):
+        * platform/graphics/chromium/cc/CCThreadProxy.h:
+
 2012-08-16  Dana Jansens  <[email protected]>
 
         [chromium] Impl scrolling crashes when the renderer's initialization failed

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCFrameRateController.cpp (125799 => 125800)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCFrameRateController.cpp	2012-08-16 19:35:25 UTC (rev 125799)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCFrameRateController.cpp	2012-08-16 19:42:21 UTC (rev 125800)
@@ -29,6 +29,7 @@
 #include "TraceEvent.h"
 #include "cc/CCDelayBasedTimeSource.h"
 #include "cc/CCTimeSource.h"
+#include <wtf/CurrentTime.h>
 
 namespace WebCore {
 
@@ -147,4 +148,12 @@
     m_numFramesPending = 0;
 }
 
+double CCFrameRateController::nextTickTime()
+{
+    if (m_isTimeSourceThrottling)
+        return m_timeSource->nextTickTime();
+
+    return monotonicallyIncreasingTime();
 }
+
+}

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCFrameRateController.h (125799 => 125800)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCFrameRateController.h	2012-08-16 19:35:25 UTC (rev 125799)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCFrameRateController.h	2012-08-16 19:42:21 UTC (rev 125800)
@@ -27,7 +27,6 @@
 
 #include "cc/CCTimer.h"
 
-#include <wtf/CurrentTime.h>
 #include <wtf/Deque.h>
 #include <wtf/OwnPtr.h>
 #include <wtf/PassOwnPtr.h>
@@ -68,6 +67,7 @@
     void didFinishFrame();
     void didAbortAllPendingFrames();
     void setMaxFramesPending(int); // 0 for unlimited.
+    double nextTickTime();
 
     void setTimebaseAndInterval(double timebase, double intervalSeconds);
 

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


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCScheduler.cpp	2012-08-16 19:35:25 UTC (rev 125799)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCScheduler.cpp	2012-08-16 19:42:21 UTC (rev 125800)
@@ -173,16 +173,11 @@
             m_client->scheduledActionBeginFrame();
             break;
         case CCSchedulerStateMachine::ACTION_BEGIN_UPDATE_MORE_RESOURCES:
-            m_client->scheduledActionUpdateMoreResources();
-            if (!m_client->hasMoreResourceUpdates()) {
-                // If we were just told to update resources, but there are no
-                // more pending, then tell the state machine that the
-                // beginUpdateMoreResources completed. If more are pending,
-                // then we will ack the update at the next draw.
-                m_updateMoreResourcesPending = false;
-                m_stateMachine.beginUpdateMoreResourcesComplete(false);
-            } else
+            if (m_client->hasMoreResourceUpdates()) {
+                m_client->scheduledActionUpdateMoreResources(m_frameRateController->nextTickTime());
                 m_updateMoreResourcesPending = true;
+            } else
+                m_stateMachine.beginUpdateMoreResourcesComplete(false);
             break;
         case CCSchedulerStateMachine::ACTION_COMMIT:
             m_client->scheduledActionCommit();

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


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCScheduler.h	2012-08-16 19:35:25 UTC (rev 125799)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCScheduler.h	2012-08-16 19:42:21 UTC (rev 125800)
@@ -58,7 +58,7 @@
     virtual void scheduledActionBeginFrame() = 0;
     virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() = 0;
     virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced() = 0;
-    virtual void scheduledActionUpdateMoreResources() = 0;
+    virtual void scheduledActionUpdateMoreResources(double monotonicTimeLimit) = 0;
     virtual void scheduledActionCommit() = 0;
     virtual void scheduledActionBeginContextRecreation() = 0;
     virtual void scheduledActionAcquireLayerTexturesForMainThread() = 0;

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


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdateController.cpp	2012-08-16 19:35:25 UTC (rev 125799)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdateController.cpp	2012-08-16 19:42:21 UTC (rev 125800)
@@ -34,9 +34,12 @@
 
 namespace {
 
-// Number of textures to update with each call to updateMoreTextures().
-static const size_t textureUpdatesPerFrame = 48;
+// Number of textures to update with each call to updateMoreTexturesIfEnoughTimeRemaining().
+static const size_t textureUpdatesPerTick = 12;
 
+// Measured in seconds.
+static const double textureUpdateTickRate = 0.004;
+
 // Flush interval when performing texture uploads.
 static const int textureUploadFlushPeriod = 4;
 
@@ -46,7 +49,7 @@
 
 size_t CCTextureUpdateController::maxPartialTextureUpdates()
 {
-    return textureUpdatesPerFrame;
+    return textureUpdatesPerTick;
 }
 
 void CCTextureUpdateController::updateTextures(CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader, CCTextureUpdateQueue* queue, size_t count)
@@ -110,11 +113,14 @@
         copier->flush();
 }
 
-CCTextureUpdateController::CCTextureUpdateController(PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
-    : m_queue(queue)
+CCTextureUpdateController::CCTextureUpdateController(CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
+    : m_timer(adoptPtr(new CCTimer(thread, this)))
+    , m_queue(queue)
     , m_resourceProvider(resourceProvider)
     , m_copier(copier)
     , m_uploader(uploader)
+    , m_monotonicTimeLimit(0)
+    , m_firstUpdateAttempt(true)
 {
 }
 
@@ -127,17 +133,57 @@
     return m_queue->hasMoreUpdates();
 }
 
-void CCTextureUpdateController::updateMoreTextures()
+void CCTextureUpdateController::updateMoreTextures(double monotonicTimeLimit)
 {
+    m_monotonicTimeLimit = monotonicTimeLimit;
+
     if (!m_queue->hasMoreUpdates())
         return;
 
-    updateTextures(m_resourceProvider, m_copier, m_uploader, m_queue.get(), updateMoreTexturesSize());
+    // 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();
+        m_firstUpdateAttempt = false;
+    } else
+        updateMoreTexturesNow();
 }
 
+void CCTextureUpdateController::onTimerFired()
+{
+    if (!m_queue->hasMoreUpdates())
+        return;
+
+    updateMoreTexturesIfEnoughTimeRemaining();
+}
+
+double CCTextureUpdateController::monotonicTimeNow() const
+{
+    return monotonicallyIncreasingTime();
+}
+
+double CCTextureUpdateController::updateMoreTexturesTime() const
+{
+    return textureUpdateTickRate;
+}
+
 size_t CCTextureUpdateController::updateMoreTexturesSize() const
 {
-    return textureUpdatesPerFrame;
+    return textureUpdatesPerTick;
 }
 
+void CCTextureUpdateController::updateMoreTexturesIfEnoughTimeRemaining()
+{
+    bool hasTimeRemaining = monotonicTimeNow() < m_monotonicTimeLimit - updateMoreTexturesTime();
+    if (hasTimeRemaining)
+        updateMoreTexturesNow();
 }
+
+void CCTextureUpdateController::updateMoreTexturesNow()
+{
+    m_timer->startOneShot(updateMoreTexturesTime());
+    updateTextures(m_resourceProvider, m_copier, m_uploader, m_queue.get(), updateMoreTexturesSize());
+}
+
+}

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


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdateController.h	2012-08-16 19:35:25 UTC (rev 125799)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdateController.h	2012-08-16 19:42:21 UTC (rev 125800)
@@ -27,6 +27,7 @@
 #define CCTextureUpdateController_h
 
 #include "cc/CCTextureUpdateQueue.h"
+#include "cc/CCTimer.h"
 #include <wtf/Noncopyable.h>
 #include <wtf/OwnPtr.h>
 
@@ -35,12 +36,12 @@
 class TextureCopier;
 class TextureUploader;
 
-class CCTextureUpdateController {
+class CCTextureUpdateController : public CCTimerClient {
     WTF_MAKE_NONCOPYABLE(CCTextureUpdateController);
 public:
-    static PassOwnPtr<CCTextureUpdateController> create(PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
+    static PassOwnPtr<CCTextureUpdateController> create(CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
     {
-        return adoptPtr(new CCTextureUpdateController(queue, resourceProvider, copier, uploader));
+        return adoptPtr(new CCTextureUpdateController(thread, queue, resourceProvider, copier, uploader));
     }
     static size_t maxPartialTextureUpdates();
     static void updateTextures(CCResourceProvider*, TextureCopier*, TextureUploader*, CCTextureUpdateQueue*, size_t count);
@@ -48,19 +49,30 @@
     virtual ~CCTextureUpdateController();
 
     bool hasMoreUpdates() const;
-    void updateMoreTextures();
+    void updateMoreTextures(double monotonicTimeLimit);
 
+    // CCTimerClient implementation.
+    virtual void onTimerFired() OVERRIDE;
+
     // Virtual for testing.
+    virtual double monotonicTimeNow() const;
+    virtual double updateMoreTexturesTime() const;
     virtual size_t updateMoreTexturesSize() const;
 
 protected:
-    CCTextureUpdateController(PassOwnPtr<CCTextureUpdateQueue>, CCResourceProvider*, TextureCopier*, TextureUploader*);
+    CCTextureUpdateController(CCThread*, PassOwnPtr<CCTextureUpdateQueue>, CCResourceProvider*, TextureCopier*, TextureUploader*);
 
+    void updateMoreTexturesIfEnoughTimeRemaining();
+    void updateMoreTexturesNow();
+
+    OwnPtr<CCTimer> m_timer;
     OwnPtr<CCTextureUpdateQueue> m_queue;
     bool m_contentsTexturesPurged;
     CCResourceProvider* m_resourceProvider;
     TextureCopier* m_copier;
     TextureUploader* m_uploader;
+    double m_monotonicTimeLimit;
+    bool m_firstUpdateAttempt;
 };
 
 }

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


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp	2012-08-16 19:35:25 UTC (rev 125799)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp	2012-08-16 19:42:21 UTC (rev 125800)
@@ -577,7 +577,7 @@
     } else
         m_resetContentsTexturesPurgedAfterCommitOnImplThread = true;
 
-    m_currentTextureUpdateControllerOnImplThread = CCTextureUpdateController::create(queue, m_layerTreeHostImpl->resourceProvider(), m_layerTreeHostImpl->layerRenderer()->textureCopier(), m_layerTreeHostImpl->layerRenderer()->textureUploader());
+    m_currentTextureUpdateControllerOnImplThread = CCTextureUpdateController::create(CCProxy::implThread(), queue, m_layerTreeHostImpl->resourceProvider(), m_layerTreeHostImpl->layerRenderer()->textureCopier(), m_layerTreeHostImpl->layerRenderer()->textureUploader());
     m_commitCompletionEventOnImplThread = completion;
 
     m_schedulerOnImplThread->beginFrameComplete();
@@ -608,11 +608,11 @@
     return m_layerTreeHostImpl->canDraw();
 }
 
-void CCThreadProxy::scheduledActionUpdateMoreResources()
+void CCThreadProxy::scheduledActionUpdateMoreResources(double monotonicTimeLimit)
 {
     TRACE_EVENT0("cc", "CCThreadProxy::scheduledActionUpdateMoreResources");
     ASSERT(m_currentTextureUpdateControllerOnImplThread);
-    m_currentTextureUpdateControllerOnImplThread->updateMoreTextures();
+    m_currentTextureUpdateControllerOnImplThread->updateMoreTextures(monotonicTimeLimit);
 }
 
 void CCThreadProxy::scheduledActionCommit()

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


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.h	2012-08-16 19:35:25 UTC (rev 125799)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.h	2012-08-16 19:42:21 UTC (rev 125800)
@@ -88,7 +88,7 @@
     virtual void scheduledActionBeginFrame() OVERRIDE;
     virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() OVERRIDE;
     virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced() OVERRIDE;
-    virtual void scheduledActionUpdateMoreResources() OVERRIDE;
+    virtual void scheduledActionUpdateMoreResources(double monotonicTimeLimit) OVERRIDE;
     virtual void scheduledActionCommit() OVERRIDE;
     virtual void scheduledActionBeginContextRecreation() OVERRIDE;
     virtual void scheduledActionAcquireLayerTexturesForMainThread() OVERRIDE;

Modified: trunk/Source/WebKit/chromium/ChangeLog (125799 => 125800)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-08-16 19:35:25 UTC (rev 125799)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-08-16 19:42:21 UTC (rev 125800)
@@ -1,3 +1,18 @@
+2012-08-16  David Reveman  <[email protected]>
+
+        [Chromium] Schedule texture uploads based on hard-coded timer and vsync.
+        https://bugs.webkit.org/show_bug.cgi?id=84281
+
+        Reviewed by James Robinson.
+
+        * tests/CCSchedulerTest.cpp:
+        (WebKitTests::TEST):
+        * tests/CCSchedulerTestCommon.h:
+        (WebKitTests::FakeCCTimeSource::FakeCCTimeSource):
+        (WebKitTests::FakeCCTimeSource::setNextTickTime):
+        (FakeCCTimeSource):
+        * tests/CCTextureUpdateControllerTest.cpp:
+
 2012-08-16  Dana Jansens  <[email protected]>
 
         [chromium] Impl scrolling crashes when the renderer's initialization failed

Modified: trunk/Source/WebKit/chromium/tests/CCSchedulerTest.cpp (125799 => 125800)


--- trunk/Source/WebKit/chromium/tests/CCSchedulerTest.cpp	2012-08-16 19:35:25 UTC (rev 125799)
+++ trunk/Source/WebKit/chromium/tests/CCSchedulerTest.cpp	2012-08-16 19:42:21 UTC (rev 125800)
@@ -81,7 +81,7 @@
         return CCScheduledActionDrawAndSwapResult(true, m_swapWillHappenIfDrawHappens);
     }
 
-    virtual void scheduledActionUpdateMoreResources() OVERRIDE { m_actions.push_back("scheduledActionUpdateMoreResources"); }
+    virtual void scheduledActionUpdateMoreResources(double) OVERRIDE { m_actions.push_back("scheduledActionUpdateMoreResources"); }
     virtual void scheduledActionCommit() OVERRIDE { m_actions.push_back("scheduledActionCommit"); }
     virtual void scheduledActionBeginContextRecreation() OVERRIDE { m_actions.push_back("scheduledActionBeginContextRecreation"); }
     virtual void scheduledActionAcquireLayerTexturesForMainThread() OVERRIDE { m_actions.push_back("scheduledActionAcquireLayerTexturesForMainThread"); }
@@ -114,12 +114,10 @@
     client.reset();
 
     // Since, hasMoreResourceUpdates is set to false,
-    // beginFrameComplete should updateMoreResources, then
-    // commit
+    // beginFrameComplete should commit
     scheduler->beginFrameComplete();
-    EXPECT_EQ(2, client.numActions());
-    EXPECT_STREQ("scheduledActionUpdateMoreResources", client.action(0));
-    EXPECT_STREQ("scheduledActionCommit", client.action(1));
+    EXPECT_EQ(1, client.numActions());
+    EXPECT_STREQ("scheduledActionCommit", client.action(0));
     EXPECT_TRUE(timeSource->active());
     client.reset();
 
@@ -152,12 +150,10 @@
     scheduler->setNeedsCommit();
 
     // Since, hasMoreResourceUpdates is set to false, and another commit is
-    // needed, beginFrameComplete should updateMoreResources, then commit, then
-    // begin another frame.
+    // needed, beginFrameComplete should commit, then begin another frame.
     scheduler->beginFrameComplete();
-    EXPECT_EQ(2, client.numActions());
-    EXPECT_STREQ("scheduledActionUpdateMoreResources", client.action(0));
-    EXPECT_STREQ("scheduledActionCommit", client.action(1));
+    EXPECT_EQ(1, client.numActions());
+    EXPECT_STREQ("scheduledActionCommit", client.action(0));
     client.reset();
 
     // Tick should draw but then begin another frame.
@@ -257,7 +253,7 @@
         return CCScheduledActionDrawAndSwapResult(true, true);
     }
 
-    virtual void scheduledActionUpdateMoreResources() OVERRIDE { }
+    virtual void scheduledActionUpdateMoreResources(double) OVERRIDE { }
     virtual void scheduledActionCommit() OVERRIDE { }
     virtual void scheduledActionBeginContextRecreation() OVERRIDE { }
 
@@ -357,7 +353,7 @@
         return CCScheduledActionDrawAndSwapResult(true, true);
     }
 
-    virtual void scheduledActionUpdateMoreResources() OVERRIDE { }
+    virtual void scheduledActionUpdateMoreResources(double) OVERRIDE { }
     virtual void scheduledActionCommit() OVERRIDE { }
     virtual void scheduledActionBeginContextRecreation() OVERRIDE { }
 

Modified: trunk/Source/WebKit/chromium/tests/CCSchedulerTestCommon.h (125799 => 125800)


--- trunk/Source/WebKit/chromium/tests/CCSchedulerTestCommon.h	2012-08-16 19:35:25 UTC (rev 125799)
+++ trunk/Source/WebKit/chromium/tests/CCSchedulerTestCommon.h	2012-08-16 19:42:21 UTC (rev 125800)
@@ -96,6 +96,7 @@
 public:
     FakeCCTimeSource()
         : m_active(false)
+        , m_nextTickTime(0)
         , m_client(0) { }
 
     virtual ~FakeCCTimeSource() { }
@@ -114,8 +115,11 @@
             m_client->onTimerTick();
     }
 
+    void setNextTickTime(double nextTickTime) { m_nextTickTime = nextTickTime; }
+
 protected:
     bool m_active;
+    double m_nextTickTime;
     WebCore::CCTimeSourceClient* m_client;
 };
 

Modified: trunk/Source/WebKit/chromium/tests/CCTextureUpdateControllerTest.cpp (125799 => 125800)


--- trunk/Source/WebKit/chromium/tests/CCTextureUpdateControllerTest.cpp	2012-08-16 19:35:25 UTC (rev 125799)
+++ trunk/Source/WebKit/chromium/tests/CCTextureUpdateControllerTest.cpp	2012-08-16 19:42:21 UTC (rev 125800)
@@ -542,4 +542,148 @@
     EXPECT_EQ(kFullUploads + kPartialUploads, m_numTotalUploads);
 }
 
+class FakeCCTextureUpdateController : public WebCore::CCTextureUpdateController {
+public:
+    static PassOwnPtr<FakeCCTextureUpdateController> create(WebCore::CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
+    {
+        return adoptPtr(new FakeCCTextureUpdateController(thread, queue, resourceProvider, copier, uploader));
+    }
+
+    void setMonotonicTimeNow(double time) { m_monotonicTimeNow = time; }
+    virtual double monotonicTimeNow() const OVERRIDE { return m_monotonicTimeNow; }
+    void setUpdateMoreTexturesTime(double time) { m_updateMoreTexturesTime = time; }
+    virtual double updateMoreTexturesTime() const OVERRIDE { return m_updateMoreTexturesTime; }
+    void setUpdateMoreTexturesSize(size_t size) { m_updateMoreTexturesSize = size; }
+    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)
+        , m_monotonicTimeNow(0)
+        , m_updateMoreTexturesTime(0)
+        , m_updateMoreTexturesSize(0) { }
+
+    double m_monotonicTimeNow;
+    double m_updateMoreTexturesTime;
+    size_t m_updateMoreTexturesSize;
+};
+
+TEST_F(CCTextureUpdateControllerTest, UpdateMoreTextures)
+{
+    FakeCCThread thread;
+
+    setMaxUploadCountPerUpdate(1);
+    appendFullUploadsToUpdateQueue(3);
+    appendPartialUploadsToUpdateQueue(0);
+
+    DebugScopedSetImplThread implThread;
+    OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateController::create(&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());
+    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();
+    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();
+    EXPECT_EQ(3, m_numBeginUploads);
+    EXPECT_EQ(3, m_numEndUploads);
+    EXPECT_EQ(3, m_numTotalUploads);
+}
+
+TEST_F(CCTextureUpdateControllerTest, NoMoreUpdates)
+{
+    FakeCCThread thread;
+
+    setMaxUploadCountPerUpdate(1);
+    appendFullUploadsToUpdateQueue(2);
+    appendPartialUploadsToUpdateQueue(0);
+
+    DebugScopedSetImplThread implThread;
+    OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateController::create(&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();
+    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());
+    EXPECT_EQ(2, m_numBeginUploads);
+    EXPECT_EQ(2, m_numEndUploads);
+    EXPECT_EQ(2, m_numTotalUploads);
+}
+
+TEST_F(CCTextureUpdateControllerTest, UpdatesCompleteInFiniteTime)
+{
+    FakeCCThread thread;
+
+    setMaxUploadCountPerUpdate(1);
+    appendFullUploadsToUpdateQueue(2);
+    appendPartialUploadsToUpdateQueue(0);
+
+    DebugScopedSetImplThread implThread;
+    OwnPtr<FakeCCTextureUpdateController> controller(FakeCCTextureUpdateController::create(&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())
+            break;
+
+        // Not enough time for any updates.
+        controller->updateMoreTextures(0.4);
+
+        if (thread.hasPendingTask()) {
+            controller->setMonotonicTimeNow(controller->monotonicTimeNow() + thread.pendingDelayMs() / 1000.0);
+            thread.runPendingTask();
+        }
+    }
+
+    EXPECT_EQ(2, m_numBeginUploads);
+    EXPECT_EQ(2, m_numEndUploads);
+    EXPECT_EQ(2, m_numTotalUploads);
+}
+
 } // namespace
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to