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

📄 vgpcodegenpt.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
字号:
/**************************************************************************
 * Name         : vgpcodegen.c
 * Author       : BCB
 * Created      : 20/06/2003
 *
 * Copyright    : 2003 by Imagination Technologies Limited. 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.
 *
 * Platform     : ANSI
 *
 * $Date: 2004/11/04 16:01:34 $ $Revision: 1.2 $
 * $Log: vgpcodegenpt.c $
 **************************************************************************/

#include "ogles_types.h"
#include "vgp.h"
#include <stdio.h>
#include <string.h>

#include "mbx13ddef.h"

/******************************************************************************************/

/* Storage for VGP Programs and section definitions */
static IMG_UINT32 gaui32VGPProgram[MBX1_VGPCODE_INST_COUNT*2];
static IMG_UINT32 gui32VGPProgramSize;
static IMG_UINT32 gaui32VGPSectionDefinitions[VGP_FF_TNL_NUM_SECTIONS];
static IMG_UINT32 gui32ConstantRemap;
static IMG_VOID SetupVGPCode(void);

#define GLES_MAX_TEXTURE_UNITS	2

/***********************************************************************************
 Function Name      : GLES_VGP
 Inputs             : uOp, uDst, uDstMask, uSrc1, ui32Src2, ui32Src3
 Outputs            : ppuInstructionMemory
 Returns            : -
 Description        : UTILITY: Sets up VGP instruction word from operation, src and
					  dest parameters.
************************************************************************************/

IMG_VOID GLES_VGP(IMG_UINT32 **ppui32InstructionMemory, 
			 IMG_UINT32 ui32Op, IMG_UINT32 ui32Dst, IMG_UINT32 ui32DstMask,
			 IMG_UINT32 ui32Src1, IMG_UINT32 ui32Src2, IMG_UINT32 ui32Src3)
{
	IMG_UINT32 *pui32InstrMem;

	IMG_UINT32	ui32Sign1, ui32Sign2, ui32Sign3;

	IMG_UINT32	ui32ConstantReg = 0, ui32NumConstants = 0;
	IMG_UINT32	ui32Cext = 0;
	IMG_UINT32  ui32CAddRel = 0;

	/* Set up constant register Cext field */	
	if(((ui32Src1 & VGP_SRC_SELECT_MASK) >> VGP_SRC_SELECT_SHIFT) == VGP_SRC_CONSTANT)
	{
		ui32ConstantReg = (ui32Src1 & VGP_SRC_CONSTREG_MASK) - gui32ConstantRemap;
		ui32NumConstants++;
	}
	if(((ui32Src2 & VGP_SRC_SELECT_MASK) >> VGP_SRC_SELECT_SHIFT) == VGP_SRC_CONSTANT)
	{
		ui32ConstantReg = (ui32Src2 & VGP_SRC_CONSTREG_MASK) - gui32ConstantRemap;
		ui32NumConstants++;
	}
	if(((ui32Src3 & VGP_SRC_SELECT_MASK) >> VGP_SRC_SELECT_SHIFT) == VGP_SRC_CONSTANT)
	{
		ui32ConstantReg = (ui32Src3 & VGP_SRC_CONSTREG_MASK) - gui32ConstantRemap;
		ui32NumConstants++;
	}

	if(ui32NumConstants > 1)
	{
/*		DPF((DBG_ERROR, "More than one VGP Constant used in instruction!\n"));*/
	}

	ui32Cext = (ui32ConstantReg & VGP_SRC_CEXT_MASK) >> VGP_SRC_CEXT_SHIFT; 
	ui32CAddRel = (ui32ConstantReg & VGP_SRC_CADDR_REL) ? MBX1_VGPHI_CADDREL : 0;

	/* Negated sources? Then set the sign bits and clear the VGP_NEG bit */
	ui32Sign1 = (ui32Src1 & VGP_NEG) ? MBX1_VGPLO_NEG1 : 0;
	ui32Src1 &= ~VGP_NEG;

	ui32Sign2 = (ui32Src2 & VGP_NEG) ? MBX1_VGPLO_NEG2 : 0;
	ui32Src2 &= ~VGP_NEG;

	ui32Sign3 = (ui32Src3 & VGP_NEG) ? MBX1_VGPLO_NEG3 : 0;
	ui32Src3 &= ~VGP_NEG;
	
	pui32InstrMem = *ppui32InstructionMemory;

	pui32InstrMem[0] = 0;
	pui32InstrMem[1] = 0;

	pui32InstrMem[0] =	ui32Op					|
						ui32Sign1				|
						ui32Sign2				|
						ui32Sign3				|
						MBX1_VGPLO_SW1_NOSWIZ	|
						MBX1_VGPLO_SW2_NOSWIZ	|
						MBX1_VGPLO_SW3_NOSWIZ;

	pui32InstrMem[1] =	(((ui32Src1 & VGP_SRC_SELECT_MASK) >> VGP_SRC_SELECT_SHIFT) << MBX1_VGPHI_S1SEL_SHIFT)	|
						( (ui32Src1 & VGP_SRC_ADDR_MASK) << MBX1_VGPHI_SRC1_SHIFT)								|
						(((ui32Src2 & VGP_SRC_SELECT_MASK) >> VGP_SRC_SELECT_SHIFT) << MBX1_VGPHI_S2SEL_SHIFT)	|
						( (ui32Src2 & VGP_SRC_ADDR_MASK) << MBX1_VGPHI_SRC2_SHIFT)								|
						(((ui32Src3 & VGP_SRC_SELECT_MASK) >> VGP_SRC_SELECT_SHIFT) << MBX1_VGPHI_S3SEL_SHIFT)	|
						( (ui32Src3 & VGP_SRC_ADDR_MASK) << MBX1_VGPHI_SRC3_SHIFT)								|
						ui32Dst																					|
						ui32DstMask																				|
						ui32Cext << MBX1_VGPHI_CEXT_SHIFT														|
						ui32CAddRel;

	/* Advance the instruction memory pointer by 2 DWORDs */
	*ppui32InstructionMemory += 2;
}

