[chromium] Use CCThread::Task in compositor's RateLimiter instead of Timer
authorjamesr@google.com <jamesr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 29 Jun 2012 23:45:38 +0000 (23:45 +0000)
committerjamesr@google.com <jamesr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 29 Jun 2012 23:45:38 +0000 (23:45 +0000)
https://bugs.webkit.org/show_bug.cgi?id=90300

Reviewed by Adrienne Walker.

* platform/graphics/chromium/RateLimiter.cpp:
(RateLimiter::Task):
(WebCore::RateLimiter::Task::create):
(WebCore::RateLimiter::Task::~Task):
(WebCore::RateLimiter::Task::Task):
(WebCore):
(WebCore::RateLimiter::RateLimiter):
(WebCore::RateLimiter::start):
(WebCore::RateLimiter::stop):
(WebCore::RateLimiter::rateLimitContext):
* platform/graphics/chromium/RateLimiter.h:
(WebCore):
(RateLimiter):
* platform/graphics/chromium/cc/CCLayerTreeHost.cpp:
(WebCore::CCLayerTreeHost::~CCLayerTreeHost):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@121601 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/chromium/RateLimiter.cpp
Source/WebCore/platform/graphics/chromium/RateLimiter.h
Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp

index 66183ec..f593223 100644 (file)
@@ -1,3 +1,26 @@
+2012-06-29  James Robinson  <jamesr@chromium.org>
+
+        [chromium] Use CCThread::Task in compositor's RateLimiter instead of Timer
+        https://bugs.webkit.org/show_bug.cgi?id=90300
+
+        Reviewed by Adrienne Walker.
+
+        * platform/graphics/chromium/RateLimiter.cpp:
+        (RateLimiter::Task):
+        (WebCore::RateLimiter::Task::create):
+        (WebCore::RateLimiter::Task::~Task):
+        (WebCore::RateLimiter::Task::Task):
+        (WebCore):
+        (WebCore::RateLimiter::RateLimiter):
+        (WebCore::RateLimiter::start):
+        (WebCore::RateLimiter::stop):
+        (WebCore::RateLimiter::rateLimitContext):
+        * platform/graphics/chromium/RateLimiter.h:
+        (WebCore):
+        (RateLimiter):
+        * platform/graphics/chromium/cc/CCLayerTreeHost.cpp:
+        (WebCore::CCLayerTreeHost::~CCLayerTreeHost):
+
 2012-06-29  Tony Payne  <tpayne@chromium.org>
 
         Remove type from screenColorProfile API
index 232f047..55a1902 100644 (file)
 
 #include "RateLimiter.h"
 #include "TraceEvent.h"
+#include "cc/CCProxy.h"
+#include "cc/CCThread.h"
 #include <public/WebGraphicsContext3D.h>
 
 namespace WebCore {
 
+class RateLimiter::Task : public CCThread::Task {
+public:
+    static PassOwnPtr<Task> create(RateLimiter* rateLimiter)
+    {
+        return adoptPtr(new Task(rateLimiter));
+    }
+    virtual ~Task() { }
+
+private:
+    explicit Task(RateLimiter* rateLimiter)
+        : CCThread::Task(this)
+        , m_rateLimiter(rateLimiter)
+    {
+    }
+
+    virtual void performTask() OVERRIDE
+    {
+        m_rateLimiter->rateLimitContext();
+    }
+
+    RefPtr<RateLimiter> m_rateLimiter;
+};
+
 PassRefPtr<RateLimiter> RateLimiter::create(WebKit::WebGraphicsContext3D* context, RateLimiterClient *client)
 {
     return adoptRef(new RateLimiter(context, client));
@@ -40,7 +65,7 @@ PassRefPtr<RateLimiter> RateLimiter::create(WebKit::WebGraphicsContext3D* contex
 
 RateLimiter::RateLimiter(WebKit::WebGraphicsContext3D* context, RateLimiterClient *client)
     : m_context(context)
-    , m_timer(this, &RateLimiter::rateLimitContext)
+    , m_active(false)
     , m_client(client)
 {
     ASSERT(context);
@@ -52,19 +77,28 @@ RateLimiter::~RateLimiter()
 
 void RateLimiter::start()
 {
-    if (!m_timer.isActive())
-        m_timer.startOneShot(0);
+    if (m_active)
+        return;
+
+    TRACE_EVENT0("cc", "RateLimiter::start");
+    m_active = true;
+    CCProxy::mainThread()->postTask(RateLimiter::Task::create(this));
 }
 
 void RateLimiter::stop()
 {
-    m_timer.stop();
+    TRACE_EVENT0("cc", "RateLimiter::stop");
+    m_client = 0;
 }
 
-void RateLimiter::rateLimitContext(Timer<RateLimiter>*)
+void RateLimiter::rateLimitContext()
 {
+    if (!m_client)
+        return;
+
     TRACE_EVENT0("cc", "RateLimiter::rateLimitContext");
 
+    m_active = false;
     m_client->rateLimit();
     m_context->rateLimitOffscreenContextCHROMIUM();
 }
index b786b90..0548fde 100644 (file)
@@ -28,9 +28,8 @@
 
 #if USE(ACCELERATED_COMPOSITING)
 
-#include "Timer.h"
+#include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
-#include <wtf/RefPtr.h>
 
 namespace WebKit {
 class WebGraphicsContext3D;
@@ -43,21 +42,29 @@ public:
     virtual void rateLimit() = 0;
 };
 
-// A class containing a timer, which calls rateLimitCHROMIUM on expiry
+// A RateLimiter can be used to make sure that a single context does not dominate all execution time.
+// To use, construct a RateLimiter class around the context and call start() whenever calls are made on the
+// context outside of normal flow control. RateLimiter will block if the context is too far ahead of the
+// compositor.
 class RateLimiter : public RefCounted<RateLimiter> {
 public:
     static PassRefPtr<RateLimiter> create(WebKit::WebGraphicsContext3D*, RateLimiterClient*);
     ~RateLimiter();
 
     void start();
+
+    // Context and client will not be accessed after stop().
     void stop();
 
 private:
     RateLimiter(WebKit::WebGraphicsContext3D*, RateLimiterClient*);
 
+    class Task;
+    friend class Task;
+    void rateLimitContext();
+
     WebKit::WebGraphicsContext3D* m_context;
-    Timer<RateLimiter> m_timer;
-    void rateLimitContext(Timer<RateLimiter>*);
+    bool m_active;
     RateLimiterClient *m_client;
 };
 
index f982b5b..a2f8bbc 100644 (file)
@@ -127,6 +127,9 @@ CCLayerTreeHost::~CCLayerTreeHost()
     m_proxy->stop();
     m_proxy.clear();
     numLayerTreeInstances--;
+    RateLimiterMap::iterator it = m_rateLimiters.begin();
+    if (it != m_rateLimiters.end())
+        it->second->stop();
 }
 
 void CCLayerTreeHost::setSurfaceReady()