summaryrefslogtreecommitdiff
authorsky 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)
commitbe100acbec50b07d02bfbae495ea2cb4f4ca278e (patch)
tree356397cdbd033cff093a64ea72ae1ab7476bba86
parent186bbb0682799a5768ec7cf00a4fb9a4dde4fb25 (diff)
downloadhwcomposer-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>
Diffstat
-rw-r--r--common/display/HwcVideoPlane.cpp299
-rw-r--r--common/display/HwcVideoPlane.h3
-rw-r--r--[-rwxr-xr-x]composition/simplestrategy/MultiplanesWithDiComposition/MultiplanesWithDiComposition.cpp6
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;
}
}