📄 services_test.cpp
字号:
/*!
******************************************************************************
@file : services_test.c
@brief
@Author Rik Allen
@date 05/09/2003
<b>Copyright 2003 by Imagination Technologies Limited.</b>\n
All rights reserved. No part of this software, either
material or conceptual may be copied or distributed,
transmitted, transcribed, stored in a retrieval system
or translated into any human or computer language in any
form by any means, electronic, mechanical, manual or
other-wise, or disclosed to third parties without the
express written permission of Imagination Technologies
Limited, Unit 8, HomePark Industrial Estate,
King's Langley, Hertfordshire, WD4 8LZ, U.K.
<b>Description:</b>\n
Simple test harness for services interface
<b>Platform:</b>\n
Generic
******************************************************************************/
#include "precomp.h"
#include "img_defs.h"
#include "services.h"
#include "mbx1defs.h"
#include "mbx12ddef.h"
#include "mbx13ddef.h"
#include "jdisplaydefs.h"
#include "pvr3dif.h"
#include "hostfunc.h"
#define FAIL_IF_NO_ERROR(val) if (val == PVRSRV_OK) {/*printf(" FAIL\n");*/ exit(-1);} else {/*printf(" OK\n");*/}
#define FAIL_IF_ERROR(val) if (val!=PVRSRV_OK) {/*printf(" FAIL - %s\n",astErrorStrings[val]);*/ exit(-1);} else {/*printf(" OK\n");*/}
/*
* Error strings - must be up to date with services.h
*/
char* astErrorStrings[] = {
"PVRSRV_OK",
"PVRSRV_ERROR_GENERIC",
"PVRSRV_ERROR_OUT_OF_MEMORY",
"PVRSRV_ERROR_TOO_MANY_BUFFERS",
"PVRSRV_ERROR_SYMBOL_NOT_FOUND",
"PVRSRV_ERROR_OUT_OF_HSPACE",
"PVRSRV_ERROR_INVALID_PARAMS",
"PVRSRV_ERROR_TILE_MAP_FAILED",
"PVRSRV_ERROR_INIT_FAILURE",
"PVRSRV_ERROR_CANT_REGISTER_CALLBACK",
"PVRSRV_ERROR_INVALID_DEVICE",
"PVRSRV_ERROR_NOT_OWNER",
"PVRSRV_ERROR_BAD_MAPPING",
"PVRSRV_ERROR_TIMEOUT",
"PVRSRV_ERROR_NO_PRIMARY",
"PVRSRV_ERROR_FLIP_CHAIN_EXISTS"
};
/* Size opf the array to fill with device IDs */
#define MAX_NUM_DEVICE_IDS 32
/*!
******************************************************************************
@Function print_dev_info
@Description
Print info about the passed PVRSRV_DEV_INFO structure to stdout
@Input *pDevInfo :
@Return void :
@todo: print info about MBX semaphores
@todo: print info about non MBX devices
******************************************************************************/
void print_dev_info(PVRSRV_DEV_INFO *pDevInfo)
{
/////printf(" eDeviceType = ");
switch (pDevInfo->sDevId.eDeviceType)
{
case PVRSRV_DEVICE_TYPE_UNKNOWN:
/////printf("PVRSRV_DEVICE_ID_UNKNOWN\n");
break;
case PVRSRV_DEVICE_TYPE_MBX1:
/////printf("PVRSRV_DEVICE_ID_MBX1\n");
break;
case PVRSVR_DEVICE_TYPE_MBX1_LITE:
/////printf("PVRSVR_DEVICE_ID_MBX1_LITE\n");
break;
case PVRSRV_DEVICE_TYPE_M24VA:
/////printf("PVRSRV_DEVICE_ID_M24VA\n");
break;
case PVRSRV_DEVICE_TYPE_JDISPLAY:
/////printf("PVRSRV_DEVICE_ID_JDISPLAY\n");
break;
case PVRSRV_DEVICE_TYPE_CRTC:
/////printf("PVRSRV_DEVICE_ID_CRTC\n");
break;
case PVRSRV_DEVICE_TYPE_DMAC:
/////printf("PVRSRV_DEVICE_ID_DMAC\n");
break;
default:
/////printf("Not recognised 0x%x\n",pDevInfo->sDevId.eDeviceType);
break;
}
/////printf(" byVersionMajor = %d\n", (int)pDevInfo->sDevId.ui8VersionMajor);
/////printf(" byVersionMinor = %d\n", (int)pDevInfo->sDevId.ui8VersionMinor);
/////printf(" <Skip dev location etc>\n");
switch (pDevInfo->sDevId.eDeviceType)
{
case PVRSRV_DEVICE_TYPE_MBX1:
case PVRSVR_DEVICE_TYPE_MBX1_LITE:
#if 0
/////printf(" MBX.hRenderSync = 0x%x\n", pDevInfo->sDeviceSpecific.sMBX.hRenderSync);
/////printf(" MBX.hBlitSync = 0x%x\n", pDevInfo->sDeviceSpecific.sMBX.hBlitSync);
/////printf(" MBX.uLastProcessId = 0x%x\n", pDevInfo->sDeviceSpecific.sMBX.uLastProcessId);
/////printf(" MBX.bWasPrevTAFirstInScene = %d\n", pDevInfo->sDeviceSpecific.sMBX.bWasPrevTAFirstInScene);
/////printf(" MBX.ui32SizeOfFifo = %d\n", pDevInfo->sDeviceSpecific.sMBX.ui32SizeOfFifo);
/////printf(" MBX.ui32BytesReserved3d = %d\n", pDevInfo->sDeviceSpecific.sMBX.ui32BytesReserved3d);
/////printf(" MBX.ui32BytesReserved2d = %d\n", pDevInfo->sDeviceSpecific.sMBX.ui32BytesReserved2d);
/////printf(" MBX.psParamBuffer = 0x%x\n", pDevInfo->sDeviceSpecific.sMBX.psParamBuffer);
PVRSRV_SEMAPHORE Sem2dSlaveport; /*!< Semaphore for 2d slaveport */
PVRSRV_SEMAPHORE Sem3dSlaveprt; /*!< Semaphore for 3d slaveport */
#endif
break;
case PVRSRV_DEVICE_TYPE_JDISPLAY:
// VSYNC_FLIP_CMD_INFO_HANDLE hVSyncFlipCmdInfo; /*!< Internal queue of commands that have been checked for */
/*!< dependencies and are now waiting for a vsync */
// PVRSRV_PRIM_SURF sPrimarySurface;
break;
default:
/////printf (" Print out of device specific dev info not supported\n");
break;
}
}
int services_test(void)
{
PVRSRV_ERROR eResult;
IMG_HANDLE hServices;
IMG_UINT32 uiNumDevices;
PVRSRV_DEVICE_IDENTIFIER asDevID[MAX_NUM_DEVICE_IDS];
PVRSRV_DEV_DATA asDevData[MAX_NUM_DEVICE_IDS];
IMG_UINT32 uiDeviceIndex;
PVRSRV_QUEUE_INFO *psQueueInfo;
IMG_UINT32 ui32QueueSize = 4096;
IMG_UINT32 ui32Count;
IMG_UINT32 x;
IMG_UINT32 y;
///IMG_UINT32 i;
PVRSRV_MEM_INFO *psMemInfo;
IMG_PVOID pvSP2DData;
IMG_PVOID pvSPData;
IMG_PVOID pvSPControl;
PVRSRV_TARENDERINFO *psTARenderInfo;
PVRSRV_PRIMARY_SURF *psPrimarySurf;
IMG_UINT32 auBltPacket[7];
IMG_BOOL bHasContextSwitched;
PVRSRV_HWREG s3DRegs[17], *ps3DRegs;
PVRSRV_BGOBJ_INFO sBGObj;
/////printf("Try calling PVRSRVConnect with invalid arguments :-");
//eResult = PVRSRVConnect("", &hServices);
// FAIL_IF_NO_ERROR(eResult);
/////printf("Call PVRSRVConnect with valid arguments:-");
//eResult = PVRSRVConnect("/dev/pvrsrv", &hServices);
//FAIL_IF_ERROR(eResult);
hServices = NULL;
/////printf("Try calling PVRSRVEnumerateDevices with invalid puiNumDevices :-");
eResult = PVRSRVEnumerateDevices(hServices,
NULL,
NULL);
FAIL_IF_NO_ERROR(eResult);
/////printf("Get number of devices from PVRSRVEnumerateDevices :-");
eResult = PVRSRVEnumerateDevices(hServices,
&uiNumDevices,
asDevID);
FAIL_IF_ERROR(eResult);
/////printf(".... Reported %ul devices\n", (unsigned int) uiNumDevices);
/* List the devices */
/////printf(".... Device Number | id\n");
for (uiDeviceIndex = 0; uiDeviceIndex < uiNumDevices; uiDeviceIndex++)
{
/////printf(" %04d | 0x%04x\n", (int)uiDeviceIndex, (unsigned int)asDevID[uiDeviceIndex].ui32DeviceIndex );
}
/* Get each device..... */
for (uiDeviceIndex = 0; uiDeviceIndex < uiNumDevices; uiDeviceIndex++)
{
PVRSRV_DEV_INFO *psDevInfo;
PVRSRV_DEV_DATA *psDevData = asDevData + uiDeviceIndex;
/////printf("Attempt to acquire device %d :-",(unsigned int) uiDeviceIndex);
eResult = PVRSRVAcquireDeviceData(hServices,
uiDeviceIndex,
psDevData,
PVRSRV_DEVICE_TYPE_UNKNOWN);
FAIL_IF_ERROR(eResult);
/* Print the contents of the dev info */
psDevInfo = psDevData->psDevInfoUM;
print_dev_info(psDevInfo);
}
/////printf("Attempt to get primary");
eResult = PVRSRVGetPrimary(&asDevData[1], &psPrimarySurf);
FAIL_IF_NO_ERROR(eResult);
/////printf("Attempt to create primary");
eResult = PVRSRVCreatePrimary( &asDevData[1],
PVRSRV_MEMFLG_RENDERABLE,
320,
240,
PVRSRV_PIXEL_FORMAT_RGB565,
&psPrimarySurf);
FAIL_IF_ERROR(eResult);
/////printf("Attempt to look inside primary\n");
/////printf("psPrimarySurf->ui32PixelWidth = %ld\n",psPrimarySurf->ui32PixelWidth);
/////printf("psPrimarySurf->ui32PixelHeight = %ld\n",psPrimarySurf->ui32PixelHeight);
/////printf("psPrimarySurf->ePixelFormat = %x\n",psPrimarySurf->ePixelFormat);
/////printf("psPrimarySurf->psMemInfo->ui32AllocSize = %x\n",(int)psPrimarySurf->psMemInfo->ui32AllocSize);
/////printf("psPrimarySurf->psMemInfo->uiDevAddr = %x\n",(int)psPrimarySurf->psMemInfo->uiDevAddr);
/////printf("Attempt to create command queue size %d",(unsigned int) ui32QueueSize);
eResult = PVRSRVCreateCommandQueue( &asDevData[0], ui32QueueSize, &psQueueInfo);
FAIL_IF_ERROR(eResult);
/////printf("Attempt to look inside command queue\n");
/////printf("psQueueInfo->ui32ReadOffset = %ld\n",psQueueInfo->ui32ReadOffset);
/////printf("psQueueInfo->ui32WriteOffset = %ld\n",psQueueInfo->ui32WriteOffset);
/////printf("psQueueInfo->pvUserLinQueue = %p\n",psQueueInfo->pvLinQueueUM);
/////printf("psQueueInfo->pvUserLinQueue[50] = %ld\n",((IMG_UINT32 *)psQueueInfo->pvLinQueueUM)[50]);
pvSP2DData = asDevData[0].psUserDevInfo->sDeviceSpecific.sMBX.pvSP2DData;
/////printf("direct access blits:clear screen\n");
eResult = PVRSRVAcquireSlavePort (asDevData[0].psDevInfoUM, PVRSRV_SLAVEPORT_2D, IMG_TRUE);
FAIL_IF_ERROR(eResult);
eResult = PVRSRVAcquireFifoSpace (&asDevData[0], IMG_TRUE, PVRSRV_SLAVEPORT_2D, 7*4, NULL);
FAIL_IF_ERROR(eResult);
PVRSRVWriteSlavePort(pvSP2DData, MBX2D_DST_CTRL_BH
| MBX2D_DST_565RGB
| 320*2);
PVRSRVWriteSlavePort(pvSP2DData, ((psPrimarySurf->psMemInfo->uiDevAddr
>> MBX2D_DST_ADDR_ALIGNSHIFT)
<< MBX2D_DST_ADDR_SHIFT)
& MBX2D_DST_ADDR_MASK);
PVRSRVWriteSlavePort(pvSP2DData, MBX2D_BLIT_BH
| MBX2D_USE_FILL
| MBX2D_ROP3_PATCOPY);
PVRSRVWriteSlavePort(pvSP2DData, 0xDEADDEAD);/* change colour as we go*/
PVRSRVWriteSlavePort(pvSP2DData, (0 << MBX2D_DST_XSTART_SHIFT)
| (0 << MBX2D_DST_YSTART_SHIFT));
PVRSRVWriteSlavePort(pvSP2DData, (320 << MBX2D_DST_XEND_SHIFT)
| (240 << MBX2D_DST_YEND_SHIFT));
PVRSRVWriteSlavePort(pvSP2DData, MBX2D_FENCE_BH);
eResult = PVRSRVReleaseSlavePort (asDevData[0].psDevInfoUM, PVRSRV_SLAVEPORT_2D);
FAIL_IF_ERROR(eResult);
HostSleepus(1000000);
/////printf("direct access blits:overlapped, multi-coloured rectangles\n");
for (x=0; x<220; x+=2)
{
for (y=0; y<140; y+=2)
{
eResult = PVRSRVAcquireSlavePort (asDevData[0].psDevInfoUM, PVRSRV_SLAVEPORT_2D, IMG_TRUE);
FAIL_IF_ERROR(eResult);
eResult = PVRSRVAcquireFifoSpace (&asDevData[0], IMG_TRUE, PVRSRV_SLAVEPORT_2D, 7*4, NULL);
FAIL_IF_ERROR(eResult);
PVRSRVWriteSlavePort(pvSP2DData, MBX2D_DST_CTRL_BH
| MBX2D_DST_565RGB
| 320*2);
PVRSRVWriteSlavePort(pvSP2DData, ((psPrimarySurf->psMemInfo->uiDevAddr
>> MBX2D_DST_ADDR_ALIGNSHIFT)
<< MBX2D_DST_ADDR_SHIFT)
& MBX2D_DST_ADDR_MASK);
PVRSRVWriteSlavePort(pvSP2DData, MBX2D_BLIT_BH
| MBX2D_USE_FILL
| MBX2D_ROP3_PATCOPY);
PVRSRVWriteSlavePort(pvSP2DData, (x|y)|((x<<5)|(y<<5)));/* change colour as we go*/
PVRSRVWriteSlavePort(pvSP2DData, (x << MBX2D_DST_XSTART_SHIFT)
| (y << MBX2D_DST_YSTART_SHIFT));
PVRSRVWriteSlavePort(pvSP2DData, ((x+100) << MBX2D_DST_XEND_SHIFT)
| ((y+100) << MBX2D_DST_YEND_SHIFT));
PVRSRVWriteSlavePort(pvSP2DData, MBX2D_FENCE_BH);
eResult = PVRSRVReleaseSlavePort (asDevData[0].psDevInfoUM, PVRSRV_SLAVEPORT_2D);
FAIL_IF_ERROR(eResult);
}
}
HostSleepus(1000000);
/////printf("direct access block write blits:overlapped, multi-coloured rectangles\n");
for (x=0; x<220; x+=2)
{
for (y=0; y<140; y+=2)
{
auBltPacket[0] = MBX2D_DST_CTRL_BH
| MBX2D_DST_565RGB
| 320*2;
auBltPacket[1] = ((psPrimarySurf->psMemInfo->uiDevAddr
>> MBX2D_DST_ADDR_ALIGNSHIFT)
<< MBX2D_DST_ADDR_SHIFT)
& MBX2D_DST_ADDR_MASK;
auBltPacket[2] = MBX2D_BLIT_BH
| MBX2D_USE_FILL
| MBX2D_ROP3_PATCOPY;
auBltPacket[3] = (x|y)|((x<<7)|(y<<7));/* change colour as we go*/
auBltPacket[4] = (x << MBX2D_DST_XSTART_SHIFT)
| (y << MBX2D_DST_YSTART_SHIFT);
auBltPacket[5] = ((x+100) << MBX2D_DST_XEND_SHIFT)
| ((y+100) << MBX2D_DST_YEND_SHIFT);
auBltPacket[6] = MBX2D_FENCE_BH;
eResult = PVRSRVAcquireSlavePort (asDevData[0].psDevInfoUM, PVRSRV_SLAVEPORT_2D, IMG_TRUE);
FAIL_IF_ERROR(eResult);
eResult = PVRSRVAcquireFifoSpace (&asDevData[0], IMG_TRUE, PVRSRV_SLAVEPORT_2D, 7*4, NULL);
FAIL_IF_ERROR(eResult);
eResult = PVRSRVWriteSlavePortBatch ( PVRSRV_SLAVEPORT_2D,
pvSP2DData,
auBltPacket,
7<<2);
FAIL_IF_ERROR(eResult);
eResult = PVRSRVReleaseSlavePort (asDevData[0].psDevInfoUM, PVRSRV_SLAVEPORT_2D);
FAIL_IF_ERROR(eResult);
}
}
HostSleepus(1000000);
/////printf("scheduled blits :overlapped, multi-coloured rectangles\n");
for (x=0; x<220; x+=2)
{
for (y=0; y<140; y+=2)
{
auBltPacket[0] = MBX2D_DST_CTRL_BH
| MBX2D_DST_565RGB
| 320*2;
auBltPacket[1] = ((psPrimarySurf->psMemInfo->uiDevAddr
>> MBX2D_DST_ADDR_ALIGNSHIFT)
<< MBX2D_DST_ADDR_SHIFT)
& MBX2D_DST_ADDR_MASK;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -