From 6562af780a22c265741b432f36dd63ce42bbcee4 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 1 Jul 2016 01:15:16 -0700 Subject: [PATCH] Move CompositorWidget construction out of nsIWidget. (bug 1281998 part 5, r=jimm) --- gfx/ipc/CompositorSession.cpp | 6 ++++- gfx/ipc/CompositorSession.h | 1 + widget/CompositorWidget.h | 7 ++++++ widget/InProcessCompositorWidget.cpp | 12 ++++++++++ widget/PlatformWidgetTypes.ipdlh | 18 +++++++++++++++ widget/PuppetWidget.h | 6 ----- widget/cocoa/nsCocoaWindow.h | 4 ---- widget/moz.build | 9 ++++++++ widget/nsBaseWidget.cpp | 7 ------ widget/nsBaseWidget.h | 2 -- widget/nsIWidget.h | 7 ++++-- widget/windows/PlatformWidgetTypes.ipdlh | 23 +++++++++++++++++++ widget/windows/WinCompositorWidget.cpp | 17 +++++++++----- widget/windows/WinCompositorWidget.h | 4 +--- widget/windows/nsWindow.cpp | 29 ++++++++++++------------ widget/windows/nsWindow.h | 2 +- 16 files changed, 107 insertions(+), 47 deletions(-) create mode 100644 widget/PlatformWidgetTypes.ipdlh create mode 100644 widget/windows/PlatformWidgetTypes.ipdlh diff --git a/gfx/ipc/CompositorSession.cpp b/gfx/ipc/CompositorSession.cpp index 8322af6f5287..32920f51496e 100644 --- a/gfx/ipc/CompositorSession.cpp +++ b/gfx/ipc/CompositorSession.cpp @@ -6,6 +6,7 @@ #include "CompositorSession.h" #include "mozilla/layers/CompositorBridgeChild.h" #include "mozilla/layers/CompositorBridgeParent.h" +#include "mozilla/widget/PlatformWidgetTypes.h" #include "base/process_util.h" namespace mozilla { @@ -73,7 +74,10 @@ InProcessCompositorSession::InProcessCompositorSession(nsIWidget* aWidget, bool aUseExternalSurfaceSize, const gfx::IntSize& aSurfaceSize) { - mCompositorWidget = aWidget->NewCompositorWidget(); + CompositorWidgetInitData initData; + aWidget->GetCompositorWidgetInitData(&initData); + mCompositorWidget = CompositorWidget::CreateLocal(initData, aWidget); + mCompositorBridgeParent = new CompositorBridgeParent( mCompositorWidget, aScale, diff --git a/gfx/ipc/CompositorSession.h b/gfx/ipc/CompositorSession.h index f665870ff039..96c17662a580 100644 --- a/gfx/ipc/CompositorSession.h +++ b/gfx/ipc/CompositorSession.h @@ -34,6 +34,7 @@ class CompositorSession { friend class gfx::GPUProcessManager; +protected: typedef widget::CompositorWidget CompositorWidget; public: diff --git a/widget/CompositorWidget.h b/widget/CompositorWidget.h index 0ad2c462462e..a61085aeaad4 100644 --- a/widget/CompositorWidget.h +++ b/widget/CompositorWidget.h @@ -29,6 +29,7 @@ class SourceSurface; namespace widget { class WinCompositorWidget; +class CompositorWidgetInitData; /** * Access to a widget from the compositor is restricted to these methods. @@ -38,6 +39,12 @@ class CompositorWidget public: NS_INLINE_DECL_REFCOUNTING(mozilla::widget::CompositorWidget) + /** + * Create an in-process compositor widget. aWidget may be ignored if the + * platform does not require it. + */ + static RefPtr CreateLocal(const CompositorWidgetInitData& aInitData, nsIWidget* aWidget); + /** * Called before rendering using OMTC. Returns false when the widget is * not ready to be rendered (for example while the window is closed). diff --git a/widget/InProcessCompositorWidget.cpp b/widget/InProcessCompositorWidget.cpp index 16453250fb6a..50e443c8d347 100644 --- a/widget/InProcessCompositorWidget.cpp +++ b/widget/InProcessCompositorWidget.cpp @@ -3,10 +3,22 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "InProcessCompositorWidget.h" +#include "nsBaseWidget.h" namespace mozilla { namespace widget { +// Platforms with no OOP compositor process support use +// InProcessCompositorWidget by default. +#if !defined(XP_WIN) +/* static */ RefPtr +CompositorWidget::CreateLocal(const CompositorWidgetInitData& aInitData, nsIWidget* aWidget) +{ + MOZ_ASSERT(aWidget); + return new InProcessCompositorWidget(static_cast(aWidget)); +} +#endif + InProcessCompositorWidget::InProcessCompositorWidget(nsBaseWidget* aWidget) : mWidget(aWidget) { diff --git a/widget/PlatformWidgetTypes.ipdlh b/widget/PlatformWidgetTypes.ipdlh new file mode 100644 index 000000000000..26933f8ded53 --- /dev/null +++ b/widget/PlatformWidgetTypes.ipdlh @@ -0,0 +1,18 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=99: */ +/* 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/. */ + +// This file is a stub, for platforms that do not yet support out-of-process +// compositing or do not need specialized types to do so. + +namespace mozilla { +namespace widget { + +struct CompositorWidgetInitData +{ +}; + +} // namespace widget +} // namespace mozilla diff --git a/widget/PuppetWidget.h b/widget/PuppetWidget.h index 098d274ab6f6..b476e445a602 100644 --- a/widget/PuppetWidget.h +++ b/widget/PuppetWidget.h @@ -279,12 +279,6 @@ protected: virtual nsresult NotifyIMEInternal( const IMENotification& aIMENotification) override; - // PuppetWidgets do not create compositors. - widget::CompositorWidget* NewCompositorWidget() override { - MOZ_ASSERT_UNREACHABLE("PuppetWidgets should not have widget proxies"); - return nullptr; - } - private: nsresult Paint(); diff --git a/widget/cocoa/nsCocoaWindow.h b/widget/cocoa/nsCocoaWindow.h index 04690bbd3d56..1bb3c7d60ca7 100644 --- a/widget/cocoa/nsCocoaWindow.h +++ b/widget/cocoa/nsCocoaWindow.h @@ -353,10 +353,6 @@ public: NS_IMETHOD ReparentNativeWidget(nsIWidget* aNewParent) override; - CompositorWidget* NewCompositorWidget() override { - return nullptr; - } - protected: virtual ~nsCocoaWindow(); diff --git a/widget/moz.build b/widget/moz.build index 62c87eda1aaa..9939dda2f337 100644 --- a/widget/moz.build +++ b/widget/moz.build @@ -242,6 +242,15 @@ LOCAL_INCLUDES += [ '/widget', ] +if toolkit == 'windows': + IPDL_SOURCES = [ + 'windows/PlatformWidgetTypes.ipdlh', + ] +else: + IPDL_SOURCES = [ + 'PlatformWidgetTypes.ipdlh', + ] + widget_dir = toolkit if widget_dir in ('gtk3', 'gtk2'): # gtk3 shares includes with gtk2 diff --git a/widget/nsBaseWidget.cpp b/widget/nsBaseWidget.cpp index 9ff6ea21a9b9..56488248526d 100644 --- a/widget/nsBaseWidget.cpp +++ b/widget/nsBaseWidget.cpp @@ -72,7 +72,6 @@ #endif #include "gfxConfig.h" #include "mozilla/layers/CompositorSession.h" -#include "InProcessCompositorWidget.h" #ifdef DEBUG #include "nsIObserver.h" @@ -1415,12 +1414,6 @@ nsBaseWidget::GetGLFrameBufferFormat() return LOCAL_GL_RGBA; } -mozilla::widget::CompositorWidget* -nsBaseWidget::NewCompositorWidget() -{ - return new mozilla::widget::InProcessCompositorWidget(this); -} - //------------------------------------------------------------------------- // // Destroy the window diff --git a/widget/nsBaseWidget.h b/widget/nsBaseWidget.h index 1fb60ef3b742..fff3a664ba76 100644 --- a/widget/nsBaseWidget.h +++ b/widget/nsBaseWidget.h @@ -354,8 +354,6 @@ public: void Shutdown(); - virtual mozilla::widget::CompositorWidget* NewCompositorWidget() override; - protected: // These are methods for CompositorWidgetWrapper, and should only be // accessed from that class. Derived widgets can choose which methods to diff --git a/widget/nsIWidget.h b/widget/nsIWidget.h index 3a340c979bd0..00c344fb8119 100644 --- a/widget/nsIWidget.h +++ b/widget/nsIWidget.h @@ -66,6 +66,7 @@ namespace widget { class TextEventDispatcher; class TextEventDispatcherListener; class CompositorWidget; +class CompositorWidgetInitData; } // namespace widget } // namespace mozilla @@ -1627,8 +1628,10 @@ class nsIWidget : public nsISupports virtual void StartAsyncScrollbarDrag(const AsyncDragMetrics& aDragMetrics) = 0; - // Return a new CompositorWidget for this widget. - virtual mozilla::widget::CompositorWidget* NewCompositorWidget() = 0; + // If this widget supports out-of-process compositing, it can override + // this method to provide additional information to the compositor. + virtual void GetCompositorWidgetInitData(mozilla::widget::CompositorWidgetInitData* aInitData) + {} private: class LongTapInfo diff --git a/widget/windows/PlatformWidgetTypes.ipdlh b/widget/windows/PlatformWidgetTypes.ipdlh new file mode 100644 index 000000000000..aad9cf395969 --- /dev/null +++ b/widget/windows/PlatformWidgetTypes.ipdlh @@ -0,0 +1,23 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=99: */ +/* 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/. */ + +// This file is a stub, for platforms that do not yet support out-of-process +// compositing or do not need specialized types to do so. + +using mozilla::WindowsHandle from "ipc/IPCMessageUtils.h"; + +namespace mozilla { +namespace widget { + +struct CompositorWidgetInitData +{ + WindowsHandle hWnd; + uintptr_t widgetKey; + int32_t transparencyMode; +}; + +} // namespace widget +} // namespace mozilla diff --git a/widget/windows/WinCompositorWidget.cpp b/widget/windows/WinCompositorWidget.cpp index b9e13de72b9c..a93e8edd5e94 100644 --- a/widget/windows/WinCompositorWidget.cpp +++ b/widget/windows/WinCompositorWidget.cpp @@ -7,20 +7,25 @@ #include "nsWindow.h" #include "VsyncDispatcher.h" #include "mozilla/gfx/Point.h" +#include "mozilla/widget/PlatformWidgetTypes.h" namespace mozilla { namespace widget { using namespace mozilla::gfx; -WinCompositorWidget::WinCompositorWidget(HWND aWnd, - uintptr_t aWidgetKey, - nsTransparencyMode aMode, +/* static */ RefPtr +CompositorWidget::CreateLocal(const CompositorWidgetInitData& aInitData, nsIWidget* aWidget) +{ + return new WinCompositorWidget(aInitData, static_cast(aWidget)); +} + +WinCompositorWidget::WinCompositorWidget(const CompositorWidgetInitData& aInitData, nsWindow* aWindow) : mWindow(aWindow), - mWidgetKey(aWidgetKey), - mWnd(aWnd), - mTransparencyMode(aMode), + mWidgetKey(aInitData.widgetKey()), + mWnd(reinterpret_cast(aInitData.hWnd())), + mTransparencyMode(static_cast(aInitData.transparencyMode())), mMemoryDC(nullptr), mCompositeDC(nullptr), mLockedBackBufferData(nullptr) diff --git a/widget/windows/WinCompositorWidget.h b/widget/windows/WinCompositorWidget.h index 004d7803a99b..4e5488cfa28f 100644 --- a/widget/windows/WinCompositorWidget.h +++ b/widget/windows/WinCompositorWidget.h @@ -21,9 +21,7 @@ namespace widget { class WinCompositorWidget: public CompositorWidget { public: - WinCompositorWidget(HWND aWnd, - uintptr_t aWidgetKey, - nsTransparencyMode aMode, + WinCompositorWidget(const CompositorWidgetInitData& aInitData, nsWindow* aWindow = nullptr); bool PreRender(layers::LayerManagerComposite*) override; diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp index 32ee6121dd6d..44848694414a 100644 --- a/widget/windows/nsWindow.cpp +++ b/widget/windows/nsWindow.cpp @@ -136,6 +136,7 @@ #include "mozilla/TextEvents.h" // For WidgetKeyboardEvent #include "mozilla/TextEventDispatcherListener.h" #include "mozilla/widget/WinNativeEventData.h" +#include "mozilla/widget/PlatformWidgetTypes.h" #include "nsThemeConstants.h" #include "nsBidiKeyboard.h" #include "nsThemeConstants.h" @@ -3621,11 +3622,11 @@ nsWindow::GetLayerManager(PLayerTransactionChild* aShadowManager, // Ensure we have a widget proxy even if we're not using the compositor, // since all our transparent window handling lives there. - mCompositorWidget = new WinCompositorWidget( - mWnd, - reinterpret_cast(this), - mTransparencyMode, - this); + CompositorWidgetInitData initData( + reinterpret_cast(mWnd), + reinterpret_cast(static_cast(this)), + mTransparencyMode); + mCompositorWidget = new WinCompositorWidget(initData, this); mLayerManager = CreateBasicLayerManager(); } @@ -3686,16 +3687,6 @@ nsWindow::OnDefaultButtonLoaded(const LayoutDeviceIntRect& aButtonRect) return NS_OK; } -mozilla::widget::CompositorWidget* -nsWindow::NewCompositorWidget() -{ - return new WinCompositorWidget( - mWnd, - reinterpret_cast(this), - mTransparencyMode, - this); -} - mozilla::widget::WinCompositorWidget* nsWindow::GetCompositorWidget() { @@ -7825,3 +7816,11 @@ DWORD ChildWindow::WindowStyle() VERIFY_WINDOW_STYLE(style); return style; } + +void +nsWindow::GetCompositorWidgetInitData(mozilla::widget::CompositorWidgetInitData* aInitData) +{ + aInitData->hWnd() = reinterpret_cast(mWnd); + aInitData->widgetKey() = reinterpret_cast(static_cast(this)); + aInitData->transparencyMode() = mTransparencyMode; +} diff --git a/widget/windows/nsWindow.h b/widget/windows/nsWindow.h index 63cbc89cfb6a..d9cd54d6e84b 100644 --- a/widget/windows/nsWindow.h +++ b/widget/windows/nsWindow.h @@ -312,7 +312,7 @@ public: const mozilla::NativeEventData& aKeyEventData, nsIKeyEventInPluginCallback* aCallback) override; - mozilla::widget::CompositorWidget* NewCompositorWidget() override; + void GetCompositorWidgetInitData(mozilla::widget::CompositorWidgetInitData* aInitData) override; protected: virtual ~nsWindow();