Skip to content

Commit

Permalink
Bug 1330037 - Propagate the CompositorOptions to all CompositorWidget…
Browse files Browse the repository at this point in the history
… instances. r=dvander

MozReview-Commit-ID: DFeeo2WNmhZ
  • Loading branch information
staktrace committed Jan 12, 2017
1 parent 6c16ec7 commit f7fbd8d
Show file tree
Hide file tree
Showing 20 changed files with 74 additions and 28 deletions.
2 changes: 1 addition & 1 deletion gfx/ipc/InProcessCompositorSession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion gfx/layers/ipc/CompositorBridgeParent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
3 changes: 2 additions & 1 deletion gfx/tests/gtest/TestCompositor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
5 changes: 5 additions & 0 deletions widget/CompositorWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@
namespace mozilla {
namespace widget {

CompositorWidget::CompositorWidget(const layers::CompositorOptions& aOptions)
: mOptions(aOptions)
{
}

CompositorWidget::~CompositorWidget()
{
}
Expand Down
16 changes: 15 additions & 1 deletion widget/CompositorWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -77,7 +78,9 @@ class CompositorWidget
* 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
Expand Down Expand Up @@ -251,6 +254,14 @@ class CompositorWidget
*/
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.
*/
Expand All @@ -274,10 +285,13 @@ class CompositorWidget
}

protected:
explicit CompositorWidget(const layers::CompositorOptions& aOptions);
virtual ~CompositorWidget();

// Back buffer of BasicCompositor
RefPtr<gfx::DrawTarget> mLastBackBuffer;

layers::CompositorOptions mOptions;
};

} // namespace widget
Expand Down
14 changes: 9 additions & 5 deletions widget/InProcessCompositorWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
}

Expand Down
3 changes: 2 additions & 1 deletion widget/InProcessCompositorWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
5 changes: 3 additions & 2 deletions widget/gtk/CompositorWidgetParent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
3 changes: 2 additions & 1 deletion widget/gtk/CompositorWidgetParent.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 { }
Expand Down
9 changes: 6 additions & 3 deletions widget/gtk/InProcessX11CompositorWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
}

Expand Down
1 change: 1 addition & 0 deletions widget/gtk/InProcessX11CompositorWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class InProcessX11CompositorWidget final : public X11CompositorWidget
{
public:
InProcessX11CompositorWidget(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions,
nsWindow* aWindow);

// CompositorWidgetDelegate
Expand Down
4 changes: 3 additions & 1 deletion widget/gtk/X11CompositorWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions widget/gtk/X11CompositorWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class X11CompositorWidget
{
public:
X11CompositorWidget(const CompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions,
nsWindow* aWindow = nullptr);
~X11CompositorWidget();

Expand Down
5 changes: 3 additions & 2 deletions widget/windows/CompositorWidgetParent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
3 changes: 2 additions & 1 deletion widget/windows/CompositorWidgetParent.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
9 changes: 6 additions & 3 deletions widget/windows/InProcessWinCompositorWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 3 additions & 1 deletion widget/windows/InProcessWinCompositorWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
6 changes: 4 additions & 2 deletions widget/windows/WinCompositorWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
3 changes: 2 additions & 1 deletion widget/windows/WinCompositorWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 3 additions & 1 deletion widget/windows/nsWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down

0 comments on commit f7fbd8d

Please sign in to comment.