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
+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
#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));
RateLimiter::RateLimiter(WebKit::WebGraphicsContext3D* context, RateLimiterClient *client)
: m_context(context)
- , m_timer(this, &RateLimiter::rateLimitContext)
+ , m_active(false)
, m_client(client)
{
ASSERT(context);
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();
}
#if USE(ACCELERATED_COMPOSITING)
-#include "Timer.h"
+#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
-#include <wtf/RefPtr.h>
namespace WebKit {
class WebGraphicsContext3D;
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;
};
m_proxy->stop();
m_proxy.clear();
numLayerTreeInstances--;
+ RateLimiterMap::iterator it = m_rateLimiters.begin();
+ if (it != m_rateLimiters.end())
+ it->second->stop();
}
void CCLayerTreeHost::setSurfaceReady()