static PVRSRV_ERROR DestroyDCSwapChain(IMG_HANDLE hDevice, IMG_HANDLE hSwapChain) { S3C_SWAPCHAIN *sc = (S3C_SWAPCHAIN *)hSwapChain; S3C_LCD_DEVINFO *psLCDInfo = (S3C_LCD_DEVINFO*)hDevice; if(!hDevice || !hSwapChain) { return PVRSRV_ERROR_INVALID_PARAMS; } FlushInternalVSyncQueue(psLCDInfo); S3C_Flip(psLCDInfo, &psLCDInfo->sSysBuffer); kfree(sc->psBuffer); kfree(sc); if (psLCDInfo->psSwapChain == sc) psLCDInfo->psSwapChain = NULL; ResetVSyncFlipItems(psLCDInfo); S3C_UninstallVsyncISR(); return PVRSRV_OK; }
static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice, IMG_UINT32 ui32Flags, DISPLAY_SURF_ATTRIBUTES *psDstSurfAttrib, DISPLAY_SURF_ATTRIBUTES *psSrcSurfAttrib, IMG_UINT32 ui32BufferCount, PVRSRV_SYNC_DATA **ppsSyncData, IMG_UINT32 ui32OEMFlags, IMG_HANDLE *phSwapChain, IMG_UINT32 *pui32SwapChainID) { IMG_UINT32 i; S3C_FRAME_BUFFER *psBuffer; S3C_SWAPCHAIN *psSwapChain; S3C_LCD_DEVINFO *psDevInfo = (S3C_LCD_DEVINFO*)hDevice; PVR_UNREFERENCED_PARAMETER(ui32OEMFlags); PVR_UNREFERENCED_PARAMETER(pui32SwapChainID); if(!hDevice || !psDstSurfAttrib || !psSrcSurfAttrib || !ppsSyncData || !phSwapChain) { return PVRSRV_ERROR_INVALID_PARAMS; } if(ui32BufferCount > psDevInfo->ui32NumFrameBuffers) { return PVRSRV_ERROR_TOOMANYBUFFERS; } if(psDevInfo->psSwapChain) { return (PVRSRV_ERROR_FLIP_CHAIN_EXISTS); } psSwapChain = (S3C_SWAPCHAIN *)kmalloc(sizeof(S3C_SWAPCHAIN),GFP_KERNEL); psBuffer = (S3C_FRAME_BUFFER*)kmalloc(sizeof(S3C_FRAME_BUFFER) * ui32BufferCount, GFP_KERNEL); if(!psBuffer) { kfree(psSwapChain); return (PVRSRV_ERROR_OUT_OF_MEMORY); } psSwapChain->ulBufferCount = (unsigned long)ui32BufferCount; psSwapChain->psBuffer = psBuffer; psBuffer[0].bufferPAddr = psDevInfo->sSysBuffer.bufferPAddr; psBuffer[0].bufferVAddr = psDevInfo->sSysBuffer.bufferVAddr; psBuffer[0].byteSize = psDevInfo->sSysBuffer.byteSize; psBuffer[0].yoffset = psDevInfo->sSysBuffer.yoffset; for (i=1; i<ui32BufferCount; i++) { psBuffer[i].bufferPAddr = psDevInfo->asBackBuffers[i-1].bufferPAddr; psBuffer[i].bufferVAddr = psDevInfo->asBackBuffers[i-1].bufferVAddr; psBuffer[i].byteSize = psDevInfo->asBackBuffers[i-1].byteSize; psBuffer[i].yoffset = psDevInfo->asBackBuffers[i-1].yoffset; } *phSwapChain = (IMG_HANDLE)psSwapChain; *pui32SwapChainID =(IMG_UINT32)psSwapChain; psDevInfo->psSwapChain = psSwapChain; ResetVSyncFlipItems(psDevInfo); S3C_InstallVsyncISR(); return PVRSRV_OK; }
static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice, IMG_UINT32 ui32Flags, DISPLAY_SURF_ATTRIBUTES *psDstSurfAttrib, DISPLAY_SURF_ATTRIBUTES *psSrcSurfAttrib, IMG_UINT32 ui32BufferCount, PVRSRV_SYNC_DATA **ppsSyncData, IMG_UINT32 ui32OEMFlags, IMG_HANDLE *phSwapChain, IMG_UINT32 *pui32SwapChainID) { IMG_UINT32 i; S3C_FRAME_BUFFER *psBuffer; S3C_SWAPCHAIN *psSwapChain; S3C_LCD_DEVINFO *psDevInfo = (S3C_LCD_DEVINFO*)hDevice; PVR_UNREFERENCED_PARAMETER(ui32OEMFlags); PVR_UNREFERENCED_PARAMETER(pui32SwapChainID); if(!hDevice || !psDstSurfAttrib || !psSrcSurfAttrib || !ppsSyncData || !phSwapChain) { return PVRSRV_ERROR_INVALID_PARAMS; } if(ui32BufferCount > psDevInfo->ui32NumFrameBuffers) { return PVRSRV_ERROR_TOOMANYBUFFERS; } if(psDevInfo->psSwapChain) { /* * To support android test applciation which access FB directly * Original code do not allow direct */ psDevInfo->psSwapChain->ulRefCount++; *phSwapChain = (IMG_HANDLE)psDevInfo->psSwapChain; *pui32SwapChainID = (IMG_UINT32)psDevInfo->psSwapChain; return PVRSRV_OK; } psSwapChain = (S3C_SWAPCHAIN *)kmalloc(sizeof(S3C_SWAPCHAIN),GFP_KERNEL); if(!psSwapChain) return (PVRSRV_ERROR_OUT_OF_MEMORY); psBuffer = (S3C_FRAME_BUFFER*)kmalloc(sizeof(S3C_FRAME_BUFFER) * ui32BufferCount, GFP_KERNEL); if(!psBuffer) { kfree(psSwapChain); return (PVRSRV_ERROR_OUT_OF_MEMORY); } psSwapChain->ulBufferCount = (unsigned long)ui32BufferCount; psSwapChain->psBuffer = psBuffer; #if defined(S3C_DC_IS_PHYS_DISCONTIG) psBuffer[0].pbufferPAddrs = psDevInfo->sSysBuffer.pbufferPAddrs; #else psBuffer[0].bufferPAddr = psDevInfo->sSysBuffer.bufferPAddr; #endif psBuffer[0].bufferVAddr = psDevInfo->sSysBuffer.bufferVAddr; psBuffer[0].byteSize = psDevInfo->sSysBuffer.byteSize; psBuffer[0].yoffset = psDevInfo->sSysBuffer.yoffset; for (i=1; i<ui32BufferCount; i++) { #if defined(S3C_DC_IS_PHYS_DISCONTIG) psBuffer[i].pbufferPAddrs = psDevInfo->asBackBuffers[i-1].pbufferPAddrs; #else psBuffer[i].bufferPAddr = psDevInfo->asBackBuffers[i-1].bufferPAddr; #endif psBuffer[i].bufferVAddr = psDevInfo->asBackBuffers[i-1].bufferVAddr; psBuffer[i].byteSize = psDevInfo->asBackBuffers[i-1].byteSize; psBuffer[i].yoffset = psDevInfo->asBackBuffers[i-1].yoffset; } *phSwapChain = (IMG_HANDLE)psSwapChain; *pui32SwapChainID =(IMG_UINT32)psSwapChain; psSwapChain->ulRefCount++; psDevInfo->psSwapChain = psSwapChain; ResetVSyncFlipItems(psDevInfo); S3C_InstallVsyncISR(); return PVRSRV_OK; }