📄 vgpsections.c
字号:
/* slt r11.x, 0, r11.x */
VGPINST(SLT, DEST(R11, MASKX), SRC_CN(CONST_ZERO), SRC_SWZRN(11, SWZ_XXXX), 0, 0),
/* mul r10.y, r11.x, r10.y */
VGPINST(MUL, DEST(R10, MASKY), SRC_SWZRN(11, SWZ_XXXX), SRC_SWZRN(10, SWZ_YYYY), 0, 0),
/* Normalise the light direction. */
/* mul r9, r9, r10.z */
VGPINST(MUL, DEST(R9, NOMASK), SRC_RN(9), SRC_SWZRN(10, SWZ_ZZZZ), 0, 0),
/* add r9, r9, rVGPTNL_RLOCALVIEWERPOS */
VGPINST(ADD, DEST(R9, NOMASK), SRC_RN(9), SRC_RN(VGPTNL_RLOCALVIEWERPOS), 0, 0),
/* dp3 r9.w, r9, r9 */
VGPINST(DP3, DEST(R9, MASKW), SRC_RN(9), SRC_RN(9), 0, 0),
/* rsq r9.w, r9.w */
VGPINST(RSQRT, DEST(R9, MASKW), SRC_SWZRN(9, SWZ_WWWW), 0, 0, 0),
/* mul r9, r9, r9.w */
VGPINST(MUL, DEST(R9, NOMASK), SRC_RN(9), SRC_SWZRN(9, SWZ_WWWW), 0, 0),
/* dp3 r11.x, r9, r1 */
VGPINST(DP3, DEST(R11, MASKX), SRC_RN(9), SRC_RN(VGPTNL_RNORMAL), 0, 0),
/* Set r11.y to zero if r11.x < specular threshold */
/* slt r11.y, c[CONST_SPECULAR_THRESHOLD], r11.x */
VGPINST(SLT, DEST(R11, MASKY), SRC_CN(CONST_SPECULAR_THRESHOLD), SRC_SWZRN(11, SWZ_XXXX), 0, 0),
/* mul r10.y, r10.y, r11.y */
VGPINST(MUL, DEST(R10, MASKY), SRC_SWZRN(10, SWZ_YYYY), SRC_SWZRN(11, SWZ_YYYY), 0, 0),
/* Calculate coff = pow(r11.x, material power) * att */
/* mov r11.y, r11.x */
VGPINST(MOV, DEST(R11, MASKY), SRC_SWZRN(11, SWZ_XXXX), 0, 0, 0),
/* mov r11.w, c[15] */
VGPINST(MOV, DEST(R11, MASKW), SRC_CN(CONST_MATERIAL_POWER), 0, 0, 0),
/* lit r11.z, r11 */
VGPINST(LIT, DEST(R11, MASKZ), SRC_RN(11), 0, 0, 0),
/* mul r11.z, r10.w, r11.z */
VGPINST(MUL, DEST(R11, MASKZ), SRC_SWZRN(10, SWZ_WWWW), SRC_SWZRN(11, SWZ_ZZZZ), 0, 0),
/* Add on to the through specular. */
/* mul r11, r11.z, c[a.x + CONST_PSLIGHT_SPECULAR] */
VGPINST(MUL, DEST(R11, NOMASK), SRC_SWZRN(11, SWZ_ZZZZ), SRC_CN(CONST_PSLIGHT_SPECULAR), 0, 1),
/* mul r11, r11, rVGPTNL_RSPECULARSRC */
VGPINST(MUL, DEST(R11, NOMASK), SRC_RN(11), SRC_RN(VGPTNL_RSPECULARSRC), 0, 0),
/* mad rVGPTNL_RTSPECULAR.xyz, r11, r10.y, rVGPTNL_RTSPECULAR */
VGPINST(MAD, DEST(VGPTNL_OUT_RTSPECULAR, MASK_XYZ), SRC_RN(11), SRC_SWZRN(10, SWZ_YYYY), SRC_RN(VGPTNL_RTSPECULAR), 0),
};
#define SECTION_POINTLIGHT_MAXIMUM_SIZE \
(sizeof(psPointLightSection) / sizeof(*psPointLightSection))
#define SECTION_POINTLIGHT_BASE_SIZE (22)
#define SECTION_POINTLIGHT_SPECULAR_SIZE \
(SECTION_POINTLIGHT_MAXIMUM_SIZE)
#else /* if defined (SUPPORT_VGPLITE)*/
/*
* Code to implement lighting for both Directional and Point Lights.
*/
HWVGPINST psGenericLightingSection[] =
{
/* Move the address pointer onto the next light. */
/* amv a0.x, r7 */
VGPINST(AMV, DEST_A0X, SRC_RN(VGPTNL_RADDRESS), 0, 0, 0),
/* add r7, r7, c[16] */
VGPINST(ADD, DEST(VGPTNL_OUT_RADDRESS, NOMASK), SRC_RN(VGPTNL_RADDRESS), SRC_CN(CONST_LIGHT_SIZE), 0, 0),
/* Calculate a vector from the position to the light. */
/* add r9, c[a.x + 0], -r0 */
VGPINST(ADD, DEST(R9, NOMASK), SRC_CN(CONST_PSLIGHT_POS), SRC_NEGRN(VGPTNL_RVIEWSPACEPOS), 0, 1),
/* Calculate the magnitude of the vector. */
/* dp3 r10.x, r9, r9 */
VGPINST(DP3, DEST(R10, MASKX), SRC_RN(9), SRC_RN(9), 0, 0),
/* Set r10.y to zero if we are going to ignore the result. */
/* slt r10.y, r10.x, c[a.x + 1].xxxx */
VGPINST(SLT, DEST(R10, MASKY), SRC_SWZRN(10, SWZ_XXXX), SRC_SWZCN(CONST_PSLIGHT_PARAMS, SWZ_XXXX), 0, 1),
/* Set r10.z to the square root of the magnitude. */
/* rsq r10.z, r10.x */
VGPINST(RSQRT, DEST(R10, MASKZ), SRC_SWZRN(10, SWZ_XXXX), 0, 0, 0),
/* rcp r10.z, r10.z */
VGPINST(RCP, DEST(R10, MASKZ), SRC_SWZRN(10, SWZ_ZZZZ), 0, 0, 0),
/* Set r10.w to attenuation. */
/* mul r10.w, r10.x, c[a.x + 1].wwww */
VGPINST(MUL, DEST(R10, MASKW), SRC_SWZRN(10, SWZ_XXXX), SRC_SWZCN(CONST_PSLIGHT_PARAMS, SWZ_WWWW), 0, 1),
/* mad r10.w, c[a.x + 1].zzzz, r10.z, r10.w */
VGPINST(MAD, DEST(R10, MASKW), SRC_SWZCN(CONST_PSLIGHT_PARAMS, SWZ_ZZZZ), SRC_SWZRN(10, SWZ_ZZZZ), SRC_SWZRN(10, SWZ_WWWW), 1),
/* add r10.w, r10.w, c[a.x + 1].yyyy */
VGPINST(ADD, DEST(R10, MASKW), SRC_SWZRN(10, SWZ_WWWW), SRC_SWZCN(CONST_PSLIGHT_PARAMS, SWZ_YYYY), 0, 1),
/* rcp r10.w, r10.w */
VGPINST(RCP, DEST(R10, MASKW), SRC_SWZRN(10, SWZ_WWWW), 0, 0, 0),
/* rcp r10.w, r10.w */
VGPINST(RCP, DEST(R10, MASKZ), SRC_SWZRN(10, SWZ_ZZZZ), 0, 0, 0),
/* Set R10.w to 1 if this is a directional light */
VGPINST(MAX, DEST(R10, MASKW), SRC_SWZRN(10, SWZ_WWWW), SRC_SWZCN(CONST_PSLIGHT_TYPESPECIFIC, SWZ_YYYY), 0, 1),
/* Set R10.z to 1 if this is a directional light */
VGPINST(MAX, DEST(R10, MASKZ), SRC_SWZRN(10, SWZ_ZZZZ), SRC_SWZCN(CONST_PSLIGHT_TYPESPECIFIC, SWZ_YYYY), 0, 1),
/* Do the ambient calculation. */
/* mul r11, c[a.x + 2], r4 */
VGPINST(MUL, DEST(R11, NOMASK), SRC_CN(CONST_PSLIGHT_AMBIENT), SRC_RN(VGPTNL_RAMBIENTSRC), 0, 1),
/* mul r11, r11, r10.y */
VGPINST(MUL, DEST(R11, NOMASK), SRC_RN(11), SRC_SWZRN(10, SWZ_YYYY), 0, 0),
/* mad r2.xyz, r11, r10.w, r2 */
VGPINST(MAD, DEST(VGPTNL_OUT_RTDIFFUSE, MASK_XYZ), SRC_RN(11), SRC_SWZRN(10, SWZ_WWWW), SRC_RN(VGPTNL_RTDIFFUSE), 0),
/* Do the diffuse calculation. */
/* r11.x = dot(light_position - vertex_position, normal) for point lights
/* dp3 r11.x, r9, r1 */
VGPINST(DP3, DEST(R11, MASKX), SRC_RN(9), SRC_RN(VGPTNL_RNORMAL), 0, 1),
/* r11.y = dot(light_direction, normal) for directional lights
/* dp3 r11.x, r9, r1 */
VGPINST(DP3, DEST(R11, MASKY), SRC_CN(CONST_PSLIGHT_DIRECTION), SRC_RN(VGPTNL_RNORMAL), 0, 1),
/* Multiply by light specific parameters to select correct params */
VGPINST(MUL, DEST(R11, NOMASK), SRC_RN(11), SRC_CN(CONST_PSLIGHT_TYPESPECIFIC), 0, 1),
/* Now DP3 with 1,1,1 to obtain correct values */
VGPINST(DP3, DEST(R11, MASKX), SRC_CN(CONST_ONE), SRC_RN(11), 0, 0),
/* max r11,x, r11.x, 0 */
VGPINST(MAX, DEST(R11, MASKX), SRC_CN(CONST_ZERO), SRC_SWZRN(11, SWZ_XXXX), 0, 0),
/* mul r11.x, r11.x, r10.z */
VGPINST(MUL, DEST(R11, MASKX), SRC_SWZRN(11, SWZ_XXXX), SRC_SWZRN(10, SWZ_ZZZZ), 0, 0),
/* mul r11.x, r11.x, r10.w */
VGPINST(MUL, DEST(R11, MASKX), SRC_SWZRN(11, SWZ_XXXX), SRC_SWZRN(10, SWZ_WWWW), 0, 0),
/* mul r12, r11.x, c[a.x + 3] */
VGPINST(MUL, DEST(R12, NOMASK), SRC_SWZRN(11, SWZ_XXXX), SRC_CN(CONST_PSLIGHT_DIFFUSE), 0, 1),
/* mul r12, r12, r5 */
VGPINST(MUL, DEST(R12, NOMASK), SRC_RN(12), SRC_RN(VGPTNL_RDIFFUSESRC), 0, 0),//?
/* mad r2.xyz, r12, r10.y, r2 */
VGPINST(MAD, DEST(VGPTNL_OUT_RTDIFFUSE, MASK_XYZ), SRC_RN(12), SRC_SWZRN(10, SWZ_YYYY), SRC_RN(VGPTNL_RTDIFFUSE), 0),
/* The specular calculation. */
/* If dot <= 0 then we are going to ignore the specular calculation. */
/* slt r11.x, 0, r11.x */
VGPINST(SLT, DEST(R11, MASKX), SRC_CN(CONST_ZERO), SRC_SWZRN(11, SWZ_XXXX), 0, 0),
/* mul r10.y, r11.x, r10.y */
VGPINST(MUL, DEST(R10, MASKY), SRC_SWZRN(11, SWZ_XXXX), SRC_SWZRN(10, SWZ_YYYY), 0, 0),
/*
Make sure R9 contains light viewpos - vert viewpos for point or light dir for directional
Multiply contents of R9 by typespecific.x (1 for point 0 for directional)
*/
VGPINST(MUL, DEST(R9, NOMASK), SRC_RN(9), SRC_SWZCN(CONST_PSLIGHT_TYPESPECIFIC, SWZ_XXXX), 0, 1),
/* MAD can't reference 2 relatively addressed instructions, so copy to a temp */
VGPINST(MOV, DEST(R13, NOMASK), SRC_SWZCN(CONST_PSLIGHT_TYPESPECIFIC, SWZ_YYYY), 0, 0, 1),
/* Multiply light direction by typespecific.y (0 for point 1 for directional) and add to r9 */
VGPINST(MAD, DEST(R9, NOMASK), SRC_CN(CONST_PSLIGHT_DIRECTION), SRC_RN(13), SRC_RN(9), 1),
/* Normalise the light direction. */
/* mul r9, r9, r10.z */
VGPINST(MAD, DEST(R9, NOMASK), SRC_RN(9), SRC_SWZRN(10, SWZ_ZZZZ), SRC_RN(VGPTNL_RLOCALVIEWERPOS), 0),
/* add r9, r9, rVGPTNL_RLOCALVIEWERPOS */
// VGPINST(ADD, DEST(R9, NOMASK), SRC_RN(9), SRC_RN(VGPTNL_RLOCALVIEWERPOS), 0, 0),
/* dp3 r9.w, r9, r9 */
VGPINST(DP3, DEST(R9, MASKW), SRC_RN(9), SRC_RN(9), 0, 0),
/* rsq r9.w, r9.w */
VGPINST(RSQRT, DEST(R9, MASKW), SRC_SWZRN(9, SWZ_WWWW), 0, 0, 0),
/* mul r9, r9, r9.w */
VGPINST(MUL, DEST(R9, NOMASK), SRC_RN(9), SRC_SWZRN(9, SWZ_WWWW), 0, 0),
/* dp3 r11.x, r9, r1 */
VGPINST(DP3, DEST(R11, MASKX), SRC_RN(9), SRC_RN(VGPTNL_RNORMAL), 0, 0),
/* Set r11.y to zero if r11.x < specular threshold */
/* slt r11.y, c[CONST_SPECULAR_THRESHOLD], r11.x */
// VGPINST(SLT, DEST(R11, MASKY), SRC_CN(CONST_SPECULAR_THRESHOLD), SRC_SWZRN(11, SWZ_XXXX), 0, 0),
/* mul r10.y, r10.y, r11.y */
// VGPINST(MUL, DEST(R10, MASKY), SRC_SWZRN(10, SWZ_YYYY), SRC_SWZRN(11, SWZ_YYYY), 0, 0),
/* Calculate coff = pow(r11.x, material power) * att */
/* mov r11.y, r11.x */
VGPINST(MOV, DEST(R11, MASKY), SRC_SWZRN(11, SWZ_XXXX), 0, 0, 0),
/* mov r11.w, c[15] */
VGPINST(MOV, DEST(R11, MASKW), SRC_CN(CONST_MATERIAL_POWER), 0, 0, 0),
/* lit r11.z, r11 */
VGPINST(LIT, DEST(R11, MASKZ), SRC_RN(11), 0, 0, 0),
/* mul r11.z, r10.w, r11.z */
VGPINST(MUL, DEST(R11, MASKZ), SRC_SWZRN(10, SWZ_WWWW), SRC_SWZRN(11, SWZ_ZZZZ), 0, 0),
/* Add on to the through specular. */
/* mul r11, r11.z, c[a.x + CONST_PSLIGHT_SPECULAR] */
VGPINST(MUL, DEST(R11, NOMASK), SRC_SWZRN(11, SWZ_ZZZZ), SRC_CN(CONST_PSLIGHT_SPECULAR), 0, 1),
/* mul r11, r11, rVGPTNL_RSPECULARSRC */
VGPINST(MUL, DEST(R11, NOMASK), SRC_RN(11), SRC_RN(VGPTNL_RSPECULARSRC), 0, 0),
/* mad rVGPTNL_RTSPECULAR.xyz, r11, r10.y, rVGPTNL_RTSPECULAR */
VGPINST(MAD, DEST(VGPTNL_OUT_RTSPECULAR, MASK_XYZ), SRC_RN(11), SRC_SWZRN(10, SWZ_YYYY), SRC_RN(VGPTNL_RTSPECULAR), 0),
};
#define SECTION_GENERICLIGHT_MAXIMUM_SIZE \
(sizeof(psGenericLightingSection) / sizeof(*psGenericLightingSection))
#define SECTION_GENERICLIGHT_BASE_SIZE (27)
#define SECTION_GENERICLIGHT_SPECULAR_SIZE \
(SECTION_GENERICLIGHT_MAXIMUM_SIZE)
#endif
/*
* Code to output the result of lighting.
*/
HWVGPINST psLightingResultSection[] =
{
/* Output diffuse and specular calculated during lighting. */
/* mov oD0, r2 */
VGPINST(MOV, DEST(OBASE, NOMASK), SRC_RN(VGPTNL_RTDIFFUSE), 0, 0, 0),
/* mov oD1, r3 */
VGPINST(MOV, DEST(OOFF, NOMASK), SRC_RN(VGPTNL_RTSPECULAR), 0, 0, 0),
};
#define SECTION_COLOUROUTPUT_DIFFUSEONLY_SIZE (1)
#define SECTION_COLOUROUTPUT_FULL_SIZE \
(sizeof(psLightingResultSection) / sizeof(*psLightingResultSection))
HWVGPINST psTextureCoordinateGenerationSection[(MBX1_MAXTEXTURE_LAYERS * 11) + 1];
#define SECTION_TEXTURECOORDGEN_MAXIMUM_SIZE \
(sizeof(psTextureCoordinateGenerationSection) / \
sizeof(*psTextureCoordinateGenerationSection))
HWVGPINST psFogSection[8];
#define SECTION_FOG_MAXIMUM_SIZE \
(sizeof(psFogSection) / sizeof(*psFogSection))
#if defined (SUPPORT_VGP)
/*
The list of pre-compiled FF-TNL code-sections, and their corresponding
sizes (in instructions)
*/
struct
{
DWORD dwSize;
HWVGPINST* psCode;
} psTNLSectionsPrototype[VGPTNL_MAXIMUM_SECTION] =
{
{ SECTION_POSITION_MAXIMUM_SIZE, psPositionSection },
{ SECTION_COLOURSETDEFAULTS_MAXIMUM_SIZE, psColourSetDefaultsSection },
{ SECTION_COLOURPASSTHRU_MAXIMUM_SIZE, psColourPassthruSection },
{ SECTION_TEXTURECOORDINATEPASSTHRU_MAXIMUM_SIZE, psTextureCoordinatePassthruSection },
{ SECTION_COLOURSOURCESETUP_MAXIMUM_SIZE, psColourSourceSection },
{ SECTION_LIGHTINGINITIALIZE_SIZE, psLightingInitialize },
{ SECTION_POSTOVIEW_MAXIMUM_SIZE, psPositionTransformToView },
{ SECTION_LOCALVIEWERFROMVERTEX_SIZE, psLocalViewerFromVertex },
{ SECTION_LOCALVIEWERFROMCONSTANT_SIZE, psLocalViewerFromConstant },
{ SECTION_DIRECTIONALLIGHT_MAXIMUM_SIZE, psDirectionalLightSection },
{ SECTION_POINTLIGHT_MAXIMUM_SIZE, psPointLightSection },
{ SECTION_COLOUROUTPUT_FULL_SIZE, psLightingResultSection },
{ SECTION_TEXTURECOORDGEN_MAXIMUM_SIZE, psTextureCoordinateGenerationSection },
{ SECTION_FOG_MAXIMUM_SIZE, psFogSection }
};
#else /* (SUPPORT_VGP_LITE) */
struct
{
DWORD dwSize;
HWVGPINST* psCode;
} psTNLSectionsPrototype[VGPTNL_MAXIMUM_SECTION] =
{
{ SECTION_POSITION_MAXIMUM_SIZE, psPositionSection },
{ SECTION_COLOURSETDEFAULTS_MAXIMUM_SIZE, psColourSetDefaultsSection },
{ SECTION_COLOURPASSTHRU_MAXIMUM_SIZE, psColourPassthruSection },
{ SECTION_TEXTURECOORDINATEPASSTHRU_MAXIMUM_SIZE, psTextureCoordinatePassthruSection },
{ SECTION_COLOURSOURCESETUP_MAXIMUM_SIZE, psColourSourceSection },
{ SECTION_LIGHTINGINITIALIZE_SIZE, psLightingInitialize },
{ SECTION_POSTOVIEW_MAXIMUM_SIZE, psPositionTransformToView },
{ SECTION_LOCALVIEWERFROMVERTEX_SIZE, psLocalViewerFromVertex },
{ SECTION_LOCALVIEWERFROMCONSTANT_SIZE, psLocalViewerFromConstant },
{ SECTION_GENERICLIGHT_MAXIMUM_SIZE, psGenericLightingSection },
{ SECTION_COLOUROUTPUT_FULL_SIZE, psLightingResultSection },
{ SECTION_TEXTURECOORDGEN_MAXIMUM_SIZE, psTextureCoordinateGenerationSection },
{ SECTION_FOG_MAXIMUM_SIZE, psFogSection }
};
#endif
#endif /* #if defined(SUPPORT_VGP) || (SUPPORT_VGP_LITE) */
/*****************************************************************************
End of file (vgpsections.c)
*****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -