зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
7e357dc268
Коммит
5e373d876a
|
@ -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(
|
||||
|
|
Загрузка…
Ссылка в новой задаче