Skip to content

Commit

Permalink
Bug 1101974. Part 3 - Create VsyncSource / Display framework. r=kats
Browse files Browse the repository at this point in the history
  • Loading branch information
Mason Chang committed Dec 18, 2014
1 parent 8c6ce77 commit 5119b7e
Show file tree
Hide file tree
Showing 5 changed files with 144 additions and 3 deletions.
66 changes: 66 additions & 0 deletions gfx/thebes/VsyncSource.cpp
Original file line number Diff line number Diff line change
@@ -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 changes: 50 additions & 0 deletions gfx/thebes/VsyncSource.h
Original file line number Diff line number Diff line change
@@ -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
6 changes: 4 additions & 2 deletions gfx/thebes/gfxPlatform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ class mozilla::gl::SkiaGLGlue : public GenericAtomicRefCounted {

#include "nsIGfxInfo.h"
#include "nsIXULRuntime.h"
#include "VsyncSource.h"

namespace mozilla {
namespace layers {
Expand Down Expand Up @@ -548,8 +549,8 @@ gfxPlatform::Init()

RegisterStrongMemoryReporter(new GfxMemoryImageReporter());

if (gfxPrefs::HardwareVsyncEnabled() && gfxPrefs::VsyncAlignedCompositor()) {
gPlatform->InitHardwareVsync();
if (XRE_IsParentProcess() && gfxPrefs::HardwareVsyncEnabled()) {
gPlatform->mVsyncSource = gPlatform->CreateHardwareVsyncSource();
}
}

Expand Down Expand Up @@ -597,6 +598,7 @@ gfxPlatform::Shutdown()

gPlatform->mMemoryPressureObserver = nullptr;
gPlatform->mSkiaGlue = nullptr;
gPlatform->mVsyncSource = nullptr;
}

#ifdef MOZ_WIDGET_ANDROID
Expand Down
20 changes: 19 additions & 1 deletion gfx/thebes/gfxPlatform.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class SourceSurface;
class DataSourceSurface;
class ScaledFont;
class DrawEventRecorder;
class VsyncSource;

inline uint32_t
BackendTypeBit(BackendType b)
Expand Down Expand Up @@ -583,6 +584,17 @@ class gfxPlatform {
static bool UsesOffMainThreadCompositing();

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:
gfxPlatform();
virtual ~gfxPlatform();
Expand All @@ -593,7 +605,10 @@ class gfxPlatform {
/**
* 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.
Expand Down Expand Up @@ -659,6 +674,9 @@ class gfxPlatform {

uint32_t mTotalSystemMemory;

// Hardware vsync source. Only valid on parent process
nsRefPtr<mozilla::gfx::VsyncSource> mVsyncSource;

private:
/**
* Start up Thebes.
Expand Down
5 changes: 5 additions & 0 deletions gfx/thebes/moz.build
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ EXPORTS += [
'gfxVR.h',
'GraphicsFilter.h',
'RoundedRect.h',
'VsyncSource.h',
]

if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
Expand Down Expand Up @@ -246,6 +247,7 @@ UNIFIED_SOURCES += [
'gfxUtils.cpp',
'gfxVR.cpp',
'nsUnicodeRange.cpp',
'VsyncSource.cpp',
]

if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
Expand All @@ -269,6 +271,9 @@ LOCAL_INCLUDES += [
'/dom/xml',
]

if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
LOCAL_INCLUDES += ['/widget/gonk']

if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gtk2', 'gtk3', 'gonk', 'qt'):
DEFINES['MOZ_ENABLE_FREETYPE'] = True

Expand Down

0 comments on commit 5119b7e

Please sign in to comment.