void GrallocTextureHostOGL::DeallocateSharedData() { if (mTilingTextureSource) { mTilingTextureSource->ForgetBuffer(); mTilingTextureSource = nullptr; } if (mGLTextureSource) { mGLTextureSource = nullptr; } DestroyEGLImage(); if (mGrallocHandle.buffer().type() != SurfaceDescriptor::Tnull_t) { MaybeMagicGrallocBufferHandle handle = mGrallocHandle.buffer(); base::ProcessId owner; if (handle.type() == MaybeMagicGrallocBufferHandle::TGrallocBufferRef) { owner = handle.get_GrallocBufferRef().mOwner; } else { owner = handle.get_MagicGrallocBufferHandle().mRef.mOwner; } SharedBufferManagerParent::DropGrallocBuffer(owner, mGrallocHandle); } }
void SharedBufferManagerParent::DropGrallocBufferImpl(mozilla::layers::SurfaceDescriptor aDesc) { MutexAutoLock lock(mLock); if (mDestroyed) { return; } #ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC int64_t key = -1; MaybeMagicGrallocBufferHandle handle; if (aDesc.type() == SurfaceDescriptor::TSurfaceDescriptorGralloc) { handle = aDesc.get_SurfaceDescriptorGralloc().buffer(); } else { return; } if (handle.type() == MaybeMagicGrallocBufferHandle::TGrallocBufferRef) { key = handle.get_GrallocBufferRef().mKey; } else if (handle.type() == MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle) { key = handle.get_MagicGrallocBufferHandle().mRef.mKey; } NS_ASSERTION(key != -1, "Invalid buffer key"); NS_ASSERTION(mBuffers.count(key) == 1, "No such buffer"); mBuffers.erase(key); mozilla::Unused << SendDropGrallocBuffer(handle); #endif }
bool ShadowLayerForwarder::PlatformAllocBuffer(const gfxIntSize& aSize, gfxASurface::gfxContentType aContent, uint32_t aCaps, SurfaceDescriptor* aBuffer) { // Some GL implementations fail to render gralloc textures with // width < 64. There's not much point in gralloc'ing buffers that // small anyway, so fall back on shared memory plus a texture // upload. if (aSize.width < 64) { return false; } SAMPLE_LABEL("ShadowLayerForwarder", "PlatformAllocBuffer"); // Gralloc buffers are efficiently mappable as gfxImageSurface, so // no need to check |aCaps & MAP_AS_IMAGE_SURFACE|. MaybeMagicGrallocBufferHandle handle; PGrallocBufferChild* gc = mShadowManager->SendPGrallocBufferConstructor(aSize, aContent, &handle); if (!gc) { NS_ERROR("GrallocBufferConstructor failed by returned null"); return false; } else if (handle.Tnull_t == handle.type()) { NS_ERROR("GrallocBufferConstructor failed by returning handle with type Tnull_t"); PGrallocBufferChild::Send__delete__(gc); return false; } GrallocBufferActor* gba = static_cast<GrallocBufferActor*>(gc); gba->InitFromHandle(handle.get_MagicGrallocBufferHandle()); *aBuffer = SurfaceDescriptorGralloc(nullptr, gc, aSize, /* external */ false); return true; }
bool ISurfaceAllocator::PlatformAllocSurfaceDescriptor(const gfxIntSize& aSize, gfxASurface::gfxContentType aContent, uint32_t aCaps, SurfaceDescriptor* aBuffer) { // Some GL implementations fail to render gralloc textures with // width < 64. There's not much point in gralloc'ing buffers that // small anyway, so fall back on shared memory plus a texture // upload. if (aSize.width < 64) { return false; } PROFILER_LABEL("ShadowLayerForwarder", "PlatformAllocSurfaceDescriptor"); // Gralloc buffers are efficiently mappable as gfxImageSurface, so // no need to check |aCaps & MAP_AS_IMAGE_SURFACE|. MaybeMagicGrallocBufferHandle handle; PGrallocBufferChild* gc; bool defaultRBSwap; if (aCaps & USING_GL_RENDERING_ONLY) { gc = AllocGrallocBuffer(aSize, PixelFormatForContentType(aContent), GraphicBuffer::USAGE_HW_RENDER | GraphicBuffer::USAGE_HW_TEXTURE, &handle); // If you're allocating for USING_GL_RENDERING_ONLY, then we don't flag // this for RB swap. defaultRBSwap = false; } else { gc = AllocGrallocBuffer(aSize, PixelFormatForContentType(aContent), GraphicBuffer::USAGE_SW_READ_OFTEN | GraphicBuffer::USAGE_SW_WRITE_OFTEN | GraphicBuffer::USAGE_HW_TEXTURE, &handle); // But if you're allocating for non-GL-only rendering, we flag for // RB swap to preserve old behaviour and proper interaction with // cairo. defaultRBSwap = true; } if (!gc) { NS_ERROR("GrallocBufferConstructor failed by returned null"); return false; } else if (handle.Tnull_t == handle.type()) { NS_ERROR("GrallocBufferConstructor failed by returning handle with type Tnull_t"); PGrallocBufferChild::Send__delete__(gc); return false; } GrallocBufferActor* gba = static_cast<GrallocBufferActor*>(gc); gba->InitFromHandle(handle.get_MagicGrallocBufferHandle()); *aBuffer = SurfaceDescriptorGralloc(nullptr, gc, aSize, /* external */ false, defaultRBSwap); return true; }
/*static*/ sp<GraphicBuffer> GetGraphicBufferFrom(MaybeMagicGrallocBufferHandle aHandle) { if (aHandle.type() != MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle) { if (aHandle.type() == MaybeMagicGrallocBufferHandle::TGrallocBufferRef) { if (XRE_IsParentProcess()) { return SharedBufferManagerParent::GetGraphicBuffer(aHandle.get_GrallocBufferRef()); } return SharedBufferManagerChild::GetSingleton()->GetGraphicBuffer(aHandle.get_GrallocBufferRef().mKey); } } else { MagicGrallocBufferHandle realHandle = aHandle.get_MagicGrallocBufferHandle(); return realHandle.mGraphicBuffer; } return nullptr; }
void GrallocTextureHostBasic::DeallocateSharedData() { ClearTextureSource(); if (mGrallocHandle.buffer().type() != MaybeMagicGrallocBufferHandle::Tnull_t) { MaybeMagicGrallocBufferHandle handle = mGrallocHandle.buffer(); base::ProcessId owner; if (handle.type() == MaybeMagicGrallocBufferHandle::TGrallocBufferRef) { owner = handle.get_GrallocBufferRef().mOwner; } else { owner = handle.get_MagicGrallocBufferHandle().mRef.mOwner; } SharedBufferManagerParent::DropGrallocBuffer(owner, mGrallocHandle); } }
void SharedBufferManagerParent::DropGrallocBufferImpl(mozilla::layers::SurfaceDescriptor aDesc) { #ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC MutexAutoLock lock(mBuffersMutex); int key = -1; MaybeMagicGrallocBufferHandle handle; if (aDesc.type() == SurfaceDescriptor::TNewSurfaceDescriptorGralloc) handle = aDesc.get_NewSurfaceDescriptorGralloc().buffer(); else return; if (handle.type() == MaybeMagicGrallocBufferHandle::TGrallocBufferRef) key = handle.get_GrallocBufferRef().mKey; else if (handle.type() == MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle) key = handle.get_MagicGrallocBufferHandle().mRef.mKey; NS_ASSERTION(key != -1, "Invalid buffer key"); NS_ASSERTION(mBuffers.count(key) == 1, "No such buffer"); mBuffers.erase(key); SendDropGrallocBuffer(handle); #endif }
bool ShadowLayerForwarder::PlatformAllocBuffer(const gfxIntSize& aSize, gfxASurface::gfxContentType aContent, uint32_t aCaps, SurfaceDescriptor* aBuffer) { SAMPLE_LABEL("ShadowLayerForwarder", "PlatformAllocBuffer"); // Gralloc buffers are efficiently mappable as gfxImageSurface, so // no need to check |aCaps & MAP_AS_IMAGE_SURFACE|. MaybeMagicGrallocBufferHandle handle; PGrallocBufferChild* gc = mShadowManager->SendPGrallocBufferConstructor(aSize, aContent, &handle); if (handle.Tnull_t == handle.type()) { PGrallocBufferChild::Send__delete__(gc); return false; } GrallocBufferActor* gba = static_cast<GrallocBufferActor*>(gc); gba->InitFromHandle(handle.get_MagicGrallocBufferHandle()); *aBuffer = SurfaceDescriptorGralloc(nullptr, gc, /* external */ false); return true; }
bool ImageBridgeChild::AllocSurfaceDescriptorGrallocNow(const gfxIntSize& aSize, const uint32_t& aFormat, const uint32_t& aUsage, SurfaceDescriptor* aBuffer) { #ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC MaybeMagicGrallocBufferHandle handle; PGrallocBufferChild* gc = SendPGrallocBufferConstructor(aSize, aFormat, aUsage, &handle); if (handle.Tnull_t == handle.type()) { PGrallocBufferChild::Send__delete__(gc); return false; } GrallocBufferActor* gba = static_cast<GrallocBufferActor*>(gc); gba->InitFromHandle(handle.get_MagicGrallocBufferHandle()); *aBuffer = SurfaceDescriptorGralloc(nullptr, gc, aSize, /* external */ false); return true; #else NS_RUNTIMEABORT("No gralloc buffers for you"); return false; #endif }
bool ISurfaceAllocator::PlatformAllocSurfaceDescriptor(const gfxIntSize& aSize, gfxASurface::gfxContentType aContent, uint32_t aCaps, SurfaceDescriptor* aBuffer) { // Check for devices that have problems with gralloc. We only check for // this on ICS or earlier, in hopes that JB will work. #if ANDROID_VERSION <= 15 static bool checkedDevice = false; static bool disableGralloc = false; if (!checkedDevice) { char propValue[PROPERTY_VALUE_MAX]; property_get("ro.product.device", propValue, "None"); if (strcmp("crespo",propValue) == 0) { NS_WARNING("Nexus S has issues with gralloc, falling back to shmem"); disableGralloc = true; } else if (strcmp("peak", propValue) == 0) { NS_WARNING("Geeksphone Peak has issues with gralloc, falling back to shmem"); disableGralloc = true; } checkedDevice = true; } if (disableGralloc) { return false; } #endif // Some GL implementations fail to render gralloc textures with // width < 64. There's not much point in gralloc'ing buffers that // small anyway, so fall back on shared memory plus a texture // upload. if (aSize.width < 64) { return false; } PROFILER_LABEL("ShadowLayerForwarder", "PlatformAllocSurfaceDescriptor"); // Gralloc buffers are efficiently mappable as gfxImageSurface, so // no need to check |aCaps & MAP_AS_IMAGE_SURFACE|. MaybeMagicGrallocBufferHandle handle; PGrallocBufferChild* gc; bool defaultRBSwap; if (aCaps & USING_GL_RENDERING_ONLY) { gc = AllocGrallocBuffer(aSize, PixelFormatForContentType(aContent), GraphicBuffer::USAGE_HW_RENDER | GraphicBuffer::USAGE_HW_TEXTURE, &handle); // If you're allocating for USING_GL_RENDERING_ONLY, then we don't flag // this for RB swap. defaultRBSwap = false; } else { gc = AllocGrallocBuffer(aSize, PixelFormatForContentType(aContent), GraphicBuffer::USAGE_SW_READ_OFTEN | GraphicBuffer::USAGE_SW_WRITE_OFTEN | GraphicBuffer::USAGE_HW_TEXTURE, &handle); // But if you're allocating for non-GL-only rendering, we flag for // RB swap to preserve old behaviour and proper interaction with // cairo. defaultRBSwap = true; } if (!gc) { NS_ERROR("GrallocBufferConstructor failed by returned null"); return false; } else if (handle.Tnull_t == handle.type()) { NS_ERROR("GrallocBufferConstructor failed by returning handle with type Tnull_t"); PGrallocBufferChild::Send__delete__(gc); return false; } GrallocBufferActor* gba = static_cast<GrallocBufferActor*>(gc); gba->InitFromHandle(handle.get_MagicGrallocBufferHandle()); *aBuffer = SurfaceDescriptorGralloc(nullptr, gc, aSize, /* external */ false, defaultRBSwap); return true; }