mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 04:15:43 +00:00
Bug 1378697 - Release resources in WebRenderXXXLayer::ClearCachedResources() r=nical
This commit is contained in:
parent
094c212d54
commit
7ceccd46b7
@ -84,8 +84,6 @@ TextureInfo ImageClientSingle::GetTextureInfo() const
|
||||
void
|
||||
ImageClientSingle::FlushAllImages()
|
||||
{
|
||||
MOZ_ASSERT(GetForwarder()->GetTextureForwarder()->UsesImageBridge());
|
||||
|
||||
for (auto& b : mBuffers) {
|
||||
RemoveTexture(b.mTextureClient);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -38,6 +38,7 @@ public:
|
||||
|
||||
protected:
|
||||
CompositableType GetImageClientType();
|
||||
void ClearWrResources();
|
||||
|
||||
void AddWRVideoImage(size_t aChannelNumber);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user