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

📄 texture.c

📁 SMDK6410 Test Code Revision 02. s3c6410 official test code, shifting all the controller functional
💻 C
📖 第 1 页 / 共 3 页
字号:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX4_CTRL;
		break;
	case 5:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX5_CTRL;
		break;
	case 6:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX6_CTRL;
		break;
	case 7:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX7_CTRL;
		break;
	default:
		return FGL_ERR_INVALID_VALUE;
	}

	if (!TEXTURE_TYPE_VALID(params->eType)
						|| !COLOR_KEY_VALID(params->eColorKey)
//						|| params->bUseExpansion > 1
						|| !PALETTE_FORMAT_VALID(params->ePaletteFormat)
						|| !TEXTURE_FORMAT_VALID(params->eFormat)
						|| !WRAP_MODE_VALID(params->eUMode)
						|| !WRAP_MODE_VALID(params->eVMode)
//						|| !WRAP_MODE_VALID(params->ePMode)
//						|| params->bIsNonparametric > 1
//						|| params->bUseMagFilter > 1
//						|| params->bUseMinFilter > 1
						|| !MIPMAP_FILTER_VALID(params->eMipMapFilter))
	{
		return FGL_ERR_INVALID_VALUE;
	}

	texStatusR = ((params->eType) << TEXCTRL_TEXTURE_TYPE_SHIFT)
				| ((params->eColorKey) << TEXCTRL_COLOR_KEY_SHIFT)
				| ((params->bUseExpansion) << TEXCTRL_EXPANSION_SHIFT)
				| ((params->ePaletteFormat) << TEXCTRL_PALETTE_FORMAT_SHIFT)
				| ((params->eFormat) << TEXCTRL_TEXTURE_FORMAT_SHIFT)
				| ((params->eUMode) << TEXCTRL_U_WRAPMODE_SHIFT)
				| ((params->eVMode) << TEXCTRL_V_WRAPMODE_SHIFT)
//				| ((params->ePMode) << TEXCTRL_P_WRAPMODE_SHIFT)
				| ((params->bIsNonparametric) << TEXCTRL_NONPARAMETRIC_SHIFT)
				| ((params->bUseMagFilter) << TEXCTRL_MAG_FILTER_SHIFT)
				| ((params->bUseMinFilter) << TEXCTRL_MIN_FILTER_SHIFT)
				| (params->eMipMapFilter);

	WRITEREG(pTexRegBaseAddr, texStatusR);
		
	return FGL_ERR_NO_ERROR;
}

/*****************************************************************************
 * FUNCTIONS: fglSetTexUSize
 *
 * 			refer to
 * 			drvsys_write_reg(FGTU_USIZE#, unsigned int)
 *
 * SYNOPSIS: This function sets a texture u size
 * 			 for each texture unit.
 * PARAMETERS: [IN]	unsigned int unit: texture unit ( 0~7 )
 *			   [IN]	unsigned int uSize: texture u size
 * RETURNS: FGL_ERR_NO_ERROR - if successful.
 *          FGL_ERR_INVALID_SIZE - if texture size is invalid
 *          FGL_ERR_INVALID_VALUE - if specified unit is invalid
 * ERRNO: FGL_ERR_INVALID_SIZE = 6
 *        FGL_ERR_INVALID_VALUE = 7
 *****************************************************************************/
FGL_Error
fglSetTexUSize(unsigned int unit, unsigned int uSize)
{
	unsigned int *pTexRegBaseAddr;

	if (uSize > MAXVALUE_TU_TEX_SIZE)
	{
		return FGL_ERR_INVALID_SIZE;
	}

	switch(unit)
	{
	case 0:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX0_USIZE;
		break;
	case 1:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX1_USIZE;
		break;
	case 2:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX2_USIZE;
		break;
	case 3:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX3_USIZE;
		break;
	case 4:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX4_USIZE;
		break;
	case 5:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX5_USIZE;
		break;
	case 6:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX6_USIZE;
		break;
	case 7:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX7_USIZE;
		break;
	default:
		return FGL_ERR_INVALID_VALUE;
	}

	WRITEREG(pTexRegBaseAddr, uSize);
		
	return FGL_ERR_NO_ERROR;
}

