void CompositableParentManager::ReturnTextureDataIfNecessary(CompositableHost* aCompositable, EditReplyVector& replyv, PCompositableParent* aParent) { if (!aCompositable || !aCompositable->GetCompositableBackendSpecificData()) { return; } const std::vector< RefPtr<TextureHost> > textureList = aCompositable->GetCompositableBackendSpecificData()->GetPendingReleaseFenceTextureList(); // Return pending Texture data for (size_t i = 0; i < textureList.size(); i++) { // File descriptor number is limited to 4 per IPC message. // See Bug 986253 if (mPrevFenceHandles.size() >= 4) { break; } TextureHostOGL* hostOGL = textureList[i]->AsHostOGL(); PTextureParent* actor = textureList[i]->GetIPDLActor(); if (!hostOGL || !actor) { continue; } android::sp<android::Fence> fence = hostOGL->GetAndResetReleaseFence(); if (fence.get() && fence->isValid()) { FenceHandle handle = FenceHandle(fence); replyv.push_back(ReturnReleaseFence(aParent, nullptr, actor, nullptr, handle)); // Hold fence handle to prevent fence's file descriptor is closed before IPC happens. mPrevFenceHandles.push_back(handle); } } aCompositable->GetCompositableBackendSpecificData()->ClearPendingReleaseFenceTextureList(); }
FenceHandle TextureHost::GetAndResetReleaseFenceHandle() { #if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17 TextureHostOGL* hostOGL = this->AsHostOGL(); if (!hostOGL) { return FenceHandle(); } android::sp<android::Fence> fence = hostOGL->GetAndResetReleaseFence(); if (fence.get() && fence->isValid()) { FenceHandle handle = FenceHandle(fence); return handle; } #endif return FenceHandle(); }
void TextureParent::SendFenceHandleIfPresent() { #if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17 if (mTextureHost) { TextureHostOGL* hostOGL = mTextureHost->AsHostOGL(); if (!hostOGL) { return; } android::sp<android::Fence> fence = hostOGL->GetAndResetReleaseFence(); if (fence.get() && fence->isValid()) { // HWC might not provide Fence. // In this case, HWC implicitly handles buffer's fence. FenceHandle handle = FenceHandle(fence); RefPtr<FenceDeliveryTracker> tracker = new FenceDeliveryTracker(handle); mCompositableManager->SendFenceHandle(tracker, this, handle); } } #endif }
void TextureParent::CompositorRecycle() { mTextureHost->ClearRecycleCallback(); MaybeFenceHandle handle = null_t(); #if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17 if (mTextureHost) { TextureHostOGL* hostOGL = mTextureHost->AsHostOGL(); android::sp<android::Fence> fence = hostOGL->GetAndResetReleaseFence(); if (fence.get() && fence->isValid()) { handle = FenceHandle(fence); // HWC might not provide Fence. // In this case, HWC implicitly handles buffer's fence. } } #endif mozilla::unused << SendCompositorRecycle(handle); // Don't forget to prepare for the next reycle mWaitForClientRecycle = mTextureHost; }