From 5f8de423f190bbb79a62f804151bc24824fa32d8 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Fri, 2 Feb 2018 04:16:08 -0500 Subject: Add m-esr52 at 52.6.0 --- widget/CompositorWidget.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 widget/CompositorWidget.cpp (limited to 'widget/CompositorWidget.cpp') diff --git a/widget/CompositorWidget.cpp b/widget/CompositorWidget.cpp new file mode 100644 index 000000000..2cdf8010a --- /dev/null +++ b/widget/CompositorWidget.cpp @@ -0,0 +1,84 @@ +/* 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 "CompositorWidget.h" +#include "GLConsts.h" +#include "nsBaseWidget.h" +#include "VsyncDispatcher.h" + +namespace mozilla { +namespace widget { + +CompositorWidget::~CompositorWidget() +{ +} + +already_AddRefed +CompositorWidget::StartRemoteDrawing() +{ + return nullptr; +} + +void +CompositorWidget::CleanupRemoteDrawing() +{ + mLastBackBuffer = nullptr; +} + +already_AddRefed +CompositorWidget::GetBackBufferDrawTarget(gfx::DrawTarget* aScreenTarget, + const LayoutDeviceIntRect& aRect, + const LayoutDeviceIntRect& aClearRect) +{ + MOZ_ASSERT(aScreenTarget); + gfx::SurfaceFormat format = + aScreenTarget->GetFormat() == gfx::SurfaceFormat::B8G8R8X8 ? gfx::SurfaceFormat::B8G8R8X8 : gfx::SurfaceFormat::B8G8R8A8; + gfx::IntSize size = aRect.ToUnknownRect().Size(); + gfx::IntSize clientSize(GetClientSize().ToUnknownSize()); + + RefPtr target; + // Re-use back buffer if possible + if (mLastBackBuffer && + mLastBackBuffer->GetBackendType() == aScreenTarget->GetBackendType() && + mLastBackBuffer->GetFormat() == format && + size <= mLastBackBuffer->GetSize() && + mLastBackBuffer->GetSize() <= clientSize) { + target = mLastBackBuffer; + target->SetTransform(gfx::Matrix()); + if (!aClearRect.IsEmpty()) { + gfx::IntRect clearRect = aClearRect.ToUnknownRect() - aRect.ToUnknownRect().TopLeft(); + target->ClearRect(gfx::Rect(clearRect.x, clearRect.y, clearRect.width, clearRect.height)); + } + } else { + target = aScreenTarget->CreateSimilarDrawTarget(size, format); + mLastBackBuffer = target; + } + return target.forget(); +} + +already_AddRefed +CompositorWidget::EndBackBufferDrawing() +{ + RefPtr surface = mLastBackBuffer ? mLastBackBuffer->Snapshot() : nullptr; + return surface.forget(); +} + +uint32_t +CompositorWidget::GetGLFrameBufferFormat() +{ + return LOCAL_GL_RGBA; +} + +RefPtr +CompositorWidget::GetVsyncObserver() const +{ + // This should only used when the widget is in the GPU process, and should be + // implemented by IPDL-enabled CompositorWidgets. + // GPU process does not have a CompositorVsyncDispatcher. + MOZ_ASSERT_UNREACHABLE("Must be implemented by derived class"); + return nullptr; +} + +} // namespace widget +} // namespace mozilla -- cgit v1.2.3