author | Stark Li <stark.li@amlogic.com> | 2016-11-02 13:32:45 (GMT) |
---|---|---|
committer | Stark Li <stark.li@amlogic.com> | 2016-11-02 13:32:45 (GMT) |
commit | 0c9801a3d47e5b2d77a02198d5fe54d6567b4866 (patch) | |
tree | be0238140c6daa41e19f9de379b2a0d60b2d420f | |
parent | 173d7e036c7230e78df78dca94f0f8b7a2adc61e (diff) | |
download | hwcomposer-0c9801a3d47e5b2d77a02198d5fe54d6567b4866.zip hwcomposer-0c9801a3d47e5b2d77a02198d5fe54d6567b4866.tar.gz hwcomposer-0c9801a3d47e5b2d77a02198d5fe54d6567b4866.tar.bz2 |
PD#132769: return proir frame's fence to retire fence not current
Change-Id: I271a59bbc629430bd8a8deb438c709cd15b541d7
-rw-r--r-- | hwc2/common/devices/PhysicalDevice.cpp | 66 | ||||
-rw-r--r-- | hwc2/include/PhysicalDevice.h | 2 |
2 files changed, 39 insertions, 29 deletions
diff --git a/hwc2/common/devices/PhysicalDevice.cpp b/hwc2/common/devices/PhysicalDevice.cpp index 4b78120..451a442 100644 --- a/hwc2/common/devices/PhysicalDevice.cpp +++ b/hwc2/common/devices/PhysicalDevice.cpp @@ -21,9 +21,12 @@ PhysicalDevice::PhysicalDevice(hwc2_display_t id, Hwcomposer& hwc) mActiveDisplayConfig(-1), mVsyncObserver(NULL), mIsConnected(false), - mInitialized(false), mFramebufferHnd(NULL), - mFramebufferInfo(NULL) + mFramebufferInfo(NULL), + mPriorFrameRetireFence(-1), + mTargetAcquireFence(-1), + mIsValidated(false), + mInitialized(false) { CTRACE(); @@ -382,21 +385,24 @@ int32_t PhysicalDevice::getReleaseFences( for (uint32_t i=0; i<mHwcLayers.size(); i++) { hwc2_layer_t layerId = mHwcLayers.keyAt(i); layer = mHwcLayers.valueAt(i); - if (layer/* && layer->getAcquireFence() > -1*/) num_layer++; + 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/* && layer->getAcquireFence() > -1*/) { + if (layer) { DTRACE("outFences: %d", layer->getAcquireFence()); - outLayers[num_layer] = layerId; - if (layer->getAcquireFence() > -1) { + /*if (layer->getAcquireFence() > -1) { close(layer->getAcquireFence()); - layer->resetAcquireFence(); + }*/ + if (layer->getAcquireFence() > -1) { + outFences[num_layer] = layer->getAcquireFence(); + } else { + outFences[num_layer] = -1; } - - outFences[num_layer++] = layer->getAcquireFence(); + outLayers[num_layer++] = layerId; + layer->resetAcquireFence(); // TODO: ? } } @@ -457,28 +463,26 @@ int32_t PhysicalDevice::postFramebuffer(int32_t* outRetireFence) { *outRetireFence = -1; if (private_handle_t::validate(mClientTargetHnd) < 0) { ETRACE("mClientTargetHnd is not validate!"); - return HWC2_ERROR_NOT_VALIDATED; - } else { return HWC2_ERROR_NONE; } } - *outRetireFence = fb_post_with_fence_locked(mFramebufferInfo, mClientTargetHnd, mTargetAcquireFence); + *outRetireFence = mPriorFrameRetireFence; if (*outRetireFence >= 0) { - DTRACE("Get retire fence %d", *outRetireFence); + DTRACE("Get prior frame's retire fence %d", *outRetireFence); } else { - ETRACE("No valid retire returned. %d ", *outRetireFence); - //-1 means no fence, less than -1 is some error - if (*outRetireFence < -1) err = HWC2_ERROR_NOT_VALIDATED; - *outRetireFence -1; + 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); - DTRACE("UPDATE FB1 status to %d", !cursorShow); ioctl(cbinfo->fd, FBIOBLANK, !cursorShow); } @@ -492,20 +496,24 @@ int32_t PhysicalDevice::presentDisplay( int32_t err = HWC2_ERROR_NONE; HwcLayer* layer = NULL; - // TODO: need improve the way to set video axis. + if (mIsValidated) { + // TODO: need improve the way to set video axis. #if WITH_LIBPLAYER_MODULE - for (uint32_t i=0; i<mHwcLayers.size(); i++) { - hwc2_layer_t layerId = mHwcLayers.keyAt(i); - layer = mHwcLayers.valueAt(i); + for (uint32_t i=0; i<mHwcLayers.size(); i++) { + hwc2_layer_t layerId = mHwcLayers.keyAt(i); + layer = mHwcLayers.valueAt(i); - if (layer && layer->getCompositionType()== HWC2_COMPOSITION_DEVICE) { - //hwc2_overlay_compose(ctx, display, hwclayer); - layer->presentOverlay(); - break; + if (layer && layer->getCompositionType()== HWC2_COMPOSITION_DEVICE) { + layer->presentOverlay(); + break; + } } - } #endif - err = postFramebuffer(outRetireFence); + err = postFramebuffer(outRetireFence); + mIsValidated = false; + } else { // display not validate yet. + err = HWC2_ERROR_NOT_VALIDATED; + } return err; } @@ -633,7 +641,7 @@ int32_t PhysicalDevice::validateDisplay(uint32_t* outNumTypes, } // mark the validate function is called.(???) - // dctx->validated = true; + mIsValidated = true; if (mHwcLayersChangeType.size() > 0) { DTRACE("there are %d layer types has changed.", mHwcLayersChangeType.size()); *outNumTypes = mHwcLayersChangeType.size(); diff --git a/hwc2/include/PhysicalDevice.h b/hwc2/include/PhysicalDevice.h index 43c163b..a59bde9 100644 --- a/hwc2/include/PhysicalDevice.h +++ b/hwc2/include/PhysicalDevice.h @@ -149,6 +149,8 @@ private: buffer_handle_t mClientTargetHnd; hwc_region_t mClientTargetDamageRegion; int32_t mTargetAcquireFence; + int32_t mPriorFrameRetireFence; + bool mIsValidated; // num of composition type changed layer. uint32_t mNumLayersChangetype; |