Bug 1101974. Part 3 - Create VsyncSource / Display framework. r=kats

This commit is contained in:
Mason Chang 2014-12-18 08:30:06 -08:00
Родитель 8c6ce778ad
Коммит 5119b7e4eb
5 изменённых файлов: 144 добавлений и 3 удалений

Просмотреть файл

@ -0,0 +1,66 @@
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "VsyncSource.h"
#include "gfxPlatform.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/VsyncDispatcher.h"
using namespace mozilla;
using namespace mozilla::gfx;
void
VsyncSource::AddVsyncDispatcher(VsyncDispatcher* aVsyncDispatcher)
{
MOZ_ASSERT(NS_IsMainThread());
GetGlobalDisplay().AddVsyncDispatcher(aVsyncDispatcher);
}
void
VsyncSource::RemoveVsyncDispatcher(VsyncDispatcher* aVsyncDispatcher)
{
MOZ_ASSERT(NS_IsMainThread());
GetGlobalDisplay().RemoveVsyncDispatcher(aVsyncDispatcher);
}
VsyncSource::Display&
VsyncSource::FindDisplay(VsyncDispatcher* aVsyncDispatcher)
{
return GetGlobalDisplay();
}
void
VsyncSource::Display::NotifyVsync(TimeStamp aVsyncTimestamp)
{
// Called on the hardware vsync thread
for (size_t i = 0; i < mVsyncDispatchers.Length(); i++) {
mVsyncDispatchers[i]->NotifyVsync(aVsyncTimestamp);
}
}
VsyncSource::Display::Display()
{
MOZ_ASSERT(NS_IsMainThread());
}
VsyncSource::Display::~Display()
{
MOZ_ASSERT(NS_IsMainThread());
mVsyncDispatchers.Clear();
}
void
VsyncSource::Display::AddVsyncDispatcher(VsyncDispatcher* aVsyncDispatcher)
{
MOZ_ASSERT(NS_IsMainThread());
mVsyncDispatchers.AppendElement(aVsyncDispatcher);
}
void
VsyncSource::Display::RemoveVsyncDispatcher(VsyncDispatcher* aVsyncDispatcher)
{
MOZ_ASSERT(NS_IsMainThread());
mVsyncDispatchers.RemoveElement(aVsyncDispatcher);
}

50
gfx/thebes/VsyncSource.h Normal file
Просмотреть файл

@ -0,0 +1,50 @@
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/RefPtr.h"
#include "mozilla/TimeStamp.h"
#include "nsISupportsImpl.h"
#include "nsTArray.h"
namespace mozilla {
class VsyncDispatcher;
namespace gfx {
// Controls how and when to enable/disable vsync. Lives as long as the
// gfxPlatform does on the parent process
class VsyncSource
{
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VsyncSource)
public:
// Controls vsync unique to each display and unique on each platform
class Display {
public:
Display();
virtual ~Display();
void AddVsyncDispatcher(mozilla::VsyncDispatcher* aVsyncDispatcher);
void RemoveVsyncDispatcher(mozilla::VsyncDispatcher* aVsyncDispatcher);
// Notified when this display's vsync occurs, on the hardware vsync thread
void NotifyVsync(mozilla::TimeStamp aVsyncTimestamp);
// These should all only be called on the main thread
virtual void EnableVsync() = 0;
virtual void DisableVsync() = 0;
virtual bool IsVsyncEnabled() = 0;
private:
nsTArray<nsRefPtr<mozilla::VsyncDispatcher>> mVsyncDispatchers;
}; // end Display
void AddVsyncDispatcher(mozilla::VsyncDispatcher* aVsyncDispatcher);
void RemoveVsyncDispatcher(mozilla::VsyncDispatcher* aVsyncDispatcher);
protected:
virtual Display& GetGlobalDisplay() = 0; // Works across all displays
virtual Display& FindDisplay(mozilla::VsyncDispatcher* aVsyncDispatcher);
virtual ~VsyncSource() {}
}; // VsyncSource
} // gfx
} // mozilla

Просмотреть файл

