зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1813407 [Linux] Get window size from compositor widget if possible in WindowSurfaceWaylandMultiBuffer backend r=emilio
- We want to get window size from compositor widget as it matches window size used by parent RenderCompositorSWGL rendrer. - For main thread rendering mCompositorWidget is not available so get window size directly from nsWindow. Depends on D169906 Differential Revision: https://phabricator.services.mozilla.com/D169907
This commit is contained in:
Родитель
1b56bde4d2
Коммит
d170405210
|
@ -14,6 +14,7 @@
|
|||
#include "gfx2DGlue.h"
|
||||
#include "gfxPlatform.h"
|
||||
#include "MozContainer.h"
|
||||
#include "GtkCompositorWidget.h"
|
||||
#include "mozilla/gfx/DataSurfaceHelpers.h"
|
||||
#include "mozilla/gfx/Tools.h"
|
||||
#include "mozilla/ScopeExit.h"
|
||||
|
@ -152,12 +153,29 @@ using gfx::DataSourceSurface;
|
|||
|
||||
#define BACK_BUFFER_NUM 3
|
||||
|
||||
WindowSurfaceWaylandMB::WindowSurfaceWaylandMB(RefPtr<nsWindow> aWindow)
|
||||
WindowSurfaceWaylandMB::WindowSurfaceWaylandMB(
|
||||
RefPtr<nsWindow> aWindow, GtkCompositorWidget* aCompositorWidget)
|
||||
: mSurfaceLock("WindowSurfaceWayland lock"),
|
||||
mWindow(std::move(aWindow)),
|
||||
mCompositorWidget(aCompositorWidget),
|
||||
mFrameInProcess(false),
|
||||
mCallbackRequested(false) {}
|
||||
|
||||
bool WindowSurfaceWaylandMB::MaybeUpdateWindowSize() {
|
||||
// We want to get window size from compositor widget as it matches window
|
||||
// size used by parent RenderCompositorSWGL rendrer.
|
||||
// For main thread rendering mCompositorWidget is not available so get
|
||||
// window size directly from nsWindow.
|
||||
LayoutDeviceIntSize newWindowSize = mCompositorWidget
|
||||
? mCompositorWidget->GetClientSize()
|
||||
: mWindow->GetClientSize();
|
||||
if (mWindowSize != newWindowSize) {
|
||||
mWindowSize = newWindowSize;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
already_AddRefed<DrawTarget> WindowSurfaceWaylandMB::Lock(
|
||||
const LayoutDeviceIntRegion& aInvalidRegion) {
|
||||
MutexAutoLock lock(mSurfaceLock);
|
||||
|
@ -176,11 +194,9 @@ already_AddRefed<DrawTarget> WindowSurfaceWaylandMB::Lock(
|
|||
|
||||
CollectPendingSurfaces(lock);
|
||||
|
||||
LayoutDeviceIntSize newMozContainerSize = mWindow->GetMozContainerSize();
|
||||
if (mMozContainerSize != newMozContainerSize) {
|
||||
mMozContainerSize = newMozContainerSize;
|
||||
LOGWAYLAND(" new MozContainer size [%d x %d]", mMozContainerSize.width,
|
||||
mMozContainerSize.height);
|
||||
if (MaybeUpdateWindowSize()) {
|
||||
LOGWAYLAND(" new window size [%d x %d]", mWindowSize.width,
|
||||
mWindowSize.height);
|
||||
if (mInProgressBuffer) {
|
||||
ReturnBufferToPool(lock, mInProgressBuffer);
|
||||
mInProgressBuffer = nullptr;
|
||||
|
@ -196,7 +212,7 @@ already_AddRefed<DrawTarget> WindowSurfaceWaylandMB::Lock(
|
|||
if (mFrontBuffer && !mFrontBuffer->IsAttached()) {
|
||||
mInProgressBuffer = mFrontBuffer;
|
||||
} else {
|
||||
mInProgressBuffer = ObtainBufferFromPool(lock, mMozContainerSize);
|
||||
mInProgressBuffer = ObtainBufferFromPool(lock, mWindowSize);
|
||||
if (!mInProgressBuffer) {
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -257,9 +273,9 @@ void WindowSurfaceWaylandMB::Commit(
|
|||
gfx::IntRect invalidRect = aInvalidRegion.GetBounds().ToUnknownRect();
|
||||
LOGWAYLAND(
|
||||
"WindowSurfaceWaylandMB::Commit [%p] damage rect [%d, %d] -> [%d x %d] "
|
||||
"MozContainer [%d x %d]\n",
|
||||
"Window [%d x %d]\n",
|
||||
(void*)mWindow.get(), invalidRect.x, invalidRect.y, invalidRect.width,
|
||||
invalidRect.height, mMozContainerSize.width, mMozContainerSize.height);
|
||||
invalidRect.height, mWindowSize.width, mWindowSize.height);
|
||||
#endif
|
||||
|
||||
if (!mInProgressBuffer) {
|
||||
|
@ -341,7 +357,7 @@ void WindowSurfaceWaylandMB::ReturnBufferToPool(
|
|||
const RefPtr<WaylandBufferSHM>& aBuffer) {
|
||||
if (aBuffer->IsAttached()) {
|
||||
mPendingBuffers.AppendElement(aBuffer);
|
||||
} else if (aBuffer->IsMatchingSize(mMozContainerSize)) {
|
||||
} else if (aBuffer->IsMatchingSize(mWindowSize)) {
|
||||
mAvailableBuffers.AppendElement(aBuffer);
|
||||
}
|
||||
mInUseBuffers.RemoveElement(aBuffer);
|
||||
|
@ -365,7 +381,7 @@ void WindowSurfaceWaylandMB::CollectPendingSurfaces(
|
|||
const MutexAutoLock& aProofOfLock) {
|
||||
mPendingBuffers.RemoveElementsBy([&](auto& buffer) {
|
||||
if (!buffer->IsAttached()) {
|
||||
if (buffer->IsMatchingSize(mMozContainerSize)) {
|
||||
if (buffer->IsMatchingSize(mWindowSize)) {
|
||||
mAvailableBuffers.AppendElement(std::move(buffer));
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -24,7 +24,8 @@ using gfx::DrawTarget;
|
|||
// and related management
|
||||
class WindowSurfaceWaylandMB : public WindowSurface {
|
||||
public:
|
||||
explicit WindowSurfaceWaylandMB(RefPtr<nsWindow> aWindow);
|
||||
WindowSurfaceWaylandMB(RefPtr<nsWindow> aWindow,
|
||||
GtkCompositorWidget* aCompositorWidget);
|
||||
~WindowSurfaceWaylandMB() = default;
|
||||
|
||||
// Lock() / Commit() are called by gecko when Firefox
|
||||
|
@ -53,11 +54,16 @@ class WindowSurfaceWaylandMB : public WindowSurface {
|
|||
void HandlePartialUpdate(const MutexAutoLock& aProofOfLock,
|
||||
const LayoutDeviceIntRegion& aInvalidRegion);
|
||||
void IncrementBufferAge(const MutexAutoLock& aProofOfLock);
|
||||
// Return true if window size was updated.
|
||||
bool MaybeUpdateWindowSize();
|
||||
|
||||
mozilla::Mutex mSurfaceLock MOZ_UNANNOTATED;
|
||||
|
||||
RefPtr<nsWindow> mWindow;
|
||||
LayoutDeviceIntSize mMozContainerSize;
|
||||
// WindowSurfaceWaylandMB is owned by GtkCompositorWidget so we can't
|
||||
// reference it.
|
||||
GtkCompositorWidget* mCompositorWidget;
|
||||
LayoutDeviceIntSize mWindowSize;
|
||||
|
||||
RefPtr<WaylandBufferSHM> mInProgressBuffer;
|
||||
RefPtr<WaylandBufferSHM> mFrontBuffer;
|
||||
|
|
Загрузка…
Ссылка в новой задаче