📄 display.c
字号:
if(g_DISPState.ui32DisplayRotation &&
!((psOverlayAttributes->ui16ValidFlags & VDISP_OVERLAYATTRIB_VALID_ROTATION) &&
(psOverlayAttributes->bDisableRotation)))
{
/* we need to rotate the video */
g_DISPState.ui32SourceRotation = g_DISPState.ui32DisplayRotation;
/* check we have the buffers we need allocated */
if(!g_DISPState.bRotatedBuffersAllocated)
{
/* allocate the buffers */
/* assume that the width and height will have suitable alignments */
g_DISPState.ui32RotatedDisplaySurfStride = (g_DISPState.ui32DisplayRotation == 180) ?
((pSurface->ui32Width + (4 - 1)) & ~(4 - 1)):
((pSurface->ui32Height + (4 - 1)) & ~(4 - 1));
ui32Size = (g_DISPState.ui32DisplayRotation == 180) ?
pSurface->ui32Height * ((g_DISPState.ui32RotatedDisplaySurfStride * 3) / 2):
pSurface->ui32Width * ((g_DISPState.ui32RotatedDisplaySurfStride * 3) / 2);
for(i=0;i<VDISP_NUM_ROT_SURFACES;i++)
{
if(PVRSRVAllocDeviceMem(&g_DISPState.sDevData, 0, ui32Size, ALLOCATION_ALIGNMENT, &g_DISPState.apsDisplaySurfaces[i]) != PVRSRV_OK)
{
/* allocation failled so clean up any we successfully allocated then exit */
return(VDISPError_OutOfMemory);
}
/* initialise the surface to 0x80 */
//memset(g_DISPState.apsDisplaySurfaces[i]->pvLinAddr,0x80,ui32Size);
}
g_DISPState.bRotatedBuffersAllocated = IMG_TRUE;
}
}
else
{
/* we don't need to rotate the video */
g_DISPState.ui32SourceRotation = 0;
/* we could test for redundant display buffers here but it will be better to do that when the overlay is destroyed */
/* that will prevent us from having to re-allocate them if this mode is temporary */
}
if(!g_DISPState.bCommandQueueCreated)
{
/* Create the blit queue that we need */
if(PVRSRVCreateCommandQueue(&g_DISPState.sDevData, VDISP_QUEUE_SIZE, &g_DISPState.psCmdQueueInfo) != PVRSRV_OK)
{
/* failled to get the blit queue so we can't rotate the video */
return(VDISPError_HardwareNotAvailable);
}
g_DISPState.bCommandQueueCreated = IMG_TRUE;
}
if(psOverlayAttributes->ui16ValidFlags & VDISP_OVERLAYATTRIB_VALID_DSTPOSITION)
wFlags |= PDP_OVERLAYATTRIB_VALID_DSTPOSITION;
if(psOverlayAttributes->ui16ValidFlags & VDISP_OVERLAYATTRIB_VALID_SRCPOSITION)
wFlags |= PDP_OVERLAYATTRIB_VALID_SRCPOSITION;
if(psOverlayAttributes->ui16ValidFlags & VDISP_OVERLAYATTRIB_VALID_CKEY)
wFlags |= PDP_OVERLAYATTRIB_VALID_CKEY;
if(psOverlayAttributes->ui16ValidFlags & VDISP_OVERLAYATTRIB_VALID_VISIBILITY)
wFlags |= PDP_OVERLAYATTRIB_VALID_VISIBILITY;
if(psOverlayAttributes->ui16ValidFlags & VDISP_OVERLAYATTRIB_VALID_VERIFY)
wFlags |= PDP_OVERLAYATTRIB_VALID_VERIFY;
sOverlay.wValidFlags = wFlags | PDP_OVERLAYATTRIB_VALID_PIXFMT;
/* these parameters are always rotated */
switch(g_DISPState.ui32DisplayRotation)
{
case 0:
sOverlay.nTop = psOverlayAttributes->i16Top;
sOverlay.nLeft = psOverlayAttributes->i16Left;
sOverlay.nBottom = psOverlayAttributes->i16Bottom;
sOverlay.nRight = psOverlayAttributes->i16Right;
break;
case 90:
sOverlay.nTop = ui32ScreenWidth - psOverlayAttributes->i16Right;
sOverlay.nLeft = psOverlayAttributes->i16Top;
sOverlay.nBottom = ui32ScreenWidth - psOverlayAttributes->i16Left;
sOverlay.nRight = psOverlayAttributes->i16Bottom;
break;
case 180:
sOverlay.nTop = ui32ScreenHeight - psOverlayAttributes->i16Bottom;
sOverlay.nLeft = ui32ScreenWidth - psOverlayAttributes->i16Right;
sOverlay.nBottom = ui32ScreenHeight - psOverlayAttributes->i16Top;
sOverlay.nRight = ui32ScreenWidth - psOverlayAttributes->i16Left;
break;
case 270:
sOverlay.nTop = psOverlayAttributes->i16Left;
sOverlay.nLeft = ui32ScreenHeight - psOverlayAttributes->i16Bottom;
sOverlay.nBottom = psOverlayAttributes->i16Right;
sOverlay.nRight = ui32ScreenHeight - psOverlayAttributes->i16Top;
break;
}
switch(g_DISPState.ui32SourceRotation)
{
case 0:
sOverlay.wSrcX1 = psOverlayAttributes->ui16SrcX1;
sOverlay.wSrcY1 = psOverlayAttributes->ui16SrcY1;
sOverlay.wSrcX2 = psOverlayAttributes->ui16SrcX2;
sOverlay.wSrcY2 = psOverlayAttributes->ui16SrcY2;
ui32BltRotateCmd = MBX2D_TEXTROT_NONE;
break;
case 90:
sOverlay.wSrcX1 = psOverlayAttributes->ui16SrcY1;
sOverlay.wSrcY1 = (WORD)pSurface->ui32Width - psOverlayAttributes->ui16SrcX2;
sOverlay.wSrcX2 = psOverlayAttributes->ui16SrcY2;
sOverlay.wSrcY2 = (WORD)pSurface->ui32Width - psOverlayAttributes->ui16SrcX1;
ui32BltRotateCmd = MBX2D_TEXTROT_90DEGS;
break;
case 180:
sOverlay.wSrcX1 = (WORD)pSurface->ui32Width - psOverlayAttributes->ui16SrcX2;
sOverlay.wSrcY1 = (WORD)pSurface->ui32Height - psOverlayAttributes->ui16SrcY2;
sOverlay.wSrcX2 = (WORD)pSurface->ui32Width - psOverlayAttributes->ui16SrcX1;
sOverlay.wSrcY2 = (WORD)pSurface->ui32Height - psOverlayAttributes->ui16SrcY1;
ui32BltRotateCmd = MBX2D_TEXTROT_180DEGS;
break;
case 270:
sOverlay.wSrcX1 = (WORD)pSurface->ui32Height - psOverlayAttributes->ui16SrcY2;
sOverlay.wSrcY1 = psOverlayAttributes->ui16SrcX1;
sOverlay.wSrcX2 = (WORD)pSurface->ui32Height - psOverlayAttributes->ui16SrcY1;
sOverlay.wSrcY2 = psOverlayAttributes->ui16SrcX2;
ui32BltRotateCmd = MBX2D_TEXTROT_270DEGS;
break;
}
sOverlay.bCKeyOn = psOverlayAttributes->bCKeyOn;
sOverlay.dwCKeyValue = psOverlayAttributes->ui32CKeyValue;
sOverlay.bOverlayOn = psOverlayAttributes->bOverlayOn;
if(ExtEscape(g_DISPState.hdcDriver, DRVESC_OVERLAY_ATTRIBUTE,
sizeof(sOverlay), (LPSTR)&sOverlay,
sizeof(sOverlay), (LPSTR)&sOverlay) < 0)
{
//;OutputDebugString(L"[DAB] Attributes failed, escape\n");
eRtn = VDISPError_GenericError;
}
if((sOverlay.wValidFlags & PDP_OVERLAYATTRIB_VALID_VISIBILITY) && !sOverlay.bOverlayOn)
{
//We are turning off the overlay
if(gpsLastSyncObject != IMG_NULL)
{
gpsLastSyncObject = IMG_NULL;
}
}
#if defined(SUPPORT_3D_BLIT)
if (ui32BltRotateCmd != MBX2D_TEXTROT_NONE)
{
if(PVRSRVInitOverlayBltResources(&g_DISPState.sDevData,
pSurface->ui32Width,
pSurface->ui32Height,
pSurface->ui32Stride,
g_DISPState.ui32RotatedDisplaySurfStride,
ui32BltRotateCmd) != PVRSRV_OK)
{
eRtn = VDISPError_GenericError;
}
}
#endif
return(eRtn);
}
IMG_VOID SysKickCmdProc(IMG_UINT32 *pui32KickerAddr);
/*****************************************************************************
FUNCTION : VDISP_FlipOverlaySurface
PURPOSE :
PARAMETERS :
RETURNS : VDISPError
Notes : The drivers will dynamically clock gate the overlay based on its
visibility. Also the drivers automatically handle single shot displays
*****************************************************************************/
VDISPError PVRAPI VDISP_OverlayFlipSurface(SMSurface hSurfaceFlipTo,
VDISP_DEINTERLACE eDeinterlace)
{
VDISPError eRtn = VDISPError_OK;
PVRSRV_MEM_INFO *pDstBuf;
IMG_UINT32 ui32DisplayWidth, ui32DisplayHeight, ui32DisplayStride;
IMG_UINT32 ui32BltWordCount = 0, ui32BltRotateCmd = 0;
PINT_SM_HANDLE pSurf = (PINT_SM_HANDLE) hSurfaceFlipTo;
PDP_OVERLAY sOverlay;
PDP_PREPARE_FLIP sPrepareFlip;
PVRSRV_SYNC_INFO* psSrcSyncInfo;
PVRSRV_MEM_INFO* psToMemInfo;
#if defined(SUPPORT_3D_BLIT)
MBX_3DBLIT_PARAMS s3DParams;
#endif
#if !defined(SUPPORT_3D_BLIT)
IMG_UINT32 aui32BltData[32];
#endif
if(gpsLastSyncObject == IMG_NULL)
{
// g_DISPState.psPrimarySurf->psMemInfo->psSyncInfo->ui32ReadOpsPending++;
gpsLastSyncObject = g_DISPState.psPrimarySurf->psMemInfo->psSyncInfo;
}
/* Return error if application is using DirectDraw */
if (pSurf->bDirectDrawActive)
{
return VDISPError_IllegalFunctionCall;
}
/* test for rotation */
if(g_DISPState.ui32SourceRotation)
{
if(pSurf->eFormat != M24VA_SURF_FORMAT_420)
{
return VDISPError_IncorrectSurfaceFormat;
}
switch(g_DISPState.ui32SourceRotation)
{
case 90:
{
ui32DisplayWidth = pSurf->ui32Height;
//ui32DisplayStride = ((ui32DisplayWidth + 31)&(~31));
ui32DisplayHeight = pSurf->ui32Width;
ui32BltRotateCmd = MBX2D_TEXTROT_270DEGS;
break;
}
case 270:
{
ui32DisplayWidth = pSurf->ui32Height;
//ui32DisplayStride = ((ui32DisplayWidth + 31)&(~31));
ui32DisplayHeight = pSurf->ui32Width;
ui32BltRotateCmd = MBX2D_TEXTROT_90DEGS;
break;
}
case 180:
default:
{
ui32DisplayWidth = pSurf->ui32Width;
//ui32DisplayStride = pSurf->ui32Stride;
ui32DisplayHeight = pSurf->ui32Height;
ui32BltRotateCmd = MBX2D_TEXTROT_180DEGS;
break;
}
}
ui32DisplayStride = g_DISPState.ui32RotatedDisplaySurfStride;
/* this overlay is rotated so we need to kick off a blit before we flip */
pDstBuf = g_DISPState.apsDisplaySurfaces[g_DISPState.ui32NextRotatedBuffer];
g_DISPState.ui32NextRotatedBuffer++;
g_DISPState.ui32NextRotatedBuffer &= (VDISP_NUM_ROT_SURFACES - 1);
sOverlay.pvOvlBase = (void *) pDstBuf->uiDevAddr.uiAddr;
sOverlay.pvOvlUBase = (void *) (pDstBuf->uiDevAddr.uiAddr + (g_DISPState.ui32RotatedDisplaySurfStride * ui32DisplayHeight));
sOverlay.pvOvlVBase = (void *) ((IMG_UINT32) sOverlay.pvOvlUBase + (g_DISPState.ui32RotatedDisplaySurfStride / 2));
#if !defined(SUPPORT_3D_BLIT)
/* set up destination surface */
aui32BltData[ui32BltWordCount++] = MBX2D_DST_CTRL_BH | MBX2D_SRC_332RGB | ui32DisplayStride;
aui32BltData[ui32BltWordCount++] = ((((IMG_UINT32)sOverlay.pvOvlBase) >> MBX2D_DST_ADDR_ALIGNSHIFT) << MBX2D_DST_ADDR_SHIFT)
& MBX2D_DST_ADDR_MASK;
/* set up source surface */
aui32BltData[ui32BltWordCount++] = MBX2D_SRC_CTRL_BH | MBX2D_SRC_FBMEM | MBX2D_SRC_332RGB | pSurf->ui32Stride;
aui32BltData[ui32BltWordCount++] = ((pSurf->ui32FBOffset >> MBX2D_SRC_ADDR_ALIGNSHIFT) << MBX2D_SRC_ADDR_SHIFT)
& MBX2D_SRC_ADDR_MASK;
/* set src start XY to zero */
aui32BltData[ui32BltWordCount++] = MBX2D_SRC_OFF_BH | (0 << MBX2D_SRCOFF_XSTART_SHIFT) | (0 << MBX2D_SRCOFF_YSTART_SHIFT);
/* disable stretch */
aui32BltData[ui32BltWordCount++] = MBX2D_STRETCH_BH | (MBX2D_NO_STRETCH << MBX2D_X_STRETCH_SHIFT) | (MBX2D_NO_STRETCH << MBX2D_Y_STRETCH_SHIFT);
/* kick off blit */
aui32BltData[ui32BltWordCount++] = MBX2D_BLIT_BH | MBX2D_USE_PAT | ui32BltRotateCmd | MBX2D_ROP3_SRCCOPY;
aui32BltData[ui32BltWordCount++] = (0 << MBX2D_DST_XSTART_SHIFT) | (0 << MBX2D_DST_YSTART_SHIFT);
if(g_DISPState.ui32SourceRotation == 180)
{
aui32BltData[ui32BltWordCount++] = (ui32DisplayWidth << MBX2D_DST_XEND_SHIFT) | (ui32DisplayHeight << MBX2D_DST_YEND_SHIFT);
}
else
{
/* 90 or 270 case */
aui32BltData[ui32BltWordCount++] = (ui32DisplayWidth << MBX2D_DST_YEND_SHIFT) | (ui32DisplayHeight << MBX2D_DST_XEND_SHIFT);
}
#if 1
/* now add chroma planes
*
* need to redefine src and dest surfaces
*/
/* U plane */
aui32BltData[ui32BltWordCount++] = MBX2D_DST_CTRL_BH | MBX2D_SRC_332RGB | ui32DisplayStride;
aui32BltData[ui32BltWordCount++] = ((((IMG_UINT32)sOverlay.pvOvlUBase) >> MBX2D_DST_ADDR_ALIGNSHIFT)
<< MBX2D_DST_ADDR_SHIFT) & MBX2D_DST_ADDR_MASK;
aui32BltData[ui32BltWordCount++] = MBX2D_SRC_CTRL_BH | MBX2D_SRC_FBMEM | MBX2D_SRC_332RGB | pSurf->ui32Stride;
aui32BltData[ui32BltWordCount++] = (((pSurf->ui32FBOffset + (pSurf->ui32Stride * pSurf->ui32Height)) >> MBX2D_SRC_ADDR_ALIGNSHIFT)
<< MBX2D_SRC_ADDR_SHIFT) & MBX2D_SRC_ADDR_MASK;
/* kick off blit */
aui32BltData[ui32BltWordCount++] = MBX2D_BLIT_BH | MBX2D_USE_PAT | ui32BltRotateCmd | MBX2D_ROP3_SRCCOPY;
aui32BltData[ui32BltWordCount++] = (0 << MBX2D_DST_XSTART_SHIFT) | (0 << MBX2D_DST_YSTART_SHIFT);
if(g_DISPState.ui32SourceRotation == 180)
{
aui32BltData[ui32BltWordCount++] = ((ui32DisplayWidth/2) << MBX2D_DST_XEND_SHIFT) | ((ui32DisplayHeight/2) << MBX2D_DST_YEND_SHIFT);
}
else
{
/* 90 or 270 case */
aui32BltData[ui32BltWordCount++] = ((ui32DisplayWidth/2) << MBX2D_DST_YEND_SHIFT) | ((ui32DisplayHeight/2) << MBX2D_DST_XEND_SHIFT);
}
/* V plane */
aui32BltData[ui32BltWordCount++] = MBX2D_DST_CTRL_BH | MBX2D_SRC_332RGB | ui32DisplayStride;
aui32BltData[ui32BltWordCount++] = ((((IMG_UINT32)sOverlay.pvOvlVBase) >> MBX2D_DST_ADDR_ALIGNSHIFT)
<< MBX2D_DST_ADDR_SHIFT) & MBX2D_DST_ADDR_MASK;
aui32BltData[ui32BltWordCount++] = MBX2D_SRC_CTRL_BH | MBX2D_SRC_FBMEM | MBX2D_SRC_332RGB | pSurf->ui32Stride;
aui32BltData[ui32BltWordCount++] = (((pSurf->ui32FBOffset + (pSurf->ui32Stride * pSurf->ui32Height) + pSurf->ui32Stride/2) >> MBX2D_SRC_ADDR_ALIGNSHIFT)
<< MBX2D_SRC_ADDR_SHIFT) & MBX2D_SRC_ADDR_MASK;
/* kick off blit */
aui32BltData[ui32BltWordCount++] = MBX2D_BLIT_BH | MBX2D_USE_PAT | ui32BltRotateCmd | MBX2D_ROP3_SRCCOPY;
aui32BltData[ui32BltWordCount++] = (0 << MBX2D_DST_XSTART_SHIFT) | (0 << MBX2D_DST_YSTART_SHIFT);
if(g_DISPState.ui32SourceRotation == 180)
{
aui32BltData[ui32BltWordCount++] = ((ui32DisplayWidth/2) << MBX2D_DST_XEND_SHIFT) | ((ui32DisplayHeight/2) << MBX2D_DST_YEND_SHIFT);
}
else
{
/* 90 or 270 case */
aui32BltData[ui32BltWordCount++] = ((ui32DisplayWidth/2) << MBX2D_DST_YEND_SHIFT) | ((ui32DisplayHeight/2) << MBX2D_DST_XEND_SHIFT);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -