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

📄 vprogram.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		psBinding = &psBindingList[i];
		
		switch(psBinding->eBindingType)
		{
			case GLES_VP_BINDING_PROGRAM_LOCAL:
				psProgram->sBindingInfo.ui32NumLocalParams++;
				break;
			case GLES_VP_BINDING_PROGRAM_ENV:
				psProgram->sBindingInfo.ui32NumEnvParams++;
				break;
			case GLES_VP_BINDING_CONSTANT:
				psProgram->sBindingInfo.ui32NumLocalConstants++;
				break;
			case GLES_VP_BINDING_MATERIAL_AMBIENT:
			case GLES_VP_BINDING_MATERIAL_DIFFUSE:
			case GLES_VP_BINDING_MATERIAL_SPECULAR:
			case GLES_VP_BINDING_MATERIAL_EMISSION:
			case GLES_VP_BINDING_MATERIAL_SHININESS:
			case GLES_VP_BINDING_LIGHT_AMBIENT:
			case GLES_VP_BINDING_LIGHT_DIFFUSE:
			case GLES_VP_BINDING_LIGHT_SPECULAR:
			case GLES_VP_BINDING_LIGHT_POSITION:
			case GLES_VP_BINDING_LIGHT_ATTENUATION:
			case GLES_VP_BINDING_LIGHT_SPOT_DIRECTION:
			case GLES_VP_BINDING_LIGHT_HALF:
			case GLES_VP_BINDING_LIGHTMODEL_AMBIENT:
			case GLES_VP_BINDING_LIGHTMODEL_SCENECOLOR:
			case GLES_VP_BINDING_LIGHTPROD_AMBIENT:
			case GLES_VP_BINDING_LIGHTPROD_DIFFUSE:
			case GLES_VP_BINDING_LIGHTPROD_SPECULAR:
			case GLES_VP_BINDING_MATRIX_MODELVIEW_ROW0:
			case GLES_VP_BINDING_MATRIX_MODELVIEW_ROW1:
			case GLES_VP_BINDING_MATRIX_MODELVIEW_ROW2:
			case GLES_VP_BINDING_MATRIX_MODELVIEW_ROW3:
			case GLES_VP_BINDING_MATRIX_PROJECTION_ROW0:
			case GLES_VP_BINDING_MATRIX_PROJECTION_ROW1:
			case GLES_VP_BINDING_MATRIX_PROJECTION_ROW2:
			case GLES_VP_BINDING_MATRIX_PROJECTION_ROW3:
			case GLES_VP_BINDING_MATRIX_MVP_ROW0:
			case GLES_VP_BINDING_MATRIX_MVP_ROW1:
			case GLES_VP_BINDING_MATRIX_MVP_ROW2:
			case GLES_VP_BINDING_MATRIX_MVP_ROW3:
			case GLES_VP_BINDING_FOG_COLOR:
			case GLES_VP_BINDING_FOG_PARAMS:
			case GLES_VP_BINDING_SPECIAL_FOG_PARAMS:
			case GLES_VP_BINDING_CLIP_PLANE:
			case GLES_VP_BINDING_POINT_SIZE:
			case GLES_VP_BINDING_MATRIX_TEXTURE_ROW0:
			case GLES_VP_BINDING_MATRIX_TEXTURE_ROW1:
			case GLES_VP_BINDING_MATRIX_TEXTURE_ROW2:
			case GLES_VP_BINDING_MATRIX_TEXTURE_ROW3:
			case GLES_VP_BINDING_MATRIX_PROGRAM_ROW0:
			case GLES_VP_BINDING_MATRIX_PROGRAM_ROW1:
			case GLES_VP_BINDING_MATRIX_PROGRAM_ROW2:
			case GLES_VP_BINDING_MATRIX_PROGRAM_ROW3:
			case GLES_VP_BINDING_CLIP_FRONT:
			case GLES_VP_BINDING_CLIP_BACK:
				psProgram->sBindingInfo.ui32NumState++;
				break;
			case GLES_VP_BINDING_VERTEX_ATTRIB:
			case GLES_VP_BINDING_VERTEX_POSITION:
			case GLES_VP_BINDING_VERTEX_NORMAL:
			case GLES_VP_BINDING_VERTEX_COLOR:
			case GLES_VP_BINDING_VERTEX_TEXCOORD:
			case GLES_VP_BINDING_TEMP:
			case GLES_VP_BINDING_RESULT:
			case GLES_VP_BINDING_ADDRESS:
			case GLES_VP_BINDING_RESULT_POSITION:
			case GLES_VP_BINDING_RESULT_COLOR:
			case GLES_VP_BINDING_RESULT_TEXCOORD:
			case GLES_VP_BINDING_RESULT_CLIP:
			case GLES_VP_BINDING_RESULT_FOGCOORD:
				break;

			default:
				DPF((DBG_ERROR,"Unknown input type"));
				break;
		}
	}

	if(psProgram->psLocalConstants)
		GLESFree(gc, (IMG_VOID *)psProgram->psLocalConstants);

	psProgram->psLocalConstants = 
		(GLESVPConstant *) GLESCalloc(gc, sizeof(GLESVPConstant) * psProgram->sBindingInfo.ui32NumLocalConstants);

	if(psProgram->psStateBinding)
		GLESFree(gc, (IMG_VOID *)psProgram->psStateBinding);

	psProgram->psStateBinding = 
		(GLESVPStateBinding *) GLESCalloc(gc, sizeof(GLESVPStateBinding) * psProgram->sBindingInfo.ui32NumState);


	/* we need to loop through the attrib bindings to find out each register to what it is bound */

	ui32StateIndex = 0;

	for(i=0; i<8; i++)
	{
		psProgram->aui32InputRegisterMapping[i] = 0xFFFFFFFF;
	}

	for(i=0; i < psProgram->sInfo.ui32NumBindings; i++)
	{
		psBinding = &psBindingList[i];
		
		switch(psBinding->eBindingType)
		{
			case GLES_VP_BINDING_VERTEX_ATTRIB:
			{
				/* Only include in input mask if binding is present in the USER section */
				if(psBinding->ui32SectionUsage & (1 << psProgram->sInfo.aui32SectionDesc[VGP_SECTIONDESC_USERCODE]))
				{
					/* Set both bits for correct behaviour */
					if(psBinding->sData.fX == 0)
						psProgram->ui32InputMask |= VARRAY_VERT_ENABLE;
					
					psProgram->ui32InputMask |= (VARRAY_ATTRIB0_ENABLE << (IMG_UINT32)(psBinding->sData.fX));
					
					psProgram->ui32NumberAttribs++;
					
					psProgram->aui32InputRegisterMapping[psBinding->ui32HWOffset] = 
						AP_VERTEX_ATTRIB0 + (IMG_UINT32)(psBinding->sData.fX); 
				}
				break;
			}
			case GLES_VP_BINDING_VERTEX_POSITION:
			{
				/* Only include in input mask if binding is present in the USER section */
				if(psBinding->ui32SectionUsage & (1 << psProgram->sInfo.aui32SectionDesc[VGP_SECTIONDESC_USERCODE]))
				{
					/* Set both bits for correct behaviour */
					psProgram->ui32InputMask |= (VARRAY_VERT_ENABLE | VARRAY_ATTRIB0_ENABLE);
					
					psProgram->aui32InputRegisterMapping[psBinding->ui32HWOffset] = AP_VERTEX;				
				}
				psProgram->ui32NumberAttribs++;
				/* Need to store input register number for passthrough */
				psProgram->aui32FFInputRegisterMapping[GLES_VP_PASSTHROUGH_POSITION_INDEX] = psBinding->ui32HWOffset;
				break;
			}
			case GLES_VP_BINDING_VERTEX_NORMAL:
			{
				/* Only include in input mask if binding is present in the USER section */
				if(psBinding->ui32SectionUsage & (1 << psProgram->sInfo.aui32SectionDesc[VGP_SECTIONDESC_USERCODE]))
				{
					psProgram->ui32InputMask |= VARRAY_NORMAL_ENABLE;

					psProgram->aui32InputRegisterMapping[psBinding->ui32HWOffset] = AP_NORMAL;

					psProgram->ui32NumberAttribs++;	
				}
				break;
			}
			case GLES_VP_BINDING_VERTEX_COLOR:
			{
				/* Only include in input mask if binding is present in the USER section */
				if(psBinding->ui32SectionUsage & (1 << psProgram->sInfo.aui32SectionDesc[VGP_SECTIONDESC_USERCODE]))
				{
					psProgram->ui32InputMask |= VARRAY_COLOR_ENABLE;
				
					psProgram->aui32InputRegisterMapping[psBinding->ui32HWOffset] = AP_COLOR;			
				}
				psProgram->ui32NumberAttribs++;
				/* Need to store input register number for passthrough */
				psProgram->aui32FFInputRegisterMapping[GLES_VP_PASSTHROUGH_COLOR_INDEX] = psBinding->ui32HWOffset;
				break;
			}
			case GLES_VP_BINDING_VERTEX_TEXCOORD:
			{
				/* Only include in input mask if binding is present in the USER section */
				if(psBinding->ui32SectionUsage & (1 << psProgram->sInfo.aui32SectionDesc[VGP_SECTIONDESC_USERCODE]))
				{
					psProgram->ui32InputMask |= (VARRAY_TEXCOORD0_ENABLE << (IMG_UINT32)(psBinding->sData.fX));
								
					psProgram->aui32InputRegisterMapping[psBinding->ui32HWOffset] = 
												AP_TEXCOORD0 + (IMG_UINT32)(psBinding->sData.fX);
				
				}
				psProgram->ui32NumberAttribs++;

				/* Need to store input register number for passthrough */
				if(psBinding->ui32SectionUsage & (1 << psProgram->sInfo.aui32SectionDesc[VGP_SECTIONDESC_PASSTHROUGH]))
					psProgram->aui32FFInputRegisterMapping[GLES_VP_PASSTHROUGH_TEXCOORD_INDEX] = psBinding->ui32HWOffset;	
				break;
			}
			case GLES_VP_BINDING_PROGRAM_LOCAL:
			{
				ui32LocalEnvIndex = (IMG_UINT32)(psBinding->sData.fX);

				psProgram->ui32LocalParamMask |= (GLES_PROGRAM_LOCAL_REQUIRED << ui32LocalEnvIndex);
				psProgram->asLocalParam[ui32LocalEnvIndex].ui32HWOffset =  psBinding->ui32HWOffset;
				break;
			}
			case GLES_VP_BINDING_PROGRAM_ENV:
			{
				ui32LocalEnvIndex = (IMG_UINT32)(psBinding->sData.fX);

				psProgram->aui32EnvParamHWOffset[ui32LocalEnvIndex] =  psBinding->ui32HWOffset;
				psProgram->ui32EnvParamMask |= (GLES_PROGRAM_ENV_REQUIRED << ui32LocalEnvIndex);
				break;
			}
			case GLES_VP_BINDING_CONSTANT:
			{
				psProgram->psLocalConstants[ui32ConstantIndex].sData = psBinding->sData;
				psProgram->psLocalConstants[ui32ConstantIndex].ui32HWOffset =  psBinding->ui32HWOffset;
					
				ui32ConstantIndex++;
				break;
			}
			case GLES_VP_BINDING_MATERIAL_AMBIENT:
				psProgram->ui32StateMask |= GLES_DIRTY_CONSTANT_MATERIAL;

				psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
				psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_MATERIAL;
				psProgram->psStateBinding[ui32StateIndex].psData = 
					(GLEScoord *)&gc->sState.sLight.sMaterial.sAmbient;

				psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
				break;
			case GLES_VP_BINDING_MATERIAL_DIFFUSE:
				psProgram->ui32StateMask |= GLES_DIRTY_CONSTANT_MATERIAL;

				psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
				psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_MATERIAL;
				psProgram->psStateBinding[ui32StateIndex].psData = 
					(GLEScoord *)&gc->sState.sLight.sMaterial.sDiffuse;

				psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
				break;
			case GLES_VP_BINDING_MATERIAL_SPECULAR:
				psProgram->ui32StateMask |= GLES_DIRTY_CONSTANT_MATERIAL;

				psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
				psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_MATERIAL;
				psProgram->psStateBinding[ui32StateIndex].psData = 
					(GLEScoord *)&gc->sState.sLight.sMaterial.sSpecular;

				psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
				break;
			case GLES_VP_BINDING_MATERIAL_EMISSION:
				psProgram->ui32StateMask |= GLES_DIRTY_CONSTANT_MATERIAL;

				psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
				psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_MATERIAL;
				psProgram->psStateBinding[ui32StateIndex].psData = 
					(GLEScoord *)&gc->sState.sLight.sMaterial.sEmissive;

				psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
				break;
			case GLES_VP_BINDING_MATERIAL_SHININESS:
				psProgram->ui32StateMask |= GLES_DIRTY_CONSTANT_MATERIAL;

				psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
				psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_MATERIAL;
				psProgram->psStateBinding[ui32StateIndex].psData = 
										(GLEScoord *)&gc->sState.sLight.sMaterial.sSpecularExponent;

				psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
				break;
			case GLES_VP_BINDING_LIGHT_AMBIENT:
			{
				IMG_UINT32 ui32LightNum = (IMG_UINT32)(psBinding->sData.fX);
				psProgram->ui32StateMask |= (GLES_DIRTY_CONSTANT_LIGHT0 << ui32LightNum);

				psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
				psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = (GLES_DIRTY_CONSTANT_LIGHT0 << ui32LightNum);
				
				psProgram->psStateBinding[ui32StateIndex].psData = 
										(GLEScoord *)&gc->sState.sLight.psSource[ui32LightNum].sAmbient;

				psProgram->psStateBinding[ui32StateIndex].ui32Index0 = ui32LightNum;
				psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
				break;
			}
			case GLES_VP_BINDING_LIGHT_DIFFUSE:
			{
				IMG_UINT32 ui32LightNum = (IMG_UINT32)(psBinding->sData.fX);
				psProgram->ui32StateMask |= (GLES_DIRTY_CONSTANT_LIGHT0 << ui32LightNum);

				psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
				psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = (GLES_DIRTY_CONSTANT_LIGHT0 << ui32LightNum);
				
				psProgram->psStateBinding[ui32StateIndex].psData = 
										(GLEScoord *)&gc->sState.sLight.psSource[ui32LightNum].sDiffuse;
				psProgram->psStateBinding[ui32StateIndex].ui32Index0 = ui32LightNum;
				psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
				break;
			}
			case GLES_VP_BINDING_LIGHT_SPECULAR:
			{
				IMG_UINT32 ui32LightNum = (IMG_UINT32)(psBinding->sData.fX);
				psProgram->ui32StateMask |= (GLES_DIRTY_CONSTANT_LIGHT0 << ui32LightNum);

				psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
				psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = (GLES_DIRTY_CONSTANT_LIGHT0 << ui32LightNum);
				
				psProgram->psStateBinding[ui32StateIndex].psData = 
										(GLEScoord *)&gc->sState.sLight.psSource[ui32LightNum].sSpecular;
				psProgram->psStateBinding[ui32StateIndex].ui32Index0 = ui32LightNum;
				psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
				break;
			}
			case GLES_VP_BINDING_LIGHT_POSITION:
			{
				IMG_UINT32 ui32LightNum = (IMG_UINT32)(psBinding->sData.fX);
				psProgram->ui32StateMask |= (GLES_DIRTY_CONSTANT_LIGHT0 << ui32LightNum);

				psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
				psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = (GLES_DIRTY_CONSTANT_LIGHT0 << ui32LightNum);
				
				psProgram->psStateBinding[ui32StateIndex].psData = 
										&gc->sState.sLight.psSource[ui32LightNum].sPositionEye;
				psProgram->psStateBinding[ui32StateIndex].ui32Index0 = ui32LightNum;
				psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
				break;
			}
			case GLES_VP_BINDING_LIGHT_ATTENUATION:
			{
				IMG_UINT32 ui32LightNum = (IMG_UINT32)(psBinding->sData.fX);
				psProgram->ui32StateMask |= (GLES_DIRTY_CONSTANT_LIGHT0 << ui32LightNum);

				psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
				psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = (GLES_DIRTY_CONSTANT_LIGHT0 << ui32LightNum);
				
				psProgram->psStateBinding[ui32StateIndex].psData = 
										(GLEScoord *)&gc->sState.sLight.psSource[ui32LightNum].afAttenuation;
				psProgram->psStateBinding[ui32StateIndex].ui32Index0 = ui32LightNum;
				psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
				break;
			}
			case GLES_VP_BINDING_LIGHT_SPOT_DIRECTION:
			{
				IMG_UINT32 ui32LightNum = (IMG_UINT32)(psBinding->sData.fX);
				psProgram->ui32StateMask |= (GLES_DIRTY_CONSTANT_LIGHT0 << ui32LightNum);

				psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
				psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = (GLES_DIRTY_CONSTANT_LIGHT0 << ui32LightNum);
				
				psProgram->psStateBinding[ui32StateIndex].psData = IMG_NULL;
				psProgram->psStateBinding[ui32StateIndex].ui32Index0 = ui32LightNum;
				psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
				break;
			}
			case GLES_VP_BINDING_LIGHT_HALF:
			{
				IMG_UINT32 ui32LightNum = (IMG_UINT32)(psBinding->sData.fX);
				psProgram->ui32StateMask |= (GLES_DIRTY_CONSTANT_LIGHT0 << ui32LightNum);

				psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
				psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = (GLES_DIRTY_CONSTANT_LIGHT0 << ui32LightNum);
				psProgram->psStateBinding[ui32StateIndex].psData = IMG_NULL;
				psProgram->psStateBinding[ui32StateIndex].ui32Index0 = ui32LightNum;
				psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
				break;
			}
			case GLES_VP_BINDING_LIGHTMODEL_AMBIENT:
			{
				psProgram->ui32StateMask |= GLES_DIRTY_CONSTANT_LIGHTMODEL;

				psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;

⌨️ 快捷键说明

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