Bug 1591523 - Move existing NativeLayer management into RenderCompositorOGL. r=sotaro

Differential Revision: https://phabricator.services.mozilla.com/D50724

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Markus Stange 2019-10-29 20:50:33 +00:00
Родитель 67f934d684
Коммит f2c9430255
9 изменённых файлов: 39 добавлений и 43 удалений

Просмотреть файл

@ -19,7 +19,6 @@ class GLContext;
} }
namespace layers { namespace layers {
class NativeLayer;
class SyncObjectHost; class SyncObjectHost;
} // namespace layers } // namespace layers
@ -37,7 +36,7 @@ class RenderCompositor {
RenderCompositor(RefPtr<widget::CompositorWidget>&& aWidget); RenderCompositor(RefPtr<widget::CompositorWidget>&& aWidget);
virtual ~RenderCompositor(); virtual ~RenderCompositor();
virtual bool BeginFrame(layers::NativeLayer* aNativeLayer) = 0; virtual bool BeginFrame() = 0;
virtual void EndFrame() = 0; virtual void EndFrame() = 0;
// Returns false when waiting gpu tasks is failed. // Returns false when waiting gpu tasks is failed.
// It might happen when rendering context is lost. // It might happen when rendering context is lost.

Просмотреть файл

@ -349,8 +349,7 @@ RefPtr<IDXGISwapChain1> RenderCompositorANGLE::CreateSwapChainForDComp(
return nullptr; return nullptr;
} }
bool RenderCompositorANGLE::BeginFrame(layers::NativeLayer* aNativeLayer) { bool RenderCompositorANGLE::BeginFrame() {
MOZ_RELEASE_ASSERT(!aNativeLayer, "Unexpected native layer on this platform");
mWidget->AsWindows()->UpdateCompositorWndSizeIfNecessary(); mWidget->AsWindows()->UpdateCompositorWndSizeIfNecessary();
if (mDCLayerTree) { if (mDCLayerTree) {

Просмотреть файл

@ -39,7 +39,7 @@ class RenderCompositorANGLE : public RenderCompositor {
virtual ~RenderCompositorANGLE(); virtual ~RenderCompositorANGLE();
bool Initialize(); bool Initialize();
bool BeginFrame(layers::NativeLayer* aNativeLayer) override; bool BeginFrame() override;
void EndFrame() override; void EndFrame() override;
bool WaitForGPU() override; bool WaitForGPU() override;
void Pause() override; void Pause() override;

Просмотреть файл

@ -63,8 +63,7 @@ RenderCompositorEGL::~RenderCompositorEGL() {
DestroyEGLSurface(); DestroyEGLSurface();
} }
bool RenderCompositorEGL::BeginFrame(layers::NativeLayer* aNativeLayer) { bool RenderCompositorEGL::BeginFrame() {
MOZ_RELEASE_ASSERT(!aNativeLayer, "Unexpected native layer on this platform");
#ifdef MOZ_WAYLAND #ifdef MOZ_WAYLAND
bool newSurface = bool newSurface =
mWidget->AsX11() && mWidget->AsX11()->WaylandRequestsUpdatingEGLSurface(); mWidget->AsX11() && mWidget->AsX11()->WaylandRequestsUpdatingEGLSurface();

Просмотреть файл

@ -22,7 +22,7 @@ class RenderCompositorEGL : public RenderCompositor {
explicit RenderCompositorEGL(RefPtr<widget::CompositorWidget> aWidget); explicit RenderCompositorEGL(RefPtr<widget::CompositorWidget> aWidget);
virtual ~RenderCompositorEGL(); virtual ~RenderCompositorEGL();
bool BeginFrame(layers::NativeLayer* aNativeLayer) override; bool BeginFrame() override;
void EndFrame() override; void EndFrame() override;
void Pause() override; void Pause() override;
bool Resume() override; bool Resume() override;

Просмотреть файл

@ -32,12 +32,28 @@ RenderCompositorOGL::RenderCompositorOGL(
RefPtr<gl::GLContext>&& aGL, RefPtr<widget::CompositorWidget>&& aWidget) RefPtr<gl::GLContext>&& aGL, RefPtr<widget::CompositorWidget>&& aWidget)
: RenderCompositor(std::move(aWidget)), : RenderCompositor(std::move(aWidget)),
mGL(aGL), mGL(aGL),
mNativeLayerRoot(GetWidget()->GetNativeLayerRoot()),
mPreviousFrameDoneSync(nullptr), mPreviousFrameDoneSync(nullptr),
mThisFrameDoneSync(nullptr) { mThisFrameDoneSync(nullptr) {
MOZ_ASSERT(mGL); MOZ_ASSERT(mGL);
if (mNativeLayerRoot) {
mNativeLayerForEntireWindow = mNativeLayerRoot->CreateLayer();
mNativeLayerForEntireWindow->SetSurfaceIsFlipped(true);
mNativeLayerForEntireWindow->SetGLContext(mGL);
mNativeLayerRoot->AppendLayer(mNativeLayerForEntireWindow);
}
} }
RenderCompositorOGL::~RenderCompositorOGL() { RenderCompositorOGL::~RenderCompositorOGL() {
if (mNativeLayerRoot) {
if (mNativeLayerForEntireWindow) {
mNativeLayerRoot->RemoveLayer(mNativeLayerForEntireWindow);
mNativeLayerForEntireWindow = nullptr;
}
mNativeLayerRoot = nullptr;
}
if (!mGL->MakeCurrent()) { if (!mGL->MakeCurrent()) {
gfxCriticalNote gfxCriticalNote
<< "Failed to make render context current during destroying."; << "Failed to make render context current during destroying.";
@ -55,21 +71,21 @@ RenderCompositorOGL::~RenderCompositorOGL() {
} }
} }
bool RenderCompositorOGL::BeginFrame(layers::NativeLayer* aNativeLayer) { bool RenderCompositorOGL::BeginFrame() {
if (!mGL->MakeCurrent()) { if (!mGL->MakeCurrent()) {
gfxCriticalNote << "Failed to make render context current, can't draw."; gfxCriticalNote << "Failed to make render context current, can't draw.";
return false; return false;
} }
if (aNativeLayer) { if (mNativeLayerForEntireWindow) {
aNativeLayer->SetSurfaceIsFlipped(true); gfx::IntRect bounds({}, GetBufferSize().ToUnknownSize());
aNativeLayer->SetGLContext(mGL); mNativeLayerForEntireWindow->SetRect(bounds);
Maybe<GLuint> fbo = aNativeLayer->NextSurfaceAsFramebuffer(true); Maybe<GLuint> fbo =
mNativeLayerForEntireWindow->NextSurfaceAsFramebuffer(true);
if (!fbo) { if (!fbo) {
return false; return false;
} }
mGL->fBindFramebuffer(LOCAL_GL_FRAMEBUFFER, *fbo); mGL->fBindFramebuffer(LOCAL_GL_FRAMEBUFFER, *fbo);
mCurrentNativeLayer = aNativeLayer;
} else { } else {
mGL->fBindFramebuffer(LOCAL_GL_FRAMEBUFFER, mGL->GetDefaultFramebuffer()); mGL->fBindFramebuffer(LOCAL_GL_FRAMEBUFFER, mGL->GetDefaultFramebuffer());
} }
@ -81,9 +97,8 @@ void RenderCompositorOGL::EndFrame() {
InsertFrameDoneSync(); InsertFrameDoneSync();
mGL->SwapBuffers(); mGL->SwapBuffers();
if (mCurrentNativeLayer) { if (mNativeLayerForEntireWindow) {
mCurrentNativeLayer->NotifySurfaceReady(); mNativeLayerForEntireWindow->NotifySurfaceReady();
mCurrentNativeLayer = nullptr;
} }
} }

Просмотреть файл

@ -11,6 +11,11 @@
namespace mozilla { namespace mozilla {
namespace layers {
class NativeLayerRoot;
class NativeLayer;
} // namespace layers
namespace wr { namespace wr {
class RenderCompositorOGL : public RenderCompositor { class RenderCompositorOGL : public RenderCompositor {
@ -22,7 +27,7 @@ class RenderCompositorOGL : public RenderCompositor {
RefPtr<widget::CompositorWidget>&& aWidget); RefPtr<widget::CompositorWidget>&& aWidget);
virtual ~RenderCompositorOGL(); virtual ~RenderCompositorOGL();
bool BeginFrame(layers::NativeLayer* aNativeLayer) override; bool BeginFrame() override;
void EndFrame() override; void EndFrame() override;
bool WaitForGPU() override; bool WaitForGPU() override;
void Pause() override; void Pause() override;
@ -39,10 +44,9 @@ class RenderCompositorOGL : public RenderCompositor {
RefPtr<gl::GLContext> mGL; RefPtr<gl::GLContext> mGL;
// The native layer that we're currently rendering to, if any. // Can be null.
// Non-null only between BeginFrame and EndFrame if BeginFrame has been called RefPtr<layers::NativeLayerRoot> mNativeLayerRoot;
// with a non-null aNativeLayer. RefPtr<layers::NativeLayer> mNativeLayerForEntireWindow;
RefPtr<layers::NativeLayer> mCurrentNativeLayer;
// Used to apply back-pressure in WaitForGPU(). // Used to apply back-pressure in WaitForGPU().
GLsync mPreviousFrameDoneSync; GLsync mPreviousFrameDoneSync;

Просмотреть файл

@ -58,12 +58,6 @@ RendererOGL::RendererOGL(RefPtr<RenderThread>&& aThread,
MOZ_ASSERT(mRenderer); MOZ_ASSERT(mRenderer);
MOZ_ASSERT(mBridge); MOZ_ASSERT(mBridge);
MOZ_COUNT_CTOR(RendererOGL); MOZ_COUNT_CTOR(RendererOGL);
mNativeLayerRoot = mCompositor->GetWidget()->GetNativeLayerRoot();
if (mNativeLayerRoot) {
mNativeLayerForEntireWindow = mNativeLayerRoot->CreateLayer();
mNativeLayerRoot->AppendLayer(mNativeLayerForEntireWindow);
}
} }
RendererOGL::~RendererOGL() { RendererOGL::~RendererOGL() {
@ -74,11 +68,6 @@ RendererOGL::~RendererOGL() {
// Leak resources! // Leak resources!
return; return;
} }
if (mNativeLayerRoot) {
mNativeLayerRoot->RemoveLayer(mNativeLayerForEntireWindow);
mNativeLayerForEntireWindow = nullptr;
mNativeLayerRoot = nullptr;
}
wr_renderer_delete(mRenderer); wr_renderer_delete(mRenderer);
} }
@ -120,12 +109,7 @@ bool RendererOGL::UpdateAndRender(const Maybe<gfx::IntSize>& aReadbackSize,
} }
// XXX set clear color if MOZ_WIDGET_ANDROID is defined. // XXX set clear color if MOZ_WIDGET_ANDROID is defined.
if (mNativeLayerForEntireWindow) { if (!mCompositor->BeginFrame()) {
gfx::IntRect bounds({}, mCompositor->GetBufferSize().ToUnknownSize());
mNativeLayerForEntireWindow->SetRect(bounds);
}
if (!mCompositor->BeginFrame(mNativeLayerForEntireWindow)) {
if (mCompositor->IsContextLost()) { if (mCompositor->IsContextLost()) {
RenderThread::Get()->HandleDeviceReset("BeginFrame", /* aNotify */ true); RenderThread::Get()->HandleDeviceReset("BeginFrame", /* aNotify */ true);
} }

Просмотреть файл

@ -26,8 +26,6 @@ class GLContext;
namespace layers { namespace layers {
class CompositorBridgeParent; class CompositorBridgeParent;
class NativeLayerRoot;
class NativeLayer;
class SyncObjectHost; class SyncObjectHost;
} // namespace layers } // namespace layers
@ -108,8 +106,6 @@ class RendererOGL {
protected: protected:
RefPtr<RenderThread> mThread; RefPtr<RenderThread> mThread;
UniquePtr<RenderCompositor> mCompositor; UniquePtr<RenderCompositor> mCompositor;
RefPtr<layers::NativeLayerRoot> mNativeLayerRoot;
RefPtr<layers::NativeLayer> mNativeLayerForEntireWindow;
wr::Renderer* mRenderer; wr::Renderer* mRenderer;
layers::CompositorBridgeParent* mBridge; layers::CompositorBridgeParent* mBridge;
wr::WindowId mWindowId; wr::WindowId mWindowId;