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

📄 services_test.cpp

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*! 
******************************************************************************
 @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 + -