Bug 1330037 - Propagate the CompositorOptions to all CompositorWidget instances. r=dvander

MozReview-Commit-ID: DFeeo2WNmhZ

--HG--
extra : rebase_source : d40bea7f726df007e3f079bb9576e1cbe17e3460
This commit is contained in:
Kartikaya Gupta 2017-01-12 17:29:42 -05:00
parent 619cad37b5
commit ac6cc8ce06
20 changed files with 74 additions and 28 deletions

View File

@ -34,7 +34,7 @@ InProcessCompositorSession::Create(nsIWidget* aWidget,
CompositorWidgetInitData initData;
aWidget->GetCompositorWidgetInitData(&initData);
RefPtr<CompositorWidget> widget = CompositorWidget::CreateLocal(initData, aWidget);
RefPtr<CompositorWidget> widget = CompositorWidget::CreateLocal(initData, aOptions, aWidget);
RefPtr<CompositorBridgeChild> child = new CompositorBridgeChild(aLayerManager);
RefPtr<CompositorBridgeParent> parent =
child->InitSameProcess(widget, aRootLayerTreeId, aScale, aOptions, aUseExternalSurfaceSize, aSurfaceSize);

View File

@ -1656,7 +1656,7 @@ CompositorBridgeParent::AllocPCompositorWidgetParent(const CompositorWidgetInitD
}
widget::CompositorWidgetParent* widget =
new widget::CompositorWidgetParent(aInitData);
new widget::CompositorWidgetParent(aInitData, mOptions);
widget->AddRef();
// Sending the constructor acts as initialization as well.

View File

@ -153,7 +153,8 @@ static std::vector<LayerManagerData> GetLayerManagers(std::vector<LayersBackend>
auto backend = aBackends[i];
RefPtr<MockWidget> widget = new MockWidget();
RefPtr<widget::CompositorWidget> proxy = new widget::InProcessCompositorWidget(widget);
CompositorOptions options;
RefPtr<widget::CompositorWidget> proxy = new widget::InProcessCompositorWidget(options, widget);
RefPtr<Compositor> compositor = CreateTestCompositor(backend, proxy);
RefPtr<LayerManagerComposite> layerManager = new LayerManagerComposite(compositor);

View File

@ -10,6 +10,11 @@
namespace mozilla {
namespace widget {
CompositorWidget::CompositorWidget(const layers::CompositorOptions& aOptions)
: mOptions(aOptions)
{
}
CompositorWidget::~CompositorWidget()
{
}

View File

@ -9,6 +9,7 @@
#include "mozilla/RefPtr.h"
#include "Units.h"
#include "mozilla/gfx/2D.h"
#include "mozilla/layers/CompositorOptions.h"
#include "mozilla/layers/LayersTypes.h"
class nsIWidget;
@ -77,7 +78,9 @@ public:
* Create an in-process compositor widget. aWidget may be ignored if the
* platform does not require it.
*/
static RefPtr<CompositorWidget> CreateLocal(const CompositorWidgetInitData& aInitData, nsIWidget* aWidget);
static RefPtr<CompositorWidget> CreateLocal(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions,
nsIWidget* aWidget);
/**
* Called before rendering using OMTC. Returns false when the widget is
@ -251,6 +254,14 @@ public:
*/
virtual void ObserveVsync(VsyncObserver* aObserver) = 0;
/**
* Get the compositor options for the compositor associated with this
* CompositorWidget.
*/
const layers::CompositorOptions& GetCompositorOptions() {
return mOptions;
}
/**
* This is only used by out-of-process compositors.
*/
@ -274,10 +285,13 @@ public:
}
protected:
explicit CompositorWidget(const layers::CompositorOptions& aOptions);
virtual ~CompositorWidget();
// Back buffer of BasicCompositor
RefPtr<gfx::DrawTarget> mLastBackBuffer;
layers::CompositorOptions mOptions;
};
} // namespace widget

View File

@ -16,19 +16,23 @@ namespace widget {
// InProcessCompositorWidget by default.
#if !defined(MOZ_WIDGET_SUPPORTS_OOP_COMPOSITING)
/* static */ RefPtr<CompositorWidget>
CompositorWidget::CreateLocal(const CompositorWidgetInitData& aInitData, nsIWidget* aWidget)
CompositorWidget::CreateLocal(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions,
nsIWidget* aWidget)
{
MOZ_ASSERT(aWidget);
#ifdef MOZ_WIDGET_ANDROID
return new AndroidCompositorWidget(static_cast<nsBaseWidget*>(aWidget));
return new AndroidCompositorWidget(aOptions, static_cast<nsBaseWidget*>(aWidget));
#else
return new InProcessCompositorWidget(static_cast<nsBaseWidget*>(aWidget));
return new InProcessCompositorWidget(aOptions, static_cast<nsBaseWidget*>(aWidget));
#endif
}
#endif
InProcessCompositorWidget::InProcessCompositorWidget(nsBaseWidget* aWidget)
: mWidget(aWidget)
InProcessCompositorWidget::InProcessCompositorWidget(const layers::CompositorOptions& aOptions,
nsBaseWidget* aWidget)
: CompositorWidget(aOptions)
, mWidget(aWidget)
{
}

View File

@ -15,7 +15,8 @@ namespace widget {
class InProcessCompositorWidget : public CompositorWidget
{
public:
explicit InProcessCompositorWidget(nsBaseWidget* aWidget);
explicit InProcessCompositorWidget(const layers::CompositorOptions& aOptions,
nsBaseWidget* aWidget);
virtual bool PreRender(WidgetRenderingContext* aManager) override;
virtual void PostRender(WidgetRenderingContext* aManager) override;

View File

@ -9,8 +9,9 @@
namespace mozilla {
namespace widget {
CompositorWidgetParent::CompositorWidgetParent(const CompositorWidgetInitData& aInitData)
: X11CompositorWidget(aInitData)
CompositorWidgetParent::CompositorWidgetParent(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions)
: X11CompositorWidget(aInitData, aOptions)
{
MOZ_ASSERT(XRE_GetProcessType() == GeckoProcessType_GPU);
}

View File

@ -17,7 +17,8 @@ class CompositorWidgetParent final
public X11CompositorWidget
{
public:
explicit CompositorWidgetParent(const CompositorWidgetInitData& aInitData);
explicit CompositorWidgetParent(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions);
~CompositorWidgetParent() override;
void ActorDestroy(ActorDestroyReason aWhy) override { }

View File

@ -11,14 +11,17 @@ namespace mozilla {
namespace widget {
/* static */ RefPtr<CompositorWidget>
CompositorWidget::CreateLocal(const CompositorWidgetInitData& aInitData, nsIWidget* aWidget)
CompositorWidget::CreateLocal(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions,
nsIWidget* aWidget)
{
return new InProcessX11CompositorWidget(aInitData, static_cast<nsWindow*>(aWidget));
return new InProcessX11CompositorWidget(aInitData, aOptions, static_cast<nsWindow*>(aWidget));
}
InProcessX11CompositorWidget::InProcessX11CompositorWidget(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions,
nsWindow* aWindow)
: X11CompositorWidget(aInitData, aWindow)
: X11CompositorWidget(aInitData, aOptions, aWindow)
{
}

View File

@ -17,6 +17,7 @@ class InProcessX11CompositorWidget final : public X11CompositorWidget
{
public:
InProcessX11CompositorWidget(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions,
nsWindow* aWindow);
// CompositorWidgetDelegate

View File

@ -15,8 +15,10 @@ namespace mozilla {
namespace widget {
X11CompositorWidget::X11CompositorWidget(const CompositorWidgetInitData& aInitData,
const CompositorOptions& aOptions,
nsWindow* aWindow)
: mWidget(aWindow)
: CompositorWidget(aOptions)
, mWidget(aWindow)
{
// If we have a nsWindow, then grab the already existing display connection
// If we don't, then use the init data to connect to the display

View File

@ -27,6 +27,7 @@ class X11CompositorWidget
{
public:
X11CompositorWidget(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions,
nsWindow* aWindow = nullptr);
~X11CompositorWidget();

View File

@ -10,8 +10,9 @@
namespace mozilla {
namespace widget {
CompositorWidgetParent::CompositorWidgetParent(const CompositorWidgetInitData& aInitData)
: WinCompositorWidget(aInitData)
CompositorWidgetParent::CompositorWidgetParent(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions)
: WinCompositorWidget(aInitData, aOptions)
{
MOZ_ASSERT(XRE_GetProcessType() == GeckoProcessType_GPU);
}

View File

@ -17,7 +17,8 @@ class CompositorWidgetParent final
public WinCompositorWidget
{
public:
explicit CompositorWidgetParent(const CompositorWidgetInitData& aInitData);
explicit CompositorWidgetParent(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions);
~CompositorWidgetParent() override;
mozilla::ipc::IPCResult RecvEnterPresentLock() override;

View File

@ -10,14 +10,17 @@ namespace mozilla {
namespace widget {
/* static */ RefPtr<CompositorWidget>
CompositorWidget::CreateLocal(const CompositorWidgetInitData& aInitData, nsIWidget* aWidget)
CompositorWidget::CreateLocal(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions,
nsIWidget* aWidget)
{
return new InProcessWinCompositorWidget(aInitData, static_cast<nsWindow*>(aWidget));
return new InProcessWinCompositorWidget(aInitData, aOptions, static_cast<nsWindow*>(aWidget));
}
InProcessWinCompositorWidget::InProcessWinCompositorWidget(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions,
nsWindow* aWindow)
: WinCompositorWidget(aInitData),
: WinCompositorWidget(aInitData, aOptions),
mWindow(aWindow)
{
MOZ_ASSERT(mWindow);

View File

@ -20,7 +20,9 @@ namespace widget {
class InProcessWinCompositorWidget final : public WinCompositorWidget
{
public:
InProcessWinCompositorWidget(const CompositorWidgetInitData& aInitData, nsWindow* aWindow);
InProcessWinCompositorWidget(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions,
nsWindow* aWindow);
void ObserveVsync(VsyncObserver* aObserver) override;
nsIWidget* RealWidget() override;

View File

@ -19,8 +19,10 @@ namespace widget {
using namespace mozilla::gfx;
WinCompositorWidget::WinCompositorWidget(const CompositorWidgetInitData& aInitData)
: mWidgetKey(aInitData.widgetKey()),
WinCompositorWidget::WinCompositorWidget(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions)
: CompositorWidget(aOptions)
, mWidgetKey(aInitData.widgetKey()),
mWnd(reinterpret_cast<HWND>(aInitData.hWnd())),
mTransparencyMode(static_cast<nsTransparencyMode>(aInitData.transparencyMode())),
mMemoryDC(nullptr),

View File

@ -43,7 +43,8 @@ class WinCompositorWidget
public CompositorWidgetDelegate
{
public:
WinCompositorWidget(const CompositorWidgetInitData& aInitData);
WinCompositorWidget(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions);
bool PreRender(WidgetRenderingContext*) override;
void PostRender(WidgetRenderingContext*) override;

View File

@ -3901,7 +3901,9 @@ nsWindow::GetLayerManager(PLayerTransactionChild* aShadowManager,
reinterpret_cast<uintptr_t>(mWnd),
reinterpret_cast<uintptr_t>(static_cast<nsIWidget*>(this)),
mTransparencyMode);
mBasicLayersSurface = new InProcessWinCompositorWidget(initData, this);
// If we're not using the compositor, the options don't actually matter.
CompositorOptions options(false);
mBasicLayersSurface = new InProcessWinCompositorWidget(initData, options, this);
mCompositorWidgetDelegate = mBasicLayersSurface;
mLayerManager = CreateBasicLayerManager();
}