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

📄 vgpcodegen.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/**************************************************************************
 * 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/10/12 09:56:38 $ $Revision: 1.10.1.6 $
 * $Log: vgpcodegen.c $
 **************************************************************************/

#if defined(SUPPORT_VGP) || defined(SUPPORT_VGP_LITE)

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



#define VGPCODE_DRIVER_REV "$Revision: 1.10.1.6 $"

#define VGPCODE_DRIVER_REV_LITE "$Revision: 1.10.1.6 $ VGPLite"


#if defined(GENERATE_VGPCODE)


#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();

#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;

/*
	Basic Transformation and Lighting VGP Code for an INFINITE viewer
	-----------------------------------------------------------------

	VGP code to perform basic transformation and lighting for an infinite viewer

  	Sections
	--------
	0		->		Transform position to clip-space, do front/back clip
	1		->		Transform position to eye-space
	2		->		User clip planes
	3		->		Lighting set-up, Colour Material setup & global lighting
	4		->		Normalise normal
	5		->		Infinite lights
	6		->		Point lights
	7		->		Spot lights
	8		->		Lighting output
	9		->		Pass through position
	10		->		Pass through texture layers 0
	11		->		Pass through texture layers 1
	12		->		Texture matrices transform 0
	13		->		Texture matrices transform 1
	14		->		Fog linear
	15		->		Fog exp/exp2

	Constants
	---------
	See vgp.h

	Register usage
	--------------
	r0		->		Transformed vertex
	r1		->		Transformed normal (normalised, if required)
	r2		->		Accumulating base colour
	r3		->		Clip-space vertex position/Accumulating specular colour
	r5-r8	->		Various uses
	r9		->		Eye Z
	r10 	->		Colour Material ambient
	r11 	->		Colour Material diffuse
	r12		->		Constant relative addressing amount
*/

/***********************************************************************************
 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: Transform position to clip-space, Do front/back clip */

	gui32ConstantRemap = VGP_CONSTANT_REMAP(VGP_MODELVIEWPROJECTION_START);

	VGP_SECTION_START()
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_DEST_R3, VGP_DMASK_X, VGP_SRC_V(VGP_VERTEX_POS), VGP_MODELVIEWPROJECTION0);
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_DEST_R3, VGP_DMASK_Y, VGP_SRC_V(VGP_VERTEX_POS), VGP_MODELVIEWPROJECTION1);
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_DEST_R3, VGP_DMASK_Z, VGP_SRC_V(VGP_VERTEX_POS), VGP_MODELVIEWPROJECTION2);
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_DEST_R3, VGP_DMASK_W, VGP_SRC_V(VGP_VERTEX_POS), VGP_MODELVIEWPROJECTION3);

		GLES_VGP1(&pui32VGPCode, VGP_MOV, VGP_OUT_POS, VGP_DMASK_ALL, VGP_SRC_R3);
	
		GLES_VGP_SWIZ1(&pui32VGPCode, VGP_MOV, VGP_OUT_BASE, VGP_DMASK_ALL, 
						VGP_SRC_V(VGP_VERTEX_BASECOL), VGP_SWIZ_COLOR);
		
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_OUT_CLIPFB, VGP_DMASK_X, VGP_SRC_R3, VGP_CLIPPLANE_FRONT);
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_OUT_CLIPFB, VGP_DMASK_Y, VGP_SRC_R3, VGP_CLIPPLANE_BACK);
	VGP_SECTION_END()

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

	/* Section 1: Transform position to eye space, copy eyeZ to r9 */
	gui32ConstantRemap = VGP_CONSTANT_REMAP(VGP_MODELVIEW_START);

	VGP_SECTION_START()
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_DEST_R0, VGP_DMASK_X, VGP_SRC_V(VGP_VERTEX_POS), VGP_MODELVIEW0);
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_DEST_R0, VGP_DMASK_Y, VGP_SRC_V(VGP_VERTEX_POS), VGP_MODELVIEW1);
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_DEST_R0, VGP_DMASK_Z, VGP_SRC_V(VGP_VERTEX_POS), VGP_MODELVIEW2);
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_DEST_R0, VGP_DMASK_W, VGP_SRC_V(VGP_VERTEX_POS), VGP_MODELVIEW3);

		/* Move the absolute value of eyeZ to r4 */
		GLES_VGP_SWIZ2(&pui32VGPCode, VGP_MAX, VGP_DEST_R9, VGP_DMASK_ALL, VGP_SRC_R0, 
						VGP_SWIZ_ALL_Z, VGP_NEGATE(VGP_SRC_R0), VGP_SWIZ_ALL_Z);
	
	VGP_SECTION_END()

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


	/* Section 2: User clip plane */
	gui32ConstantRemap = VGP_CONSTANT_REMAP(VGP_USERCLIPPLANES_START);

	VGP_SECTION_START()
	
	/* This will cause an empty section on VGP lite */
#if defined(SUPPORT_VGP)
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_OUT_USERCLIP03, VGP_DMASK_X, VGP_SRC_R0, VGP_USERCLIPPLANE_0);
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_OUT_USERCLIP03, VGP_DMASK_Y, VGP_SRC_R0, VGP_USERCLIPPLANE_1);
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_OUT_USERCLIP03, VGP_DMASK_Z, VGP_SRC_R0, VGP_USERCLIPPLANE_2);

⌨️ 快捷键说明

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