From e4b5d681101a8c6660c159d10c361d4ea9336c09 Mon Sep 17 00:00:00 2001 From: Sotaro Ikeda Date: Tue, 25 Mar 2014 18:28:47 -0700 Subject: [PATCH] Bug 986933 - Add DeallocGrallocBuffer() r=nical --- gfx/layers/ipc/ISurfaceAllocator.h | 7 ++++- gfx/layers/ipc/ImageBridgeChild.cpp | 47 ++++++++++++++++++++++++++++++ gfx/layers/ipc/ImageBridgeChild.h | 2 ++ gfx/layers/ipc/ShadowLayerUtilsGralloc.cpp | 9 +++++- gfx/layers/ipc/ShadowLayers.h | 2 ++ 5 files changed, 65 insertions(+), 2 deletions(-) diff --git a/gfx/layers/ipc/ISurfaceAllocator.h b/gfx/layers/ipc/ISurfaceAllocator.h index 5e846ae99609..907cb293a96d 100644 --- a/gfx/layers/ipc/ISurfaceAllocator.h +++ b/gfx/layers/ipc/ISurfaceAllocator.h @@ -160,6 +160,11 @@ public: return nullptr; } + virtual void DeallocGrallocBuffer(PGrallocBufferChild* aChild) + { + NS_RUNTIMEABORT("should not be called"); + } + virtual bool IPCOpen() const { return true; } virtual bool IsSameProcess() const = 0; @@ -170,7 +175,7 @@ protected: // this method is needed for a temporary fix, will be removed after // DeprecatedTextureClient/Host rework. virtual bool IsOnCompositorSide() const = 0; - static bool PlatformDestroySharedSurface(SurfaceDescriptor* aSurface); + bool PlatformDestroySharedSurface(SurfaceDescriptor* aSurface); virtual bool PlatformAllocSurfaceDescriptor(const gfx::IntSize& aSize, gfxContentType aContent, uint32_t aCaps, diff --git a/gfx/layers/ipc/ImageBridgeChild.cpp b/gfx/layers/ipc/ImageBridgeChild.cpp index 7b5d4d733986..18214065521c 100644 --- a/gfx/layers/ipc/ImageBridgeChild.cpp +++ b/gfx/layers/ipc/ImageBridgeChild.cpp @@ -936,6 +936,53 @@ ImageBridgeChild::AllocGrallocBuffer(const IntSize& aSize, #endif } +static void ProxyDeallocGrallocBufferNow(ISurfaceAllocator* aAllocator, + PGrallocBufferChild* aChild, + ReentrantMonitor* aBarrier, + bool* aDone) +{ + MOZ_ASSERT(aChild); + MOZ_ASSERT(aDone); + MOZ_ASSERT(aBarrier); + +#ifdef MOZ_WIDGET_GONK + PGrallocBufferChild::Send__delete__(aChild); +#else + NS_RUNTIMEABORT("not implemented"); +#endif + + ReentrantMonitorAutoEnter autoMon(*aBarrier); + *aDone = true; + aBarrier->NotifyAll(); +} + +void +ImageBridgeChild::DeallocGrallocBuffer(PGrallocBufferChild* aChild) +{ + MOZ_ASSERT(aChild); + if (InImageBridgeChildThread()) { +#ifdef MOZ_WIDGET_GONK + PGrallocBufferChild::Send__delete__(aChild); +#else + NS_RUNTIMEABORT("not implemented"); +#endif + } else { + ReentrantMonitor barrier("AllocatorProxy Dealloc"); + ReentrantMonitorAutoEnter autoMon(barrier); + + bool done = false; + GetMessageLoop()->PostTask(FROM_HERE, + NewRunnableFunction(&ProxyDeallocGrallocBufferNow, + this, + aChild, + &barrier, + &done)); + while (!done) { + barrier.Wait(); + } + } +} + PTextureChild* ImageBridgeChild::AllocPTextureChild(const SurfaceDescriptor&, const TextureFlags&) diff --git a/gfx/layers/ipc/ImageBridgeChild.h b/gfx/layers/ipc/ImageBridgeChild.h index f9b63bf6f782..2f11d15b6ff4 100644 --- a/gfx/layers/ipc/ImageBridgeChild.h +++ b/gfx/layers/ipc/ImageBridgeChild.h @@ -396,6 +396,8 @@ protected: virtual PGrallocBufferChild* AllocGrallocBuffer(const gfx::IntSize& aSize, uint32_t aFormat, uint32_t aUsage, MaybeMagicGrallocBufferHandle* aHandle) MOZ_OVERRIDE; + + virtual void DeallocGrallocBuffer(PGrallocBufferChild* aChild) MOZ_OVERRIDE; }; } // layers diff --git a/gfx/layers/ipc/ShadowLayerUtilsGralloc.cpp b/gfx/layers/ipc/ShadowLayerUtilsGralloc.cpp index 74ff53bbb37d..4bdc08550d81 100644 --- a/gfx/layers/ipc/ShadowLayerUtilsGralloc.cpp +++ b/gfx/layers/ipc/ShadowLayerUtilsGralloc.cpp @@ -362,7 +362,7 @@ ISurfaceAllocator::PlatformDestroySharedSurface(SurfaceDescriptor* aSurface) } else { PGrallocBufferChild* gbc = aSurface->get_SurfaceDescriptorGralloc().bufferChild(); - unused << PGrallocBufferChild::Send__delete__(gbc); + DeallocGrallocBuffer(gbc); } *aSurface = SurfaceDescriptor(); @@ -396,6 +396,13 @@ ShadowLayerForwarder::AllocGrallocBuffer(const gfx::IntSize& aSize, return mShadowManager->SendPGrallocBufferConstructor(aSize, aFormat, aUsage, aHandle); } +void +ShadowLayerForwarder::DeallocGrallocBuffer(PGrallocBufferChild* aChild) +{ + MOZ_ASSERT(aChild); + PGrallocBufferChild::Send__delete__(aChild); +} + bool ISurfaceAllocator::PlatformAllocSurfaceDescriptor(const gfx::IntSize& aSize, gfxContentType aContent, diff --git a/gfx/layers/ipc/ShadowLayers.h b/gfx/layers/ipc/ShadowLayers.h index ced2fa1118f2..be16b9f37b40 100644 --- a/gfx/layers/ipc/ShadowLayers.h +++ b/gfx/layers/ipc/ShadowLayers.h @@ -422,6 +422,8 @@ protected: uint32_t aFormat, uint32_t aUsage, MaybeMagicGrallocBufferHandle* aHandle) MOZ_OVERRIDE; + + virtual void DeallocGrallocBuffer(PGrallocBufferChild* aChild) MOZ_OVERRIDE; #endif private: -- 2.11.4.GIT