static PVRSRV_ERROR DestroyDCSwapChain(IMG_HANDLE hDevice, IMG_HANDLE hSwapChain) { OMAPLFB_DEVINFO *psDevInfo; OMAPLFB_SWAPCHAIN *psSwapChain; OMAPLFB_ERROR eError; if(!hDevice || !hSwapChain) { return PVRSRV_ERROR_INVALID_PARAMS; } psDevInfo = (OMAPLFB_DEVINFO*)hDevice; psSwapChain = (OMAPLFB_SWAPCHAIN*)hSwapChain; OMAPLFBCreateSwapChainLock(psDevInfo); if (SwapChainHasChanged(psDevInfo, psSwapChain)) { printk(KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Swap chain mismatch\n", __FUNCTION__, psDevInfo->uiFBDevID); eError = PVRSRV_ERROR_INVALID_PARAMS; goto ExitUnLock; } OMAPLFBDestroySwapQueue(psSwapChain); eError = OMAPLFBDisableLFBEventNotification(psDevInfo); if (eError != OMAPLFB_OK) { printk(KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Couldn't disable framebuffer event notification\n", __FUNCTION__, psDevInfo->uiFBDevID); } OMAPLFBFreeKernelMem(psSwapChain->psBuffer); OMAPLFBFreeKernelMem(psSwapChain); psDevInfo->psSwapChain = NULL; OMAPLFBFlip(psDevInfo, &psDevInfo->sSystemBuffer); (void) OMAPLFBCheckModeAndSync(psDevInfo); eError = PVRSRV_OK; ExitUnLock: OMAPLFBCreateSwapChainUnLock(psDevInfo); return eError; }
static IMG_BOOL ProcessFlip(IMG_HANDLE hCmdCookie, IMG_UINT32 ui32DataSize, IMG_VOID *pvData) { DISPLAYCLASS_FLIP_COMMAND *psFlipCmd; OMAPLFB_DEVINFO *psDevInfo; OMAPLFB_BUFFER *psBuffer; OMAPLFB_SWAPCHAIN *psSwapChain; if(!hCmdCookie || !pvData) { return IMG_FALSE; } psFlipCmd = (DISPLAYCLASS_FLIP_COMMAND*)pvData; if (psFlipCmd == IMG_NULL || sizeof(DISPLAYCLASS_FLIP_COMMAND) != ui32DataSize) { return IMG_FALSE; } psDevInfo = (OMAPLFB_DEVINFO*)psFlipCmd->hExtDevice; psBuffer = (OMAPLFB_BUFFER*)psFlipCmd->hExtBuffer; psSwapChain = (OMAPLFB_SWAPCHAIN*) psFlipCmd->hExtSwapChain; OMAPLFBCreateSwapChainLock(psDevInfo); if (SwapChainHasChanged(psDevInfo, psSwapChain)) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u (PVR Device ID %u): The swap chain has been destroyed\n", __FUNCTION__, psDevInfo->uiFBDevID, psDevInfo->uiPVRDevID)); } else { psBuffer->hCmdComplete = (OMAPLFB_HANDLE)hCmdCookie; psBuffer->ulSwapInterval = (unsigned long)psFlipCmd->ui32SwapInterval; #if defined(NO_HARDWARE) psDevInfo->sPVRJTable.pfnPVRSRVCmdComplete((IMG_HANDLE)psBuffer->hCmdComplete, IMG_FALSE); #else OMAPLFBQueueBufferForSwap(psSwapChain, psBuffer); #endif } OMAPLFBCreateSwapChainUnLock(psDevInfo); return IMG_TRUE; }
static PVRSRV_ERROR GetDCBuffers(IMG_HANDLE hDevice, IMG_HANDLE hSwapChain, IMG_UINT32 *pui32BufferCount, IMG_HANDLE *phBuffer) { MTKLFB_DEVINFO *psDevInfo; MTKLFB_SWAPCHAIN *psSwapChain; PVRSRV_ERROR eError; unsigned i; if(!hDevice || !hSwapChain || !pui32BufferCount || !phBuffer) { xlog_printk(ANDROID_LOG_ERROR, DRIVER_PREFIX, "%s: invalid params\n", __FUNCTION__); return PVRSRV_ERROR_INVALID_PARAMS; } psDevInfo = (MTKLFB_DEVINFO*)hDevice; psSwapChain = (MTKLFB_SWAPCHAIN*)hSwapChain; MTKLFBCreateSwapChainLock(psDevInfo); if (SwapChainHasChanged(psDevInfo, psSwapChain)) { xlog_printk(ANDROID_LOG_ERROR, DRIVER_PREFIX, "%s: Device %u: Swap chain mismatch\n", __FUNCTION__, psDevInfo->uiFBDevID); eError = PVRSRV_ERROR_INVALID_PARAMS; goto Exit; } *pui32BufferCount = (IMG_UINT32)psSwapChain->ulBufferCount; for(i=0; i<psSwapChain->ulBufferCount; i++) { phBuffer[i] = (IMG_HANDLE)&psSwapChain->psBuffer[i]; } eError = PVRSRV_OK; Exit: MTKLFBCreateSwapChainUnLock(psDevInfo); return eError; }
static IMG_BOOL ProcessFlip(IMG_HANDLE hCmdCookie, IMG_UINT32 ui32DataSize, IMG_VOID *pvData) { DISPLAYCLASS_FLIP_COMMAND *psFlipCmd; MTKLFB_DEVINFO *psDevInfo; MTKLFB_BUFFER *psBuffer; MTKLFB_SWAPCHAIN *psSwapChain; if(!hCmdCookie || !pvData) { xlog_printk(ANDROID_LOG_ERROR, DRIVER_PREFIX, "hCmdCookie(%p) or pvData(%p) is NULL\n", hCmdCookie, pvData); return IMG_FALSE; } psFlipCmd = (DISPLAYCLASS_FLIP_COMMAND*)pvData; if (psFlipCmd == IMG_NULL) { xlog_printk(ANDROID_LOG_ERROR, DRIVER_PREFIX, "psFlipCmd is NULL\n"); return IMG_FALSE; } psDevInfo = (MTKLFB_DEVINFO*)psFlipCmd->hExtDevice; psBuffer = (MTKLFB_BUFFER*)psFlipCmd->hExtBuffer; psSwapChain = (MTKLFB_SWAPCHAIN*) psFlipCmd->hExtSwapChain; MTKLFBCreateSwapChainLock(psDevInfo); if (SwapChainHasChanged(psDevInfo, psSwapChain)) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u (PVR Device ID %u): The swap chain has been destroyed\n", __FUNCTION__, psDevInfo->uiFBDevID, psDevInfo->uiPVRDevID)); } else { psBuffer->hCmdComplete = (MTKLFB_HANDLE)hCmdCookie; psBuffer->ulSwapInterval = (unsigned long)psFlipCmd->ui32SwapInterval; MTKLFBQueueBufferForSwap(psSwapChain, psBuffer); } MTKLFBCreateSwapChainUnLock(psDevInfo); return IMG_TRUE; }