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

📄 texture.c

📁 SMDK6410 Test Code Revision 02. s3c6410 official test code, shifting all the controller functional
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************
*
* 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 + -