📄 vprogram.c
字号:
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_LIGHTMODEL;
psProgram->psStateBinding[ui32StateIndex].psData =
(GLEScoord *)&gc->sState.sLight.sModel.sAmbient;
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
}
case GLES_VP_BINDING_LIGHTMODEL_SCENECOLOR:
{
psProgram->ui32StateMask |= GLES_DIRTY_CONSTANT_LIGHTMODEL;
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_LIGHTMODEL;
psProgram->psStateBinding[ui32StateIndex].psData = IMG_NULL;
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
}
case GLES_VP_BINDING_LIGHTPROD_AMBIENT:
{
psProgram->ui32StateMask |= GLES_DIRTY_CONSTANT_LIGHTMODEL;
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_LIGHTMODEL;
psProgram->psStateBinding[ui32StateIndex].psData = IMG_NULL;
psProgram->psStateBinding[ui32StateIndex].ui32Index0 = (IMG_UINT32)(psBinding->sData.fX);
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
}
case GLES_VP_BINDING_LIGHTPROD_DIFFUSE:
{
psProgram->ui32StateMask |= GLES_DIRTY_CONSTANT_LIGHTMODEL;
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_LIGHTMODEL;
psProgram->psStateBinding[ui32StateIndex].psData = IMG_NULL;
psProgram->psStateBinding[ui32StateIndex].ui32Index0 = (IMG_UINT32)(psBinding->sData.fX);
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
}
case GLES_VP_BINDING_LIGHTPROD_SPECULAR:
{
psProgram->ui32StateMask |= GLES_DIRTY_CONSTANT_LIGHTMODEL;
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_LIGHTMODEL;
psProgram->psStateBinding[ui32StateIndex].psData = IMG_NULL;
psProgram->psStateBinding[ui32StateIndex].ui32Index0 = (IMG_UINT32)(psBinding->sData.fX);
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
}
/* matrices - modelview */
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:
{
ui32MatrixRow = psBinding->eBindingType - GLES_VP_BINDING_MATRIX_MODELVIEW_ROW0;
psProgram->ui32StateMask |= GLES_DIRTY_CONSTANT_MODELVIEW;
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_MODELVIEW;
psProgram->psStateBinding[ui32StateIndex].ui32Index1 = (IMG_UINT32)(psBinding->sData.fY);
if(psProgram->psStateBinding[ui32StateIndex].ui32Index1 != GLES_MATRIX_MODE_TRANSPOSE)
{
psProgram->psStateBinding[ui32StateIndex].psData = 0;
}
else
{
psProgram->psStateBinding[ui32StateIndex].psData =
(GLEScoord *)&gc->sTransform.psModelView->sMatrix.afMatrix[ui32MatrixRow][0];
}
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
}
/* matrices - projection */
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:
{
ui32MatrixRow = psBinding->eBindingType - GLES_VP_BINDING_MATRIX_PROJECTION_ROW0;
psProgram->ui32StateMask |= GLES_DIRTY_CONSTANT_MVP;
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_MVP;
psProgram->psStateBinding[ui32StateIndex].ui32Index1 = (IMG_UINT32)(psBinding->sData.fY);
if(psProgram->psStateBinding[ui32StateIndex].ui32Index1 != GLES_MATRIX_MODE_TRANSPOSE)
{
psProgram->psStateBinding[ui32StateIndex].psData = 0;
}
else
{
psProgram->psStateBinding[ui32StateIndex].psData =
(GLEScoord *)&gc->sTransform.psProjection->sMatrix.afMatrix[ui32MatrixRow][0];
}
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
}
/* matrices - MVP */
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:
{
ui32MatrixRow = psBinding->eBindingType - GLES_VP_BINDING_MATRIX_MVP_ROW0;
psProgram->ui32StateMask |= GLES_DIRTY_CONSTANT_MVP;
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_MVP;
psProgram->psStateBinding[ui32StateIndex].ui32Index1 = (IMG_UINT32)(psBinding->sData.fY);
if(psProgram->psStateBinding[ui32StateIndex].ui32Index1 != GLES_MATRIX_MODE_TRANSPOSE)
{
psProgram->psStateBinding[ui32StateIndex].psData = 0;
}
else
{
psProgram->psStateBinding[ui32StateIndex].psData =
(GLEScoord *)&gc->sTransform.psModelView->sMvp.afMatrix[ui32MatrixRow][0];
}
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
}
/* matrices - texture */
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:
{
ui32MatrixRow = psBinding->eBindingType - GLES_VP_BINDING_MATRIX_TEXTURE_ROW0;
ui32LayerNumber = (IMG_UINT32)(psBinding->sData.fX);
psProgram->ui32StateMask |= (GLES_DIRTY_CONSTANT_TEXMATRIX0 << ui32LayerNumber);
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = (GLES_DIRTY_CONSTANT_TEXMATRIX0 << ui32LayerNumber);
psProgram->psStateBinding[ui32StateIndex].ui32Index0 = (IMG_UINT32)(psBinding->sData.fX);
psProgram->psStateBinding[ui32StateIndex].ui32Index1 = (IMG_UINT32)(psBinding->sData.fY);
if(psProgram->psStateBinding[ui32StateIndex].ui32Index1 != GLES_MATRIX_MODE_TRANSPOSE)
{
psProgram->psStateBinding[ui32StateIndex].psData = 0;
}
else
{
psProgram->psStateBinding[ui32StateIndex].psData =
(GLEScoord *)&gc->sTransform.apsTexture[ui32LayerNumber]->sMatrix.afMatrix[ui32MatrixRow][0];
}
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
}
/* matrices - program */
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:
{
ui32MatrixRow = psBinding->eBindingType - GLES_VP_BINDING_MATRIX_PROGRAM_ROW0;
ui32MatrixNumber = (IMG_UINT32)(psBinding->sData.fX);
psProgram->ui32StateMask |= GLES_DIRTY_CONSTANT_PROGRAMMATRIX;
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_PROGRAMMATRIX;
psProgram->psStateBinding[ui32StateIndex].ui32Index0 = (IMG_UINT32)(psBinding->sData.fX);
psProgram->psStateBinding[ui32StateIndex].ui32Index1 = (IMG_UINT32)(psBinding->sData.fY);
if(psProgram->psStateBinding[ui32StateIndex].ui32Index1 != GLES_MATRIX_MODE_TRANSPOSE)
{
psProgram->psStateBinding[ui32StateIndex].psData = 0;
}
else
{
psProgram->psStateBinding[ui32StateIndex].psData =
(GLEScoord *)&gc->sTransform.apsProgram[ui32MatrixNumber]->sMatrix.afMatrix[ui32MatrixRow][0];
}
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
}
case GLES_VP_BINDING_CLIP_FRONT:
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_CONSTANTS;
psProgram->psStateBinding[ui32StateIndex].psData = &gc->sState.sViewport.sFrontBackClip[0];
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
case GLES_VP_BINDING_CLIP_BACK:
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_CONSTANTS;
psProgram->psStateBinding[ui32StateIndex].psData = &gc->sState.sViewport.sFrontBackClip[1];
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
case GLES_VP_BINDING_FOG_COLOR:
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_FOGPARAMS;
psProgram->psStateBinding[ui32StateIndex].psData = IMG_NULL;
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
case GLES_VP_BINDING_FOG_PARAMS:
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_FOGPARAMS;
psProgram->psStateBinding[ui32StateIndex].psData = IMG_NULL;
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
case GLES_VP_BINDING_SPECIAL_FOG_PARAMS:
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = GLES_DIRTY_CONSTANT_FOGPARAMS;
psProgram->psStateBinding[ui32StateIndex].psData = IMG_NULL;
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
#if defined(SUPPORT_VGP)
case GLES_VP_BINDING_CLIP_PLANE:
{
IMG_UINT32 ui32ClipPlane = (IMG_UINT32) psBinding->sData.fX;
psProgram->psStateBinding[ui32StateIndex].ui32HWOffset = psBinding->ui32HWOffset;
psProgram->psStateBinding[ui32StateIndex].ui32NeedsFlag = (GLES_DIRTY_CONSTANT_CLIPPLANE0 << ui32ClipPlane);
psProgram->psStateBinding[ui32StateIndex].psData = &gc->sTransform.asEyeClipPlane[ui32ClipPlane];
psProgram->psStateBinding[ui32StateIndex].ui32Index0 = ui32ClipPlane;
psProgram->psStateBinding[ui32StateIndex++].eBindingType = psBinding->eBindingType;
break;
}
#endif
case GLES_VP_BINDING_POINT_SIZE:
DPF((DBG_WARNING,"Invalid binding"));
break;
default:
break;
}
}
psProgram->bValid = IMG_TRUE;
GLES_TIME_STOP(GLES_TIMES_glProgramString);
}
/***********************************************************************************
Function Name : CreateProgram
Inputs : gc, ui32Name
Outputs : -
Returns : Pointer to new program structure
Description : Creates and initialises a new program structure.
************************************************************************************/
static GLESVertexProgram *CreateProgram(GLESContext *gc, IMG_UINT32 ui32Name)
{
GLESVertexProgram *psProgram;
psProgram = (GLESVertexProgram *) GLESCalloc(gc, sizeof(GLESVertexProgram));
if (psProgram == IMG_NULL)
return IMG_NULL;
psProgram->ui32Refcount = 1;
psProgram->ui32Name = ui32Name;
psProgram->bValid = IMG_FALSE;
/* initialize the program */
return psProgram;
}
/***********************************************************************************
Function Name : BindProgram
Inputs : gc, ui32Program
Outputs : -
Returns : -
Description : Sets current program for subsequent calls.
Will create an internal program structure, but no program data
memory is allocated yet. Uses name table.
************************************************************************************/
static IMG_VOID BindProgram(GLESContext *gc, IMG_UINT32 ui32Program)
{
GLESVertexProgram *psProgram;
GLESVertexProgram *psBoundProgram;
GLESnamesArray *psArray;
psArray = gc->sVertexProgram.psNamesArray;
GLES_ASSERT(NULL != psArray);
/*
** Retrieve the program object from the psNamesArray structure.
*/
if (ui32Program == 0)
{
psProgram = gc->sVertexProgram.psDefaultProgram;
GLES_ASSERT(IMG_NULL != psProgram);
GLES_ASSERT(0 == psProgram->ui32Name);
}
else
{
LOCK_NAMES_ARRAY(psArray);
psProgram = (GLESVertexProgram *) LockNamedItem(gc, psArray, ui32Program);
UNLOCK_NAMES_ARRAY(psArray);
}
/*
** Is this the first time this name has been bound?
** If so, create a new program object and initialize it.
*/
if (IMG_NULL == psProgram)
{
psProgram = CreateProgram(gc, ui32Program);
GLES_ASSERT(IMG_NULL != psProgram);
GLES_ASSERT(ui32Program == psProgram->ui32Name);
LOCK_NAMES_ARRAY(psArray);
NewNamedItem(gc, psArray, ui32Program, psProgram);
UNLOCK_NAMES_ARRAY(psArray);
psProgram->ui32Refcount++;
}
else
{
/*
** Retrieved an existing program object. Do some
** sanity checks.
*/
GLES_ASSERT(ui32Program == psProgram->ui32Name);
}
/*
** Release program that is being unbound.
*/
psBoundProgram = gc->sVertexProgram.psCurrentProgram;
if (psBoundProgram && (psBoundProgram->ui32Name != 0))
{
LOCK_NAMES_ARRAY(psArray);
UnlockDataItem(gc, psBoundProgram);
UNLOCK_NAMES_ARRAY(psArray);
}
/*
** Install the new program into the correct target in this context.
*/
gc->sState.sVertexProgram.ui32Name = ui32Program;
gc->sVertexProgram.psCurrentProgram = psProgram;
gc->ui32DirtyMask |= GLES_DIRTY_SW_VGPPROGRAM | GLES_DIRTY_SW_VGPSECTION;
}
/***********************************************************************************
Function Name : glBindProgramARB
Inputs : target, program
Outputs : -
Returns : -
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -