Bug 1626142 - Fix canvas handling during resuming on Android r=jnicol

CanvasClientSharedSurface did not handle a case that CanvasClientSharedSurface was re-created, but GLScreenBuffer was not re-created. And RenderCompositorEGL::Pause() detaches all SurfaceTesxtures, but RenderAndroidSurfaceTextureHostOGL did not handle it.

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

--HG--
extra : moz-landing-system : lando
This commit is contained in:
sotaro 2020-04-14 14:07:30 +00:00
Родитель 7e357dc268
Коммит 5e373d876a
7 изменённых файлов: 54 добавлений и 6 удалений

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

@ -430,7 +430,17 @@ void CanvasClientSharedSurface::UpdateRenderer(gfx::IntSize aSize,
SharedSurface* surf = mShSurfClient->Surf();
if (!surf->IsBufferAvailable()) {
NS_WARNING("SharedSurface buffer not available, skip update");
// SharedSurface is already forwared to compositor side.
// SharedSurface::Commit() could not be called again.
// It happens only with SharedSurface_SurfaceTexture.
if (!mNewFront && !mFront) {
// This could happen when CanvasClientSharedSurface is re-created, but
// GLScreenBuffer is not re-created.
// See Bug 1626142
mNewFront = newFront;
} else {
NS_WARNING("SharedSurface buffer not available, skip update");
}
return;
}

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

@ -55,6 +55,13 @@ gfx::IntSize RenderAndroidSurfaceTextureHostOGL::GetSize(
wr::WrExternalImage RenderAndroidSurfaceTextureHostOGL::Lock(
uint8_t aChannelIndex, gl::GLContext* aGL, wr::ImageRendering aRendering) {
MOZ_ASSERT(aChannelIndex == 0);
MOZ_ASSERT((mPrepareStatus == STATUS_PREPARED) ||
(!mSurfTex->IsSingleBuffer() &&
mPrepareStatus == STATUS_UPDATE_TEX_IMAGE_NEEDED));
if (!EnsureAttachedToGLContext()) {
return InvalidToWrExternalImage();
}
if (mGL.get() != aGL) {
// This should not happen. On android, SharedGL is used.
@ -66,11 +73,6 @@ wr::WrExternalImage RenderAndroidSurfaceTextureHostOGL::Lock(
return InvalidToWrExternalImage();
}
MOZ_ASSERT(mAttachedToGLContext);
if (!mAttachedToGLContext) {
return InvalidToWrExternalImage();
}
if (IsFilterUpdateNecessary(aRendering)) {
// Cache new rendering filter.
mCachedRendering = aRendering;
@ -101,6 +103,10 @@ void RenderAndroidSurfaceTextureHostOGL::DeleteTextureHandle() {
NotifyNotUsed();
}
void RenderAndroidSurfaceTextureHostOGL::DetachedFromGLContext() {
mAttachedToGLContext = false;
}
bool RenderAndroidSurfaceTextureHostOGL::EnsureAttachedToGLContext() {
// During handling WebRenderError, GeckoSurfaceTexture should not be attached
// to GLContext.

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

@ -31,6 +31,13 @@ class RenderAndroidSurfaceTextureHostOGL final : public RenderTextureHostOGL {
virtual void PrepareForUse() override;
virtual void NotifyNotUsed() override;
void DetachedFromGLContext();
virtual RenderAndroidSurfaceTextureHostOGL*
AsRenderAndroidSurfaceTextureHostOGL() override {
return this;
}
private:
virtual ~RenderAndroidSurfaceTextureHostOGL();
void DeleteTextureHandle();

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

@ -103,6 +103,7 @@ void RenderCompositorEGL::Pause() {
#ifdef MOZ_WIDGET_ANDROID
java::GeckoSurfaceTexture::DestroyUnused((int64_t)gl());
java::GeckoSurfaceTexture::DetachAllFromGLContext((int64_t)gl());
RenderThread::Get()->NotifyAllAndroidSurfaceTexturesDetatched();
#endif
DestroyEGLSurface();
}

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

@ -22,6 +22,7 @@ class GLContext;
namespace wr {
class RenderAndroidSurfaceTextureHostOGL;
class RenderDXGITextureHostOGL;
class RenderBufferTextureHost;
class RenderTextureHostOGL;
@ -54,6 +55,11 @@ class RenderTextureHost {
return nullptr;
}
virtual RenderAndroidSurfaceTextureHostOGL*
AsRenderAndroidSurfaceTextureHostOGL() {
return nullptr;
}
protected:
virtual ~RenderTextureHost();

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

@ -32,6 +32,7 @@
#ifdef MOZ_WIDGET_ANDROID
# include "GLLibraryEGL.h"
# include "GeneratedJNIWrappers.h"
# include "mozilla/webrender/RenderAndroidSurfaceTextureHostOGL.h"
#endif
#ifdef MOZ_WIDGET_GTK
@ -719,6 +720,20 @@ void RenderThread::UnregisterExternalImageDuringShutdown(
mRenderTextures.erase(aExternalImageId);
}
void RenderThread::NotifyAllAndroidSurfaceTexturesDetatched() {
MOZ_ASSERT(IsInRenderThread());
#ifdef MOZ_WIDGET_ANDROID
MutexAutoLock lock(mRenderTextureMapLock);
for (const auto& entry : mRenderTextures) {
RenderAndroidSurfaceTextureHostOGL* host =
entry.second->AsRenderAndroidSurfaceTextureHostOGL();
if (host) {
host->DetachedFromGLContext();
}
}
#endif
}
void RenderThread::HandlePrepareForUse() {
MOZ_ASSERT(IsInRenderThread());
MutexAutoLock lock(mRenderTextureMapLock);

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

@ -264,6 +264,9 @@ class RenderThread final {
/// Can only be called from the render thread.
bool IsHandlingWebRenderError();
/// Can only be called from the render thread.
void NotifyAllAndroidSurfaceTexturesDetatched();
size_t RendererCount();
void SetCompositionRecorderForWindow(