📄 vprogram.c
字号:
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 + -