author | sky zhou <sky.zhou@amlogic.com> | 2019-12-23 14:02:03 (GMT) |
---|---|---|
committer | sky zhou <sky.zhou@amlogic.com> | 2020-05-21 11:08:02 (GMT) |
commit | be100acbec50b07d02bfbae495ea2cb4f4ca278e (patch) | |
tree | 356397cdbd033cff093a64ea72ae1ab7476bba86 | |
parent | 186bbb0682799a5768ec7cf00a4fb9a4dde4fb25 (diff) | |
download | hwcomposer-be100acbec50b07d02bfbae495ea2cb4f4ca278e.zip hwcomposer-be100acbec50b07d02bfbae495ea2cb4f4ca278e.tar.gz hwcomposer-be100acbec50b07d02bfbae495ea2cb4f4ca278e.tar.bz2 |
Hwc: return last compose release fence in HwcVideoPlane [1/1]
PD#SWPL-18186
Problem:
HwcVideoPlane return release fence in current
commit flow, it is not right for surfaceflinger.
Solution:
record last release fence and return in next frame.
Verify:
verify on Newton.
Change-Id: I1fa2133f92a46bad8a3dc37539f321aba7fb97b1
Signed-off-by: sky zhou <sky.zhou@amlogic.com>
-rw-r--r-- | common/display/HwcVideoPlane.cpp | 299 | ||||
-rw-r--r-- | common/display/HwcVideoPlane.h | 3 | ||||
-rw-r--r--[-rwxr-xr-x] | composition/simplestrategy/MultiplanesWithDiComposition/MultiplanesWithDiComposition.cpp | 6 |
3 files changed, 98 insertions, 210 deletions
diff --git a/common/display/HwcVideoPlane.cpp b/common/display/HwcVideoPlane.cpp index 1788c84..82e11e7 100644 --- a/common/display/HwcVideoPlane.cpp +++ b/common/display/HwcVideoPlane.cpp @@ -18,6 +18,8 @@ HwcVideoPlane::HwcVideoPlane(int32_t drvFd, uint32_t id) : HwDisplayPlane(drvFd, id) { snprintf(mName, 64, "HwcVideo-%d", id); + mLastComposeFbs.clear(); + mLastFence = std::make_shared<DrmFence>(-1); } HwcVideoPlane::~HwcVideoPlane() { @@ -54,244 +56,127 @@ bool HwcVideoPlane::isFbSupport(std::shared_ptr<DrmFramebuffer> & fb) { int32_t HwcVideoPlane::setComposePlane( DiComposerPair *difbs, int blankOp) { + MESON_ASSERT(mDrvFd >= 0, "osd plane fd is not valiable!"); + MESON_ASSERT(blankOp == UNBLANK, "osd plane fd is not valiable!"); + u32 i; video_frame_info_t *vFrameInfo; int video_composer_enable; std::shared_ptr<DrmFramebuffer> fb; + std::vector<std::shared_ptr<DrmFramebuffer>> composeFbs; + std::shared_ptr<DrmFence> compseFence; - if (mDrvFd < 0) { - MESON_LOGE("hwcvideo plane fd is not valiable!"); - return -EBADF; - } - - bool bBlank = blankOp == UNBLANK ? false : true; - - if (!bBlank) { - - memset(&mVideoFramesInfo, 0, sizeof(mVideoFramesInfo)); - mFramesCount = difbs->composefbs.size(); - for (i = 0; i < mFramesCount; i++) { - vFrameInfo = &mVideoFramesInfo.frame_info[i]; - fb = difbs->composefbs[i]; - - buffer_handle_t buf = fb->mBufferHandle; - drm_rect_t dispFrame = fb->mDisplayFrame; - drm_rect_t srcCrop = fb->mSourceCrop; - if (fb->mFbType == DRM_FB_VIDEO_OMX_V4L || - fb->mFbType == DRM_FB_VIDEO_OMX2_V4L2) { - vFrameInfo->fd = am_gralloc_get_omx_v4l_file(buf); - vFrameInfo->type = 0; - } else if (fb->mFbType == DRM_FB_VIDEO_DMABUF) { - vFrameInfo->fd = am_gralloc_get_buffer_fd(buf); - vFrameInfo->type = 1; - } else if (fb->mFbType == DRM_FB_VIDEO_SIDEBAND || - fb->mFbType == DRM_FB_VIDEO_SIDEBAND_SECOND) { - vFrameInfo->type = 2; - } - - vFrameInfo->dst_x = dispFrame.left; - vFrameInfo->dst_y = dispFrame.top; - vFrameInfo->dst_w = dispFrame.right - dispFrame.left; - vFrameInfo->dst_h = dispFrame.bottom - dispFrame.top; + memset(&mVideoFramesInfo, 0, sizeof(mVideoFramesInfo)); + mFramesCount = difbs->composefbs.size(); + for (i = 0; i < mFramesCount; i++) { + vFrameInfo = &mVideoFramesInfo.frame_info[i]; + fb = difbs->composefbs[i]; - vFrameInfo->crop_x = srcCrop.left; - vFrameInfo->crop_y = srcCrop.top; - vFrameInfo->crop_w = srcCrop.right - srcCrop.left; - vFrameInfo->crop_h = srcCrop.bottom - srcCrop.top; - vFrameInfo->buffer_w = am_gralloc_get_width(buf); - vFrameInfo->buffer_h = am_gralloc_get_height(buf); - vFrameInfo->zorder = fb->mZorder; - vFrameInfo->transform = fb->mTransform; + buffer_handle_t buf = fb->mBufferHandle; + drm_rect_t dispFrame = fb->mDisplayFrame; + drm_rect_t srcCrop = fb->mSourceCrop; + if (fb->mFbType == DRM_FB_VIDEO_OMX_V4L || + fb->mFbType == DRM_FB_VIDEO_OMX2_V4L2) { + vFrameInfo->fd = am_gralloc_get_omx_v4l_file(buf); + vFrameInfo->type = 0; + } else if (fb->mFbType == DRM_FB_VIDEO_DMABUF) { + vFrameInfo->fd = am_gralloc_get_buffer_fd(buf); + vFrameInfo->type = 1; + } else if (fb->mFbType == DRM_FB_VIDEO_SIDEBAND || + fb->mFbType == DRM_FB_VIDEO_SIDEBAND_SECOND) { + vFrameInfo->type = 2; } - mVideoFramesInfo.frame_count = mFramesCount; - mVideoFramesInfo.layer_index = mId; - mVideoFramesInfo.disp_zorder = difbs->zorder; - if (!mStatus) { - video_composer_enable = 1; - MESON_LOGE("di composer device %d set enable.\n", mDrvFd); - if (ioctl(mDrvFd, VIDEO_COMPOSER_IOCTL_SET_ENABLE, &video_composer_enable) != 0) { - MESON_LOGE("video composer: ioctl error, %s(%d), mDrvFd = %d", - strerror(errno), errno, mDrvFd); - return -1; - } - mStatus = 1; - } + vFrameInfo->dst_x = dispFrame.left; + vFrameInfo->dst_y = dispFrame.top; + vFrameInfo->dst_w = dispFrame.right - dispFrame.left; + vFrameInfo->dst_h = dispFrame.bottom - dispFrame.top; + + vFrameInfo->crop_x = srcCrop.left; + vFrameInfo->crop_y = srcCrop.top; + vFrameInfo->crop_w = srcCrop.right - srcCrop.left; + vFrameInfo->crop_h = srcCrop.bottom - srcCrop.top; + vFrameInfo->buffer_w = am_gralloc_get_width(buf); + vFrameInfo->buffer_h = am_gralloc_get_height(buf); + vFrameInfo->zorder = fb->mZorder; + vFrameInfo->transform = fb->mTransform; + } + mVideoFramesInfo.frame_count = mFramesCount; + mVideoFramesInfo.layer_index = mId; + mVideoFramesInfo.disp_zorder = difbs->zorder; - MESON_LOGE("di composer device %d set frame.\n", mDrvFd); - if (ioctl(mDrvFd, VIDEO_COMPOSER_IOCTL_SET_FRAMES, &mVideoFramesInfo) != 0) { + if (!mStatus) { + video_composer_enable = 1; + if (ioctl(mDrvFd, VIDEO_COMPOSER_IOCTL_SET_ENABLE, &video_composer_enable) != 0) { MESON_LOGE("video composer: ioctl error, %s(%d), mDrvFd = %d", strerror(errno), errno, mDrvFd); return -1; } + mStatus = 1; + } - for (i = 0; i < mFramesCount; i++) { - vFrameInfo = &mVideoFramesInfo.frame_info[i]; - fb = difbs->composefbs[i]; - - if (fb) { - /* dup a out fence fd for layer's release fence, we can't close this fd - * now, cause display retire fence will also use this fd. will be closed - * on SF side*/ - if (DebugHelper::getInstance().discardOutFence()) { - MESON_LOGE("di composer set release fence: -1.\n"); - fb->setReleaseFence(-1); - } else { - MESON_LOGE("di composer set release fence: %u.\n", vFrameInfo->composer_fen_fd); - if (i > 0) - fb->setReleaseFence((vFrameInfo->composer_fen_fd >= 0) ? dup(vFrameInfo->composer_fen_fd) : -1); - else if (i == 0) - fb->setReleaseFence((vFrameInfo->composer_fen_fd >= 0) ? vFrameInfo->composer_fen_fd : -1); - } - } - } - }else { - memset(&mVideoFramesInfo, 0, sizeof(mVideoFramesInfo)); + if (ioctl(mDrvFd, VIDEO_COMPOSER_IOCTL_SET_FRAMES, &mVideoFramesInfo) != 0) { + MESON_LOGE("video composer: ioctl error, %s(%d), mDrvFd = %d", + strerror(errno), errno, mDrvFd); + return -1; + } - if (mStatus) { - video_composer_enable = 0; - MESON_LOGE("di composer device %d set disable.\n", mDrvFd); - if (ioctl(mDrvFd, VIDEO_COMPOSER_IOCTL_SET_ENABLE, &video_composer_enable) != 0) { - MESON_LOGE("video composer: ioctl error, %s(%d), mDrvFd = %d", - strerror(errno), errno, mDrvFd); - return -1; + composeFbs = difbs->composefbs; + int composefd = + (vFrameInfo->composer_fen_fd >= 0) ? vFrameInfo->composer_fen_fd : -1; + compseFence = std::make_shared<DrmFence>(composefd); + + /*update last frame release fence*/ + if (mLastComposeFbs.size() > 0) { + for (auto fbIt = mLastComposeFbs.begin(); fbIt != mLastComposeFbs.end(); ++fbIt) { + if (DebugHelper::getInstance().discardOutFence()) { + (*fbIt)->setReleaseFence(-1); + } else { + (*fbIt)->setReleaseFence(mLastFence->dup()); } - mStatus = 0; } + mLastComposeFbs.clear(); + mLastFence.reset(); } + + mLastComposeFbs = composeFbs; + mLastFence = compseFence; + composeFbs.clear(); + compseFence.reset(); + return 0; } int32_t HwcVideoPlane::setPlane( - std::shared_ptr<DrmFramebuffer> fb, - uint32_t zorder __unused, int blankOp) { - u32 i; - video_frame_info_t *vFrameInfo; - int video_composer_enable; - - if (mDrvFd < 0) { - MESON_LOGE("hwcvideo plane fd is not valiable!"); - return -EBADF; - } - - bool bBlank = blankOp == UNBLANK ? false : true; - - if (!bBlank) { - - memset(&mVideoFramesInfo, 0, sizeof(mVideoFramesInfo)); - mFramesCount = 1; - for (i = 0; i < mFramesCount; i++) { - vFrameInfo = &mVideoFramesInfo.frame_info[i]; - - buffer_handle_t buf = fb->mBufferHandle; - drm_rect_t dispFrame = fb->mDisplayFrame; - drm_rect_t srcCrop = fb->mSourceCrop; - vFrameInfo->fd = am_gralloc_get_omx_v4l_file(buf); - - vFrameInfo->dst_x = dispFrame.left; - vFrameInfo->dst_y = dispFrame.top; - vFrameInfo->dst_w = dispFrame.right - dispFrame.left; - vFrameInfo->dst_h = dispFrame.bottom - dispFrame.top; - - vFrameInfo->crop_x = srcCrop.left; - vFrameInfo->crop_y = srcCrop.top; - vFrameInfo->crop_w = srcCrop.right - srcCrop.left; - vFrameInfo->crop_h = srcCrop.bottom - srcCrop.top; - vFrameInfo->zorder = fb->mZorder + 1; - vFrameInfo->transform = fb->mTransform; - } - mVideoFramesInfo.frame_count = mFramesCount; - mVideoFramesInfo.layer_index = mId; - mVideoFramesInfo.disp_zorder = fb->mZorder + 1; - - if (!mStatus) { - video_composer_enable = 1; - MESON_LOGE("di composer device %d set enable.\n", mDrvFd); - if (ioctl(mDrvFd, VIDEO_COMPOSER_IOCTL_SET_ENABLE, &video_composer_enable) != 0) { - MESON_LOGE("video composer: ioctl error, %s(%d), mDrvFd = %d", - strerror(errno), errno, mDrvFd); - return -1; - } - mStatus = 1; - } - - MESON_LOGE("di composer device %d set frame.\n", mDrvFd); - if (ioctl(mDrvFd, VIDEO_COMPOSER_IOCTL_SET_FRAMES, &mVideoFramesInfo) != 0) { + std::shared_ptr<DrmFramebuffer> fb __unused, + uint32_t zorder __unused, int blankOp __unused) { + MESON_ASSERT(mDrvFd >= 0, "osd plane fd is not valiable!"); + MESON_ASSERT(blankOp != UNBLANK, "only called when blank now!"); + + if (mStatus) { + int video_composer_enable = 0; + MESON_LOGE("di composer device %d set disable.\n", mDrvFd); + if (ioctl(mDrvFd, VIDEO_COMPOSER_IOCTL_SET_ENABLE, &video_composer_enable) != 0) { MESON_LOGE("video composer: ioctl error, %s(%d), mDrvFd = %d", strerror(errno), errno, mDrvFd); return -1; } - }else { - memset(&mVideoFramesInfo, 0, sizeof(mVideoFramesInfo)); - - if (mStatus) { - video_composer_enable = 0; - MESON_LOGE("di composer device %d set disable.\n", mDrvFd); - if (ioctl(mDrvFd, VIDEO_COMPOSER_IOCTL_SET_ENABLE, &video_composer_enable) != 0) { - MESON_LOGE("video composer: ioctl error, %s(%d), mDrvFd = %d", - strerror(errno), errno, mDrvFd); - return -1; - } - mStatus = 0; - } - } -#if 0 - drm_rect_t srcCrop = fb->mSourceCrop; - drm_rect_t disFrame = fb->mDisplayFrame; - buffer_handle_t buf = fb->mBufferHandle; - - mPlaneInfo.magic = OSD_SYNC_REQUEST_RENDER_MAGIC_V2; - mPlaneInfo.len = sizeof(osd_plane_info_t); - mPlaneInfo.type = DIRECT_COMPOSE_MODE; - - mPlaneInfo.xoffset = srcCrop.left; - mPlaneInfo.yoffset = srcCrop.top; - mPlaneInfo.width = srcCrop.right - srcCrop.left; - mPlaneInfo.height = srcCrop.bottom - srcCrop.top; - mPlaneInfo.dst_x = disFrame.left; - mPlaneInfo.dst_y = disFrame.top; - mPlaneInfo.dst_w = disFrame.right - disFrame.left; - mPlaneInfo.dst_h = disFrame.bottom - disFrame.top; - - if (DebugHelper::getInstance().discardInFence()) { - fb->getAcquireFence()->waitForever("osd-input"); - mPlaneInfo.in_fen_fd = -1; - } else { - mPlaneInfo.in_fen_fd = fb->getAcquireFence()->dup(); - } - mPlaneInfo.format = am_gralloc_get_format(buf); - mPlaneInfo.shared_fd = am_gralloc_get_buffer_fd(buf); - mPlaneInfo.byte_stride = am_gralloc_get_stride_in_byte(buf); - mPlaneInfo.pixel_stride = am_gralloc_get_stride_in_pixel(buf); - /* osd request plane zorder > 0 */ - mPlaneInfo.zorder = fb->mZorder + 1; - mPlaneInfo.blend_mode = fb->mBlendMode; - mPlaneInfo.plane_alpha = fb->mPlaneAlpha; - mPlaneInfo.op &= ~(OSD_BLANK_OP_BIT); - mPlaneInfo.afbc_inter_format = am_gralloc_get_vpu_afbc_mask(buf); - - if (ioctl(mDrvFd, FBIOPUT_OSD_SYNC_RENDER_ADD, &mPlaneInfo) != 0) { - MESON_LOGE("osd plane FBIOPUT_OSD_SYNC_RENDER_ADD return(%d)", errno); - return -EINVAL; + mStatus = 0; } - if (mDrmFb) { - /* dup a out fence fd for layer's release fence, we can't close this fd - * now, cause display retire fence will also use this fd. will be closed - * on SF side*/ - if (DebugHelper::getInstance().discardOutFence()) { - mDrmFb->setReleaseFence(-1); - } else { - mDrmFb->setReleaseFence((mPlaneInfo.out_fen_fd >= 0) ? ::dup(mPlaneInfo.out_fen_fd) : -1); + /*update last frame release fence*/ + if (mLastComposeFbs.size() > 0) { + for (auto fbIt = mLastComposeFbs.begin(); fbIt != mLastComposeFbs.end(); ++fbIt) { + if (DebugHelper::getInstance().discardOutFence()) { + (*fbIt)->setReleaseFence(-1); + } else { + (*fbIt)->setReleaseFence(mLastFence->dup()); + } } + mLastComposeFbs.clear(); + mLastFence.reset(); } - // update drm fb. - mDrmFb = fb; - - mPlaneInfo.in_fen_fd = -1; - mPlaneInfo.out_fen_fd = -1; -#endif return 0; } diff --git a/common/display/HwcVideoPlane.h b/common/display/HwcVideoPlane.h index 8281b7f..5adfe87 100644 --- a/common/display/HwcVideoPlane.h +++ b/common/display/HwcVideoPlane.h @@ -79,6 +79,9 @@ protected: u32 mFramesCount; video_frames_info_t mVideoFramesInfo; bool mStatus; + + std::vector<std::shared_ptr<DrmFramebuffer>> mLastComposeFbs; + std::shared_ptr<DrmFence> mLastFence; }; #endif/*HWC_VIDEO_PLANE_H*/ diff --git a/composition/simplestrategy/MultiplanesWithDiComposition/MultiplanesWithDiComposition.cpp b/composition/simplestrategy/MultiplanesWithDiComposition/MultiplanesWithDiComposition.cpp index 8bca031..d512db5 100755..100644 --- a/composition/simplestrategy/MultiplanesWithDiComposition/MultiplanesWithDiComposition.cpp +++ b/composition/simplestrategy/MultiplanesWithDiComposition/MultiplanesWithDiComposition.cpp @@ -453,9 +453,9 @@ int32_t MultiplanesWithDiComposition::compareFbScale( else if (widthCompare > 0 && heighCompare > 0) return 1; else { - MESON_LOGW("compareFbScale failed %d ,%d, %d, %d", - widthCompare, heighCompare, - bDisplayWidth, bDisplayHeight); + //MESON_LOGW("compareFbScale failed %d ,%d, %d, %d", + //widthCompare, heighCompare, + //bDisplayWidth, bDisplayHeight); return -1; } } |