return IMG_TRUE;
}
+static inline void MRSTFBFlipComplete(MRSTLFB_SWAPCHAIN *psSwapChain, MRSTLFB_VSYNC_FLIP_ITEM* psFlipItem, MRST_BOOL bSchedule)
+{
+ MRSTLFB_VSYNC_FLIP_ITEM *psLastItem;
+ SYS_DATA *psSysData;
+ MRST_BOOL bMISRScheduled = MRST_FALSE;
+ SysAcquireData(&psSysData);
+ if (psSwapChain) {
+ psLastItem = &(psSwapChain->sLastItem);
+ if (psLastItem->bValid && psLastItem->bFlipped && psLastItem->bCmdCompleted == MRST_FALSE)
+ {
+ psSwapChain->psPVRJTable->pfnPVRSRVCmdComplete((IMG_HANDLE)psLastItem->hCmdComplete, MRST_TRUE);
+ psLastItem->bCmdCompleted = MRST_TRUE;
+ bMISRScheduled = MRST_TRUE;
+ }
+ if (psFlipItem)
+ psSwapChain->sLastItem = *psFlipItem;
+ }
+ if (bSchedule && !bMISRScheduled)
+ OSScheduleMISR(psSysData);
+}
+
+
static void MRSTLFBFlipOverlay(MRSTLFB_DEVINFO *psDevInfo,
struct intel_overlay_context *psContext)
{
psFlipItem = &psSwapChain->psVSyncFlips[psSwapChain->ulRemoveIndex];
ulMaxIndex = psSwapChain->ulSwapChainLength - 1;
+ MRSTFBFlipComplete(psSwapChain, NULL, MRST_TRUE);
for(i = 0; i < psSwapChain->ulSwapChainLength; i++)
{
if (psFlipItem->bValid == MRST_FALSE)
}
- ulSwapChainLength = ui32BufferCount + 1;
+ ulSwapChainLength = ui32BufferCount + 6;
if(psDstSurfAttrib->pixelformat != psDevInfo->sDisplayFormat.pixelformat
eError = PVRSRV_ERROR_OUT_OF_MEMORY;
goto ErrorFreeSwapChain;
}
-
ppsBuffer = (MRSTLFB_BUFFER**)MRSTLFBAllocKernelMem(sizeof(MRSTLFB_BUFFER*) * ui32BufferCount);
if(!ppsBuffer)
{
psSwapChain->ulInsertIndex = 0;
psSwapChain->ulRemoveIndex = 0;
psSwapChain->psPVRJTable = &psDevInfo->sPVRJTable;
-
+ psSwapChain->sLastItem.bValid = MRST_FALSE;
for (i = 0; i < ui32BufferCount; i++)
{
return (PVRSRV_ERROR_INVALID_PARAMS);
}
-
psDevInfo = (MRSTLFB_DEVINFO*)hDevice;
psSwapChain = (MRSTLFB_SWAPCHAIN*)hSwapChain;
return (PVRSRV_OK);
}
+
static MRST_BOOL MRSTLFBVSyncIHandler(MRSTLFB_DEVINFO *psDevInfo, int iPipe)
{
MRST_BOOL bStatus = MRST_FALSE;
- MRSTLFB_VSYNC_FLIP_ITEM *psFlipItem;
+ MRSTLFB_VSYNC_FLIP_ITEM *psFlipItem, *psLastItem;
unsigned long ulMaxIndex;
unsigned long ulLockFlags;
MRSTLFB_SWAPCHAIN *psSwapChain;
MRST_BOOL bScheduleMISR;
bScheduleMISR = MRST_TRUE;
- psSwapChain->psPVRJTable->pfnPVRSRVCmdComplete((IMG_HANDLE)psFlipItem->hCmdComplete, bScheduleMISR);
+ MRSTFBFlipComplete(psSwapChain, psFlipItem, MRST_TRUE);
psFlipItem->bCmdCompleted = MRST_TRUE;
}
&psFlipItem->sPlaneContexts);
psFlipItem->bFlipped = MRST_TRUE;
-
break;
}
IMG_TRUE);
goto ExitErrorUnlock;
}
+ MRSTFBFlipComplete(psSwapChain, NULL, MRST_FALSE);
psSwapChain->psPVRJTable->pfnPVRSRVCmdComplete(hCmdCookie,
IMG_TRUE);
#if defined(MRST_USING_INTERRUPTS)
if (psFlipItem->bValid == MRST_FALSE) {
unsigned long ulMaxIndex = psSwapChain->ulSwapChainLength - 1;
-
if (psSwapChain->ulInsertIndex == psSwapChain->ulRemoveIndex) {
/*update sprite plane context*/
if (DRMLFBFlipBuffer2(
goto ExitErrorUnlock;
}
+ MRSTFBFlipComplete(psSwapChain, NULL, MRST_FALSE);
psSwapChain->psPVRJTable->pfnPVRSRVCmdComplete(hCmdCookie, IMG_TRUE);
#if defined(MRST_USING_INTERRUPTS)
if(psFlipItem->bValid == MRST_FALSE)
{
unsigned long ulMaxIndex = psSwapChain->ulSwapChainLength - 1;
-
if(psSwapChain->ulInsertIndex == psSwapChain->ulRemoveIndex)
{
if (DRMLFBFlipBuffer(psDevInfo,
return MRST_OK;
}
+IMG_VOID MRSTQuerySwapCommand(IMG_HANDLE hDev, IMG_HANDLE hSwap, IMG_HANDLE hBuffer, IMG_HANDLE hTag, IMG_UINT16* ID, IMG_BOOL* bAddRef)
+{
+ UNREFERENCED_PARAMETER(hDev);
+ UNREFERENCED_PARAMETER(hSwap);
+ UNREFERENCED_PARAMETER(hBuffer);
+ UNREFERENCED_PARAMETER(hTag);
+ UNREFERENCED_PARAMETER(ID);
+ *bAddRef = IMG_FALSE;
+}
+
+
MRST_ERROR MRSTLFBInit(struct drm_device * dev)
{
psDevInfo->sDCJTable.pfnSwapToDCSystem = SwapToDCSystem;
psDevInfo->sDCJTable.pfnSetDCState = SetDCState;
psDevInfo->sDCJTable.pfnGetDCFrontBuffer = GetDCFrontBuffer;
+ psDevInfo->sDCJTable.pfnQuerySwapCommandID = MRSTQuerySwapCommand;
if(psDevInfo->sPVRJTable.pfnPVRSRVRegisterDCDevice (