/*****************************************************************************
 * FUNCTIONS: fglSetTexVSize
 *
 * 			refer to
 * 			drvsys_write_reg(FGTU_VSIZE#, unsigned int)
 *
 * SYNOPSIS: This function sets a texture v size
 * 			 for each texture unit.
 * PARAMETERS: [IN]	unsigned int unit: texture unit ( 0~7 )
 *			   [IN]	unsigned int vSize: texture v size
 * RETURNS: FGL_ERR_NO_ERROR - if successful.
 *          FGL_ERR_INVALID_SIZE - if texture size is invalid
 *          FGL_ERR_INVALID_VALUE - if specified unit is invalid
 * ERRNO: FGL_ERR_INVALID_SIZE = 6
 *        FGL_ERR_INVALID_VALUE = 7
 *****************************************************************************/
FGL_Error
fglSetTexVSize(unsigned int unit, unsigned int vSize)
{
	unsigned int *pTexRegBaseAddr;

	if (vSize > MAXVALUE_TU_TEX_SIZE)
	{
		return FGL_ERR_INVALID_SIZE;
	}

	switch(unit)
	{
	case 0:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX0_VSIZE;
		break;
	case 1:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX1_VSIZE;
		break;
	case 2:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX2_VSIZE;
		break;
	case 3:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX3_VSIZE;
		break;
	case 4:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX4_VSIZE;
		break;
	case 5:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX5_VSIZE;
		break;
	case 6:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX6_VSIZE;
		break;
	case 7:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX7_VSIZE;
		break;
	default:
		return FGL_ERR_INVALID_VALUE;
	}

	WRITEREG(pTexRegBaseAddr, vSize);
		
	return FGL_ERR_NO_ERROR;
}

/*****************************************************************************
 * FUNCTIONS: fglSetTexPSize
 *
 * 			refer to
 * 			drvsys_write_reg(FGTU_PSIZE#, unsigned int)
 *
 * SYNOPSIS: This function sets a texture p size
 * 			 for each texture unit.
 * PARAMETERS: [IN]	unsigned int unit: texture unit ( 0~7 )
 *			   [IN]	unsigned int pSize: texture p size
 * RETURNS: FGL_ERR_NO_ERROR - if successful.
 *          FGL_ERR_INVALID_SIZE - if texture size is invalid
 *          FGL_ERR_INVALID_VALUE - if specified unit is invalid
 * ERRNO: FGL_ERR_INVALID_SIZE = 6
 *        FGL_ERR_INVALID_VALUE = 7
 *****************************************************************************/
FGL_Error
fglSetTexPSize(unsigned int unit, unsigned int pSize)
{
	unsigned int *pTexRegBaseAddr;

	if (pSize > MAXVALUE_TU_TEX_SIZE)
	{
		return FGL_ERR_INVALID_SIZE;
	}

	switch(unit)
	{
	case 0:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX0_PSIZE;
		break;
	case 1:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX1_PSIZE;
		break;
	case 2:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX2_PSIZE;
		break;
	case 3:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX3_PSIZE;
		break;
	case 4:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX4_PSIZE;
		break;
	case 5:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX5_PSIZE;
		break;
	case 6:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX6_PSIZE;
		break;
	case 7:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX7_PSIZE;
		break;
	default:
		return FGL_ERR_INVALID_VALUE;
	}

	WRITEREG(pTexRegBaseAddr, pSize);
		
	return FGL_ERR_NO_ERROR;
}

/*****************************************************************************
 * FUNCTIONS: fglCalculateMipmapOffset
 *
 * 			refer to
 * 			drvsys_write_reg(FGTU_TEX#_L#_OFFSET, unsigned int)
 *
 * SYNOPSIS: This function sets a texture mipmap offset
 * 			 for each texture unit.
 * PARAMETERS: [IN]	unsigned int unit: texture unit ( 0~7 )
 *			   [IN]	unsigned int uSize: texture u size
 *			   [IN]	unsigned int vSize: texture v size
 * RETURNS: FGL_ERR_NO_ERROR - if successful.
 *          FGL_ERR_INVALID_SIZE - if texture size is invalid
 *          FGL_ERR_INVALID_VALUE - if specified unit is invalid
 * ERRNO: FGL_ERR_INVALID_SIZE = 6
 *        FGL_ERR_INVALID_VALUE = 7
 *****************************************************************************/

