Bug 1378697 - Release resources in WebRenderXXXLayer::ClearCachedResources() r=nical

This commit is contained in:
sotaro 2017-07-18 22:37:36 +09:00
parent 094c212d54
commit 7ceccd46b7
11 changed files with 95 additions and 9 deletions

View File

@ -84,8 +84,6 @@ TextureInfo ImageClientSingle::GetTextureInfo() const
void
ImageClientSingle::FlushAllImages()
{
MOZ_ASSERT(GetForwarder()->GetTextureForwarder()->UsesImageBridge());
for (auto& b : mBuffers) {
RemoveTexture(b.mTextureClient);
}

View File

@ -22,6 +22,7 @@ using namespace mozilla::gfx;
WebRenderBridgeChild::WebRenderBridgeChild(const wr::PipelineId& aPipelineId)
: mReadLockSequenceNumber(0)
, mIsInTransaction(false)
, mIsInClearCachedResources(false)
, mIdNamespace(0)
, mResourceId(0)
, mPipelineId(aPipelineId)
@ -57,7 +58,7 @@ WebRenderBridgeChild::ActorDestroy(ActorDestroyReason why)
void
WebRenderBridgeChild::AddWebRenderParentCommand(const WebRenderParentCommand& aCmd)
{
MOZ_ASSERT(mIsInTransaction);
MOZ_ASSERT(mIsInTransaction || mIsInClearCachedResources);
mParentCommands.AppendElement(aCmd);
}
@ -460,5 +461,19 @@ WebRenderBridgeChild::RecvWrUpdated(const uint32_t& aNewIdNameSpace)
return IPC_OK();
}
void
WebRenderBridgeChild::BeginClearCachedResources()
{
mIsInClearCachedResources = true;
SendClearCachedResources();
}
void
WebRenderBridgeChild::EndClearCachedResources()
{
ProcessWebRenderParentCommands();
mIsInClearCachedResources = false;
}
} // namespace layers
} // namespace mozilla

View File

@ -110,6 +110,9 @@ public:
void RemoveExpiredFontKeys();
void ClearReadLocks();
void BeginClearCachedResources();
void EndClearCachedResources();
private:
friend class CompositorBridgeChild;
@ -162,6 +165,7 @@ private:
nsTArray<nsTArray<ReadLockInit>> mReadLocks;
uint64_t mReadLockSequenceNumber;
bool mIsInTransaction;
bool mIsInClearCachedResources;
uint32_t mIdNamespace;
uint32_t mResourceId;
wr::PipelineId mPipelineId;

View File

@ -27,9 +27,15 @@ namespace layers {
WebRenderCanvasLayer::~WebRenderCanvasLayer()
{
MOZ_COUNT_DTOR(WebRenderCanvasLayer);
ClearWrResources();
}
void
WebRenderCanvasLayer::ClearWrResources()
{
if (mExternalImageId.isSome()) {
WrBridge()->DeallocExternalImageId(mExternalImageId.ref());
mExternalImageId = Nothing();
}
}
@ -97,5 +103,17 @@ WebRenderCanvasLayer::GetForwarder()
return WrManager()->WrBridge();
}
void
WebRenderCanvasLayer::ClearCachedResources()
{
ClearWrResources();
if (mBufferProvider) {
mBufferProvider->ClearCachedResources();
}
if (mCanvasClient) {
mCanvasClient->Clear();
}
}
} // namespace layers
} // namespace mozilla

View File

