fune/widget/android/AndroidCompositorWidget.h
Jamie Nicol 3b0edb46fc Bug 1783542 - Use widget size from ResumeAndResize rather than querying native window. r=gfx-reviewers,aosmond
On Android we have until now determined the compositor widget's size
by querying the values from the ANativeWindow. However, since bug
1780093 landed we can now switch between which Surface we are
rendering in to, and as a result we appear to be using the wrong size
some of the time.

This patch is a speculative attempt to fix this, by using the size
passed to ResumeAndResize() (which itself comes from the Surface's
surfaceChanged() callback) rather than querying the window.

Differential Revision: https://phabricator.services.mozilla.com/D154909
2022-08-18 12:16:46 +00:00

70 lines
2.2 KiB
C++

/* -*- Mode: c++; c-basic-offset: 2; tab-width: 20; indent-tabs-mode: nil; -*-
* 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/. */
#ifndef mozilla_widget_AndroidCompositorWidget_h
#define mozilla_widget_AndroidCompositorWidget_h
#include "CompositorWidget.h"
#include "AndroidNativeWindow.h"
#include "GLDefs.h"
namespace mozilla {
namespace widget {
class PlatformCompositorWidgetDelegate : public CompositorWidgetDelegate {
public:
virtual void NotifyClientSizeChanged(
const LayoutDeviceIntSize& aClientSize) = 0;
// CompositorWidgetDelegate Overrides
PlatformCompositorWidgetDelegate* AsPlatformSpecificDelegate() override {
return this;
}
};
class AndroidCompositorWidgetInitData;
class AndroidCompositorWidget : public CompositorWidget {
public:
AndroidCompositorWidget(const AndroidCompositorWidgetInitData& aInitData,
const layers::CompositorOptions& aOptions);
~AndroidCompositorWidget() override;
EGLNativeWindowType GetEGLNativeWindow();
// CompositorWidget overrides
already_AddRefed<gfx::DrawTarget> StartRemoteDrawingInRegion(
const LayoutDeviceIntRegion& aInvalidRegion,
layers::BufferMode* aBufferMode) override;
void EndRemoteDrawingInRegion(
gfx::DrawTarget* aDrawTarget,
const LayoutDeviceIntRegion& aInvalidRegion) override;
bool OnResumeComposition() override;
AndroidCompositorWidget* AsAndroid() override { return this; }
LayoutDeviceIntSize GetClientSize() override;
void NotifyClientSizeChanged(const LayoutDeviceIntSize& aClientSize);
protected:
int32_t mWidgetId;
java::sdk::Surface::GlobalRef mSurface;
ANativeWindow* mNativeWindow;
ANativeWindow_Buffer mBuffer;
int32_t mFormat;
LayoutDeviceIntSize mClientSize;
private:
// Called whenever the compositor surface may have changed. The derived class
// should update mSurface to the new compositor surface.
virtual void OnCompositorSurfaceChanged() = 0;
};
} // namespace widget
} // namespace mozilla
#endif // mozilla_widget_AndroidCompositorWidget_h