bool HwcComposer2D::Commit() { hwc_display_contents_1_t *displays[HWC_NUM_DISPLAY_TYPES] = { nullptr }; displays[HWC_DISPLAY_PRIMARY] = mList; 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; } TextureHostOGL* texture = state.mTexture->AsHostOGL(); if (!texture) { continue; } sp<Fence> fence = texture->GetAndResetAcquireFence(); if (fence.get() && fence->isValid()) { mList->hwLayers[j].acquireFenceFd = fence->dup(); } } int err = mHwc->set(mHwc, HWC_NUM_DISPLAY_TYPES, displays); mPrevDisplayFence = mPrevRetireFence; mPrevRetireFence = Fence::NO_FENCE; 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; sp<Fence> fence = new Fence(fd); LayerRenderState state = mHwcLayerMap[j]->GetLayer()->GetRenderState(); if (!state.mTexture) { continue; } TextureHostOGL* texture = state.mTexture->AsHostOGL(); if (!texture) { continue; } texture->SetReleaseFence(fence); } } if (mList->retireFenceFd >= 0) { mPrevRetireFence = new Fence(mList->retireFenceFd); } mPrepared = false; return !err; }
void TiledLayerBufferComposite::SetReleaseFence(const android::sp<android::Fence>& aReleaseFence) { for (size_t i = 0; i < mRetainedTiles.Length(); i++) { if (!mRetainedTiles[i].mTextureHost) { continue; } TextureHostOGL* texture = mRetainedTiles[i].mTextureHost->AsHostOGL(); if (!texture) { continue; } texture->SetReleaseFence(new android::Fence(aReleaseFence->dup())); } }