qcom/display: fixes for the external overlay channel
- During video playback, when the external display is connected, start the overlay channel on the right framebuffer. - set the correct position for the new external display channel - fix minor bug in the function getAspectRatioPosition for external display CRs-fixed: 336674 (cherry picked from commit 6afc95ee1197718332461c8f0ddf9cf5f94cc7aa) Change-Id: Ifa30dfea349c2a0f133790ab2dc91527d53152f8
This commit is contained in:
		
				
					committed by
					
						
						Andrew Sutherland
					
				
			
			
				
	
			
			
			
						parent
						
							452832bb84
						
					
				
				
					commit
					eee6309c4f
				
			@@ -288,7 +288,8 @@ static int prepareOverlay(hwc_context_t *ctx, hwc_layer_t *layer, const bool wai
 | 
			
		||||
        int hdmiConnected = 0;
 | 
			
		||||
 | 
			
		||||
#if defined HDMI_DUAL_DISPLAY
 | 
			
		||||
        hdmiConnected = (int)ctx->mHDMIEnabled;
 | 
			
		||||
        if(!ctx->pendingHDMI) //makes sure the UI channel is opened first
 | 
			
		||||
            hdmiConnected = (int)ctx->mHDMIEnabled;
 | 
			
		||||
#endif
 | 
			
		||||
        ret = ovLibObject->setSource(info, layer->transform,
 | 
			
		||||
                            hdmiConnected, waitForVsync);
 | 
			
		||||
 
 | 
			
		||||
@@ -416,7 +416,7 @@ int overlay::initOverlay() {
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Overlay::Overlay() : mChannelUP(false), mHDMIConnected(false),
 | 
			
		||||
Overlay::Overlay() : mChannelUP(false), mExternalDisplay(false),
 | 
			
		||||
                     mS3DFormat(0), mCroppedSrcWidth(0),
 | 
			
		||||
                     mCroppedSrcHeight(0), mState(-1) {
 | 
			
		||||
    mOVBufferInfo.width = mOVBufferInfo.height = 0;
 | 
			
		||||
@@ -468,7 +468,7 @@ bool Overlay::closeChannel() {
 | 
			
		||||
        return true;
 | 
			
		||||
 | 
			
		||||
    if(mS3DFormat) {
 | 
			
		||||
        if (mHDMIConnected)
 | 
			
		||||
        if (mExternalDisplay)
 | 
			
		||||
            overlay::send3DInfoPacket(0);
 | 
			
		||||
        else if (mState == OV_3D_VIDEO_3D_PANEL) {
 | 
			
		||||
            if (sHDMIAsPrimary)
 | 
			
		||||
@@ -692,7 +692,7 @@ bool Overlay::setSource(const overlay_buffer_info& info, int orientation,
 | 
			
		||||
    // effectiveFormat = 3D_IN | 3D_OUT | ColorFormat
 | 
			
		||||
    int newState = mState;
 | 
			
		||||
    bool stateChange = false, ret = true;
 | 
			
		||||
    bool isHDMIStateChange = (mHDMIConnected != hdmiConnected) && (mState != -1);
 | 
			
		||||
    bool isHDMIStateChange = (mExternalDisplay != hdmiConnected) && (mState != -1);
 | 
			
		||||
    unsigned int format3D = getS3DFormat(info.format);
 | 
			
		||||
    int colorFormat = getColorFormat(info.format);
 | 
			
		||||
    if (isHDMIStateChange || -1 == mState) {
 | 
			
		||||
@@ -702,7 +702,7 @@ bool Overlay::setSource(const overlay_buffer_info& info, int orientation,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (stateChange) {
 | 
			
		||||
        mHDMIConnected = hdmiConnected;
 | 
			
		||||
        mExternalDisplay = hdmiConnected;
 | 
			
		||||
        mState = newState;
 | 
			
		||||
        mS3DFormat = format3D;
 | 
			
		||||
        if (mState == OV_3D_VIDEO_2D_PANEL || mState == OV_3D_VIDEO_2D_TV) {
 | 
			
		||||
@@ -745,15 +745,29 @@ bool Overlay::setSource(const overlay_buffer_info& info, int orientation,
 | 
			
		||||
                   //start only HDMI channel
 | 
			
		||||
                   noRot = true;
 | 
			
		||||
                   bool waitForVsync = true;
 | 
			
		||||
                   if(!startChannel(info, FRAMEBUFFER_1, noRot, false, mS3DFormat,
 | 
			
		||||
                                    VG1_PIPE, waitForVsync, num_buffers)) {
 | 
			
		||||
                   // External display connected, start corresponding channel
 | 
			
		||||
                   // mExternalDisplay will hold the fbnum
 | 
			
		||||
                   if(!startChannel(info, mExternalDisplay, noRot, false, mS3DFormat,
 | 
			
		||||
                               VG1_PIPE, waitForVsync, num_buffers)) {
 | 
			
		||||
                       LOGE("%s:failed to open channel %d", __func__, VG1_PIPE);
 | 
			
		||||
                       return false;
 | 
			
		||||
                    }
 | 
			
		||||
                    overlay_rect rect;
 | 
			
		||||
                    objOvCtrlChannel[VG1_PIPE].getAspectRatioPosition(info.width,
 | 
			
		||||
                                                                  info.height, &rect);
 | 
			
		||||
                    return setChannelPosition(rect.x, rect.y, rect.w, rect.h, VG1_PIPE);
 | 
			
		||||
                   }
 | 
			
		||||
                   int currX, currY;
 | 
			
		||||
                   uint32_t currW, currH;
 | 
			
		||||
                   overlay_rect priDest;
 | 
			
		||||
                   overlay_rect secDest;
 | 
			
		||||
                   objOvCtrlChannel[VG0_PIPE].getPosition(currX, currY, currW, currH);
 | 
			
		||||
                   priDest.x = currX, priDest.y = currY;
 | 
			
		||||
                   priDest.w = currW, priDest.h = currH;
 | 
			
		||||
                   if (FrameBufferInfo::getInstance()->canSupportTrueMirroring()) {
 | 
			
		||||
                       objOvCtrlChannel[VG1_PIPE].getAspectRatioPosition(
 | 
			
		||||
                               mCroppedSrcWidth, mCroppedSrcHeight, mDevOrientation,
 | 
			
		||||
                               &priDest, &secDest);
 | 
			
		||||
                   } else {
 | 
			
		||||
                       objOvCtrlChannel[VG1_PIPE].getAspectRatioPosition(
 | 
			
		||||
                               mCroppedSrcWidth, mCroppedSrcHeight, &secDest);
 | 
			
		||||
                   }
 | 
			
		||||
                   return setChannelPosition(secDest.x, secDest.y, secDest.w, secDest.h, VG1_PIPE);
 | 
			
		||||
                }
 | 
			
		||||
            case OV_3D_VIDEO_2D_TV:
 | 
			
		||||
                closeChannel();
 | 
			
		||||
@@ -1042,7 +1056,6 @@ bool OverlayControlChannel::getAspectRatioPosition(int w, int h, int orientation
 | 
			
		||||
    int xPos = 0;
 | 
			
		||||
    int yPos = 0;
 | 
			
		||||
    int tmp = 0;
 | 
			
		||||
    float actualWidth = fbWidth;
 | 
			
		||||
    overlay_rect rect;
 | 
			
		||||
    switch(orientation) {
 | 
			
		||||
        case MDP_ROT_NOP:
 | 
			
		||||
@@ -1052,7 +1065,6 @@ bool OverlayControlChannel::getAspectRatioPosition(int w, int h, int orientation
 | 
			
		||||
            yPos = rect.y;
 | 
			
		||||
            fbWidth = rect.w;
 | 
			
		||||
            fbHeight = rect.h;
 | 
			
		||||
            actualWidth = fbWidth;
 | 
			
		||||
 | 
			
		||||
            if(orientation == MDP_ROT_180) {
 | 
			
		||||
                inRect->x = priWidth - (inRect->x + inRect->w);
 | 
			
		||||
@@ -1061,16 +1073,6 @@ bool OverlayControlChannel::getAspectRatioPosition(int w, int h, int orientation
 | 
			
		||||
            break;
 | 
			
		||||
        case MDP_ROT_90:
 | 
			
		||||
        case MDP_ROT_270:
 | 
			
		||||
            // Swap width/height for primary
 | 
			
		||||
            swapWidthHeight(priWidth, priHeight);
 | 
			
		||||
            //Swap the destination width/height
 | 
			
		||||
            swapWidthHeight(inRect->w, inRect->h);
 | 
			
		||||
            getAspectRatioPosition((int)priWidth, (int)priHeight, &rect);
 | 
			
		||||
            xPos = rect.x;
 | 
			
		||||
            yPos = rect.y;
 | 
			
		||||
            fbWidth = rect.w;
 | 
			
		||||
            actualWidth = fbWidth;
 | 
			
		||||
            fbHeight = rect.h;
 | 
			
		||||
            if(orientation == MDP_ROT_90) {
 | 
			
		||||
                tmp = inRect->y;
 | 
			
		||||
                inRect->y = priWidth - (inRect->x + inRect->w);
 | 
			
		||||
@@ -1081,6 +1083,15 @@ bool OverlayControlChannel::getAspectRatioPosition(int w, int h, int orientation
 | 
			
		||||
                inRect->x = priHeight - (inRect->y + inRect->h);
 | 
			
		||||
                inRect->y = tmp;
 | 
			
		||||
            }
 | 
			
		||||
            //Swap the destination width/height
 | 
			
		||||
            swapWidthHeight(inRect->w, inRect->h);
 | 
			
		||||
            // Swap width/height for primary
 | 
			
		||||
            swapWidthHeight(priWidth, priHeight);
 | 
			
		||||
            getAspectRatioPosition((int)priWidth, (int)priHeight, &rect);
 | 
			
		||||
            xPos = rect.x;
 | 
			
		||||
            yPos = rect.y;
 | 
			
		||||
            fbWidth = rect.w;
 | 
			
		||||
            fbHeight = rect.h;
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            LOGE("In  %s: Unknown Orientation", __FUNCTION__);
 | 
			
		||||
@@ -1092,10 +1103,10 @@ bool OverlayControlChannel::getAspectRatioPosition(int w, int h, int orientation
 | 
			
		||||
 | 
			
		||||
    wRatio = inRect->w/priWidth;
 | 
			
		||||
    hRatio = inRect->h/priHeight;
 | 
			
		||||
    outRect->x = (xRatio * actualWidth) + xPos;
 | 
			
		||||
    outRect->x = (xRatio * fbWidth) + xPos;
 | 
			
		||||
    outRect->y = (yRatio * fbHeight) + yPos;
 | 
			
		||||
 | 
			
		||||
    outRect->w = (wRatio * actualWidth);
 | 
			
		||||
    outRect->w = (wRatio * fbWidth);
 | 
			
		||||
    outRect->h = hRatio * fbHeight;
 | 
			
		||||
    LOGD("Calculated AS Position for HDMI:  X= %d, y = %d w = %d h = %d",
 | 
			
		||||
                                  outRect->x, outRect->y,outRect->w, outRect->h);
 | 
			
		||||
 
 | 
			
		||||
@@ -390,8 +390,8 @@ public:
 | 
			
		||||
class Overlay {
 | 
			
		||||
 | 
			
		||||
    bool mChannelUP;
 | 
			
		||||
    ////stores the connected external display
 | 
			
		||||
    int mHDMIConnected;
 | 
			
		||||
    //stores the connected external display Ex: HDMI(1) WFD(2)
 | 
			
		||||
    int mExternalDisplay;
 | 
			
		||||
    unsigned int mS3DFormat;
 | 
			
		||||
    //Actual cropped source width and height of overlay
 | 
			
		||||
    int mCroppedSrcWidth;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user