зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1101974. Part 3 - Create VsyncSource / Display framework. r=kats
This commit is contained in:
Родитель
8c6ce778ad
Коммит
5119b7e4eb
|
@ -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);
|
||||||
|
}
|
|
@ -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
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче