void SharedBufferManagerChild::DeallocGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& aBuffer) { #ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC NS_ASSERTION(aBuffer.type() != mozilla::layers::MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle, "We shouldn't try to do IPC with real buffer"); if (aBuffer.type() != mozilla::layers::MaybeMagicGrallocBufferHandle::TGrallocBufferRef) { return; } #endif if (InSharedBufferManagerChildThread()) { return SharedBufferManagerChild::DeallocGrallocBufferNow(aBuffer); } GetMessageLoop()->PostTask(NewRunnableFunction(&DeallocGrallocBufferSync, aBuffer)); }
bool SharedBufferManagerParent::RecvDropGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& handle) { #ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC NS_ASSERTION(handle.type() == MaybeMagicGrallocBufferHandle::TGrallocBufferRef, "We shouldn't interact with the real buffer!"); int bufferKey = handle.get_GrallocBufferRef().mKey; sp<GraphicBuffer> buf = GetGraphicBuffer(bufferKey); MOZ_ASSERT(buf.get()); MutexAutoLock lock(mBuffersMutex); NS_ASSERTION(mBuffers.count(bufferKey) == 1, "No such buffer"); mBuffers.erase(bufferKey); if(!buf.get()) { printf_stderr("SharedBufferManagerParent::RecvDropGrallocBuffer -- invalid buffer key."); return true; } int bpp = 0; bpp = android::bytesPerPixel(buf->getPixelFormat()); if (bpp > 0) GrallocReporter::sAmount -= buf->getStride() * buf->getHeight() * bpp; else // Specical case for BSP specific formats(mainly YUV formats, count it as normal YUV buffer) GrallocReporter::sAmount -= buf->getStride() * buf->getHeight() * 3 / 2; #endif return true; }
void SharedBufferManagerChild::DropGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& aHandle) { #ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC int64_t bufferKey = -1; if (aHandle.type() == mozilla::layers::MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle) { bufferKey = aHandle.get_MagicGrallocBufferHandle().mRef.mKey; } else if (aHandle.type() == mozilla::layers::MaybeMagicGrallocBufferHandle::TGrallocBufferRef) { bufferKey = aHandle.get_GrallocBufferRef().mKey; } else { return; } { MutexAutoLock lock(mBufferMutex); mBuffers.erase(bufferKey); } #endif }
void SharedBufferManagerChild::DeallocGrallocBufferNow(const mozilla::layers::MaybeMagicGrallocBufferHandle& aBuffer) { #ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC NS_ASSERTION(aBuffer.type() != mozilla::layers::MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle, "We shouldn't try to do IPC with real buffer"); { MutexAutoLock lock(mBufferMutex); mBuffers.erase(aBuffer.get_GrallocBufferRef().mKey); } SendDropGrallocBuffer(aBuffer); #else NS_RUNTIMEABORT("No GrallocBuffer for you"); #endif }
bool SharedBufferManagerParent::RecvDropGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& handle) { #ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC NS_ASSERTION(handle.type() == MaybeMagicGrallocBufferHandle::TGrallocBufferRef, "We shouldn't interact with the real buffer!"); int64_t bufferKey = handle.get_GrallocBufferRef().mKey; sp<GraphicBuffer> buf = GetGraphicBuffer(bufferKey); MOZ_ASSERT(buf.get()); MutexAutoLock lock(mLock); NS_ASSERTION(mBuffers.count(bufferKey) == 1, "No such buffer"); mBuffers.erase(bufferKey); if(!buf.get()) { printf_stderr("SharedBufferManagerParent::RecvDropGrallocBuffer -- invalid buffer key."); return true; } #endif return true; }