Title: [121601] trunk/Source/WebCore
Revision
121601
Author
[email protected]
Date
2012-06-29 16:45:38 -0700 (Fri, 29 Jun 2012)

Log Message

[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):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (121600 => 121601)


--- trunk/Source/WebCore/ChangeLog	2012-06-29 23:40:35 UTC (rev 121600)
+++ trunk/Source/WebCore/ChangeLog	2012-06-29 23:45:38 UTC (rev 121601)
@@ -1,3 +1,26 @@
+2012-06-29  James Robinson  <[email protected]>
+
+        [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  <[email protected]>
 
         Remove type from screenColorProfile API

Modified: trunk/Source/WebCore/platform/graphics/chromium/RateLimiter.cpp (121600 => 121601)


--- trunk/Source/WebCore/platform/graphics/chromium/RateLimiter.cpp	2012-06-29 23:40:35 UTC (rev 121600)
+++ trunk/Source/WebCore/platform/graphics/chromium/RateLimiter.cpp	2012-06-29 23:45:38 UTC (rev 121601)
@@ -29,10 +29,35 @@
 
 #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 @@
 
 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 @@
 
 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();
 }

Modified: trunk/Source/WebCore/platform/graphics/chromium/RateLimiter.h (121600 => 121601)


--- trunk/Source/WebCore/platform/graphics/chromium/RateLimiter.h	2012-06-29 23:40:35 UTC (rev 121600)
+++ trunk/Source/WebCore/platform/graphics/chromium/RateLimiter.h	2012-06-29 23:45:38 UTC (rev 121601)
@@ -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 @@
     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;
 };
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp (121600 => 121601)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp	2012-06-29 23:40:35 UTC (rev 121600)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp	2012-06-29 23:45:38 UTC (rev 121601)
@@ -127,6 +127,9 @@
     m_proxy->stop();
     m_proxy.clear();
     numLayerTreeInstances--;
+    RateLimiterMap::iterator it = m_rateLimiters.begin();
+    if (it != m_rateLimiters.end())
+        it->second->stop();
 }
 
 void CCLayerTreeHost::setSurfaceReady()
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to