author | Stark Li <stark.li@amlogic.com> | 2017-01-19 05:10:51 (GMT) |
---|---|---|
committer | Stark Li <stark.li@amlogic.com> | 2017-01-19 05:14:17 (GMT) |
commit | e621a17c2cb80c9b1a48c98ec9dc6a59b14fb9fe (patch) | |
tree | bfbbda65a56db92c44e9716153729f2eadf71928 | |
parent | 50aa1bae08dcfa76d5d80ce9cc145c951112cdf2 (diff) | |
download | hwcomposer-e621a17c2cb80c9b1a48c98ec9dc6a59b14fb9fe.zip hwcomposer-e621a17c2cb80c9b1a48c98ec9dc6a59b14fb9fe.tar.gz hwcomposer-e621a17c2cb80c9b1a48c98ec9dc6a59b14fb9fe.tar.bz2 |
Revert "PD #137587: fix fence error (merged from hwc2.0 revison)."
This reverts commit 463bfa06241858b7f87916ea150c74730de3e6b1.
Change-Id: I4692e3ccaab83fe4eda65084c9519f94341065f1
-rw-r--r-- | hwc2/common/devices/PhysicalDevice.cpp | 207 | ||||
-rw-r--r-- | hwc2/include/PhysicalDevice.h | 11 |
2 files changed, 59 insertions, 159 deletions
diff --git a/hwc2/common/devices/PhysicalDevice.cpp b/hwc2/common/devices/PhysicalDevice.cpp index 39d4820..e4f6ab2 100644 --- a/hwc2/common/devices/PhysicalDevice.cpp +++ b/hwc2/common/devices/PhysicalDevice.cpp @@ -53,15 +53,11 @@ PhysicalDevice::PhysicalDevice(hwc2_display_t id, Hwcomposer& hwc) // set capacity of mDisplayConfigs mDisplayConfigs.setCapacity(DEVICE_COUNT); - - mHwcCurReleaseFences = mHwcPriorReleaseFences = NULL; } PhysicalDevice::~PhysicalDevice() { WARN_IF_NOT_DEINIT(); - clearFenceList(mHwcCurReleaseFences); - clearFenceList(mHwcPriorReleaseFences); } bool PhysicalDevice::initialize() { @@ -144,18 +140,6 @@ bool PhysicalDevice::destroyLayer(hwc2_layer_t layerId) { return false; } - for (int i = 0; i < 2; i++) { - ssize_t idx = mLayerReleaseFences[i].indexOfKey(layerId); - if (idx >= 0) { - int releaseFence = mLayerReleaseFences[i].valueAt(idx); - if (releaseFence > -1) { - close(releaseFence); - } - mLayerReleaseFences[i].removeItemsAt(idx); - DTRACE("destroyLayer remove layer %lld from cur release list %p\n", layerId, &(mLayerReleaseFences[i])); - } - } - mHwcLayers.removeItem(layerId); DEINIT_AND_DELETE_OBJ(layer); return true; @@ -428,102 +412,47 @@ int32_t PhysicalDevice::getHdrCapabilities( return HWC2_ERROR_NONE; } -void PhysicalDevice::swapReleaseFence() { - //dumpFenceList(mHwcCurReleaseFences); - - if (mHwcCurReleaseFences == NULL || mHwcPriorReleaseFences == NULL) { - if (mHwcCurReleaseFences) { - clearFenceList(mHwcPriorReleaseFences); - } - - if (mHwcPriorReleaseFences) { - clearFenceList(mHwcPriorReleaseFences); - } - - mHwcCurReleaseFences = &(mLayerReleaseFences[0]); - mHwcPriorReleaseFences = &(mLayerReleaseFences[1]); - } else { - KeyedVector<hwc2_layer_t, int32_t> * tmp = mHwcCurReleaseFences; - clearFenceList(mHwcPriorReleaseFences); - mHwcCurReleaseFences = mHwcPriorReleaseFences; - mHwcPriorReleaseFences = tmp; - } -} - - -void PhysicalDevice::addReleaseFence(hwc2_layer_t layerId, int32_t fenceFd) { - ssize_t idx = mHwcCurReleaseFences->indexOfKey(layerId); - if (idx >= 0 && idx < mHwcCurReleaseFences->size()) { - int32_t oldFence = mHwcCurReleaseFences->valueAt(idx); - String8 mergeName("hwc-release"); - int32_t newFence = -1; - if (oldFence > -1 && fenceFd > -1) { - newFence = sync_merge(mergeName, oldFence, fenceFd); - } else if (oldFence > -1) { - newFence = sync_merge(mergeName, oldFence, oldFence); - } else if (fenceFd > -1) { - newFence = sync_merge(mergeName, fenceFd, fenceFd); - } - mHwcCurReleaseFences->replaceValueAt(idx, newFence); - if (oldFence > -1) - close(oldFence); - if (fenceFd > -1) - close(fenceFd); - ETRACE("addReleaseFence:(%d, %d) + %d -> (%d,%d)\n", idx, oldFence, fenceFd, idx, newFence); - dumpFenceList(mHwcCurReleaseFences); - } else { - mHwcCurReleaseFences->add(layerId, fenceFd); - } -} - -void PhysicalDevice::clearFenceList(KeyedVector<hwc2_layer_t, int32_t> * fenceList) { - if (!fenceList || !fenceList->size()) - return; - - for (int i = 0; i < fenceList->size(); i++) { - int32_t fenceFd = fenceList->valueAt(i); - if (fenceFd > -1) { - close(fenceFd); - } - DTRACE("clearFenceList close fd %d\n", fenceFd); - fenceList->replaceValueAt(i, -1); - } - fenceList->clear(); -} - -void PhysicalDevice::dumpFenceList(KeyedVector<hwc2_layer_t, int32_t> * fenceList) { - if (!fenceList || fenceList->isEmpty()) - return; - - String8 resultStr("dumpFenceList: "); - for (int i = 0; i < fenceList->size(); i++) { - hwc2_layer_t layerId = fenceList->keyAt(i); - int32_t fenceFd = fenceList->valueAt(i); - resultStr.appendFormat("(%lld, %d), ", layerId, fenceFd); - } - - ETRACE("%s", resultStr.string()); -} - int32_t PhysicalDevice::getReleaseFences( uint32_t* outNumElements, hwc2_layer_t* outLayers, int32_t* outFences) { - *outNumElements = mHwcPriorReleaseFences->size(); - - if (outLayers && outFences) { - for (uint32_t i=0; i<mHwcPriorReleaseFences->size(); i++) { - outLayers[i] = mHwcPriorReleaseFences->keyAt(i); + HwcLayer* layer = NULL; + uint32_t num_layer = 0; - int releaseFence = mHwcPriorReleaseFences->valueAt(i); - if (releaseFence > -1) { - outFences[i] = dup(releaseFence); - } else { - outFences[i] = -1; + if (NULL == outLayers || NULL == outFences) { + for (uint32_t i=0; i<mHwcLayers.size(); i++) { + hwc2_layer_t layerId = mHwcLayers.keyAt(i); + layer = mHwcLayers.valueAt(i); + if (layer) num_layer++; + } + } else { + for (uint32_t i=0; i<mHwcLayers.size(); i++) { + hwc2_layer_t layerId = mHwcLayers.keyAt(i); + layer = mHwcLayers.valueAt(i); + if (layer) { + DTRACE("outFences: %d", layer->getAcquireFence()); + /*if (layer->getAcquireFence() > -1) { + close(layer->getAcquireFence()); + }*/ + if (layer->getAcquireFence() > -1) { + outFences[num_layer] = layer->getAcquireFence(); + } else { + outFences[num_layer] = -1; + } + outLayers[num_layer++] = layerId; + layer->resetAcquireFence(); + // TODO: ? } } } + if (num_layer > 0) { + DTRACE("There are %d layer requests.", num_layer); + *outNumElements = num_layer; + } else { + DTRACE("No layer have set buffer yet."); + } + return HWC2_ERROR_NONE; } @@ -563,36 +492,32 @@ int32_t PhysicalDevice::postFramebuffer(int32_t* outRetireFence) { } if (!mClientTargetHnd || private_handle_t::validate(mClientTargetHnd) < 0 || mPowerMode == HWC2_POWER_MODE_OFF) { - if (mTargetAcquireFence > -1 && mPriorFrameRetireFence > -1) { - *outRetireFence = sync_merge("Layer-2", mTargetAcquireFence, mPriorFrameRetireFence); - } else if (mTargetAcquireFence > -1) { - *outRetireFence = sync_merge("Layer-0", mTargetAcquireFence, mTargetAcquireFence); - } else if (mPriorFrameRetireFence > -1) { - *outRetireFence = sync_merge("Layer-1", mPriorFrameRetireFence, mPriorFrameRetireFence); - } else { - *outRetireFence = -1; - } - - if (mTargetAcquireFence > -1) + DTRACE("mClientTargetHnd is null or Enter suspend state, mTargetAcquireFence: %d", mTargetAcquireFence); + if (mTargetAcquireFence > -1) { + sync_wait(mTargetAcquireFence, 5000); close(mTargetAcquireFence); - mTargetAcquireFence = -1; - if (mPriorFrameRetireFence > -1) - close(mPriorFrameRetireFence); - mPriorFrameRetireFence = -1; - } else { - *outRetireFence = mPriorFrameRetireFence; - if (*outRetireFence >= 0) { - DTRACE("Get prior frame's retire fence %d", *outRetireFence); - } else { - ETRACE("No valid prior frame's retire returned. %d ", *outRetireFence); - // -1 means no fence, less than -1 is some error - *outRetireFence = -1; + mTargetAcquireFence = -1; + } + *outRetireFence = -1; + if (private_handle_t::validate(mClientTargetHnd) < 0) { + ETRACE("mClientTargetHnd is not validate!"); + return HWC2_ERROR_NONE; } + } - mPriorFrameRetireFence = fb_post_with_fence_locked(mFramebufferInfo, mClientTargetHnd, mTargetAcquireFence); - mTargetAcquireFence = -1; + *outRetireFence = mPriorFrameRetireFence; + + if (*outRetireFence >= 0) { + DTRACE("Get prior frame's retire fence %d", *outRetireFence); + } else { + ETRACE("No valid prior frame's retire returned. %d ", *outRetireFence); + // -1 means no fence, less than -1 is some error + *outRetireFence = -1; } + mPriorFrameRetireFence = fb_post_with_fence_locked(mFramebufferInfo, mClientTargetHnd, mTargetAcquireFence); + mTargetAcquireFence = -1; + // finally we need to update cursor's blank status if (cbinfo->fd > 0 && cursorShow != mCursorContext->getCursorStatus()) { mCursorContext->setCursorStatus(cursorShow); @@ -600,7 +525,6 @@ int32_t PhysicalDevice::postFramebuffer(int32_t* outRetireFence) { ioctl(cbinfo->fd, FBIOBLANK, !cursorShow); } - return err; } @@ -629,16 +553,6 @@ int32_t PhysicalDevice::presentDisplay( err = HWC2_ERROR_NOT_VALIDATED; } - // reset layers' acquire fence. - for (uint32_t i=0; i<mHwcLayers.size(); i++) { - hwc2_layer_t layerId = mHwcLayers.keyAt(i); - layer = mHwcLayers.valueAt(i); - if (layer != NULL) { - close(layer->getAcquireFence()); - layer->resetAcquireFence(); - } - } - return err; } @@ -657,17 +571,16 @@ int32_t PhysicalDevice::setClientTarget( return HWC2_ERROR_BAD_PARAMETER; } - if (mTargetAcquireFence > -1) { - close(mTargetAcquireFence); - mTargetAcquireFence = -1; - } - if (NULL != target) { mClientTargetHnd = target; mClientTargetDamageRegion = damage; - mTargetAcquireFence = acquireFence; + if (-1 != acquireFence) { + mTargetAcquireFence = acquireFence; + //sync_wait(mTargetAcquireFence, 3000); + } + // TODO: HWC2_ERROR_BAD_PARAMETER && dataspace && damage. } else { - ETRACE("client target is null!, no need to update this frame."); + DTRACE("client target is null!, no need to update this frame."); } return HWC2_ERROR_NONE; @@ -703,8 +616,6 @@ int32_t PhysicalDevice::validateDisplay(uint32_t* outNumTypes, HwcLayer* layer = NULL; bool istvp = false; - swapReleaseFence(); - for (uint32_t i=0; i<mHwcLayers.size(); i++) { hwc2_layer_t layerId = mHwcLayers.keyAt(i); layer = mHwcLayers.valueAt(i); diff --git a/hwc2/include/PhysicalDevice.h b/hwc2/include/PhysicalDevice.h index 0543e84..85419f6 100644 --- a/hwc2/include/PhysicalDevice.h +++ b/hwc2/include/PhysicalDevice.h @@ -123,12 +123,6 @@ public: virtual void removeDisplayConfigs(); virtual bool updateDisplayConfigs(); - //this function will take contorl of fencefd, if you need use it also, please dup it before call. - void swapReleaseFence(); - void addReleaseFence(hwc2_layer_t layerId, int32_t fenceFd); - void clearFenceList(KeyedVector<hwc2_layer_t, int32_t> * fenceList); - void dumpFenceList(KeyedVector<hwc2_layer_t, int32_t> * fenceList); - //events virtual void onVsync(int64_t timestamp); virtual void dump(Dump& d); @@ -182,11 +176,6 @@ private: //HDR Capabilities hdr_capabilities_t mHdrCapabilities; - // record the release fence of layer. - KeyedVector<hwc2_layer_t, int32_t> mLayerReleaseFences[2]; - KeyedVector<hwc2_layer_t, int32_t> * mHwcCurReleaseFences; - KeyedVector<hwc2_layer_t, int32_t> * mHwcPriorReleaseFences; - // lock Mutex mLock; bool mInitialized; |