ThreadedDisplayRefreshMonitor.cpp [plain text]
#include "config.h"
#include "ThreadedDisplayRefreshMonitor.h"
#if USE(COORDINATED_GRAPHICS_THREADED) && USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
#include "CompositingRunLoop.h"
#include "ThreadedCompositor.h"
#include <wtf/glib/RunLoopSourcePriority.h>
namespace WebKit {
ThreadedDisplayRefreshMonitor::ThreadedDisplayRefreshMonitor(ThreadedCompositor& compositor)
: WebCore::DisplayRefreshMonitor(0)
, m_displayRefreshTimer(RunLoop::main(), this, &ThreadedDisplayRefreshMonitor::displayRefreshCallback)
, m_compositor(&compositor)
{
#if USE(GLIB_EVENT_LOOP)
m_displayRefreshTimer.setPriority(RunLoopSourcePriority::DisplayRefreshMonitorTimer);
m_displayRefreshTimer.setName("[WebKit] ThreadedDisplayRefreshMonitor");
#endif
}
bool ThreadedDisplayRefreshMonitor::requestRefreshCallback()
{
if (!m_compositor)
return false;
LockHolder locker(mutex());
setIsScheduled(true);
if (isPreviousFrameDone())
m_compositor->coordinateUpdateCompletionWithClient();
return true;
}
bool ThreadedDisplayRefreshMonitor::requiresDisplayRefreshCallback()
{
LockHolder locker(mutex());
return isScheduled() && isPreviousFrameDone();
}
void ThreadedDisplayRefreshMonitor::dispatchDisplayRefreshCallback()
{
if (!m_compositor)
return;
m_displayRefreshTimer.startOneShot(0);
}
void ThreadedDisplayRefreshMonitor::invalidate()
{
m_displayRefreshTimer.stop();
m_compositor = nullptr;
}
void ThreadedDisplayRefreshMonitor::displayRefreshCallback()
{
bool shouldHandleDisplayRefreshNotification = false;
{
LockHolder locker(mutex());
shouldHandleDisplayRefreshNotification = isScheduled() && isPreviousFrameDone();
if (shouldHandleDisplayRefreshNotification)
setIsPreviousFrameDone(false);
}
if (shouldHandleDisplayRefreshNotification)
DisplayRefreshMonitor::handleDisplayRefreshedNotificationOnMainThread(this);
if (m_compositor) {
m_compositor->renderNextFrameIfNeeded();
m_compositor->completeCoordinatedUpdateIfNeeded();
if (isScheduled())
m_compositor->coordinateUpdateCompletionWithClient();
}
}
}
#endif // USE(COORDINATED_GRAPHICS_THREADED) && USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)