void OMAPLFBSwapHandler(OMAPLFB_BUFFER *psBuffer) { OMAPLFB_DEVINFO *psDevInfo = psBuffer->psDevInfo; OMAPLFB_SWAPCHAIN *psSwapChain = psDevInfo->psSwapChain; OMAPLFB_BOOL bPreviouslyNotVSynced; #if defined(SUPPORT_DRI_DRM) if (!OMAPLFBAtomicBoolRead(&psDevInfo->sLeaveVT)) #endif { OMAPLFBFlip(psDevInfo, psBuffer); } bPreviouslyNotVSynced = psSwapChain->bNotVSynced; psSwapChain->bNotVSynced = OMAPLFB_TRUE; if (!DontWaitForVSync(psDevInfo)) { OMAPLFB_UPDATE_MODE eMode = OMAPLFBGetUpdateMode(psDevInfo); int iBlankEvents = OMAPLFBAtomicIntRead(&psDevInfo->sBlankEvents); switch(eMode) { case OMAPLFB_UPDATE_MODE_AUTO: psSwapChain->bNotVSynced = OMAPLFB_FALSE; if (bPreviouslyNotVSynced || psSwapChain->iBlankEvents != iBlankEvents) { psSwapChain->iBlankEvents = iBlankEvents; psSwapChain->bNotVSynced = !WaitForVSyncSettle(psDevInfo); } else if (psBuffer->ulSwapInterval != 0) { psSwapChain->bNotVSynced = !OMAPLFBWaitForVSync(psDevInfo); } break; #if defined(PVR_OMAPFB3_MANUAL_UPDATE_SYNC_IN_SWAP) case OMAPLFB_UPDATE_MODE_MANUAL: if (psBuffer->ulSwapInterval != 0) { (void) OMAPLFBManualSync(psDevInfo); } break; #endif default: break; } } psDevInfo->sPVRJTable.pfnPVRSRVCmdComplete((IMG_HANDLE)psBuffer->hCmdComplete, IMG_TRUE); }
/* * If the screen is manual or auto update mode, wait for the screen to * update. */ OMAPLFB_BOOL OMAPLFBCheckModeAndSync(OMAPLFB_DEVINFO *psDevInfo) { OMAPLFB_UPDATE_MODE eMode = OMAPLFBGetUpdateMode(psDevInfo); switch(eMode) { case OMAPLFB_UPDATE_MODE_AUTO: case OMAPLFB_UPDATE_MODE_MANUAL: return OMAPLFBManualSync(psDevInfo); default: break; } return OMAPLFB_TRUE; }