📄 texture.c
字号:
/******************************************************************************
*
* NAME : fimg_tu.c
* TITLE : FIMG-3DSE ver1.0 Register Level API
* AUTHOR : inhosens, Lee
* CREATED : 06 Apr 2006
*
* COPYRIGHT : Copyright(c) 2006 by Samsung Electronics Limited. All rights
* reserved. No part of this software, either material or
* conceptual may be copied or distributed, transmitted,
* transcribed, stored in a retrieval system or translated into
* any human or computer language in any form by any means,
* electronic, mechanical, manual or other-wise, or disclosed
* to third parties without the express written permission of
* Samsung Electronics. Semiconductor Business, System LSI
* Division, Mobile Solution Development, Graphics IP Team
* in AP.
*
*
* $Revision: 1.7 $
* $Author: inhosens.lee $
* $Date: 2006/04/14 00:18:34 $
* $Locker: $
*
* $Source: C:/CVS/CVSrepository/FIMG-3DSE_SW/fimg3dse_fpga/fimg3d/device/fimg_tu.c,v $
* $State: Exp $
* $Log: fimg_tu.c,v $
* Revision 1.7 2006/04/14 00:18:34 inhosens.lee
* modified some mistypings
*
* Revision 1.6 2006/04/13 10:56:31 cheolkyoo.kim
* Replace FG_TRUE with FGL_TRUE.
*
* Revision 1.5 2006/04/11 06:44:36 inhosens.lee
* function descriptions are added
*
* Revision 1.4 2006/04/06 06:57:09 inhosens.lee
* Descriptions of register-level API of texture unit
*
*
*****************************************************************************/
#include "config.h"
#include "register.h"
#include "macros.h"
#include "fgl.h"
//#include "string.h"
/*****************************************************************************
DEFINES
*****************************************************************************/
#define FGL_TEXTURE_TYPE_VALIDATOR ( \
(1 << FGL_TEX_2D) | \
(1 << FGL_TEX_CUBE) | \
(1 << FGL_TEX_3D) \
)
#define FGL_COLOR_KEY_VALIDATOR ( \
(1 << FGL_CKEY_DISABLE) | \
(1 << FGL_CKEY_SEL1) | \
(1 << FGL_CKEY_DISABLE2) | \
(1 << FGL_CKEY_SEL2) \
)
#define FGL_PALETTE_FORMAT_VALIDATOR ( \
(1 << FGL_PALETTE_ARGB1555) | \
(1 << FGL_PALETTE_RGB565 ) | \
(1 << FGL_PALETTE_ARGB4444) | \
(1 << FGL_PALETTE_ARGB8888) \
)
#define FGL_TEXTURE_FORMAT_VALIDATOR ( \
(1 << FGL_TEXEL_ARGB1555) | \
(1 << FGL_TEXEL_RGB565 ) | \
(1 << FGL_TEXEL_ARGB4444) | \
(1 << FGL_TEXEL_DEPTH24 ) | \
(1 << FGL_TEXEL_IA88 ) | \
(1 << FGL_TEXEL_I8 ) | \
(1 << FGL_TEXEL_ARGB8888) | \
(1 << FGL_TEXEL_1BPP ) | \
(1 << FGL_TEXEL_2BPP ) | \
(1 << FGL_TEXEL_4BPP ) | \
(1 << FGL_TEXEL_8BPP ) | \
(1 << FGL_TEXEL_S3TC ) | \
(1 << FGL_TEXEL_Y1VY0U ) | \
(1 << FGL_TEXEL_VY1UY0 ) | \
(1 << FGL_TEXEL_Y1UY0V ) | \
(1 << FGL_TEXEL_UY1VY0 ) \
)
#define FGL_WRAP_MODE_VALIDATOR ( \
(1 << FGL_TEX_WRAP_REPEAT ) | \
(1 << FGL_TEX_WRAP_FLIP ) | \
(1 << FGL_TEX_WRAP_CLAMP ) \
)
#define FGL_MIPMAP_FILTER_VALIDATOR ( \
(1 << FGL_FILTER_DISABLE) | \
(1 << FGL_FILTER_NEAREST) | \
(1 << FGL_FILTER_LINEAR) \
)
#define TEXTURE_TYPE_VALID(type) \
FGL_ENUM_IN_SET(type, FGL_TEXTURE_TYPE_VALIDATOR)
#define COLOR_KEY_VALID(key) \
FGL_ENUM_IN_SET(key, FGL_COLOR_KEY_VALIDATOR)
#define PALETTE_FORMAT_VALID(format) \
FGL_ENUM_IN_SET(format, FGL_PALETTE_FORMAT_VALIDATOR)
#define TEXTURE_FORMAT_VALID(format) \
FGL_ENUM_IN_SET(format, FGL_TEXTURE_FORMAT_VALIDATOR)
#define WRAP_MODE_VALID(mode) \
FGL_ENUM_IN_SET(mode, FGL_WRAP_MODE_VALIDATOR)
#define MIPMAP_FILTER_VALID(filter) \
FGL_ENUM_IN_SET(filter, FGL_MIPMAP_FILTER_VALIDATOR)
/*****************************************************************************
* FUNCTIONS: fglSetTexUnitParams
*
* refer to
* drvsys_write_reg(FGTU_TSTA#, unsigned int)
*
* SYNOPSIS: This function sets various texture parameters
* for each texture unit.
* (type, texture half decimation factor control,
* texture decimation factor, color key selection,
* texture value expansion method, bilinear filter register,
* MIPMAP control register, texture format,
* u address mode, v address mode, u size, v size)
* PARAMETERS: [IN] unsigned int unit: texture unit ( 0~7 )
* [IN] FGL_TexUnitParams params: texture parameter structure
* typedef struct FGL_TexUnitParamsTag
* {
* FGL_TexType type;
* FG_BOOL bOnHalfDecimation;
* FGL_TexDeciFactor deciFactor;
* FGL_CKeySel ckey;
* FG_BOOL bTexExp;
* FG_BOOL bUseMapFilter;
* FGL_TexFilter mipFilter;
* FGL_TexelFormat format;
* FGL_TexWrapMode uMode;
* FGL_TexWrapMode vMode;
* FGL_TexSize uSize;
* FGL_TexSize vSize;
* } FGL_TexUnitParams;
* RETURNS: FGL_ERR_NO_ERROR - if successful.
* FGL_ERR_INVALID_SIZE - if texture u or v size is invalid
* FGL_ERR_INVALID_VALUE - if specified parameters are invalid
* ERRNO: FGL_ERR_INVALID_SIZE = 6
* FGL_ERR_INVALID_VALUE = 7
*****************************************************************************/
FGL_Error
fglSetTexUnitParams(unsigned int unit, FGL_TexUnitParams *params)
{
//FGL_Error ret = FGL_ERR_UNKNOWN;
FGL_Error ret = FGL_ERR_NO_ERROR;
unsigned int uUSize = params->uUSize;
unsigned int uVSize = params->uVSize;
unsigned int uPSize = params->uPSize;
unsigned int uMipMapLevel = 0;
unsigned int uIndex = 0;
unsigned int uTexMipMapSize = 0;
unsigned int *pTexRegBaseAddr;// = FIMG_NULL;
unsigned int TexRegs[17] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
unsigned int *pTexRegVal = (unsigned int *)TexRegs;
unsigned int uCheckSize, i;
switch(unit)
{
case 0:
pTexRegBaseAddr = (unsigned int *)FGTU_TEX0_CTRL;
break;
case 1:
pTexRegBaseAddr = (unsigned int *)FGTU_TEX1_CTRL;
break;
case 2:
pTexRegBaseAddr = (unsigned int *)FGTU_TEX2_CTRL;
break;
case 3:
pTexRegBaseAddr = (unsigned int *)FGTU_TEX3_CTRL;
break;
case 4:
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)
&& 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)
&& MIPMAP_FILTER_VALID(params->eMipMapFilter)) {
TexRegs[uIndex] = ((params->eType) << TEXCTRL_TEXTURE_TYPE_SHIFT)
| ((params->eColorkey) << TEXCTRL_COLOR_KEY_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);
if(params->bUseExpansion)
TexRegs[uIndex] |= (1 << TEXCTRL_EXPANSION_SHIFT);
if(params->bIsNonparametric)
TexRegs[uIndex] |= (1 << TEXCTRL_NONPARAMETRIC_SHIFT);
if(params->bUseMagFilter)
TexRegs[uIndex] |= (1 << TEXCTRL_MAG_FILTER_SHIFT);
if(params->bUseMinFilter)
TexRegs[uIndex] |= (1 << TEXCTRL_MIN_FILTER_SHIFT);
TexRegs[uIndex] |= ((params->eMipMapFilter) << TEXCTRL_MIPMAP_FILTER_SHIFT);
uIndex++;
}
else
{
uIndex++;
ret = FGL_ERR_INVALID_VALUE;
}
if(uUSize >= FGL_MIN_TEXTURE_WIDTH && uUSize <= FGL_MAX_TEXTURE_WIDTH)
TexRegs[uIndex++] = uUSize;
else
{
uIndex++;
ret = FGL_ERR_INVALID_SIZE;
}
if(uVSize >= FGL_MIN_TEXTURE_HEIGHT && uVSize <= FGL_MAX_TEXTURE_HEIGHT)
TexRegs[uIndex++] = uVSize;
else
{
uIndex++;
ret = FGL_ERR_INVALID_SIZE;
}
if(uPSize >= FGL_MIN_TEXTURE_DEPTH && uPSize <= FGL_MAX_TEXTURE_DEPTH)
TexRegs[uIndex++] = uPSize;
else
{
uIndex++;
ret = FGL_ERR_INVALID_SIZE;
}
if(params->eMipMapFilter)
{
uTexMipMapSize = (unsigned int)(uUSize * uVSize);
TexRegs[uIndex++] = uTexMipMapSize;
#if 0
while(FIMG_MAX(uUSize, uVSize) > 1 )
{
++uMipMapLevel;
uTexMipMapSize += (unsigned int)((uUSize >>= 1)*(uVSize >>= 1));
TexRegs[uIndex++] = uTexMipMapSize;
}
#else
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;
}
#endif
TexRegs[16] = uMipMapLevel;
}
#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
return ret;
}
/*****************************************************************************
* FUNCTIONS: fglSetTexStatusParams
*
* refer to
* drvsys_write_reg(FGTU_TSTA#, unsigned int)
*
* SYNOPSIS: This function sets various texture parameters
* for each texture unit.
* (type, color key selection, texture msb expansion method,
* palette format, texture format,
* u address mode, v address mode,
* parametric or nonparametric addressing,
* and mag., min. and mipmap filter)
* PARAMETERS: [IN] unsigned int unit: texture unit ( 0~7 )
* [IN] FGL_TexStatusParams params: texture parameter structure
* typedef struct FGL_TexStatusParamsTag
* {
* FGL_TexType eType;
* FGL_CKeySel eColorKey;
* FG_BOOL bUseExpansion;
* FGL_PaletteFormat ePaletteFormat;
* FGL_TexelFormat eFormat;
* FGL_TexWrapMode eUMode;
* FGL_TexWrapMode eVMode;
* FG_BOOL bIsNonparametric;
* FG_BOOL bUseMagFilter;
* FG_BOOL bUseMinFilter;
* FGL_TexFilter eMipMapFilter;
* } FGL_TexUnitParams;
* RETURNS: FGL_ERR_NO_ERROR - if successful.
* FGL_ERR_INVALID_VALUE - if specified parameters are invalid
* ERRNO: FGL_ERR_INVALID_VALUE = 7
*****************************************************************************/
FGL_Error
fglSetTexStatusParams(unsigned int unit, FGL_TexStatusParams *params)
{
unsigned int texStatusR;
unsigned int *pTexRegBaseAddr;
switch(unit)
{
case 0:
pTexRegBaseAddr = (unsigned int *)FGTU_TEX0_CTRL;
break;
case 1:
pTexRegBaseAddr = (unsigned int *)FGTU_TEX1_CTRL;
break;
case 2:
pTexRegBaseAddr = (unsigned int *)FGTU_TEX2_CTRL;
break;
case 3:
pTexRegBaseAddr = (unsigned int *)FGTU_TEX3_CTRL;
break;
case 4:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -