📄 vgpcodegenpt.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 + -