diff --git a/libhwcomposer/hwc_fbupdate.cpp b/libhwcomposer/hwc_fbupdate.cpp index 74d95e7f..8145d82b 100644 --- a/libhwcomposer/hwc_fbupdate.cpp +++ b/libhwcomposer/hwc_fbupdate.cpp @@ -101,7 +101,8 @@ bool FBUpdateNonSplit::preRotateExtDisplay(hwc_context_t *ctx, // viewFrame with sourceCrop to avoid those black bars sourceCrop = getIntersection(sourceCrop, ctx->mViewFrame[mDpy]); //Configure rotator for pre-rotation - if(configRotator(mRot, info, sourceCrop, mdpFlags, orient, 0) < 0) { + if(configRotator(mRot, info, sourceCrop, mdpFlags, orient, 0, + ctx->dpyAttr[HWC_DISPLAY_PRIMARY].refreshRate) < 0) { ALOGE("%s: configRotator Failed!", __FUNCTION__); mRot = NULL; return false; diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp index e2c46778..1f16416d 100644 --- a/libhwcomposer/hwc_mdpcomp.cpp +++ b/libhwcomposer/hwc_mdpcomp.cpp @@ -3103,8 +3103,14 @@ int MDPCompSrcSplit::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, BwcPM::setBwc(ctx, mDpy, hnd, crop, dst, transform, downscale, mdpFlags); } + uint32_t frame_rate = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].refreshRate; + if(!mDpy && !isSecondaryConnected(ctx)) { + if(metadata && (metadata->operation & UPDATE_REFRESH_RATE)) + frame_rate = metadata->refreshrate; + } //Configure rotator for pre-rotation - if(configRotator(*rot, whf, crop, mdpFlags, orient, downscale) < 0) { + if(configRotator(*rot, whf, crop, mdpFlags, orient, downscale, + frame_rate) < 0) { ALOGE("%s: configRotator failed!", __FUNCTION__); return -1; } diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp index 5de30819..7bc4d235 100644 --- a/libhwcomposer/hwc_utils.cpp +++ b/libhwcomposer/hwc_utils.cpp @@ -1922,7 +1922,8 @@ void setMdpFlags(hwc_context_t *ctx, hwc_layer_1_t *layer, int configRotator(Rotator *rot, Whf& whf, hwc_rect_t& crop, const eMdpFlags& mdpFlags, - const eTransform& orient, const int& downscale) { + const eTransform& orient, const int& downscale, + const uint32_t& frame_rate) { // Fix alignments for TILED format if(whf.format == MDP_Y_CRCB_H2V2_TILE || @@ -1939,6 +1940,7 @@ int configRotator(Rotator *rot, Whf& whf, rot->setCrop(rotCrop); } + rot->setFrameRate(frame_rate); rot->setFlags(mdpFlags); rot->setTransform(orient); rot->setDownscale(downscale); @@ -2226,8 +2228,14 @@ int configureNonSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, ctx->mLayerRotMap[dpy]->add(layer, *rot); BwcPM::setBwc(ctx, dpy, hnd, crop, dst, transform, downscale, mdpFlags); + uint32_t frame_rate = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].refreshRate; + if(!dpy && !isSecondaryConnected(ctx)) { + if(metadata && (metadata->operation & UPDATE_REFRESH_RATE)) + frame_rate = metadata->refreshrate; + } //Configure rotator for pre-rotation - if(configRotator(*rot, whf, crop, mdpFlags, orient, downscale) < 0) { + if(configRotator(*rot, whf, crop, mdpFlags, orient, downscale, + frame_rate) < 0) { ALOGE("%s: configRotator failed!", __FUNCTION__); return -1; } @@ -2335,8 +2343,14 @@ int configureSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, (*rot) = ctx->mRotMgr->getNext(); if((*rot) == NULL) return -1; ctx->mLayerRotMap[dpy]->add(layer, *rot); + uint32_t frame_rate = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].refreshRate; + if(!dpy && !isSecondaryConnected(ctx)) { + if(metadata && (metadata->operation & UPDATE_REFRESH_RATE)) + frame_rate = metadata->refreshrate; + } //Configure rotator for pre-rotation - if(configRotator(*rot, whf, crop, mdpFlagsL, orient, downscale) < 0) { + if(configRotator(*rot, whf, crop, mdpFlagsL, orient, downscale, + frame_rate) < 0) { ALOGE("%s: configRotator failed!", __FUNCTION__); return -1; } @@ -2459,8 +2473,14 @@ int configure3DVideo(hwc_context_t *ctx, hwc_layer_1_t *layer, (*rot) = ctx->mRotMgr->getNext(); if((*rot) == NULL) return -1; ctx->mLayerRotMap[dpy]->add(layer, *rot); + uint32_t frame_rate = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].refreshRate; + if(!dpy && !isSecondaryConnected(ctx)) { + if(metadata && (metadata->operation & UPDATE_REFRESH_RATE)) + frame_rate = metadata->refreshrate; + } //Configure rotator for pre-rotation - if(configRotator(*rot, whf, crop, mdpFlagsL, orient, downscale) < 0) { + if(configRotator(*rot, whf, crop, mdpFlagsL, orient, downscale, + frame_rate) < 0) { ALOGE("%s: configRotator failed!", __FUNCTION__); return -1; } @@ -2577,8 +2597,14 @@ int configureSourceSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, (*rot) = ctx->mRotMgr->getNext(); if((*rot) == NULL) return -1; ctx->mLayerRotMap[dpy]->add(layer, *rot); + uint32_t frame_rate = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].refreshRate; + if(!dpy && !isSecondaryConnected(ctx)) { + if(metadata && (metadata->operation & UPDATE_REFRESH_RATE)) + frame_rate = metadata->refreshrate; + } //Configure rotator for pre-rotation - if(configRotator(*rot, whf, crop, mdpFlagsL, orient, downscale) < 0) { + if(configRotator(*rot, whf, crop, mdpFlagsL, orient, downscale, + frame_rate) < 0) { ALOGE("%s: configRotator failed!", __FUNCTION__); return -1; } diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h index 4849baf3..41dd2585 100644 --- a/libhwcomposer/hwc_utils.h +++ b/libhwcomposer/hwc_utils.h @@ -420,7 +420,8 @@ void setMdpFlags(hwc_context_t *ctx, hwc_layer_1_t *layer, int configRotator(overlay::Rotator *rot, ovutils::Whf& whf, hwc_rect_t& crop, const ovutils::eMdpFlags& mdpFlags, - const ovutils::eTransform& orient, const int& downscale); + const ovutils::eTransform& orient, const int& downscale, + const uint32_t& frame_rate); int configMdp(overlay::Overlay *ov, const ovutils::PipeArgs& parg, const ovutils::eTransform& orient, const hwc_rect_t& crop, diff --git a/liboverlay/overlayMdpRot.cpp b/liboverlay/overlayMdpRot.cpp index d3228976..b5a90ad1 100755 --- a/liboverlay/overlayMdpRot.cpp +++ b/liboverlay/overlayMdpRot.cpp @@ -126,6 +126,10 @@ void MdpRot::setCrop(const utils::Dim& /*crop*/) { // NO-OP for non-mdss rotator due to possible h/w limitations } +void MdpRot::setFrameRate(uint32_t /*frame_rate*/) { + // NO-OP for non-mdss rotator +} + void MdpRot::setFlags(const utils::eMdpFlags& flags) { mRotImgInfo.secure = 0; if(flags & utils::OV_MDP_SECURE_OVERLAY_SESSION) diff --git a/liboverlay/overlayMdssRot.cpp b/liboverlay/overlayMdssRot.cpp index 87e134a9..39b240d5 100644 --- a/liboverlay/overlayMdssRot.cpp +++ b/liboverlay/overlayMdssRot.cpp @@ -129,6 +129,10 @@ void MdssRot::setDownscale(int downscale) { mDownscale = downscale; } +void MdssRot::setFrameRate(uint32_t frame_rate) { + mRotInfo.frame_rate = frame_rate; +} + void MdssRot::setFlags(const utils::eMdpFlags& flags) { mRotInfo.flags = flags; } diff --git a/liboverlay/overlayRotator.h b/liboverlay/overlayRotator.h index e045b440..0766c867 100644 --- a/liboverlay/overlayRotator.h +++ b/liboverlay/overlayRotator.h @@ -97,6 +97,7 @@ public: virtual bool queueBuffer(int fd, uint32_t offset) = 0; virtual void dump() const = 0; virtual void getDump(char *buf, size_t len) const = 0; + virtual void setFrameRate(uint32_t frame_rate) = 0; inline void setCurrBufReleaseFd(const int& fence) { mMem.setCurrBufReleaseFd(fence); } @@ -150,6 +151,7 @@ public: virtual bool queueBuffer(int fd, uint32_t offset); virtual void dump() const; virtual void getDump(char *buf, size_t len) const; + virtual void setFrameRate(uint32_t frame_rate); private: explicit MdpRot(); @@ -222,6 +224,7 @@ public: virtual bool queueBuffer(int fd, uint32_t offset); virtual void dump() const; virtual void getDump(char *buf, size_t len) const; + virtual void setFrameRate(uint32_t frame_rate); private: explicit MdssRot();