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

📄 queue.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	psUpdateCmd->sCmdInfo.ui32CommandID = PVRSRV_CMD_ID_UPDATE;
	psUpdateCmd->sCmdInfo.ui32Size = ui32CommandSize;

	psUpdateCmd->psDestSyncInfoKM = psDestSync->psKernSyncInfo;	
	psUpdateCmd->ui32DestNextOpVal = PVRSRVGetNextWriteOp(psDestSync, IMG_TRUE);

	// Increment the read ops pending, so that other writes to this surface will wait until we have completed the update.
	PVRSRVGetReadOpsPending(psDestSync, IMG_TRUE);

	PVRSRVUpdateQueue(psQueue, ui32CommandSize);

	return PVRSRVReleaseQueue(psQueue);
}

#if defined(SUPPORT_3D_BLIT)
/*!
****************************************************************************

 @Function : PVRSRVSetup3Dblit
    
 @Description	: Inserts a 3D blit command into a Q

 @Input	:	psQueue			 - pointer to queue information struct
 @Input	:	psDevInfo 		 - pointer to Dev info
 @Input	:	psHWInfo		 - pointer to hardware info Info
 @Input	:	ps3DParams		 - pointer to 3d blit params structre
					
 @Return	: PVRSRV_ERROR_INVALID_PARAMS if too many SRCs
*****************************************************************************/
PVRSRV_ERROR PVRSRVSetup3Dblit ( PVRSRV_QUEUE_INFO 	*psQueue,
								 PVRSRV_DEV_INFO	*psDevInfo,
								 PVRSRV_HW_INFO 	*psHWInfo,
								 MBX_3DBLIT_PARAMS	*ps3DParams )
{
	/*
		input data
		==========
		 - dst address
		 - dst stride
		 - dst pixel format
		 - dst rect

		 - clip rects - setup viewport objects

		 - src address
		 - src stride/twiddled
		 - src pixel format
		 - src rect
		 
		things to do
		============
		 - get hw context id
		 - resource management on region headers and associated obj data (poll for access)
		 - setup a SW BGO to accummulate around SRCCOPY rectangle
		 - insert viewport objects for clip rectangles
		 - take into account implied stretch from src/dst rect width/height mismatch
		 - optimise setup - cache blit parameters and use deltas to conditionally setup details
	*/
	PVRSRV_RENDERBLIT_CMD_INFO	*ps3DBlitCmd;
	PVR3DIF_BLITCTL				*ps3DBlitCtl = (PVR3DIF_BLITCTL*)psDevInfo->sDeviceSpecific.s3D.h3DBlitCtl;	
	IMG_UINT32					i;
	IMG_UINT32					ui32CommandSize;
	PVRSRV_ERROR				eError;
	IMG_RECT					sFBClip;
	IMG_FLOAT					fYShift, fXShift;

#define MAX_3D_REGS	20

	ui32CommandSize = sizeof(PVRSRV_RENDERBLIT_CMD_INFO)
					+ (sizeof(PVRSRV_HWREG) * MAX_3D_REGS)
					+ (sizeof(IMG_RECTF) * ps3DParams->ui32NumClipRects) 
					- sizeof(PVRSRV_HWREG);

	/*
		round to 4byte units
	*/
	ui32CommandSize =  (ui32CommandSize+3) & ~3L;

	ps3DBlitCmd = (PVRSRV_RENDERBLIT_CMD_INFO *) PVRSRVGetQueueSpace(psQueue, ui32CommandSize);
	
	if(!ps3DBlitCmd)
	{
		PVR_DPF((PVR_DBG_ERROR,"Couldn't get space in queue"));
		return PVRSRV_ERROR_TIMEOUT;
	}

	ps3DBlitCmd->sCmdInfo.ui32CommandID = PVRSRV_CMD_ID_RENDER_BLIT;
	ps3DBlitCmd->sCmdInfo.ui32Size		= ui32CommandSize;

	ps3DBlitCmd->ui32TexAddrStride		= ps3DParams->sBGObject.ui32TexAddrStride;
	ps3DBlitCmd->ui32TexFormatStride	= ps3DParams->sBGObject.ui32TexFormatStride;

	/* Set up FB clip */
	if(ps3DParams->ui32NumClipRects == 1)
	{
		/* 
			Single clip rect optimisation - Set FB Clip registers to draw only the 
			intersection between the dest rect and the clip rect 
		*/
		IMG_RECT *psDest = &ps3DParams->sDstRect;
		IMG_RECT *psClip = ps3DParams->psClipRect;
		
		sFBClip.left	= (psDest->left   > psClip->left)   ? psDest->left   : psClip->left;
		sFBClip.top		= (psDest->top    > psClip->top)    ? psDest->top    : psClip->top;
		sFBClip.right	= (psDest->right  < psClip->right)  ? psDest->right  : psClip->right;
		sFBClip.bottom	= (psDest->bottom < psClip->bottom) ? psDest->bottom : psClip->bottom;

		ps3DParams->ui32NumClipRects = 0;
	}
	else
	{
		/* We need to clamp Dest rect to  0 */
		ps3DParams->sDstRect.left   = (ps3DParams->sDstRect.left   < 0) ? 0 : ps3DParams->sDstRect.left;
		ps3DParams->sDstRect.top    = (ps3DParams->sDstRect.top    < 0) ? 0 : ps3DParams->sDstRect.top;
		ps3DParams->sDstRect.right  = (ps3DParams->sDstRect.right  < 0) ? 0 : ps3DParams->sDstRect.right;
		ps3DParams->sDstRect.bottom = (ps3DParams->sDstRect.bottom < 0) ? 0 : ps3DParams->sDstRect.bottom;

		sFBClip.left	= ps3DParams->sDstRect.left;
		sFBClip.top		= ps3DParams->sDstRect.top;
		sFBClip.right	= ps3DParams->sDstRect.right;
		sFBClip.bottom	= ps3DParams->sDstRect.bottom;
	}

	/* dst details */
	ps3DBlitCmd->sDstRect.fX0			= (IMG_FLOAT)ps3DParams->sDstRect.left;
	ps3DBlitCmd->sDstRect.fY0			= (IMG_FLOAT)ps3DParams->sDstRect.top;
	ps3DBlitCmd->sDstRect.fX1			= (IMG_FLOAT)(ps3DParams->sDstRect.right);
	ps3DBlitCmd->sDstRect.fY1			= (IMG_FLOAT)(ps3DParams->sDstRect.bottom);
	ps3DBlitCmd->sDstDevVAddr			= ps3DParams->sDstDevVAddr;
	ps3DBlitCmd->ui32DstStride			= ps3DParams->ui32DstStride;
	ps3DBlitCmd->ui32DstPixFormat		= ps3DParams->ui32DstPixFormat;

	/* dst sync fiddling */
	ps3DBlitCmd->psDstSyncInfoKM		= ps3DParams->psDstSyncInfoKM;
	ps3DBlitCmd->ui32DstReadOpsPending	= PVRSRVGetReadOpsPending(ps3DBlitCmd->psDstSyncInfoKM, IMG_FALSE);
	ps3DBlitCmd->ui32DstNextWriteOpVal	= PVRSRVGetNextWriteOp(ps3DBlitCmd->psDstSyncInfoKM, IMG_FALSE);

	/* Primary update control */
	ps3DBlitCmd->bUpdatePrimary			= ps3DParams->bUpdatePrimary;

	if(!ps3DParams->bColourFill)
	{
		IMG_UINT32 ui32Width = 1, ui32Height = 1;

		/* Round up the Width and height */
		while(ui32Width < ps3DParams->ui32SrcWidth)
		{
			ui32Width <<= 1;
		}		
		while(ui32Height < ps3DParams->ui32SrcHeight)
		{
			ui32Height <<= 1;
		}

		/* src details */
		ps3DBlitCmd->sSrcDevVAddr			= ps3DParams->sSrcDevVAddr;
		ps3DBlitCmd->ui32SrcStride			= ps3DParams->ui32SrcStride;
		ps3DBlitCmd->ui32SrcPixFormat		= ps3DParams->ui32SrcPixFormat;
		ps3DBlitCmd->sSrcRect.fX0			= (IMG_FLOAT)ps3DParams->sSrcRect.left / ((IMG_FLOAT) ui32Width);
		ps3DBlitCmd->sSrcRect.fY0			= (IMG_FLOAT)ps3DParams->sSrcRect.top  / ((IMG_FLOAT) ui32Height);
		ps3DBlitCmd->sSrcRect.fX1			= (IMG_FLOAT)(ps3DParams->sSrcRect.right)  / ((IMG_FLOAT) ui32Width);
		ps3DBlitCmd->sSrcRect.fY1			= (IMG_FLOAT)(ps3DParams->sSrcRect.bottom) / ((IMG_FLOAT) ui32Height);
		ps3DBlitCmd->ui32SrcWidth			= ps3DParams->ui32SrcWidth;
		ps3DBlitCmd->ui32SrcHeight			= ps3DParams->ui32SrcHeight;
		ps3DBlitCmd->bSourceTwiddled		= ps3DParams->bSourceTwiddled;

		/* Tweak texture coords to address correct pixels */
		fXShift = (((IMG_FLOAT)ps3DParams->ui32SrcWidth / (IMG_FLOAT)ui32Width)    / (IMG_FLOAT)ps3DParams->ui32SrcWidth) / 4.0f;
		fYShift = (((IMG_FLOAT)ps3DParams->ui32SrcHeight  / (IMG_FLOAT)ui32Height) / (IMG_FLOAT)ps3DParams->ui32SrcHeight) / 4.0f;

		ps3DBlitCmd->sSrcRect.fX0	+= fXShift;
		ps3DBlitCmd->sSrcRect.fY0	+= fYShift;
		ps3DBlitCmd->sSrcRect.fX1	+= fXShift;
		ps3DBlitCmd->sSrcRect.fY1	+= fYShift;
		
		/* src sync fiddling */
		ps3DBlitCmd->psSrcSyncInfoKM		= ps3DParams->psSrcSyncInfoKM;
		PVRSRVGetReadOpsPending (ps3DBlitCmd->psSrcSyncInfoKM, IMG_TRUE);
		ps3DBlitCmd->ui32SrcNextWriteOpVal	= PVRSRVGetNextWriteOp(ps3DBlitCmd->psSrcSyncInfoKM, IMG_TRUE);
	}
	else
	{
		ps3DBlitCmd->ui32ColourFillColour	= ps3DParams->ui32ColourFillColour;
		ps3DBlitCmd->psSrcSyncInfoKM		= IMG_NULL;
	}

    /* Dest rotation control */
	ps3DBlitCmd->ui32SourceRotation		= ps3DParams->ui32SourceRotation;

    /* Filter control */
	ps3DBlitCmd->bFilter				= ps3DParams->bFilter;

	/* setup clip list pointer */	
	ps3DBlitCmd->psClipRect				= (IMG_RECTF*)&ps3DBlitCmd->s3DReg[MAX_3D_REGS];

	/* clip count */
	ps3DBlitCmd->ui32NumClipRects = ps3DParams->ui32NumClipRects;

	/*
		clip list:
		n.b. we always unconditionally clip to the dst using back-end mbx pixel clip registers
	*/
	for (i=0; i<ps3DParams->ui32NumClipRects; i++)
	{
		ps3DBlitCmd->psClipRect[i].fX0 = (IMG_FLOAT)ps3DParams->psClipRect[i].left;
		ps3DBlitCmd->psClipRect[i].fY0 = (IMG_FLOAT)ps3DParams->psClipRect[i].top;
		ps3DBlitCmd->psClipRect[i].fX1 = (IMG_FLOAT)(ps3DParams->psClipRect[i].right - 1);
		ps3DBlitCmd->psClipRect[i].fY1 = (IMG_FLOAT)(ps3DParams->psClipRect[i].bottom - 1);	
	}

	/*
		get HW context ID
	*/
	eError = GetFreeHWContextID(psDevInfo, psHWInfo, &ps3DBlitCmd->ui32HWContextID);
	if (eError != PVRSRV_OK)
	{
		PVR_DPF((PVR_DBG_ERROR, "PVRSRVSetup3Dblit: Failed to get free HW context ID"));
		return eError;
	}
	
	i=0;
	ps3DBlitCmd->s3DReg[i].ui32RegAddr	= MBX1_GLOBREG_RGNBASE;
	ps3DBlitCmd->s3DReg[i++].ui32RegVal = ps3DBlitCtl->sRgnHeaderDevVAddr.uiAddr & MBX1_RGNBASE_MASK;

	ps3DBlitCmd->s3DReg[i].ui32RegAddr	= MBX1_GLOBREG_OBJBASE;
	ps3DBlitCmd->s3DReg[i++].ui32RegVal	= ps3DBlitCtl->sObjDataDevVAddr.uiAddr & MBX1_OBJBASE_MASK;

	ps3DBlitCmd->s3DReg[i].ui32RegAddr	= MBX1_GLOBREG_ZLOADSTORE;
	ps3DBlitCmd->s3DReg[i++].ui32RegVal = 0;

	ps3DBlitCmd->s3DReg[i].ui32RegAddr	= MBX1_GLOBREG_SCALERCTL;
	ps3DBlitCmd->s3DReg[i++].ui32RegVal = 0;

	ps3DBlitCmd->s3DReg[i].ui32RegAddr	= MBX1_GLOBREG_FBCTL;
	ps3DBlitCmd->s3DReg[i++].ui32RegVal = ((ps3DParams->bColourFill || ps3DBlitCmd->bFilter == IMG_FALSE) ? 0 : MBX1_FBCTL_DITHER)
										  | ps3DBlitCmd->ui32DstPixFormat;

	ps3DBlitCmd->s3DReg[i].ui32RegAddr	= MBX1_GLOBREG_FBXCLIP;
	ps3DBlitCmd->s3DReg[i++].ui32RegVal =	(sFBClip.left<<MBX1_FBXCLIPMINSHIFT) 
										|	((sFBClip.right-1)<<MBX1_FBXCLIPMAXSHIFT);

	ps3DBlitCmd->s3DReg[i].ui32RegAddr	= MBX1_GLOBREG_FBYCLIP;
	ps3DBlitCmd->s3DReg[i++].ui32RegVal =	(sFBClip.top<<MBX1_FBYCLIPMINSHIFT) 
										|	((sFBClip.bottom-1)<<MBX1_FBYCLIPMAXSHIFT);

	ps3DBlitCmd->s3DReg[i].ui32RegAddr	= MBX1_GLOBREG_3DPIXSAMP;
	ps3DBlitCmd->s3DReg[i++].ui32RegVal = ps3DParams->bD3DPixelSampling ? 
										(MBX1_PIXSAMP_TSPTEXEL | MBX1_PIXSAMP_DCALCTILEXY):
										(MBX1_PIXSAMP_FPUPIXEL | MBX1_PIXSAMP_TSPPIXEL | 
										 MBX1_PIXSAMP_TSPTEXEL | MBX1_PIXSAMP_DCALCTILEXY);
	ps3DBlitCmd->s3DReg[i].ui32RegAddr	= MBX1_GLOBREG_FBSTART;
	ps3DBlitCmd->s3DReg[i++].ui32RegVal = ps3DBlitCmd->sDstDevVAddr.uiAddr & MBX1_FBSTART_MASK;

	ps3DBlitCmd->s3DReg[i].ui32RegAddr	= MBX1_GLOBREG_FBLINESTRIDE;
	ps3DBlitCmd->s3DReg[i++].ui32RegVal = ps3DBlitCmd->ui32DstStride>>MBX1_FBLINESTRIDE_ALIGNSHIFT;

	ps3DBlitCmd->s3DReg[i].ui32RegAddr	= MBX1_GLOBREG_3D_RENDER_ID;
	ps3DBlitCmd->s3DReg[i++].ui32RegVal = ps3DBlitCmd->ui32HWContextID;

	ps3DBlitCmd->s3DReg[i].ui32RegAddr	= MBX1_GLOBREG_STARTRENDER;
	ps3DBlitCmd->s3DReg[i++].ui32RegVal = 1;
	
	ps3DBlitCmd->ui32NumRegs = i;

	PVRSRVUpdateQueue(psQueue, ui32CommandSize);
	
	return PVRSRVReleaseQueue(psQueue);
}
/*!
****************************************************************************

 @Function : PVRSRVSetupOverlay3Dblit
    
 @Description	: Inserts an Overlay 3D blit command into a Q

 @Input	:	psQueue			 - pointer to queue information struct
 @Input	:	psDevInfo 		 - pointer to Dev info
 @Input	:	psHWInfo		 - pointer to hardware info Info
 @Input	:	ps3DParams		 - pointer to 3d blit params structre
					
 @Return	: PVRSRV_ERROR_INVALID_PARAMS if too many SRCs
*****************************************************************************/
PVRSRV_ERROR PVRSRVSetupOverlay3Dblit ( PVRSRV_QUEUE_INFO 	*psQueue,
										PVRSRV_DEV_INFO		*psDevInfo,
										PVRSRV_HW_INFO 		*psHWInfo,
										MBX_3DBLIT_PARAMS	*ps3DParams )
{
	PVRSRV_OVL_RENDERBLIT_CMD_INFO	*ps3DBlitCmd;
	PVR3DIF_OVL_BLITCTL				*ps3DBlitCtl = (PVR3DIF_OVL_BLITCTL*)psDevInfo->sDeviceSpecific.s3D.hOvl3DBlitCtl;	
	IMG_UINT32						ui32CommandSize;
	PVRSRV_ERROR					eError;

	ui32CommandSize = sizeof(PVRSRV_OVL_RENDERBLIT_CMD_INFO);

	/*
		round to 4byte units
	*/
	ui32CommandSize =  (ui32CommandSize+3) & ~3L;

	ps3DBlitCmd = (PVRSRV_OVL_RENDERBLIT_CMD_INFO *) PVRSRVGetQueueSpace(psQueue, ui32CommandSize);
	
	if(!ps3DBlitCmd)
	{
		PVR_DPF((PVR_DBG_ERROR,"Couldn't get space in queue"));
		return PVRSRV_ERROR_TIMEOUT;
	}

	ps3DBlitCmd->sCmdInfo.ui32CommandID = PVRSRV_CMD_ID_OVL_RENDER_BLIT;
	ps3DBlitCmd->sCmdInfo.ui32Size		= ui32CommandSize;

	/* dst sync fiddling */
	ps3DBlitCmd->psDstSyncInfoKM		= ps3DParams->psDstSyncInfoKM;
	ps3DBlitCmd->ui32DstReadOpsPending	= PVRSRVGetReadOpsPending(ps3DBlitCmd->psDstSyncInfoKM, IMG_FALSE);
	ps3DBlitCmd->ui32DstNextWriteOpVal	= PVRSRVGetNextWriteOp(ps3DBlitCmd->psDstSyncInfoKM, IMG_FALSE);

	/* src details */
	ps3DBlitCmd->sSrcDevVAddr			= ps3DParams->sSrcDevVAddr;

	/* src sync fiddling */
	ps3DBlitCmd->psSrcSyncInfoKM		= ps3DParams->psSrcSyncInfoKM;
	PVRSRVGetReadOpsPending (ps3DBlitCmd->psSrcSyncInfoKM, IMG_TRUE);
	ps3DBlitCmd->ui32SrcNextWriteOpVal	= PVRSRVGetNextWriteOp(ps3DBlitCmd->psSrcSyncInfoKM, IMG_TRUE);

	/*
		get HW context ID
	*/
	eError = GetFreeHWContextID(psDevInfo, psHWInfo, &ps3DBlitCmd->ui32HWContextID);
	if (eError != PVRSRV_OK)
	{
		PVR_DPF((PVR_DBG_ERROR, "PVRSRVSetup3Dblit: Failed to get free HW context ID"));
		return eError;
	}

	/* Set up ovl blt regs */
	ps3DBlitCmd->asOverlayBlitRegs[0].ui32RegAddr	= MBX1_GLOBREG_FBSTART;
	ps3DBlitCmd->asOverlayBlitRegs[0].ui32RegVal	= ps3DParams->sDstDevVAddr.uiAddr;

	ps3DBlitCmd->asOverlayBlitRegs[1].ui32RegAddr	= MBX1_GLOBREG_3D_RENDER_ID;
	ps3DBlitCmd->asOverlayBlitRegs[1].ui32RegVal	= ps3DBlitCmd->ui32HWContextID;

	PVRSRVUpdateQueue(psQueue, ui32CommandSize);
	
	return PVRSRVReleaseQueue(psQueue);
}

#endif /* SUPPORT_3D_BLIT */

#endif /* QUEUE_C */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -