/* 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 "InProcessCompositorWidget.h" #include "mozilla/VsyncDispatcher.h" #include "nsBaseWidget.h" #if defined(MOZ_WIDGET_ANDROID) && !defined(MOZ_WIDGET_SUPPORTS_OOP_COMPOSITING) # include "mozilla/widget/AndroidCompositorWidget.h" #endif namespace mozilla { namespace widget { // Platforms with no OOP compositor process support use // InProcessCompositorWidget by default. #if !defined(MOZ_WIDGET_SUPPORTS_OOP_COMPOSITING) /* static */ RefPtr CompositorWidget::CreateLocal( const CompositorWidgetInitData& aInitData, const layers::CompositorOptions& aOptions, nsIWidget* aWidget) { MOZ_ASSERT(aWidget); # ifdef MOZ_WIDGET_ANDROID return new AndroidCompositorWidget(aOptions, static_cast(aWidget)); # else return new InProcessCompositorWidget(aOptions, static_cast(aWidget)); # endif } #endif InProcessCompositorWidget::InProcessCompositorWidget( const layers::CompositorOptions& aOptions, nsBaseWidget* aWidget) : CompositorWidget(aOptions), mWidget(aWidget) { // The only method of construction that is used outside of unit tests is // ::CreateLocal, above. That method of construction asserts that mWidget // is not assigned a NULL value. And yet mWidget is NULL in some crash // reports that involve other class methods. Adding a release assert here // will give us the earliest possible notification that we're headed for // a crash. MOZ_RELEASE_ASSERT(mWidget); } bool InProcessCompositorWidget::PreRender(WidgetRenderingContext* aContext) { return mWidget->PreRender(aContext); } void InProcessCompositorWidget::PostRender(WidgetRenderingContext* aContext) { mWidget->PostRender(aContext); } RefPtr InProcessCompositorWidget::GetNativeLayerRoot() { return mWidget->GetNativeLayerRoot(); } already_AddRefed InProcessCompositorWidget::StartRemoteDrawing() { return mWidget->StartRemoteDrawing(); } already_AddRefed InProcessCompositorWidget::StartRemoteDrawingInRegion( LayoutDeviceIntRegion& aInvalidRegion, layers::BufferMode* aBufferMode) { return mWidget->StartRemoteDrawingInRegion(aInvalidRegion, aBufferMode); } void InProcessCompositorWidget::EndRemoteDrawing() { mWidget->EndRemoteDrawing(); } void InProcessCompositorWidget::EndRemoteDrawingInRegion( gfx::DrawTarget* aDrawTarget, const LayoutDeviceIntRegion& aInvalidRegion) { mWidget->EndRemoteDrawingInRegion(aDrawTarget, aInvalidRegion); } void InProcessCompositorWidget::CleanupRemoteDrawing() { mWidget->CleanupRemoteDrawing(); } void InProcessCompositorWidget::CleanupWindowEffects() { mWidget->CleanupWindowEffects(); } bool InProcessCompositorWidget::InitCompositor( layers::Compositor* aCompositor) { return mWidget->InitCompositor(aCompositor); } LayoutDeviceIntSize InProcessCompositorWidget::GetClientSize() { return mWidget->GetClientSize(); } uint32_t InProcessCompositorWidget::GetGLFrameBufferFormat() { return mWidget->GetGLFrameBufferFormat(); } uintptr_t InProcessCompositorWidget::GetWidgetKey() { return reinterpret_cast(mWidget); } nsIWidget* InProcessCompositorWidget::RealWidget() { return mWidget; } void InProcessCompositorWidget::ObserveVsync(VsyncObserver* aObserver) { if (RefPtr cvd = mWidget->GetCompositorVsyncDispatcher()) { cvd->SetCompositorVsyncObserver(aObserver); } } } // namespace widget } // namespace mozilla