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
55 lines
1.6 KiB
C++
55 lines
1.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/. */
|
|
|
|
#ifndef GFX_WEBRENDERCANVASRENDERER_H
|
|
#define GFX_WEBRENDERCANVASRENDERER_H
|
|
|
|
#include "mozilla/layers/RenderRootStateManager.h"
|
|
#include "ShareableCanvasRenderer.h"
|
|
|
|
namespace mozilla {
|
|
namespace layers {
|
|
|
|
class WebRenderCanvasRenderer : public ShareableCanvasRenderer {
|
|
public:
|
|
explicit WebRenderCanvasRenderer(RenderRootStateManager* aManager)
|
|
: mManager(aManager) {}
|
|
|
|
CompositableForwarder* GetForwarder() override;
|
|
RenderRootStateManager* GetRenderRootStateManager() { return mManager; }
|
|
|
|
protected:
|
|
RefPtr<RenderRootStateManager> mManager;
|
|
};
|
|
|
|
class WebRenderCanvasRendererAsync final : public WebRenderCanvasRenderer {
|
|
public:
|
|
explicit WebRenderCanvasRendererAsync(RenderRootStateManager* aManager)
|
|
: WebRenderCanvasRenderer(aManager) {}
|
|
virtual ~WebRenderCanvasRendererAsync();
|
|
|
|
WebRenderCanvasRendererAsync* AsWebRenderCanvasRendererAsync() override {
|
|
return this;
|
|
}
|
|
|
|
void Initialize(const CanvasRendererData& aData) override;
|
|
bool CreateCompositable() override;
|
|
|
|
void ClearCachedResources() override;
|
|
|
|
void UpdateCompositableClientForEmptyTransaction();
|
|
|
|
Maybe<wr::PipelineId> GetPipelineId() { return mPipelineId; }
|
|
|
|
protected:
|
|
Maybe<wr::PipelineId> mPipelineId;
|
|
};
|
|
|
|
} // namespace layers
|
|
} // namespace mozilla
|
|
|
|
#endif
|