FGL_Error
fglCalculateMipmapOffset(
					unsigned int unit,
					unsigned int uUSize,
					unsigned int uVSize
		)
{
	unsigned int uTexMipMapSize;
	unsigned int uMipMapLevel;
	unsigned int TexRegs[10];
	unsigned int uCheckSize;
	unsigned int uIndex = 0;
	
	unsigned int* pTexRegBaseAddr;
//	unsigned int* pTexRegVal = TexRegs;
	
	unsigned int i;

	if ((uUSize > MAXVALUE_TU_TEX_SIZE) || (uVSize > MAXVALUE_TU_TEX_SIZE))
	{
		return FGL_ERR_INVALID_SIZE;
	}

	switch(unit)
	{
	case 0:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX0_L1_OFFSET;
		break;
	case 1:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX1_L1_OFFSET;
		break;
	case 2:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX2_L1_OFFSET;
		break;
	case 3:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX3_L1_OFFSET;
		break;
	case 4:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX4_L1_OFFSET;
		break;
	case 5:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX5_L1_OFFSET;
		break;
	case 6:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX6_L1_OFFSET;
		break;
	case 7:
		pTexRegBaseAddr = (unsigned int *)FGTU_TEX7_L1_OFFSET;
		break;
	default:
		return FGL_ERR_INVALID_VALUE;
	}


	uTexMipMapSize = (unsigned int)(uUSize * uVSize);

	TexRegs[uIndex] = uTexMipMapSize;

	WRITEREG(pTexRegBaseAddr++, TexRegs[uIndex++]);

	uCheckSize = uUSize > uVSize ? uUSize : uVSize;
	uCheckSize >>= 1;
	for(i = 0; uCheckSize > 0 && i < 11; i++) 
	{
   		++uMipMapLevel;
		uUSize = (uUSize <= 1) ? 1 : (uUSize >> 1);
		uVSize = (uVSize <= 1) ? 1 : (uVSize >> 1);
		uCheckSize >>= 1;
		uTexMipMapSize += uUSize * uVSize;
   		TexRegs[uIndex] = uTexMipMapSize;
		WRITEREG(pTexRegBaseAddr++, TexRegs[uIndex++]);
   	}

#if 0
#if 1
	__asm
	{
	LDMIA pTexRegVal!,{v1-v8}
	STMIA pTexRegBaseAddr!,{v1-v8}
	LDMIA pTexRegVal!,{v1-v8}
	STMIA pTexRegBaseAddr!,{v1-v8}
	}
    WRITEREG(pTexRegBaseAddr, *pTexRegVal);
#else
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
		WRITEREG(pTexRegBaseAddr++, *(pTexRegVal++));
#endif
#endif

	return FGL_ERR_NO_ERROR;
}


/*****************************************************************************
 * FUNCTIONS: fglSetTexMipmapLevel
 *
 * 			refer to
 * 			drvsys_write_reg(FGTU_TEX#_BASE_LEVEL, unsigned int)
 * 			drvsys_write_reg(FGTU_TEX#_MAX_LEVEL, unsigned int)
 *
 * SYNOPSIS: This function sets texture base level or max. level of mipmap
 * 			 for each texture unit.
 * PARAMETERS: [IN]	unsigned int unit: texture unit ( 0~7 )
 *			   [IN] FGL_MipmapLevel level: base level or max. level
 * 			 		 	typedef enum FGL_MipmapLevelTag {
 * 			 		 		FGL_MIPMAP_BASE_LEVEL,
 * 			 		 		FGL_MIPMAP_MAX_LEVEL
 * 			 		 	} FGL_MipmapLevel;
 * 			   [IN]	unsigned int value: 4 bits value for specified level
 * RETURNS: FGL_ERR_NO_ERROR - if successful
 *          FGL_ERR_INVALID_VALUE - if specified level or unit is invalid
 *          							or value is over the range
 * ERRNO: FGL_ERR_INVALID_VALUE = 7
 *****************************************************************************/
FGL_Error

⌨️ 快捷键说明

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