/***********************************************************************************
 Function Name      : GLES_VGP_SWIZ
 Inputs             : uOp, uDst, uDstMask, uSrc1, uSwiz1, ui32Src2, uSwiz2, ui32Src3, uSwiz3
 Outputs            : ppuInstructionMemory
 Returns            : -
 Description        : UTILITY: Sets up VGP instruction word from operation, src and
					  dest parameters. Includes swizzles for src operands.
************************************************************************************/

IMG_VOID GLES_VGP_SWIZ(IMG_UINT32 **ppui32InstructionMemory, 
				  IMG_UINT32 ui32Op, IMG_UINT32 ui32Dst, IMG_UINT32 ui32DstMask,
				  IMG_UINT32 ui32Src1, IMG_UINT32 ui32Swiz1, 
				  IMG_UINT32 ui32Src2, IMG_UINT32 ui32Swiz2, 
				  IMG_UINT32 ui32Src3, IMG_UINT32 ui32Swiz3)
{
	IMG_UINT32 *pui32InstrMem;

	IMG_UINT32	ui32Sign1, ui32Sign2, ui32Sign3;

	IMG_UINT32	ui32ConstantReg = 0, ui32NumConstants = 0;
	IMG_UINT32	ui32Cext = 0;
	IMG_UINT32	ui32CAddRel = 0;
	
	/* Set up constant register Cext field */	
	if(((ui32Src1 & VGP_SRC_SELECT_MASK) >> VGP_SRC_SELECT_SHIFT) == VGP_SRC_CONSTANT)
	{
		ui32ConstantReg = (ui32Src1 & VGP_SRC_CONSTREG_MASK) - gui32ConstantRemap;
		ui32NumConstants++;
	}
	if(((ui32Src2 & VGP_SRC_SELECT_MASK) >> VGP_SRC_SELECT_SHIFT) == VGP_SRC_CONSTANT)
	{
		ui32ConstantReg = (ui32Src2 & VGP_SRC_CONSTREG_MASK) - gui32ConstantRemap;
		ui32NumConstants++;
	}
	if(((ui32Src3 & VGP_SRC_SELECT_MASK) >> VGP_SRC_SELECT_SHIFT) == VGP_SRC_CONSTANT)
	{
		ui32ConstantReg = (ui32Src3 & VGP_SRC_CONSTREG_MASK) - gui32ConstantRemap;
		ui32NumConstants++;
	}

	if(ui32NumConstants > 1)
	{
/*		DPF((DBG_ERROR, "More than one VGP Constant used in instruction!\n"));*/
	}

	ui32Cext = (ui32ConstantReg & VGP_SRC_CEXT_MASK) >> VGP_SRC_CEXT_SHIFT; 
	ui32CAddRel = (ui32ConstantReg & VGP_SRC_CADDR_REL) ? MBX1_VGPHI_CADDREL : 0;
	
	/* Negated sources? Then set the sign bits and clear the VGP_NEG bit */
	ui32Sign1 = (ui32Src1 & VGP_NEG) ? MBX1_VGPLO_NEG1 : 0;
	ui32Src1 &= ~VGP_NEG;

	ui32Sign2 = (ui32Src2 & VGP_NEG) ? MBX1_VGPLO_NEG2 : 0;
	ui32Src2 &= ~VGP_NEG;

	ui32Sign3 = (ui32Src3 & VGP_NEG) ? MBX1_VGPLO_NEG3 : 0;
	ui32Src3 &= ~VGP_NEG;


	pui32InstrMem = *ppui32InstructionMemory;

	pui32InstrMem[0] = 0;
	pui32InstrMem[1] = 0;

	pui32InstrMem[0] =	ui32Op								|
					ui32Sign1								|
					ui32Sign2								|
					ui32Sign3								|
					(ui32Swiz1 << MBX1_VGPLO_SW1_SHIFT)		|
					(ui32Swiz2 << MBX1_VGPLO_SW2_SHIFT)		|
					(ui32Swiz3 << MBX1_VGPLO_SW3_SHIFT);

	pui32InstrMem[1] =	(((ui32Src1 & VGP_SRC_SELECT_MASK) >> VGP_SRC_SELECT_SHIFT) << MBX1_VGPHI_S1SEL_SHIFT)	|
						( (ui32Src1 & VGP_SRC_ADDR_MASK) << MBX1_VGPHI_SRC1_SHIFT)								|
						(((ui32Src2 & VGP_SRC_SELECT_MASK) >> VGP_SRC_SELECT_SHIFT) << MBX1_VGPHI_S2SEL_SHIFT)	|
						( (ui32Src2 & VGP_SRC_ADDR_MASK) << MBX1_VGPHI_SRC2_SHIFT)								|
						(((ui32Src3 & VGP_SRC_SELECT_MASK) >> VGP_SRC_SELECT_SHIFT) << MBX1_VGPHI_S3SEL_SHIFT)	|
						( (ui32Src3 & VGP_SRC_ADDR_MASK) << MBX1_VGPHI_SRC3_SHIFT)								|
						ui32Dst 																				|
						ui32DstMask																				|
						ui32Cext << MBX1_VGPHI_CEXT_SHIFT														|
						ui32CAddRel;

	/* Advance the instruction memory pointer by 2 DWORDs */
	*ppui32InstructionMemory += 2;
}