@ -104,6 +104,7 @@ class mozilla::gl::SkiaGLGlue : public GenericAtomicRefCounted {
#include "nsIGfxInfo.h" #include "nsIGfxInfo.h"
#include "nsIXULRuntime.h" #include "nsIXULRuntime.h"
#include "VsyncSource.h"
namespace mozilla { namespace mozilla {
namespace layers { namespace layers {
@ -548,8 +549,8 @@ gfxPlatform::Init()
RegisterStrongMemoryReporter(new GfxMemoryImageReporter()); RegisterStrongMemoryReporter(new GfxMemoryImageReporter());
if (gfxPrefs::HardwareVsyncEnabled() && gfxPrefs::VsyncAlignedCompositor()) { if (XRE_IsParentProcess() && gfxPrefs::HardwareVsyncEnabled()) {
gPlatform->InitHardwareVsync(); gPlatform->mVsyncSource = gPlatform->CreateHardwareVsyncSource();
} }
} }
@ -597,6 +598,7 @@ gfxPlatform::Shutdown()
gPlatform->mMemoryPressureObserver = nullptr; gPlatform->mMemoryPressureObserver = nullptr;
gPlatform->mSkiaGlue = nullptr; gPlatform->mSkiaGlue = nullptr;
gPlatform->mVsyncSource = nullptr;
} }
#ifdef MOZ_WIDGET_ANDROID #ifdef MOZ_WIDGET_ANDROID

Просмотреть файл

@ -50,6 +50,7 @@ class SourceSurface;
class DataSourceSurface; class DataSourceSurface;
class ScaledFont; class ScaledFont;
class DrawEventRecorder; class DrawEventRecorder;
class VsyncSource;
inline uint32_t inline uint32_t
BackendTypeBit(BackendType b) BackendTypeBit(BackendType b)
@ -583,6 +584,17 @@ public:
static bool UsesOffMainThreadCompositing(); static bool UsesOffMainThreadCompositing();
bool HasEnoughTotalSystemMemoryForSkiaGL(); bool HasEnoughTotalSystemMemoryForSkiaGL();
/**
* Get the hardware vsync source for each platform.
* Should only exist and be valid on the parent process
*/
virtual mozilla::gfx::VsyncSource* GetHardwareVsync() {
MOZ_ASSERT(mVsyncSource != nullptr);
MOZ_ASSERT(XRE_IsParentProcess());
return mVsyncSource;
}
protected: protected:
gfxPlatform(); gfxPlatform();
virtual ~gfxPlatform(); virtual ~gfxPlatform();
@ -593,7 +605,10 @@ protected:
/** /**
* Initialized hardware vsync based on each platform. * Initialized hardware vsync based on each platform.
*/ */
virtual void InitHardwareVsync() {} virtual already_AddRefed<mozilla::gfx::VsyncSource> CreateHardwareVsyncSource() {
NS_WARNING("Hardware vsync not supported on platform yet");
return nullptr;
}
/** /**
* Helper method, creates a draw target for a specific Azure backend. * Helper method, creates a draw target for a specific Azure backend.
@ -659,6 +674,9 @@ protected:
uint32_t mTotalSystemMemory; uint32_t mTotalSystemMemory;
// Hardware vsync source. Only valid on parent process
nsRefPtr<mozilla::gfx::VsyncSource> mVsyncSource;
private: private:
/** /**
* Start up Thebes. * Start up Thebes.

Просмотреть файл

@ -52,6 +52,7 @@ EXPORTS += [
'gfxVR.h', 'gfxVR.h',
'GraphicsFilter.h', 'GraphicsFilter.h',
'RoundedRect.h', 'RoundedRect.h',
'VsyncSource.h',
] ]
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android': if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
@ -246,6 +247,7 @@ UNIFIED_SOURCES += [
'gfxUtils.cpp', 'gfxUtils.cpp',
'gfxVR.cpp', 'gfxVR.cpp',
'nsUnicodeRange.cpp', 'nsUnicodeRange.cpp',
'VsyncSource.cpp',
] ]
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
@ -269,6 +271,9 @@ LOCAL_INCLUDES += [
'/dom/xml', '/dom/xml',
] ]
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
LOCAL_INCLUDES += ['/widget/gonk']
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gtk2', 'gtk3', 'gonk', 'qt'): if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gtk2', 'gtk3', 'gonk', 'qt'):
DEFINES['MOZ_ENABLE_FREETYPE'] = True DEFINES['MOZ_ENABLE_FREETYPE'] = True