bug 1733732 decreased the size of the display port on Android. When you scroll to the bottom of the page, the canvas leaves the display port. It triggers to destroy WebRenderCanvasData and WebRenderCanvasRendererAsync. And then RenderAndroidSurfaceTextureHost::NotifyNotUsed() is called and RenderAndroidSurfaceTextureHost is destroyed. Then if scrolling makes the canvas into the display port again, WebRenderCanvasData, WebRenderCanvasRendererAsync and RenderAndroidSurfaceTextureHost are recreated again. But there is no rendering update at SharedSurface_SurfaceTexture. Since the page does WebGL rendering only once during page load. It caused the problem to RenderAndroidSurfaceTextureHost. RenderAndroidSurfaceTextureHost::NotifyNotUsed() returns SurfaceTexture's buffer to client side. For using SurfaceTexture again in RenderAndroidSurfaceTextureHost, Client side needs to do re-rendering to SurfaceTexture. But SharedSurface_SurfaceTexture did nothing in this case. To address the problem, we could hold layers::CanvasRenderer in ClientWebGLContext::mNotLost. If WebRenderCanvasRendererAsync is kept alive, RenderAndroidSurfaceTextureHost::NotifyNotUsed() and destruction of WebRenderCanvasRendererAsync do not happen. Then if WebRenderCanvasData is re-created, the stored WebRenderCanvasRendererAsync is set in the new WebRenderCanvasData in ClientWebGLContext::UpdateWebRenderCanvasData(). Differential Revision: https://phabricator.services.mozilla.com/D143811
82 lines
2.6 KiB
C++
82 lines
2.6 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* 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/. */
|
|
|
|
#include "WebRenderCanvasRenderer.h"
|
|
|
|
#include "GLContext.h"
|
|
#include "GLScreenBuffer.h"
|
|
#include "mozilla/layers/CompositorBridgeChild.h"
|
|
#include "SharedSurfaceGL.h"
|
|
#include "WebRenderBridgeChild.h"
|
|
|
|
namespace mozilla {
|
|
namespace layers {
|
|
|
|
CompositableForwarder* WebRenderCanvasRenderer::GetForwarder() {
|
|
return mManager->WrBridge();
|
|
}
|
|
|
|
WebRenderCanvasRendererAsync::~WebRenderCanvasRendererAsync() {
|
|
if (mPipelineId.isSome()) {
|
|
mManager->RemovePipelineIdForCompositable(mPipelineId.ref());
|
|
mPipelineId.reset();
|
|
}
|
|
}
|
|
|
|
void WebRenderCanvasRendererAsync::Initialize(const CanvasRendererData& aData) {
|
|
WebRenderCanvasRenderer::Initialize(aData);
|
|
|
|
ClearCachedResources();
|
|
}
|
|
|
|
bool WebRenderCanvasRendererAsync::CreateCompositable() {
|
|
if (!mCanvasClient) {
|
|
auto compositableFlags = TextureFlags::NO_FLAGS;
|
|
if (!mData.mIsAlphaPremult) {
|
|
// WR needs this flag marked on the compositable, not just the texture.
|
|
compositableFlags |= TextureFlags::NON_PREMULTIPLIED;
|
|
}
|
|
mCanvasClient = new CanvasClient(GetForwarder(), compositableFlags);
|
|
mCanvasClient->Connect();
|
|
}
|
|
|
|
if (!mPipelineId) {
|
|
// Alloc async image pipeline id.
|
|
mPipelineId = Some(
|
|
mManager->WrBridge()->GetCompositorBridgeChild()->GetNextPipelineId());
|
|
mManager->AddPipelineIdForCompositable(
|
|
mPipelineId.ref(), mCanvasClient->GetIPCHandle(),
|
|
CompositableHandleOwner::WebRenderBridge);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void WebRenderCanvasRendererAsync::ClearCachedResources() {
|
|
if (mPipelineId.isSome()) {
|
|
mManager->RemovePipelineIdForCompositable(mPipelineId.ref());
|
|
mPipelineId.reset();
|
|
}
|
|
}
|
|
|
|
void WebRenderCanvasRendererAsync::
|
|
UpdateCompositableClientForEmptyTransaction() {
|
|
bool wasDirty = IsDirty();
|
|
UpdateCompositableClient();
|
|
if (wasDirty && mPipelineId.isSome()) {
|
|
// Notify an update of async image pipeline during empty transaction.
|
|
// During non empty transaction, WebRenderBridgeParent receives
|
|
// OpUpdateAsyncImagePipeline message, but during empty transaction, the
|
|
// message is not sent to WebRenderBridgeParent. Then
|
|
// OpUpdatedAsyncImagePipeline is used to notify the update.
|
|
mManager->AddWebRenderParentCommand(
|
|
OpUpdatedAsyncImagePipeline(mPipelineId.ref()));
|
|
}
|
|
}
|
|
|
|
} // namespace layers
|
|
} // namespace mozilla
|