void ParamTraits<FenceHandle>::Write(Message* aMsg, const paramType& aParam) { FenceHandle handle = aParam; MOZ_ASSERT(handle.IsValid()); #if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17 RefPtr<FenceHandle::FdObj> fence = handle.GetAndResetFdObj(); aMsg->WriteFileDescriptor(base::FileDescriptor(fence->GetAndResetFd(), true)); #endif }
bool HwcComposer2D::Commit(nsScreenGonk* aScreen) { for (uint32_t j=0; j < (mList->numHwLayers - 1); j++) { mList->hwLayers[j].acquireFenceFd = -1; if (mHwcLayerMap.IsEmpty() || (mList->hwLayers[j].compositionType == HWC_FRAMEBUFFER)) { continue; } LayerRenderState state = mHwcLayerMap[j]->GetLayer()->GetRenderState(); if (!state.mTexture) { continue; } FenceHandle fence = state.mTexture->GetAndResetAcquireFenceHandle(); if (fence.IsValid()) { RefPtr<FenceHandle::FdObj> fdObj = fence.GetAndResetFdObj(); mList->hwLayers[j].acquireFenceFd = fdObj->GetAndResetFd(); } } int err = mHal->Set(mList, aScreen->GetDisplayType()); mPrevRetireFence.TransferToAnotherFenceHandle(mPrevDisplayFence); for (uint32_t j=0; j < (mList->numHwLayers - 1); j++) { if (mList->hwLayers[j].releaseFenceFd >= 0) { int fd = mList->hwLayers[j].releaseFenceFd; mList->hwLayers[j].releaseFenceFd = -1; RefPtr<FenceHandle::FdObj> fdObj = new FenceHandle::FdObj(fd); FenceHandle fence(fdObj); LayerRenderState state = mHwcLayerMap[j]->GetLayer()->GetRenderState(); if (!state.mTexture) { continue; } state.mTexture->SetReleaseFenceHandle(fence); } } if (mList->retireFenceFd >= 0) { mPrevRetireFence = FenceHandle(new FenceHandle::FdObj(mList->retireFenceFd)); } // Set DisplaySurface layer fence DisplaySurface* displaySurface = aScreen->GetDisplaySurface(); displaySurface->setReleaseFenceFd(mList->hwLayers[mList->numHwLayers - 1].releaseFenceFd); mList->hwLayers[mList->numHwLayers - 1].releaseFenceFd = -1; mPrepared = false; return !err; }
void GonkNativeWindow::returnBuffer(TextureClient* client) { ALOGD("GonkNativeWindow::returnBuffer"); Mutex::Autolock lock(mMutex); int index = mConsumer->getSlotFromTextureClientLocked(client); if (index < 0) { return; } FenceHandle handle = client->GetAndResetReleaseFenceHandle(); nsRefPtr<FenceHandle::FdObj> fdObj = handle.GetAndResetFdObj(); sp<Fence> fence = new Fence(fdObj->GetAndResetFd()); status_t err; err = addReleaseFenceLocked(index, mSlots[index].mGraphicBuffer, fence); err = releaseBufferLocked(index, mSlots[index].mGraphicBuffer); if (err != OK) { ALOGE("Failed to return buffer: %s (%d)", strerror(-err), err); } }