📄 queue.c
字号:
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 + -