@ -33,9 +33,13 @@ public:
virtual void AttachCompositable() override;
virtual void ClearCachedResources() override;
protected:
virtual ~WebRenderCanvasLayer();
void ClearWrResources();
public:
Layer* GetLayer() override { return this; }
void RenderLayer(wr::DisplayListBuilder& aBuilder,

View File

@ -32,16 +32,23 @@ WebRenderImageLayer::WebRenderImageLayer(WebRenderLayerManager* aLayerManager)
WebRenderImageLayer::~WebRenderImageLayer()
{
MOZ_COUNT_DTOR(WebRenderImageLayer);
ClearWrResources();
}
void
WebRenderImageLayer::ClearWrResources()
{
if (mKey.isSome()) {
WrManager()->AddImageKeyForDiscard(mKey.value());
mKey = Nothing();
}
if (mExternalImageId.isSome()) {
WrBridge()->DeallocExternalImageId(mExternalImageId.ref());
mExternalImageId = Nothing();
}
if (mPipelineId.isSome()) {
WrBridge()->RemovePipelineIdForAsyncCompositable(mPipelineId.ref());
mPipelineId = Nothing();
}
}
@ -85,6 +92,7 @@ WebRenderImageLayer::GetAsSourceSurface()
void
WebRenderImageLayer::ClearCachedResources()
{
ClearWrResources();
if (mImageClient) {
mImageClient->ClearCachedResources();
}

View File

@ -38,6 +38,7 @@ public:
protected:
CompositableType GetImageClientType();
void ClearWrResources();
void AddWRVideoImage(size_t aChannelNumber);

View File

@ -746,6 +746,9 @@ void
WebRenderLayerManager::ClearLayer(Layer* aLayer)
{
aLayer->ClearCachedResources();
if (aLayer->GetMaskLayer()) {
aLayer->GetMaskLayer()->ClearCachedResources();
}
for (Layer* child = aLayer->GetFirstChild(); child;
child = child->GetNextSibling()) {
ClearLayer(child);
@ -755,12 +758,13 @@ WebRenderLayerManager::ClearLayer(Layer* aLayer)
void
WebRenderLayerManager::ClearCachedResources(Layer* aSubtree)
{
WrBridge()->SendClearCachedResources();
WrBridge()->BeginClearCachedResources();
if (aSubtree) {
ClearLayer(aSubtree);
} else if (mRoot) {
ClearLayer(mRoot);
}
WrBridge()->EndClearCachedResources();
}
void

View File

@ -163,5 +163,29 @@ WebRenderPaintedLayer::RenderLayer(wr::DisplayListBuilder& aBuilder,
CreateWebRenderDisplayList(aBuilder, aSc);
}
void
WebRenderPaintedLayer::ClearCachedResources()
{
ClearWrResources();
if (mImageClient) {
mImageClient->FlushAllImages();
mImageClient->ClearCachedResources();
}
if (mImageContainer) {
mImageContainer->ClearAllImages();
mImageContainer->ClearCachedResources();
}
ClearValidRegion();
}
void
WebRenderPaintedLayer::ClearWrResources()
{
if (mExternalImageId.isSome()) {
WrBridge()->DeallocExternalImageId(mExternalImageId.ref());
mExternalImageId = Nothing();
}
}
} // namespace layers
} // namespace mozilla

View File

@ -32,9 +32,7 @@ protected:
virtual ~WebRenderPaintedLayer()
{
MOZ_COUNT_DTOR(WebRenderPaintedLayer);
if (mExternalImageId.isSome()) {
WrBridge()->DeallocExternalImageId(mExternalImageId.ref());
}
ClearWrResources();
}
wr::MaybeExternalImageId mExternalImageId;
@ -49,6 +47,8 @@ public:
Layer* GetLayer() override { return this; }
void RenderLayer(wr::DisplayListBuilder& aBuilder,
const StackingContextHelper& aSc) override;
virtual void ClearCachedResources() override;
RefPtr<ImageContainer> mImageContainer;
RefPtr<ImageClient> mImageClient;
@ -57,6 +57,7 @@ private:
bool UpdateImageClient();
void CreateWebRenderDisplayList(wr::DisplayListBuilder& aBuilder,
const StackingContextHelper& aSc);
void ClearWrResources();
};
} // namespace layers

View File

@ -32,11 +32,17 @@ protected:
virtual ~WebRenderPaintedLayerBlob()
{
MOZ_COUNT_DTOR(WebRenderPaintedLayerBlob);
ClearWrResources();
}
void ClearWrResources()
{
if (mExternalImageId.isSome()) {
WrBridge()->DeallocExternalImageId(mExternalImageId.ref());
mExternalImageId = Nothing();
}
if (mImageKey.isSome()) {
WrManager()->AddImageKeyForDiscard(mImageKey.value());
mImageKey = Nothing();
}
}
@ -48,7 +54,10 @@ public:
mInvalidRegion.Add(aRegion);
UpdateValidRegionAfterInvalidRegionChanged();
}
virtual void ClearCachedResources() override
{
ClearWrResources();
}
Layer* GetLayer() override { return this; }
void RenderLayer(wr::DisplayListBuilder& aBuilder,
const StackingContextHelper& aSc) override;