📄 vgpcodegen.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/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 + -