/******************************************************************************************/

#define VGP_SECTION_START()		ui32SectionStartAddress = (pui32VGPCode - pui32VGPCodeBase) >> 1;
#define VGP_SECTION_END()		ui32SectionEndAddress	 = ((pui32VGPCode - pui32VGPCodeBase) >> 1) - 1;

/*
	VGP code to perform pass through

  	Sections
	--------
	0		->		Pass through position+base colour
	1		->		Offset colour
	2		->		Pass through texture layers 0
	3		->		Pass through texture layers 1
*/

/***********************************************************************************
 Function Name      : SetupVGPCode
 Inputs             : gc
 Outputs            : -
 Returns            : -
 Description        : Sets up VGP code for fixed function transform & lighting
************************************************************************************/

static IMG_VOID SetupVGPCode()
{
	IMG_UINT32 ui32SectionNum = 0;
	IMG_UINT32 *pui32VGPCode = gaui32VGPProgram;
	IMG_UINT32 *pui32VGPCodeBase;
	IMG_UINT32 *pui32VGPSectionDefinitions = gaui32VGPSectionDefinitions;

	IMG_UINT32	ui32SectionStartAddress, ui32SectionEndAddress;

	pui32VGPCodeBase = pui32VGPCode;

	/* Section 0: XYZW + colour */
	VGP_SECTION_START()
		GLES_VGP1(&pui32VGPCode, VGP_MOV, VGP_OUT_POS, VGP_DMASK_ALL, VGP_SRC_V(VGP_VERTEX_POS));
		GLES_VGP_SWIZ1(&pui32VGPCode, VGP_MOV, VGP_OUT_BASE, VGP_DMASK_ALL, VGP_SRC_V(VGP_VERTEX_BASECOL), VGP_SWIZ_COLOR);
	VGP_SECTION_END()

	pui32VGPSectionDefinitions[ui32SectionNum++] =	VGP_SECTIONDEF_STARTADDR(ui32SectionStartAddress)	|
													VGP_SECTIONDEF_ENDADDR(ui32SectionEndAddress)		|
													VGP_SECTIONDEF_EXECOUNT(1)							|
													VGP_SECTIONDEF_CONST_OFFSET(128)					|
													VGP_SECTIONDEF_CONST_END(0);
	/* Section 1: Offset */
	VGP_SECTION_START()
		GLES_VGP1(&pui32VGPCode, VGP_MOV, VGP_OUT_OFFSET, VGP_DMASK_ALL, VGP_SRC_V(VGP_VERTEX_OFFSETCOL));
	VGP_SECTION_END()

	pui32VGPSectionDefinitions[ui32SectionNum++] =	VGP_SECTIONDEF_STARTADDR(ui32SectionStartAddress)	|
													VGP_SECTIONDEF_ENDADDR(ui32SectionEndAddress)		|
													VGP_SECTIONDEF_EXECOUNT(1)							|
													VGP_SECTIONDEF_CONST_OFFSET(128)					|
													VGP_SECTIONDEF_CONST_END(0);
	/* Sections 2->3 textures */		
	VGP_SECTION_START()
		GLES_VGP1(&pui32VGPCode, VGP_MOV, VGP_OUT_TEX0, VGP_DMASK_ALL, VGP_SRC_V(VGP_VERTEX_TEX_START));
	VGP_SECTION_END()

	pui32VGPSectionDefinitions[ui32SectionNum++] =	VGP_SECTIONDEF_STARTADDR(ui32SectionStartAddress)	|
													VGP_SECTIONDEF_ENDADDR(ui32SectionEndAddress)		|
													VGP_SECTIONDEF_EXECOUNT(1)							|
													VGP_SECTIONDEF_CONST_OFFSET(128)					|
													VGP_SECTIONDEF_CONST_END(0);
	VGP_SECTION_START()
		GLES_VGP1(&pui32VGPCode, VGP_MOV, VGP_OUT_TEX1, VGP_DMASK_ALL, VGP_SRC_V(VGP_VERTEX_TEX_START+1));
	VGP_SECTION_END()

	pui32VGPSectionDefinitions[ui32SectionNum++] =	VGP_SECTIONDEF_STARTADDR(ui32SectionStartAddress)	|
													VGP_SECTIONDEF_ENDADDR(ui32SectionEndAddress)		|
													VGP_SECTIONDEF_EXECOUNT(1)							|
													VGP_SECTIONDEF_CONST_OFFSET(128)					|
													VGP_SECTIONDEF_CONST_END(0);

	/* Return the size of the VGP program */
	gui32VGPProgramSize = (IMG_UINT32)(pui32VGPCode - pui32VGPCodeBase);
}

