⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -