本文整理汇总了C++中PVR_DPF函数的典型用法代码示例。如果您正苦于以下问题:C++ PVR_DPF函数的具体用法?C++ PVR_DPF怎么用?C++ PVR_DPF使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了PVR_DPF函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: AssembleUSEASMInstructions
/***********************************************************************************
Function Name : AssembleUSEASMInstrcutions
Inputs : gc, psUSEASMInfo
Outputs : psUSEASMInfo
Returns : -
Description : Calls USEASM to generate USE instructions for a list
of USEASM instructions
************************************************************************************/
IMG_INTERNAL GLES1_MEMERROR AssembleUSEASMInstructions(GLES1Context *gc, GLESUSEASMInfo *psUSEASMInfo)
{
USE_REGISTER sOutputRegister= {0, USEASM_REGTYPE_OUTPUT, 0, 0, 0};
IMG_UINT32 auKeepOutputReg[1]= { 0 };
IMG_UINT32 auKeepTempReg[1]= { 0 };
IMG_UINT32 auKeepPAReg[1]= { 0 };
USEASM_CONTEXT sUseasmContext;
USEOPT_DATA sUseoptData;
SGX_CORE_INFO sTarget;
IMG_UINT32 i;
if(!psUSEASMInfo->psFirstUSEASMInstruction)
{
PVR_DPF((PVR_DBG_ERROR,"AssembleUSEASMInstructions(): No USEASM input instructions"));
psUSEASMInfo->ui32NumHWInstructions = 0;
return GLES1_GENERAL_MEM_ERROR;
}
psUSEASMInfo->pui32HWInstructions = GLES1Malloc(gc, psUSEASMInfo->ui32NumMainUSEASMInstructions * EURASIA_USE_INSTRUCTION_SIZE);
if(!psUSEASMInfo->pui32HWInstructions)
{
PVR_DPF((PVR_DBG_ERROR,"AssembleUSEASMInstructions(): Failed to allocate memory for HW instructions"));
psUSEASMInfo->ui32NumHWInstructions = 0;
return GLES1_HOST_MEM_ERROR;
}
sTarget.eID = SGX_CORE_ID;
#if defined(SGX_CORE_REV)
sTarget.uiRev = SGX_CORE_REV;
#else
sTarget.uiRev = 0; /* use head revision */
#endif
sUseasmContext.pvContext = (IMG_VOID *)gc;
sUseasmContext.pvLabelState = IMG_NULL;
sUseasmContext.pfnRealloc = UseasmRealloc;
sUseasmContext.pfnGetLabelAddress = UseAssemblerGetLabelAddress;
sUseasmContext.pfnSetLabelAddress = UseAssemblerSetLabelAddress;
sUseasmContext.pfnGetLabelName = UseAssemblerGetLabelName;
sUseasmContext.pfnAssemblerError = UseAssemblerError;
sUseoptData.pfnAlloc = UseasmAlloc;
sUseoptData.pfnFree = UseasmFree;
sUseoptData.uNumTempRegs = psUSEASMInfo->ui32MaxTempNumber + 1;
sUseoptData.uNumPARegs = psUSEASMInfo->ui32MaxPrimaryNumber + 1;
sUseoptData.uNumOutputRegs = 1;
sUseoptData.auKeepTempReg = auKeepTempReg;
sUseoptData.auKeepPAReg = auKeepPAReg;
for(i=0; i<sUseoptData.uNumPARegs; i++)
{
UseoptSetBit(auKeepPAReg, i, IMG_TRUE);
}
sUseoptData.auKeepOutputReg = auKeepOutputReg;
sUseoptData.psStart = psUSEASMInfo->psFirstUSEASMInstruction;
sUseoptData.psProgram = psUSEASMInfo->psFirstUSEASMInstruction;
sUseoptData.uNumOutRegs = 1;
sUseoptData.asOutRegs = &sOutputRegister;
#if 0
{
IMG_UINT32 i, pi[50*8];
i = UseAssembler(UseAsmGetCoreDesc(&sTarget),
psUSEASMInfo->psFirstUSEASMInstruction,
pi,
0,
&sUseasmContext);
printf("Before:\n");
UseDisassembler(UseAsmGetCoreDesc(&sTarget), i, pi);
}
#endif
/* Optimise program */
if((psUSEASMInfo->ui32NumMainUSEASMInstructions>1) && !gc->sAppHints.bDisableUSEASMOPT)
//.........这里部分代码省略.........
示例2: SysLocateDevices
/*!
******************************************************************************
@Function SysLocateDevices
@Description Specifies devices in the systems memory map
@Input psSysData - sys data
@Return PVRSRV_ERROR
******************************************************************************/
static PVRSRV_ERROR SysLocateDevices(SYS_DATA *psSysData)
{
#if defined(NO_HARDWARE)
PVRSRV_ERROR eError;
IMG_CPU_PHYADDR sCpuPAddr;
#else
#if defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO)
struct resource *dev_res;
int dev_irq;
#endif
#endif
PVR_UNREFERENCED_PARAMETER(psSysData);
/* SGX Device: */
gsSGXDeviceMap.ui32Flags = 0x0;
#if defined(NO_HARDWARE)
/*
* For no hardware, allocate some contiguous memory for the
* register block.
*/
/* Registers */
gsSGXDeviceMap.ui32RegsSize = SYS_OMAP3430_SGX_REGS_SIZE;
eError = OSBaseAllocContigMemory(gsSGXDeviceMap.ui32RegsSize,
&gsSGXRegsCPUVAddr,
&sCpuPAddr);
if(eError != PVRSRV_OK)
{
return eError;
}
gsSGXDeviceMap.sRegsCpuPBase = sCpuPAddr;
gsSGXDeviceMap.sRegsSysPBase = SysCpuPAddrToSysPAddr(gsSGXDeviceMap.sRegsCpuPBase);
#if defined(__linux__)
/* Indicate the registers are already mapped */
gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr;
#else
/*
* FIXME: Could we just use the virtual address returned by
* OSBaseAllocContigMemory?
*/
gsSGXDeviceMap.pvRegsCpuVBase = IMG_NULL;
#endif
OSMemSet(gsSGXRegsCPUVAddr, 0, gsSGXDeviceMap.ui32RegsSize);
/*
device interrupt IRQ
Note: no interrupts available on no hardware system
*/
gsSGXDeviceMap.ui32IRQ = 0;
#else /* defined(NO_HARDWARE) */
#if defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO)
/* get the resource and IRQ through platform resource API */
dev_res = platform_get_resource(gpsPVRLDMDev, IORESOURCE_MEM, 0);
if (dev_res == NULL)
{
PVR_DPF((PVR_DBG_ERROR, "%s: platform_get_resource failed", __FUNCTION__));
return PVRSRV_ERROR_INVALID_DEVICE;
}
dev_irq = platform_get_irq(gpsPVRLDMDev, 0);
if (dev_irq < 0)
{
PVR_DPF((PVR_DBG_ERROR, "%s: platform_get_irq failed (%d)", __FUNCTION__, -dev_irq));
return PVRSRV_ERROR_INVALID_DEVICE;
}
gsSGXDeviceMap.sRegsSysPBase.uiAddr = dev_res->start;
gsSGXDeviceMap.sRegsCpuPBase =
SysSysPAddrToCpuPAddr(gsSGXDeviceMap.sRegsSysPBase);
PVR_TRACE(("SGX register base: 0x%lx", (unsigned long)gsSGXDeviceMap.sRegsCpuPBase.uiAddr));
#if defined(SGX544) && defined(SGX_FEATURE_MP)
/* FIXME: Workaround due to HWMOD change. Otherwise this region is too small. */
gsSGXDeviceMap.ui32RegsSize = SYS_OMAP3430_SGX_REGS_SIZE;
#else
gsSGXDeviceMap.ui32RegsSize = (unsigned int)(dev_res->end - dev_res->start);
#endif
PVR_TRACE(("SGX register size: %d",gsSGXDeviceMap.ui32RegsSize));
gsSGXDeviceMap.ui32IRQ = dev_irq;
PVR_TRACE(("SGX IRQ: %d", gsSGXDeviceMap.ui32IRQ));
#else /* defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO) */
gsSGXDeviceMap.sRegsSysPBase.uiAddr = SYS_OMAP3430_SGX_REGS_SYS_PHYS_BASE;
//.........这里部分代码省略.........
示例3: RGXCmdHelperAcquireCmdCCB
/*
Reserve space in the CCB and fill in the command and client sync data
*/
PVRSRV_ERROR RGXCmdHelperAcquireCmdCCB(IMG_UINT32 ui32CmdCount,
RGX_CCB_CMD_HELPER_DATA *asCmdHelperData,
IMG_BOOL *pbKickRequired)
{
IMG_UINT32 ui32BeforeWOff = asCmdHelperData[0].psClientCCB->ui32HostWriteOffset;
IMG_UINT32 ui32AllocSize = 0;
IMG_UINT32 i;
IMG_UINT8 *pui8StartPtr;
PVRSRV_ERROR eError;
*pbKickRequired = IMG_FALSE;
/*
Workout how much space we need for all the command(s)
*/
for (i=0;i<ui32CmdCount;i++)
{
if (asCmdHelperData[0].bPDumpContinuous != asCmdHelperData[i].bPDumpContinuous)
{
PVR_DPF((PVR_DBG_ERROR, "%s: PDump continuous is not consistent (%s != %s) for command %d",
__FUNCTION__,
asCmdHelperData[0].bPDumpContinuous?"IMG_TRUE":"IMG_FALSE",
asCmdHelperData[i].bPDumpContinuous?"IMG_TRUE":"IMG_FALSE",
ui32CmdCount));
return PVRSRV_ERROR_INVALID_PARAMS;
}
ui32AllocSize += asCmdHelperData[i].ui32FenceCmdSize +
asCmdHelperData[i].ui32DMCmdSize +
asCmdHelperData[i].ui32UpdateCmdSize;
}
/*
Acquire space in the CCB for all the command(s).
*/
eError = RGXAcquireCCB(asCmdHelperData[0].psClientCCB,
ui32AllocSize,
(IMG_PVOID *)&pui8StartPtr,
asCmdHelperData[0].bPDumpContinuous);
if (eError != PVRSRV_OK)
{
/* Failed so bail out and allow the client side to retry */
if (asCmdHelperData[0].psClientCCB->ui32HostWriteOffset != ui32BeforeWOff)
{
*pbKickRequired = IMG_TRUE;
}
return eError;
}
/*
For each command fill in the fence, DM, and update command
Note:
We only fill in the client fences here, the server fences (and updates)
will be filled in together at the end. This is because we might fail the
kernel CCB alloc and would then have to rollback the server syncs if
we took the operation here
*/
for (i=0;i<ui32CmdCount;i++)
{
RGX_CCB_CMD_HELPER_DATA *psCmdHelperData = &asCmdHelperData[i];
IMG_UINT8 *pui8CmdPtr;
IMG_UINT8 *pui8ServerFenceStart = 0;
IMG_UINT8 *pui8ServerUpdateStart = 0;
#if defined(PDUMP)
IMG_UINT32 ui32CtxAddr = FWCommonContextGetFWAddress(asCmdHelperData->psClientCCB->psServerCommonContext).ui32Addr;
IMG_UINT32 ui32CcbWoff = RGXGetHostWriteOffsetCCB(FWCommonContextGetClientCCB(asCmdHelperData->psClientCCB->psServerCommonContext));
#endif
if (psCmdHelperData->ui32ClientFenceCount+psCmdHelperData->ui32ClientUpdateCount != 0)
{
PDUMPCOMMENT("Start of %s client syncs for cmd[%d] on FWCtx %08x Woff 0x%x bytes",
psCmdHelperData->psClientCCB->szName, i, ui32CtxAddr, ui32CcbWoff);
}
/*
Create the fence command.
*/
if (psCmdHelperData->ui32FenceCmdSize)
{
RGXFWIF_CCB_CMD_HEADER *psHeader;
IMG_UINT k;
/* Fences are at the start of the command */
pui8CmdPtr = pui8StartPtr;
psHeader = (RGXFWIF_CCB_CMD_HEADER *) pui8CmdPtr;
psHeader->eCmdType = RGXFWIF_CCB_CMD_TYPE_FENCE;
psHeader->ui32CmdSize = psCmdHelperData->ui32FenceCmdSize - sizeof(RGXFWIF_CCB_CMD_HEADER);
pui8CmdPtr += sizeof(RGXFWIF_CCB_CMD_HEADER);
/* Fill in the client fences */
for (k = 0; k < psCmdHelperData->ui32ClientFenceCount; k++)
{
RGXFWIF_UFO *psUFOPtr = (RGXFWIF_UFO *) pui8CmdPtr;
psUFOPtr->puiAddrUFO = psCmdHelperData->pauiFenceUFOAddress[k];
psUFOPtr->ui32Value = psCmdHelperData->paui32FenceValue[k];
//.........这里部分代码省略.........
示例4: DuplicateUSEASMInstructionList
/***********************************************************************************
Function Name : DuplicateUSEASMInstructionList
Inputs :
Outputs :
Returns :
Description :
************************************************************************************/
IMG_INTERNAL IMG_VOID DuplicateUSEASMInstructionList(GLES1Context *gc, GLESUSEASMInfo *psSrcUSEASMInfo, GLESUSEASMInfo *psDstUSEASMInfo)
{
USE_INST *psInputInstruction, *psOutputInstruction, *psPrev;
PVR_UNREFERENCED_PARAMETER(gc);
psInputInstruction = psSrcUSEASMInfo->psFirstUSEASMInstruction;
psDstUSEASMInfo->psFirstUSEASMInstruction = IMG_NULL;
psPrev = IMG_NULL;
/* Fix build warning */
psOutputInstruction = IMG_NULL;
while(psInputInstruction)
{
psOutputInstruction = GLES1Malloc(gc, sizeof(USE_INST));
if(!psOutputInstruction)
{
USE_INST *psNext;
PVR_DPF((PVR_DBG_ERROR,"DuplicateUSEASMInstrcutionList(): Failed to allocate memory for USEASM instructions"));
psOutputInstruction = psDstUSEASMInfo->psFirstUSEASMInstruction;
while(psOutputInstruction)
{
psNext = psOutputInstruction->psNext;
GLES1Free(gc, psOutputInstruction);
psOutputInstruction = psNext;
}
psDstUSEASMInfo->psFirstUSEASMInstruction = IMG_NULL;
psDstUSEASMInfo->psLastUSEASMInstruction = IMG_NULL;
psDstUSEASMInfo->ui32NumMainUSEASMInstructions = 0;
return;
}
*psOutputInstruction = *psInputInstruction;
if(!psDstUSEASMInfo->psFirstUSEASMInstruction)
{
psDstUSEASMInfo->psFirstUSEASMInstruction = psOutputInstruction;
}
psOutputInstruction->psNext = IMG_NULL;
if(psPrev)
{
psPrev->psNext = psOutputInstruction;
}
psOutputInstruction->psPrev = psPrev;
psPrev = psOutputInstruction;
psInputInstruction = psInputInstruction->psNext;
}
psDstUSEASMInfo->psLastUSEASMInstruction = psOutputInstruction;
psDstUSEASMInfo->ui32NumMainUSEASMInstructions = psSrcUSEASMInfo->ui32NumMainUSEASMInstructions;
}
示例5: SGXSubmit2DKM
IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK *psKick)
#endif
{
PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo = (PVRSRV_KERNEL_MEM_INFO *)psKick->hCCBMemInfo;
SGXMKIF_COMMAND sCommand = {0};
SGXMKIF_2DCMD_SHARED *ps2DCmd;
PVRSRV_KERNEL_SYNC_INFO *psSyncInfo;
PVRSRV_ERROR eError;
IMG_UINT32 i;
IMG_HANDLE hDevMemContext = IMG_NULL;
#if defined(PDUMP)
IMG_BOOL bPersistentProcess = IMG_FALSE;
{
PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData();
if(psPerProc != IMG_NULL)
{
bPersistentProcess = psPerProc->bPDumpPersistent;
}
}
#endif
#if defined(FIX_HW_BRN_31620)
hDevMemContext = psKick->hDevMemContext;
#endif
if (!CCB_OFFSET_IS_VALID(SGXMKIF_2DCMD_SHARED, psCCBMemInfo, psKick, ui32SharedCmdCCBOffset))
{
PVR_DPF((PVR_DBG_ERROR, "SGXSubmit2DKM: Invalid CCB offset"));
return PVRSRV_ERROR_INVALID_PARAMS;
}
ps2DCmd = CCB_DATA_FROM_OFFSET(SGXMKIF_2DCMD_SHARED, psCCBMemInfo, psKick, ui32SharedCmdCCBOffset);
OSMemSet(ps2DCmd, 0, sizeof(*ps2DCmd));
if (psKick->hTASyncInfo != IMG_NULL)
{
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo;
ps2DCmd->sTASyncData.ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++;
ps2DCmd->sTASyncData.ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
ps2DCmd->sTASyncData.sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
ps2DCmd->sTASyncData.sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
}
if (psKick->h3DSyncInfo != IMG_NULL)
{
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo;
ps2DCmd->s3DSyncData.ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++;
ps2DCmd->s3DSyncData.ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
ps2DCmd->s3DSyncData.sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
ps2DCmd->s3DSyncData.sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
}
ps2DCmd->ui32NumSrcSync = psKick->ui32NumSrcSync;
for (i = 0; i < psKick->ui32NumSrcSync; i++)
{
psSyncInfo = psKick->ahSrcSyncInfo[i];
ps2DCmd->sSrcSyncData[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
ps2DCmd->sSrcSyncData[i].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
ps2DCmd->sSrcSyncData[i].sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
ps2DCmd->sSrcSyncData[i].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
}
if (psKick->hDstSyncInfo != IMG_NULL)
{
psSyncInfo = psKick->hDstSyncInfo;
ps2DCmd->sDstSyncData.ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
ps2DCmd->sDstSyncData.ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
ps2DCmd->sDstSyncData.ui32ReadOps2PendingVal = psSyncInfo->psSyncData->ui32ReadOps2Pending;
ps2DCmd->sDstSyncData.sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
ps2DCmd->sDstSyncData.sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
ps2DCmd->sDstSyncData.sReadOps2CompleteDevVAddr = psSyncInfo->sReadOps2CompleteDevVAddr;
}
for (i = 0; i < psKick->ui32NumSrcSync; i++)
{
psSyncInfo = psKick->ahSrcSyncInfo[i];
psSyncInfo->psSyncData->ui32ReadOpsPending++;
}
if (psKick->hDstSyncInfo != IMG_NULL)
{
psSyncInfo = psKick->hDstSyncInfo;
psSyncInfo->psSyncData->ui32WriteOpsPending++;
}
//.........这里部分代码省略.........
示例6: RGXAcquireCCB
/******************************************************************************
FUNCTION : RGXAcquireCCB
PURPOSE : Obtains access to write some commands to a CCB
PARAMETERS : psClientCCB - The client CCB
ui32CmdSize - How much space is required
ppvBufferSpace - Pointer to space in the buffer
bPDumpContinuous - Should this be PDump continuous?
RETURNS : PVRSRV_ERROR
******************************************************************************/
IMG_INTERNAL PVRSRV_ERROR RGXAcquireCCB(RGX_CLIENT_CCB *psClientCCB,
IMG_UINT32 ui32CmdSize,
IMG_PVOID *ppvBufferSpace,
IMG_BOOL bPDumpContinuous)
{
PVRSRV_ERROR eError;
IMG_UINT32 ui32PDumpFlags = bPDumpContinuous ? PDUMP_FLAGS_CONTINUOUS : 0;
IMG_BOOL bInCaptureRange;
IMG_BOOL bPdumpEnabled;
PDumpIsCaptureFrameKM(&bInCaptureRange);
bPdumpEnabled = (bInCaptureRange || bPDumpContinuous);
/*
PDumpSetFrame will detect as we Transition into capture range for
frame based data but if we are PDumping continuous data then we
need to inform the PDump layer ourselves
*/
if (bPDumpContinuous && !bInCaptureRange)
{
eError = PDumpTransition(psClientCCB->psPDumpConnectionData, IMG_TRUE, IMG_TRUE);
if (eError != PVRSRV_OK)
{
return eError;
}
}
/* Check that the CCB can hold this command + padding */
if ((ui32CmdSize + PADDING_COMMAND_SIZE + 1) > psClientCCB->ui32Size)
{
PVR_DPF((PVR_DBG_ERROR, "Command size (%d bytes) too big for CCB (%d bytes)\n",
ui32CmdSize, psClientCCB->ui32Size));
return PVRSRV_ERROR_CMD_TOO_BIG;
}
/*
Check we don't overflow the end of the buffer and make sure we have
enough for the padding command.
*/
if ((psClientCCB->ui32HostWriteOffset + ui32CmdSize + PADDING_COMMAND_SIZE) >
psClientCCB->ui32Size)
{
RGXFWIF_CCB_CMD_HEADER *psHeader;
IMG_VOID *pvHeader;
PVRSRV_ERROR eError;
IMG_UINT32 ui32Remain = psClientCCB->ui32Size - psClientCCB->ui32HostWriteOffset;
/* We're at the end of the buffer without enough contiguous space */
eError = _RGXAcquireCCB(psClientCCB,
ui32Remain,
&pvHeader);
if (eError != PVRSRV_OK)
{
/*
It's possible no commands have been processed in which case as we
can fail the padding allocation due to that fact we never allow
the client CCB to be full
*/
return eError;
}
psHeader = pvHeader;
psHeader->eCmdType = RGXFWIF_CCB_CMD_TYPE_PADDING;
psHeader->ui32CmdSize = ui32Remain - sizeof(RGXFWIF_CCB_CMD_HEADER);
PDUMPCOMMENTWITHFLAGS(ui32PDumpFlags, "cCCB(%p): Padding cmd %d", psClientCCB, psHeader->ui32CmdSize);
if (bPdumpEnabled)
{
DevmemPDumpLoadMem(psClientCCB->psClientCCBMemDesc,
psClientCCB->ui32HostWriteOffset,
ui32Remain,
ui32PDumpFlags);
}
UPDATE_CCB_OFFSET(psClientCCB->ui32HostWriteOffset,
ui32Remain,
psClientCCB->ui32Size);
}
return _RGXAcquireCCB(psClientCCB,
ui32CmdSize,
ppvBufferSpace);
}
示例7: SGXAddSharedPBDescKM
IMG_EXPORT PVRSRV_ERROR
SGXAddSharedPBDescKM(PVRSRV_PER_PROCESS_DATA *psPerProc,
IMG_HANDLE hDevCookie,
PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo,
PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo,
PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo,
PVRSRV_KERNEL_MEM_INFO *psHWBlockKernelMemInfo,
IMG_UINT32 ui32TotalPBSize,
IMG_HANDLE *phSharedPBDesc,
PVRSRV_KERNEL_MEM_INFO **ppsSharedPBDescSubKernelMemInfos,
IMG_UINT32 ui32SharedPBDescSubKernelMemInfosCount)
{
PVRSRV_STUB_PBDESC *psStubPBDesc=IMG_NULL;
PVRSRV_ERROR eRet = PVRSRV_ERROR_GENERIC;
IMG_UINT32 i;
PVRSRV_SGXDEV_INFO *psSGXDevInfo;
PRESMAN_ITEM psResItem;
if (psPerProcCreateSharedPB != psPerProc)
{
goto NoAdd;
}
else
{
PVR_ASSERT(psResItemCreateSharedPB != IMG_NULL);
ResManFreeResByPtr(psResItemCreateSharedPB);
PVR_ASSERT(psResItemCreateSharedPB == IMG_NULL);
PVR_ASSERT(psPerProcCreateSharedPB == IMG_NULL);
}
psSGXDevInfo = (PVRSRV_SGXDEV_INFO *)((PVRSRV_DEVICE_NODE *)hDevCookie)->pvDevice;
psStubPBDesc = psSGXDevInfo->psStubPBDescListKM;
if (psStubPBDesc != IMG_NULL)
{
if(psStubPBDesc->ui32TotalPBSize != ui32TotalPBSize)
{
PVR_DPF((PVR_DBG_WARNING,
"SGXAddSharedPBDescKM: Shared PB requested with different size (0x%x) from existing shared PB (0x%x) - requested size ignored",
ui32TotalPBSize, psStubPBDesc->ui32TotalPBSize));
}
psResItem = ResManRegisterRes(psPerProc->hResManContext,
RESMAN_TYPE_SHARED_PB_DESC,
psStubPBDesc,
0,
&SGXCleanupSharedPBDescCallback);
if (psResItem == IMG_NULL)
{
PVR_DPF((PVR_DBG_ERROR,
"SGXAddSharedPBDescKM: "
"Failed to register existing shared "
"PBDesc with the resource manager"));
goto NoAddKeepPB;
}
psStubPBDesc->ui32RefCount++;
*phSharedPBDesc = (IMG_HANDLE)psResItem;
eRet = PVRSRV_OK;
goto NoAddKeepPB;
}
if(OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
sizeof(PVRSRV_STUB_PBDESC),
(IMG_VOID **)&psStubPBDesc,
0,
"Stub Parameter Buffer Description") != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "SGXAddSharedPBDescKM: Failed to alloc "
"StubPBDesc"));
eRet = PVRSRV_ERROR_OUT_OF_MEMORY;
goto NoAdd;
}
psStubPBDesc->ppsSubKernelMemInfos = IMG_NULL;
if(OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
sizeof(PVRSRV_KERNEL_MEM_INFO *)
* ui32SharedPBDescSubKernelMemInfosCount,
(IMG_VOID **)&psStubPBDesc->ppsSubKernelMemInfos,
0,
"Array of Kernel Memory Info") != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "SGXAddSharedPBDescKM: "
"Failed to alloc "
"StubPBDesc->ppsSubKernelMemInfos"));
eRet = PVRSRV_ERROR_OUT_OF_MEMORY;
goto NoAdd;
}
if(PVRSRVDissociateMemFromResmanKM(psSharedPBDescKernelMemInfo)
!= PVRSRV_OK)
//.........这里部分代码省略.........
示例8: SGXFindSharedPBDescKM
IMG_EXPORT PVRSRV_ERROR
SGXFindSharedPBDescKM(PVRSRV_PER_PROCESS_DATA *psPerProc,
IMG_HANDLE hDevCookie,
IMG_BOOL bLockOnFailure,
IMG_UINT32 ui32TotalPBSize,
IMG_HANDLE *phSharedPBDesc,
PVRSRV_KERNEL_MEM_INFO **ppsSharedPBDescKernelMemInfo,
PVRSRV_KERNEL_MEM_INFO **ppsHWPBDescKernelMemInfo,
PVRSRV_KERNEL_MEM_INFO **ppsBlockKernelMemInfo,
PVRSRV_KERNEL_MEM_INFO **ppsHWBlockKernelMemInfo,
PVRSRV_KERNEL_MEM_INFO ***pppsSharedPBDescSubKernelMemInfos,
IMG_UINT32 *ui32SharedPBDescSubKernelMemInfosCount)
{
PVRSRV_STUB_PBDESC *psStubPBDesc;
PVRSRV_KERNEL_MEM_INFO **ppsSharedPBDescSubKernelMemInfos=IMG_NULL;
PVRSRV_SGXDEV_INFO *psSGXDevInfo;
PVRSRV_ERROR eError;
psSGXDevInfo = ((PVRSRV_DEVICE_NODE *)hDevCookie)->pvDevice;
psStubPBDesc = psSGXDevInfo->psStubPBDescListKM;
if (psStubPBDesc != IMG_NULL)
{
IMG_UINT32 i;
PRESMAN_ITEM psResItem;
if(psStubPBDesc->ui32TotalPBSize != ui32TotalPBSize)
{
PVR_DPF((PVR_DBG_WARNING,
"SGXFindSharedPBDescKM: Shared PB requested with different size (0x%x) from existing shared PB (0x%x) - requested size ignored",
ui32TotalPBSize, psStubPBDesc->ui32TotalPBSize));
}
if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(PVRSRV_KERNEL_MEM_INFO *)
* psStubPBDesc->ui32SubKernelMemInfosCount,
(IMG_VOID **)&ppsSharedPBDescSubKernelMemInfos,
IMG_NULL,
"Array of Kernel Memory Info") != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "SGXFindSharedPBDescKM: OSAllocMem failed"));
eError = PVRSRV_ERROR_OUT_OF_MEMORY;
goto ExitNotFound;
}
psResItem = ResManRegisterRes(psPerProc->hResManContext,
RESMAN_TYPE_SHARED_PB_DESC,
psStubPBDesc,
0,
&SGXCleanupSharedPBDescCallback);
if (psResItem == IMG_NULL)
{
OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
sizeof(PVRSRV_KERNEL_MEM_INFO *) * psStubPBDesc->ui32SubKernelMemInfosCount,
ppsSharedPBDescSubKernelMemInfos,
0);
PVR_DPF((PVR_DBG_ERROR, "SGXFindSharedPBDescKM: ResManRegisterRes failed"));
eError = PVRSRV_ERROR_GENERIC;
goto ExitNotFound;
}
*ppsSharedPBDescKernelMemInfo = psStubPBDesc->psSharedPBDescKernelMemInfo;
*ppsHWPBDescKernelMemInfo = psStubPBDesc->psHWPBDescKernelMemInfo;
*ppsBlockKernelMemInfo = psStubPBDesc->psBlockKernelMemInfo;
*ppsHWBlockKernelMemInfo = psStubPBDesc->psHWBlockKernelMemInfo;
*ui32SharedPBDescSubKernelMemInfosCount =
psStubPBDesc->ui32SubKernelMemInfosCount;
*pppsSharedPBDescSubKernelMemInfos = ppsSharedPBDescSubKernelMemInfos;
for(i=0; i<psStubPBDesc->ui32SubKernelMemInfosCount; i++)
{
ppsSharedPBDescSubKernelMemInfos[i] =
psStubPBDesc->ppsSubKernelMemInfos[i];
}
psStubPBDesc->ui32RefCount++;
*phSharedPBDesc = (IMG_HANDLE)psResItem;
return PVRSRV_OK;
}
eError = PVRSRV_OK;
if (bLockOnFailure)
{
if (psResItemCreateSharedPB == IMG_NULL)
{
psResItemCreateSharedPB = ResManRegisterRes(psPerProc->hResManContext,
RESMAN_TYPE_SHARED_PB_DESC_CREATE_LOCK,
psPerProc,
0,
&SGXCleanupSharedPBDescCreateLockCallback);
if (psResItemCreateSharedPB == IMG_NULL)
{
//.........这里部分代码省略.........
示例9: PVRSRVRGXCreateTransferContextKM
/*
* PVRSRVCreateTransferContextKM
*/
IMG_EXPORT
PVRSRV_ERROR PVRSRVRGXCreateTransferContextKM(CONNECTION_DATA *psConnection,
PVRSRV_DEVICE_NODE *psDeviceNode,
IMG_UINT32 ui32Priority,
IMG_DEV_VIRTADDR sMCUFenceAddr,
IMG_UINT32 ui32FrameworkCommandSize,
IMG_PBYTE pabyFrameworkCommand,
IMG_HANDLE hMemCtxPrivData,
RGX_SERVER_TQ_CONTEXT **ppsTransferContext)
{
RGX_SERVER_TQ_CONTEXT *psTransferContext;
DEVMEM_MEMDESC *psFWMemContextMemDesc = RGXGetFWMemDescFromMemoryContextHandle(hMemCtxPrivData);
RGX_COMMON_CONTEXT_INFO sInfo;
PVRSRV_ERROR eError = PVRSRV_OK;
/* Allocate the server side structure */
psTransferContext = OSAllocMem(sizeof(*psTransferContext));
if (psTransferContext == IMG_NULL)
{
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
OSMemSet(psTransferContext, 0, sizeof(*psTransferContext));
psTransferContext->psDeviceNode = psDeviceNode;
/* Allocate cleanup sync */
eError = SyncPrimAlloc(psDeviceNode->hSyncPrimContext,
&psTransferContext->psCleanupSync);
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateTransferContextKM: Failed to allocate cleanup sync (0x%x)",
eError));
goto fail_syncalloc;
}
/*
* Create the FW framework buffer
*/
eError = PVRSRVRGXFrameworkCreateKM(psDeviceNode,
&psTransferContext->psFWFrameworkMemDesc,
ui32FrameworkCommandSize);
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateTransferContextKM: Failed to allocate firmware GPU framework state (%u)",
eError));
goto fail_frameworkcreate;
}
/* Copy the Framework client data into the framework buffer */
eError = PVRSRVRGXFrameworkCopyCommand(psTransferContext->psFWFrameworkMemDesc,
pabyFrameworkCommand,
ui32FrameworkCommandSize);
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateTransferContextKM: Failed to populate the framework buffer (%u)",
eError));
goto fail_frameworkcopy;
}
sInfo.psFWFrameworkMemDesc = psTransferContext->psFWFrameworkMemDesc;
sInfo.psMCUFenceAddr = &sMCUFenceAddr;
eError = _Create3DTransferContext(psConnection,
psDeviceNode,
psFWMemContextMemDesc,
ui32Priority,
&sInfo,
&psTransferContext->s3DData);
if (eError != PVRSRV_OK)
{
goto fail_3dtransfercontext;
}
psTransferContext->ui32Flags |= RGX_SERVER_TQ_CONTEXT_FLAGS_3D;
eError = _Create2DTransferContext(psConnection,
psDeviceNode,
psFWMemContextMemDesc,
ui32Priority,
&sInfo,
&psTransferContext->s2DData);
if (eError != PVRSRV_OK)
{
goto fail_2dtransfercontext;
}
psTransferContext->ui32Flags |= RGX_SERVER_TQ_CONTEXT_FLAGS_2D;
{
PVRSRV_RGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
dllist_add_to_tail(&(psDevInfo->sTransferCtxtListHead), &(psTransferContext->sListNode));
*ppsTransferContext = psTransferContext;
}
return PVRSRV_OK;
fail_2dtransfercontext:
_Destroy3DTransferContext(&psTransferContext->s3DData,
//.........这里部分代码省略.........
示例10: PVRSRVRGXSubmitTransferKM
//.........这里部分代码省略.........
psServerCommonCtx = psTransferContext->s3DData.psServerCommonContext;
psClientCCB = FWCommonContextGetClientCCB(psServerCommonCtx);
pszCommandName = "TQ-3D";
psCmdHelper = &pas3DCmdHelper[ui323DCmdCount++];
eType = RGXFWIF_CCB_CMD_TYPE_TQ_3D;
}
else if (TQ_PREP_FLAGS_COMMAND_IS(pui32TQPrepareFlags[i], 2D))
{
psServerCommonCtx = psTransferContext->s2DData.psServerCommonContext;
psClientCCB = FWCommonContextGetClientCCB(psServerCommonCtx);
pszCommandName = "TQ-2D";
psCmdHelper = &pas2DCmdHelper[ui322DCmdCount++];
eType = RGXFWIF_CCB_CMD_TYPE_TQ_2D;
}
else
{
eError = PVRSRV_ERROR_INVALID_PARAMS;
goto fail_cmdtype;
}
if (i == 0)
{
bPDumpContinuous = ((pui32TQPrepareFlags[i] & TQ_PREP_FLAGS_PDUMPCONTINUOUS) == TQ_PREP_FLAGS_PDUMPCONTINUOUS);
PDUMPCOMMENTWITHFLAGS((bPDumpContinuous) ? PDUMP_FLAGS_CONTINUOUS : 0,
"%s Command Server Submit on FWCtx %08x", pszCommandName, FWCommonContextGetFWAddress(psServerCommonCtx).ui32Addr);
}
else
{
IMG_BOOL bNewPDumpContinuous = ((pui32TQPrepareFlags[i] & TQ_PREP_FLAGS_PDUMPCONTINUOUS) == TQ_PREP_FLAGS_PDUMPCONTINUOUS);
if (bNewPDumpContinuous != bPDumpContinuous)
{
eError = PVRSRV_ERROR_INVALID_PARAMS;
PVR_DPF((PVR_DBG_ERROR, "%s: Mixing of continuous and non-continuous command in a batch is not permitted", __FUNCTION__));
goto fail_pdumpcheck;
}
}
#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC)
if (ui32NumFenceFDs)
{
IMG_UINT32 ui32NumFenceSyncs;
PRGXFWIF_UFO_ADDR *puiFenceFWAddrs;
IMG_UINT32 *pui32FenceValues;
IMG_UINT32 ui32NumUpdateSyncs;
PRGXFWIF_UFO_ADDR *puiUpdateFWAddrs;
IMG_UINT32 *pui32UpdateValues;
/*
FIXME:
We can't be taking the server sync operations here as we
have no way to undo them should the acquire fail.
If client/local syncs where used here would that remove the
issue?
*/
eError = PVRFDSyncQueryFencesKM(ui32NumFenceFDs,
paui32FenceFDs,
IMG_TRUE,
&ui32NumFenceSyncs,
&puiFenceFWAddrs,
&pui32FenceValues,
&ui32NumUpdateSyncs,
&puiUpdateFWAddrs,
&pui32UpdateValues);
if (eError != PVRSRV_OK)
{
示例11: PVRSRVRGXCreateComputeContextKM
IMG_EXPORT
PVRSRV_ERROR PVRSRVRGXCreateComputeContextKM(CONNECTION_DATA *psConnection,
PVRSRV_DEVICE_NODE *psDeviceNode,
IMG_UINT32 ui32Priority,
IMG_DEV_VIRTADDR sMCUFenceAddr,
IMG_UINT32 ui32FrameworkCommandSize,
IMG_PBYTE pbyFrameworkCommand,
IMG_HANDLE hMemCtxPrivData,
RGX_SERVER_COMPUTE_CONTEXT **ppsComputeContext)
{
PVRSRV_RGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
DEVMEM_MEMDESC *psFWMemContextMemDesc = RGXGetFWMemDescFromMemoryContextHandle(hMemCtxPrivData);
RGX_SERVER_COMPUTE_CONTEXT *psComputeContext;
RGX_COMMON_CONTEXT_INFO sInfo;
PVRSRV_ERROR eError = PVRSRV_OK;
/* Prepare cleanup struct */
psComputeContext = OSAllocMem(sizeof(*psComputeContext));
if (psComputeContext == IMG_NULL)
{
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
OSMemSet(psComputeContext, 0, sizeof(*psComputeContext));
*ppsComputeContext = psComputeContext;
psComputeContext->psDeviceNode = psDeviceNode;
/* Allocate cleanup sync */
eError = SyncPrimAlloc(psDeviceNode->hSyncPrimContext,
&psComputeContext->psSync);
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRGXCreateComputeContextKM: Failed to allocate cleanup sync (0x%x)",
eError));
goto fail_syncalloc;
}
/*
Allocate device memory for the firmware GPU context suspend state.
Note: the FW reads/writes the state to memory by accessing the GPU register interface.
*/
PDUMPCOMMENT("Allocate RGX firmware compute context suspend state");
eError = DevmemFwAllocate(psDevInfo,
sizeof(RGXFWIF_COMPUTECTX_STATE),
RGX_FWCOMCTX_ALLOCFLAGS,
"ComputeContextState",
&psComputeContext->psFWComputeContextStateMemDesc);
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRGXCreateComputeContextKM: Failed to allocate firmware GPU context suspend state (%u)",
eError));
goto fail_contextsuspendalloc;
}
/*
* Create the FW framework buffer
*/
eError = PVRSRVRGXFrameworkCreateKM(psDeviceNode,
&psComputeContext->psFWFrameworkMemDesc,
ui32FrameworkCommandSize);
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRGXCreateComputeContextKM: Failed to allocate firmware GPU framework state (%u)",
eError));
goto fail_frameworkcreate;
}
/* Copy the Framework client data into the framework buffer */
eError = PVRSRVRGXFrameworkCopyCommand(psComputeContext->psFWFrameworkMemDesc,
pbyFrameworkCommand,
ui32FrameworkCommandSize);
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRGXCreateComputeContextKM: Failed to populate the framework buffer (%u)",
eError));
goto fail_frameworkcopy;
}
sInfo.psFWFrameworkMemDesc = psComputeContext->psFWFrameworkMemDesc;
sInfo.psMCUFenceAddr = &sMCUFenceAddr;
eError = FWCommonContextAllocate(psConnection,
psDeviceNode,
"CDM",
IMG_NULL,
0,
psFWMemContextMemDesc,
psComputeContext->psFWComputeContextStateMemDesc,
RGX_CCB_SIZE_LOG2,
ui32Priority,
&sInfo,
&psComputeContext->psServerCommonContext);
if (eError != PVRSRV_OK)
{
goto fail_contextalloc;
}
//.........这里部分代码省略.........
示例12: PVRSRVRGXKickCDMKM
IMG_EXPORT
PVRSRV_ERROR PVRSRVRGXKickCDMKM(RGX_SERVER_COMPUTE_CONTEXT *psComputeContext,
IMG_UINT32 ui32ClientFenceCount,
PRGXFWIF_UFO_ADDR *pauiClientFenceUFOAddress,
IMG_UINT32 *paui32ClientFenceValue,
IMG_UINT32 ui32ClientUpdateCount,
PRGXFWIF_UFO_ADDR *pauiClientUpdateUFOAddress,
IMG_UINT32 *paui32ClientUpdateValue,
IMG_UINT32 ui32ServerSyncPrims,
IMG_UINT32 *paui32ServerSyncFlags,
SERVER_SYNC_PRIMITIVE **pasServerSyncs,
IMG_UINT32 ui32CmdSize,
IMG_PBYTE pui8DMCmd,
IMG_BOOL bPDumpContinuous,
IMG_UINT32 ui32ExtJobRef,
IMG_UINT32 ui32IntJobRef)
{
RGXFWIF_KCCB_CMD sCmpKCCBCmd;
RGX_CCB_CMD_HELPER_DATA sCmdHelperData;
IMG_BOOL bKickRequired;
PVRSRV_ERROR eError;
PVRSRV_ERROR eError2;
IMG_UINT32 i;
PRGXFWIF_TIMESTAMP_ADDR pPreAddr;
PRGXFWIF_TIMESTAMP_ADDR pPostAddr;
PRGXFWIF_UFO_ADDR pRMWUFOAddr;
/* Sanity check the server fences */
for (i=0;i<ui32ServerSyncPrims;i++)
{
if (!(paui32ServerSyncFlags[i] & PVRSRV_CLIENT_SYNC_PRIM_OP_CHECK))
{
PVR_DPF((PVR_DBG_ERROR, "%s: Server fence (on CDM) must fence", __FUNCTION__));
return PVRSRV_ERROR_INVALID_SYNC_PRIM_OP;
}
}
RGX_GetTimestampCmdHelper((PVRSRV_RGXDEV_INFO*) psComputeContext->psDeviceNode->pvDevice,
& pPreAddr,
& pPostAddr,
& pRMWUFOAddr);
eError = RGXCmdHelperInitCmdCCB(FWCommonContextGetClientCCB(psComputeContext->psServerCommonContext),
ui32ClientFenceCount,
pauiClientFenceUFOAddress,
paui32ClientFenceValue,
ui32ClientUpdateCount,
pauiClientUpdateUFOAddress,
paui32ClientUpdateValue,
ui32ServerSyncPrims,
paui32ServerSyncFlags,
pasServerSyncs,
ui32CmdSize,
pui8DMCmd,
& pPreAddr,
& pPostAddr,
& pRMWUFOAddr,
RGXFWIF_CCB_CMD_TYPE_CDM,
bPDumpContinuous,
"Compute",
&sCmdHelperData);
if (eError != PVRSRV_OK)
{
goto fail_cmdinit;
}
eError = RGXCmdHelperAcquireCmdCCB(1, &sCmdHelperData, &bKickRequired);
if ((eError != PVRSRV_OK) && (!bKickRequired))
{
/*
Only bail if no new data was submitted into the client CCB, we might
have already submitted a padding packet which we should flush through
the FW.
*/
PVR_DPF((PVR_DBG_ERROR, "RGXKickCDM: Failed to create client CCB command"));
goto fail_cmdaquire;
}
/*
We should reserved space in the kernel CCB here and fill in the command
directly.
This is so if there isn't space in the kernel CCB we can return with
retry back to services client before we take any operations
*/
/*
We might only be kicking for flush out a padding packet so only submit
the command if the create was successful
*/
if (eError == PVRSRV_OK)
{
/*
All the required resources are ready at this point, we can't fail so
take the required server sync operations and commit all the resources
*/
RGXCmdHelperReleaseCmdCCB(1, &sCmdHelperData, "CDM", FWCommonContextGetFWAddress(psComputeContext->psServerCommonContext).ui32Addr);
}
//.........这里部分代码省略.........
示例13: StartUpMemSpeedTest
IMG_INTERNAL IMG_VOID StartUpMemSpeedTest(GLES1Context *gc)
{
IMG_UINT32 ui32BlockSize, ui32MaxSize, ui32BlockNumber;
IMG_UINT32 *pui32VBuffer, *pui32HostBuffer1, *pui32HostBuffer2;
IMG_UINT32 *pui32RealHostBuffer1, *pui32RealHostBuffer2;
IMG_CHAR szTempBuffer[1024];
IMG_UINT32 ui32BufLen;
PVR_DPF((PVR_DBG_WARNING, "Running StartUpMemSpeedTest. High memory watermark will be ruined. Disable using apphint EnableMemorySpeedTest"));
ui32MaxSize = 128*1024;
if(ui32MaxSize > (gc->apsBuffers[CBUF_TYPE_VERTEX_DATA_BUFFER]->ui32BufferLimitInBytes << 2))
{
PVR_DPF((PVR_DBG_ERROR,"StartUpMemSpeedTest: VB is too small - aborting test"));
return;
}
pui32VBuffer = gc->apsBuffers[CBUF_TYPE_VERTEX_DATA_BUFFER]->pui32BufferBase;
pui32RealHostBuffer1 = (IMG_UINT32 *)GLES1Malloc(gc, 1024*1024+32);
if (!pui32RealHostBuffer1)
{
PVR_DPF((PVR_DBG_ERROR,"StartUpMemSpeedTest: Failed host alloc 1 - aborting test"));
return;
}
pui32RealHostBuffer2 = (IMG_UINT32 *)GLES1Malloc(gc, 1024*1024+32);
if (!pui32RealHostBuffer2)
{
GLES1Free(gc, pui32RealHostBuffer1);
PVR_DPF((PVR_DBG_ERROR,"StartUpMemSpeedTest: Failed host alloc 2 - aborting test"));
return;
}
/* Align the addresses */
pui32HostBuffer1 = (IMG_UINT32 *)(((unsigned int)pui32RealHostBuffer1 & 0xFFFFFFE0UL) + 32);
pui32HostBuffer2 = (IMG_UINT32 *)(((unsigned int)pui32RealHostBuffer2 & 0xFFFFFFE0UL) + 32);
/* Spacer */
ui32BufLen = sprintf(szTempBuffer, "Bytes :");
/* Draw column headers */
for (ui32BlockSize=512; ui32BlockSize<=ui32MaxSize; ui32BlockSize<<=1)
{
ui32BufLen += sprintf(szTempBuffer + ui32BufLen, "%7u ",ui32BlockSize);
}
PVR_TRACE((szTempBuffer));
/* Spacer */
ui32BufLen = sprintf(szTempBuffer, "--------");
/* Draw separator */
for (ui32BlockSize=512; ui32BlockSize<=ui32MaxSize; ui32BlockSize<<=1)
{
ui32BufLen += sprintf(szTempBuffer + ui32BufLen, "-------|");
}
PVR_TRACE((szTempBuffer));
/* Row header */
ui32BufLen = sprintf(szTempBuffer, "H -> VB:");
/* Host to VB copy */
for (ui32BlockSize=512,ui32BlockNumber=0; ui32BlockSize<=ui32MaxSize; ui32BlockSize<<=1,ui32BlockNumber++)
{
IMG_UINT32 ui32Start, ui32Stop, ui32Total;
IMG_UINT32 ui32Count;
IMG_FLOAT fMB, fSeconds;
ui32Start = PVRSRVMetricsTimeNow();
for (ui32Count=0; ui32Count<10; ui32Count++)
{
GLES1MemCopy(pui32VBuffer, pui32HostBuffer1, ui32BlockSize);
}
ui32Stop = PVRSRVMetricsTimeNow();
ui32Total = ui32Stop - ui32Start;
fMB = 10.0f*ui32BlockSize;
fMB /= (1024.0f*1024.0f);
fSeconds = (IMG_FLOAT)ui32Total;
fSeconds *= (gc->fCPUSpeed/1000.0f);
ui32BufLen += sprintf(szTempBuffer + ui32BufLen, "%7.2f ", fSeconds?fMB/fSeconds:0.0f);
}
PVR_TRACE((szTempBuffer));
/* Row header */
ui32BufLen = sprintf(szTempBuffer, "H -> H:");
/* Host to Host copy */
//.........这里部分代码省略.........
示例14: SGXSubmitTransferKM
IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSFER_SGX_KICK *psKick)
#endif
{
PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo = (PVRSRV_KERNEL_MEM_INFO *)psKick->hCCBMemInfo;
SGXMKIF_COMMAND sCommand = {0};
SGXMKIF_TRANSFERCMD_SHARED *psSharedTransferCmd;
PVRSRV_KERNEL_SYNC_INFO *psSyncInfo;
PVRSRV_ERROR eError;
IMG_UINT32 loop;
IMG_HANDLE hDevMemContext = IMG_NULL;
IMG_BOOL abSrcSyncEnable[SGX_MAX_TRANSFER_SYNC_OPS];
IMG_UINT32 ui32RealSrcSyncNum = 0;
IMG_BOOL abDstSyncEnable[SGX_MAX_TRANSFER_SYNC_OPS];
IMG_UINT32 ui32RealDstSyncNum = 0;
#if defined(PDUMP)
IMG_BOOL bPersistentProcess = IMG_FALSE;
{
PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData();
if(psPerProc != IMG_NULL)
{
bPersistentProcess = psPerProc->bPDumpPersistent;
}
}
#endif
#if defined(FIX_HW_BRN_31620)
hDevMemContext = psKick->hDevMemContext;
#endif
PVR_TTRACE(PVRSRV_TRACE_GROUP_TRANSFER, PVRSRV_TRACE_CLASS_FUNCTION_ENTER, TRANSFER_TOKEN_SUBMIT);
for (loop = 0; loop < SGX_MAX_TRANSFER_SYNC_OPS; loop++)
{
abSrcSyncEnable[loop] = IMG_TRUE;
abDstSyncEnable[loop] = IMG_TRUE;
}
if (!CCB_OFFSET_IS_VALID(SGXMKIF_TRANSFERCMD_SHARED, psCCBMemInfo, psKick, ui32SharedCmdCCBOffset))
{
PVR_DPF((PVR_DBG_ERROR, "SGXSubmitTransferKM: Invalid CCB offset"));
PVR_TTRACE(PVRSRV_TRACE_GROUP_TRANSFER, PVRSRV_TRACE_CLASS_FUNCTION_EXIT,
TRANSFER_TOKEN_SUBMIT);
return PVRSRV_ERROR_INVALID_PARAMS;
}
psSharedTransferCmd = CCB_DATA_FROM_OFFSET(SGXMKIF_TRANSFERCMD_SHARED, psCCBMemInfo, psKick, ui32SharedCmdCCBOffset);
PVR_TTRACE(PVRSRV_TRACE_GROUP_TRANSFER, PVRSRV_TRACE_CLASS_CMD_START, TRANSFER_TOKEN_SUBMIT);
PVR_TTRACE_UI32(PVRSRV_TRACE_GROUP_TRANSFER, PVRSRV_TRACE_CLASS_CCB,
TRANSFER_TOKEN_CCB_OFFSET, psKick->ui32SharedCmdCCBOffset);
if (psKick->hTASyncInfo != IMG_NULL)
{
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo;
PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_TRANSFER, TRANSFER_TOKEN_TA_SYNC,
psSyncInfo, PVRSRV_SYNCOP_SAMPLE);
psSharedTransferCmd->ui32TASyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++;
psSharedTransferCmd->ui32TASyncReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
psSharedTransferCmd->sTASyncWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
psSharedTransferCmd->sTASyncReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
}
else
{
psSharedTransferCmd->sTASyncWriteOpsCompleteDevVAddr.uiAddr = 0;
psSharedTransferCmd->sTASyncReadOpsCompleteDevVAddr.uiAddr = 0;
}
if (psKick->h3DSyncInfo != IMG_NULL)
{
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo;
PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_TRANSFER, TRANSFER_TOKEN_3D_SYNC,
psSyncInfo, PVRSRV_SYNCOP_SAMPLE);
psSharedTransferCmd->ui323DSyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++;
psSharedTransferCmd->ui323DSyncReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
psSharedTransferCmd->s3DSyncWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
psSharedTransferCmd->s3DSyncReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
}
else
{
psSharedTransferCmd->s3DSyncWriteOpsCompleteDevVAddr.uiAddr = 0;
psSharedTransferCmd->s3DSyncReadOpsCompleteDevVAddr.uiAddr = 0;
}
for (loop = 0; loop < MIN(SGX_MAX_TRANSFER_SYNC_OPS, psKick->ui32NumSrcSync); loop++)
{
IMG_UINT32 i;
PVRSRV_KERNEL_SYNC_INFO * psMySyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[loop];
for (i = 0; i < loop; i++)
{
//.........这里部分代码省略.........
示例15: EnableSGXClocks
PVRSRV_ERROR EnableSGXClocks(SYS_DATA *psSysData)
{
#if !defined(NO_HARDWARE)
SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData;
if (atomic_read(&psSysSpecData->sSGXClocksEnabled) != 0)
{
return PVRSRV_OK;
}
PVR_DPF((PVR_DBG_MESSAGE, "EnableSGXClocks: Enabling SGX Clocks"));
#if defined(LDM_PLATFORM) && !defined(PVR_DRI_DRM_NOT_PCI) && defined(CONFIG_PM_RUNTIME)
{
int res = pm_runtime_get_sync(&gpsPVRLDMDev->dev);
if (res < 0)
{
PVR_DPF((PVR_DBG_ERROR, "EnableSGXClocks: pm_runtime_get_sync failed (%d)", -res));
return PVRSRV_ERROR_UNABLE_TO_ENABLE_CLOCK;
}
}
#endif
//disable_clock(MT65XX_PDN_MM_MFG_HALF, "MFG");
//disable_clock(MT65XX_PDN_MM_MFG, "MFG");
//disable_clock(MT65XX_PDN_MM_G3D, "MFG");
#if USE_SYS_CLOCK
#if !defined(MTK_CLK_CTRL)
DRV_WriteReg16(PLL_CON11, DRV_Reg16(PLL_CON11)|0x0C00); // F3D_CK_SEL
#endif
DRV_WriteReg32(MMSYS2_CONFG_BASE + 0x0504, 0x4); // MFG_CORE_CK_SEL DCM
#else
#if !defined(MTK_CLK_CTRL)
DRV_WriteReg16(PLL_CON11, DRV_Reg16(PLL_CON11)|0x0C00); // F3D_CK_SEL
#endif
DRV_WriteReg32(MMSYS2_CONFG_BASE + 0x0504, 0x6); // MFG_CORE_CK_SEL DCM
#endif
//DRV_WriteReg32(MMSYS2_CONFG_BASE+0x400, DRV_Reg32(MMSYS2_CONFG_BASE+0x400)|0x4);
enable_clock(MT65XX_PDN_MM_G3D, "MFG");
enable_clock(MT65XX_PDN_MM_MFG, "MFG");
enable_clock(MT65XX_PDN_MM_MFG_HALF, "MFG");
DRV_WriteReg32(MMSYS2_CONFG_BASE+0x400, DRV_Reg32(MMSYS2_CONFG_BASE+0x400)|0x4);
#if defined(MTK_USE_GDC)
SysInitGDC();
#endif
#if 0
DRV_WriteReg16(0xF0007404, 0x6);
DRV_WriteReg16(0xF0007400, 0x4800);
DRV_WriteReg16(0xF0007400, 0x0800);
DRV_WriteReg16(0xF0007400, 0x8800);
while(DRV_Reg16(0xF0007404) & 0x8000){}
PVRSRVReleasePrintf("MainPLL: 0x%x", DRV_Reg16(0xF0007410));
DRV_WriteReg16(0xF0007404, 0x15);
DRV_WriteReg16(0xF0007400, 0x4800);
DRV_WriteReg16(0xF0007400, 0x0800);
DRV_WriteReg16(0xF0007400, 0x8800);
while(DRV_Reg16(0xF0007404) & 0x8000){}
PVRSRVReleasePrintf("MEMPLL: 0x%x", DRV_Reg16(0xF0007410));
#endif
SysEnableSGXInterrupts(psSysData);
atomic_set(&psSysSpecData->sSGXClocksEnabled, 1);
#else
PVR_UNREFERENCED_PARAMETER(psSysData);
#endif
return PVRSRV_OK;
}