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

📄 vgpsections.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	/* 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 + -