int main(void)
{
	IMG_UINT32 ui32Count=0,ui32Count2=0;
	FILE *stream;

	stream = fopen("vgpcodept.h", "wt");

	if(!stream)
		return 1;

	fprintf(stream,"/***************************************************************************************\n");
	fprintf(stream,"* Title			: VGP code for pass through TNL on MBX					           *\n");
	fprintf(stream,"*																				       *\n");
	fprintf(stream,"* Copyright		: 2003-2004 by Imaginations Technologies Limited. All rights reserved. *\n");
	fprintf(stream,"*                 No part of this software, either material or conceptual			   *\n");	
	fprintf(stream,"*                 may be copied or distributed, transmitted, transcribed,			   *\n");
	fprintf(stream,"*                 stored in a	retrieval system or	translated into	any				   *\n");
	fprintf(stream,"*                 human or computer language in any form by any means,				   *\n");
	fprintf(stream,"*                 electronic,	mechanical,	manual or other-wise, or				   *\n");
	fprintf(stream,"*                 disclosed to third parties without the express written			   *\n");
	fprintf(stream,"*                 permission of Imaginations Technologies Limited, HomePark			   *\n");
	fprintf(stream,"*                 Industrial Estate, King's Langley, Hertfordshire,					   *\n");
	fprintf(stream,"*                 WD4	8LZ, U.K.													   *\n");
	fprintf(stream,"*																					   *\n");
	fprintf(stream,"*																					   *\n");
	fprintf(stream,"* This is an autogenerated file (by vgpcodegenpt).DO NOT EDIT!						   *\n");
	fprintf(stream,"****************************************************************************************/\n\n\n");

	fprintf(stream,"/*\n");
	fprintf(stream,"Sections\n--------\n");
	fprintf(stream,"0		->		Pass through position+base colour\n");
	fprintf(stream,"1		->		Offset colour\n");
	fprintf(stream,"2		->		Pass through texture layers 0\n");
	fprintf(stream,"3		->		Pass through texture layers 1\n");
	fprintf(stream,"*/\n\n");

	fprintf(stream,"#ifndef _VGPCODEPT_H_\n");
	fprintf(stream,"#define _VGPCODEPT_H_\n\n\n");

	fprintf(stream,"#if defined(PASSTHROUGH_BUILD)\n\n");

	SetupVGPCode();

	fprintf(stream,"const static IMG_UINT32 gaui32VGPSectionDefinitions[] = {\n");

	for(ui32Count=0,ui32Count2 = 1; ui32Count < VGP_FF_TNL_NUM_SECTIONS; ui32Count++, ui32Count2++)
	{
		fprintf(stream, "0x%08lx,\t", gaui32VGPSectionDefinitions[ui32Count]);
		
		if(ui32Count2 > 9)
		{
			ui32Count2 = 0;
			fprintf(stream, "\n");
		}
	}
	
	fprintf(stream,"0};\n\n\n\n");

	fprintf(stream,"const static IMG_UINT32 gui32VGPCodeSize = %lu;\n\n", gui32VGPProgramSize);

	fprintf(stream,"const static IMG_UINT32 gaui32VGPCode[] = {\n");

	for(ui32Count = 0, ui32Count2 = 1; ui32Count < gui32VGPProgramSize; ui32Count++, ui32Count2++)
	{
		fprintf(stream, "0x%08lx,\t", gaui32VGPProgram[ui32Count]);

		if(ui32Count2 > 9)
		{
			ui32Count2 = 0;
			fprintf(stream, "\n");
		}
	}
	fprintf(stream,"0};\n\n\n\n");
	
	fprintf(stream,"#endif /* PASSTHROUGH_BUILD */\n\n");

	fprintf(stream,"#endif /* _VGPCODEPT_H_ */\n\n");

	fclose(stream);

	return 0;
}

/***************************************************************************
 End of file (vgpcodegen.c)
***************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -