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

📄 vprogram.c

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