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