📄 pvr_pdump.c
字号:
IMG_UINT32 ui32DataToWrite;
IMG_HANDLE *phFile = IMG_NULL;
IMG_CHAR szTmpStr[256];
IMG_CHAR *pszPostConfig;
PDUMP_CONTEXT *psPDContext = IMG_NULL;;
VALIDATE_PDUMP_CONTEXT(psPDContext)
if(!psPDContext->bVirtualContextEnabled)
{
return IMG_FALSE;
}
sprintf(szTmpStr, "%s\\%s", psPDContext->sz2DMemFilePath, psPDContext->sz2DMemFileName);
phFile = fopen(szTmpStr, "wb");
if(!phFile) return IMG_FALSE;
/*
Locate the end of the config data
*/
pszPostConfig = strstr((IMG_CHAR*) psPDContext->pvMemFile, "\r\n-- Virtual File Start --");
if(!pszPostConfig)
{
goto FV_Close;
}
/*
Write config data
*/
ui32DataToWrite = pszPostConfig - (IMG_CHAR*) psPDContext->pvMemFile;
if (ui32DataToWrite)
{
if(!fwrite(psPDContext->pvMemFile, ui32DataToWrite, 1, phFile))
{
goto FV_Close;
}
}
/*
Write prefix to file
*/
if (strlen(pszPrefix))
{
if(!fwrite(pszPrefix, strlen(pszPrefix), 1, phFile))
{
goto FV_Close;
}
}
/*
Write remainder of mem file to file
*/
pszPostConfig += strlen("\r\n-- Virtual File Start --");
ui32DataToWrite = psPDContext->ui32MemFileIndex - ui32DataToWrite - strlen("\r\n-- Virtual File Start --");
if (ui32DataToWrite)
{
fwrite(pszPostConfig, ui32DataToWrite, 1, phFile);
}
FV_Close:
fclose(phFile);
return PDumpDisableVirtual();
}
/***********************************************************************************
Function Name : PDumpClose
Inputs : psPDContext
Outputs : -
Returns : Success
Description : releases pdump resources
************************************************************************************/
IMG_BOOL PDumpClose(PDUMP_CONTEXT * psPDContext)
{
if(psPDContext == IMG_NULL)
{
/*
De-initialise global context
*/
SysReleasePDUMPData(gpsPDMMData);
return IMG_TRUE;
}
/*
Free up texture lists
*/
if(psPDContext->psRegisteredTextures != IMG_NULL)
{
PVRSRV_PDUMP_TEXTURE *psTexList;
PVRSRV_PDUMP_TEXTURE *psTmp;
psTexList = psPDContext->psRegisteredTextures;
while(psTexList != IMG_NULL)
{
psTmp = psTexList;
psTexList = psTexList->psNext;
HostFreeMem(PVRSRV_HOST_PAGEABLE_HEAP, psTmp);
}
}
psPDContext->psPDumpMemMap->ui32ActiveContexts--;
if(psPDContext->psPDumpMemMap->ui32ActiveContexts == 1)
{
PDUMP_CONTEXT *psGlobalContext;
psGlobalContext = psPDContext->psPDumpMemMap->psGlobalContext;
/*
The only active context is the global one created at boot and deleted at shut down
, so close the global script, prim and tex files so the files can be manipulated
*/
if(psGlobalContext->fpPrim)
{
fclose(psGlobalContext->fpPrim);
psGlobalContext->fpPrim = IMG_NULL;
}
if(psGlobalContext->fpTex)
{
fclose(psGlobalContext->fpTex);
psGlobalContext->fpTex = IMG_NULL;
}
if(psGlobalContext->fpScript)
{
fclose(psGlobalContext->fpScript);
psGlobalContext->fpScript = IMG_NULL;
psGlobalContext->bScriptConfigured = IMG_FALSE;
}
}
if(psPDContext->psPDumpMemMap->ui32ActiveContexts == 0)
{
/*
This is the global context so close 2D script
*/
if(psPDContext->fp2DScript)
{
fclose(psPDContext->fp2DScript);
psPDContext->b2DScriptConfigured = IMG_FALSE;
}
}
/*
Local context cleanup
*/
if(psPDContext->fpPrim)
fclose(psPDContext->fpPrim);
if(psPDContext->fpTex)
fclose(psPDContext->fpTex);
if(psPDContext->fpScript)
fclose(psPDContext->fpScript);
if(psPDContext->psPDumpMemMap)
SysReleasePDUMPData(psPDContext->psPDumpMemMap);
HostFreeMem (PVRSRV_HOST_PAGEABLE_HEAP, psPDContext);
return IMG_TRUE;
}
/*****************************************************************************
FUNCTION : PDumpEnable
PURPOSE : Enables Dumping on the context passed in. Enables global
PDumping if psPDContext == NULL
PARAMETERS : psPDContext
RETURNS :
*****************************************************************************/
IMG_VOID PDumpEnable()
{
PVRSRV_PDUMP_MEMMAP *psPDMemMap;
psPDMemMap = SysGetPDUMPData();
psPDMemMap->bPDumpingOn = IMG_TRUE;
SysReleasePDUMPData(psPDMemMap);
}
/*****************************************************************************
FUNCTION : PDumpDisable
PURPOSE : Disables Dumping on the context passed in. Disables global
PDumping if psPDContext == NULL
PARAMETERS : psPDContext
RETURNS :
*****************************************************************************/
IMG_VOID PDumpDisable()
{
PVRSRV_PDUMP_MEMMAP *psPDMemMap;
psPDMemMap = SysGetPDUMPData();
psPDMemMap->bPDumpingOn = IMG_FALSE;
SysReleasePDUMPData(psPDMemMap);
}
/*****************************************************************************
FUNCTION : PDumpDisable2D
PURPOSE : Disables 2D PDumping on the context passed in and the global context
PARAMETERS : psPDContext
RETURNS :
*****************************************************************************/
IMG_VOID PDumpDisable2D()
{
PVRSRV_PDUMP_MEMMAP *psPDMemMap;
psPDMemMap = SysGetPDUMPData();
psPDMemMap->b2DEnabled = IMG_FALSE;
SysReleasePDUMPData(psPDMemMap);
}
/*****************************************************************************
FUNCTION : PDumpEnableLocalScript
PURPOSE : Enables Dumping on the context passed in. Enables global
PDumping if psPDContext == NULL
PARAMETERS : psPDContext
RETURNS :
*****************************************************************************/
IMG_VOID PDumpEnableLocalScript(PDUMP_CONTEXT *psPDContext)
{
if(psPDContext)
psPDContext->bLocalScriptDumpingOn = IMG_TRUE;
}
/*****************************************************************************
FUNCTION : PDumpPol
PURPOSE :
PARAMETERS :
RETURNS :
*****************************************************************************/
IMG_BOOL PDumpPoll(PDUMP_CONTEXT *psPDContext,
IMG_UINT32 ui32RegTag,
IMG_UINT32 ui32Addr,
IMG_UINT32 ui32Mask,
IMG_UINT32 ui32Value,
IMG_UINT32 ui32A,
IMG_UINT32 ui32B,
IMG_UINT32 ui32C)
{
IMG_UINT32 ui32Frame;
IMG_UINT32 bIs2DWrite;
VALIDATE_PDUMP_CONTEXT(psPDContext)
/*
If were using the global context directly, then
this is a 2d write
*/
bIs2DWrite = psPDContext->bGlobalContext;
ui32Frame = psPDContext->ui32CurrentFrame;
if(!psPDContext->psPDumpMemMap->bPDumpingOn)
{
return IMG_FALSE;
}
if(!ui32Frame ||
((ui32Frame >= psPDContext->ui32StartFrame) &&
(ui32Frame <= psPDContext->ui32StopFrame) &&
!(ui32Frame%psPDContext->ui32SkipFrame)))
{
IMG_CHAR szTmpStr[256];
sprintf(szTmpStr, "POL :REG:%8.8lX %8.8lX %8.8lX %d %d %d\r\n",
ui32Addr,
ui32Mask,
ui32Value,
ui32A, ui32B, ui32C);
if(!DumpScriptLine (psPDContext, szTmpStr, strlen(szTmpStr), bIs2DWrite))
{
return IMG_FALSE;
}
}
return IMG_TRUE;
}
/*****************************************************************************
FUNCTION : PDumpRegArray
PURPOSE :
PARAMETERS :
RETURNS : None
*****************************************************************************/
IMG_BOOL PDumpRegArray(PDUMP_CONTEXT *psPDContext,
IMG_UINT32 ui32RegTag,
PVRSRV_HWREG *psRegs,
IMG_UINT32 ui32RegCount)
{
IMG_UINT32 ui32Frame;
VALIDATE_PDUMP_CONTEXT(psPDContext)
ui32Frame = psPDContext->ui32CurrentFrame;
if(!psPDContext->psPDumpMemMap->bPDumpingOn)
{
return IMG_FALSE;
}
if(!ui32Frame ||
((ui32Frame >= psPDContext->ui32StartFrame) &&
(ui32Frame <= psPDContext->ui32StopFrame) &&
!(ui32Frame%psPDContext->ui32SkipFrame)))
{
IMG_CHAR szTmpStr[256];
IMG_UINT32 ui32Cnt;
for(ui32Cnt = 0; ui32Cnt<ui32RegCount; ui32Cnt++)
{
sprintf(szTmpStr, "WRW :REG:%8.8lX %8.8lX\r\n", psRegs[ui32Cnt].ui32RegAddr, psRegs[ui32Cnt].ui32RegVal);
if(!DumpScriptLine(psPDContext, szTmpStr, strlen(szTmpStr), IMG_FALSE))
{
return IMG_FALSE;
}
}
}
return IMG_TRUE;
}
/***********************************************************************************
Function Name : PDumpSPBatch
Inputs : psPDContext, ui32Data
Outputs : -
Returns : Success
Description : Write 32 bits to the primitive file
************************************************************************************/
IMG_BOOL PDumpSPBatch(PDUMP_CONTEXT *psPDContext,
IMG_UINT32 ui32SPTag,
IMG_UINT32 *pui32Data,
IMG_UINT32 ui32Count)
{
IMG_UINT32 ui32Frame;
VALIDATE_PDUMP_CONTEXT(psPDContext)
ui32Frame = psPDContext->ui32CurrentFrame;
if(!psPDContext->psPDumpMemMap->bPDumpingOn)
{
return IMG_FALSE;
}
if(!ui32Frame ||
((ui32Frame >= psPDContext->ui32StartFrame) &&
(ui32Frame <= psPDContext->ui32StopFrame) &&
!(ui32Frame%psPDContext->ui32SkipFrame)))
{
IMG_CHAR szTmpStr[256];
switch(ui32SPTag)
{
case PDUMPTAGS_SP_MBX_DATA:
{
if(*pui32Data == MBX1_TAOBJTYPE_STREAMEND)
{
IMG_CHAR szTmpStr[256];
/*
Terminate the TA data stream
*/
sprintf(szTmpStr, "WRW :SP:%8.8lX %8.8lX\r\n",
psPDContext->psPDumpMemMap->sMBX.ui32SPDataStart,
*pui32Data);
if(!DumpScriptLine(psPDContext, szTmpStr, strlen(szTmpStr), IMG_FALSE))
{
return IMG_FALSE;
}
break;
}
/*
Dump primitive data to prim file
*/
VALIDATE_PDUMP_FILE(psPDContext->fpPrim, psPDContext->szPrimFilePath, psPDContext->szPrimFileName)
if(!fwrite(pui32Data, 4, ui32Count, psPDContext->fpPrim))
{
return IMG_FALSE;
}
fflush(psPDContext->fpPrim);
break;
}
case PDUMPTAGS_SP_MBX_TERM:
{
IMG_CHAR szTmpStr[256];
IMG_UINT32 ui32Pos;
/*
Write load prim instruction to Script file
*/
VALIDATE_PDUMP_FILE(psPDContext->fpPrim, psPDContext->szPrimFilePath, psPDContext->szPrimFileName)
ui32Pos = ftell(psPDContext->fpPrim);
sprintf(szTmpStr,"\r\nLDB :SP:%8.8lX %8.8lX %8.8lX %s\r\n",
psPDContext->psPDumpMemMap->sMBX.ui32SPDataStart,
psPDContext->ui32PrmPos,
ui32Pos - psPDContext->ui32PrmPos,
psPDContext->szPrimFileName);
if(!DumpScriptLine(psPDContext, szTmpStr, strlen(szTmpStr), IMG_FALSE))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -