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

📄 texture.h

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 H
字号:
/**************************************************************************
 * Name         : texture.h
 * Author       : BCB
 * Created      : 02/05/2003
 *
 * Copyright    : 2003 by Imagination Technologies 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 Imagination Technologies Limited, Unit 8, HomePark
 *              : Industrial Estate, King's Langley, Hertfordshire,
 *              : WD4 8LZ, U.K.
 *
 * Platform     : ANSI
 *
 * $Date: 2004/10/06 13:44:21 $ $Revision: 1.16.1.2 $
 * $Log: texture.h $
 **************************************************************************/

#ifndef _TEXTURE_
#define _TEXTURE_

#include "names.h"

#define GLES_TEXTURE_LATENCY				2
#define GLES_MIPMAP				   0x00000001

#define	GLES_TEX_INCONSISTENT				0
#define	GLES_TEX_CONSISTENT					1
#define	GLES_TEX_UNKNOWN					2
#define	GLES_TEX_DUMMY						3

#define GLES_NUM_TEX_FORMATS				5

#define	GLES_ALPHA_TEX_INDEX				0
#define	GLES_LUMINANCE_TEX_INDEX			1
#define	GLES_LUMINANCE_ALPHA_TEX_INDEX		2
#define	GLES_RGB_TEX_INDEX					3
#define	GLES_RGBA_TEX_INDEX					4

#define GLES_MODULATE_INDEX					0
#define	GLES_DECAL_INDEX					1
#define	GLES_BLEND_INDEX					2
#define	GLES_REPLACE_INDEX					3
#define	GLES_ADD_INDEX						4
#define GLES_NUM_TEX_BLENDS					5

#if defined(SUPPORT_MBX1_LITE)

#define	GLES_MODULATE_COLOR_INDEX			5
#define	GLES_RECIP_ADD_SIGNED_ALPHA_INDEX	6
#define	GLES_TEXTURE_ALPHA_MODULATE_INDEX	7
#define	GLES_FACTOR_ALPHA_MODULATE_INDEX	8
#define	GLES_FRAGMENT_ALPHA_MODULATE_INDEX	9
#define	GLES_ADD_BLEND_INDEX				10
#define	GLES_DOT3_RGBA_INDEX				11
#define GLES_NUM_TEXEXT_BLENDS				7

#else

#define	GLES_COMBINE_INDEX					5

#define GLES_COMBINE_COLOR					0
#define GLES_COMBINE_ALPHA					1
#define GLES_NUM_COMBINERS					2

#define GLES_COMBINE_MAX_SRC				3

#endif

typedef struct GLEStextureFormatRec {
    IMG_UINT32 ui32BitsPerTexel;

	IMG_UINT32		 ui32HWFormat;
	IMG_UINT32       ui32BaseFormatIndex;

}GLEStextureFormat;

/*
** Per Mipmap Level state.
*/
typedef struct GLESmipMapLevelRec {
    /* These are the texels for this mipmap level */
    GLEStextureBuffer *pui8Buffer;

    /* Image dimensions */
    IMG_UINT32 ui32Width, ui32Height, ui32ImageSize;

    /* log2 of width & height */
    IMG_INT32 i32WidthLog2, i32HeightLog2;

    /* Requested internal format */
    GLenum eRequestedFormat;

    const GLEStextureFormat *psTexFormat;
}GLESmipMapLevel;

/*
** State set with glTexParameter
*/
typedef struct GLEStextureParamStateRec {
    
	IMG_UINT32 ui32StateWord1;
	IMG_UINT32 ui32StateWord2;

	/* wrap modes - Stored directly in stateword1
    GLenum sWrapMode;
    GLenum tWrapMode;
*/
    /* min and mag filter */
    IMG_UINT32 ui32MinFilter;
    IMG_UINT32 ui32MagFilter;

} GLEStextureParamState;

/*
** State set with glTexEnv
*/
typedef struct GLEStextureEnvStateRec {
    /* environment "blend" function */
    IMG_UINT32 ui32Mode;

    /* environment color - stored in HW format*/
	IMG_UINT32 ui32Color;

#if defined (SUPPORT_MBX1)
	/* Combine Operation/Scale Factor */
	IMG_UINT8 ui8ScaleOp[GLES_NUM_COMBINERS];

	/* Combine Srcs */
	IMG_UINT8 aui8Src[GLES_NUM_COMBINERS][GLES_COMBINE_MAX_SRC];
#endif
} GLEStextureEnvState;


typedef struct GLEStextureBindingStateRec {
    /* Texture name */
    IMG_UINT32 ui32Name;

    /* Parameter state */
    GLEStextureParamState sParams;
} GLEStextureBindingState;

typedef struct GLEStextureUnitStateRec {

    /* Per texture object binding state (points to bound texture object) */
	GLEStextureBindingState *psTexture;

    /* Per texture environment binding state */
    GLEStextureEnvState sEnv;
} GLEStextureUnitState;

/*
** Per Texture Object state.
** refcount field MUST be first in the structure.
*/
struct GLEStextureRec {
    /* reference count: create with 1; delete when 0 */
    IMG_UINT32 ui32Refcount;

    /* State for this texture object */
    GLEStextureBindingState sState;

    /* Level information */
    IMG_UINT32 ui32NumLevels;
	GLESmipMapLevel asMipLevel[GLES_MAX_TEXTURE_MIPMAP_LEVELS];

    IMG_BOOL bResidence;

    /* 
     * This should only be called by the texture object when it is 
     * deleted. It calls the texture managers delete textureobj func
     */
    IMG_VOID (*pfnFree)(GLESContext *gc, GLEStexture *psTex);


	/*
	 * For non square textures whose aspect ration is greater than HW allows
	 * the dimension must be scaled must be scled to be within HW limits
	 * The height and width scales indicate what this scling was
	 * there are in terms 2^HeightScale or 2^WidthScale
	 * Height and Width should not be set at the same time  
	 */
	IMG_UINT32 ui32HeightScale;
	IMG_UINT32 ui32WidthScale;

	/*
	 * Sizes smaller that 8x8 are placed into larger sized maps.
	 * scaleShift is how many doublings have been applied to the
	 * intermediate and texture maps (equivalent to a mip map
	 * offset).
	 *
	 * These are computed when the texture is made resident (i.e.,
	 * loaded into texture memory). forceMipMapped specifies if a
	 * non-MIP mapped small texture has been forced to be MIP-mapped.
	 */
	IMG_UINT32 ui32ScaleShift;
	IMG_BOOL bForceMipMapped;

	/*
	 * State variables. 
	 *
	 * frameLastUsed records the frame number the texture was last used.
	 * If the current frame number has advanced more than GLES_TEXTURE_LATENCY
	 * then the texture can be reclaimed.
	 *
	 * dirty indicates the host data has been updated, but the new
	 * data has not yet been loaded into the video memory texture. This way,
	 * multiple modifications to the host data (e.g., a series
	 * the MIP levels updates) can be batched up and loaded into video
	 * memory in all together.
	 * 
	 * levelsConsistent is updated everytime an level in the texture 
	 * changes size and summarises whether the texture can be sensibly
	 * MIP mapped.
	 */
	IMG_UINT32 ui32FrameLastUsed;
	IMG_BOOL bDirty;
	IMG_UINT32 ui32LevelsConsistent; 

	const GLEStextureFormat *psFormat;
	IMG_UINT32 ui32HWSize;
	IMG_UINT32 ui32HWType;

	PVRSRV_MEM_INFO *psMemInfo;
#if defined(PDUMP) || defined(OLDPDUMP)
	IMG_BOOL bIsDumped;
#endif
	/*
	 * List pointers. If the next/prev are NULL, the texture is idle
	 */
    struct GLEStextureRec *psNext;	    /* circular for activeList */
    struct GLEStextureRec *psPrev;

	IMG_VOID (*pfnReadBackData)(IMG_VOID *pvDest, const IMG_VOID *pvSrc, IMG_UINT32 ui32Log2Width, 
						IMG_UINT32 ui32Log2Height, IMG_UINT32 ui32X, IMG_UINT32 ui32Y, IMG_UINT32 ui32Width, 
						IMG_UINT32 ui32Height, IMG_UINT32 ui32DstStride);
	
	IMG_VOID (*pfnTextureTwiddle)(IMG_VOID *pvDest, const IMG_VOID	*pvSrc, IMG_UINT32 ui32Width, 
						IMG_UINT32 ui32Height,	IMG_UINT32 ui32StrideIn);

	IMG_VOID (*pfnSubTextureTwiddle)(IMG_VOID *pvDest, const IMG_VOID *pvSrc, IMG_UINT32 ui32Log2Width, 
						IMG_UINT32 ui32Log2Height, IMG_UINT32 ui32X, IMG_UINT32 ui32Y, IMG_UINT32 ui32Width, 
						IMG_UINT32 ui32Height, IMG_UINT32 ui32SrcStride);
};


typedef struct GLESghostRec {
    PVRSRV_MEM_INFO *psMemInfo;
	IMG_UINT32 ui32Size;

    struct GLESghostRec *psNext;	        /* linear ghost list */
} GLESghost;



/*
 * Records state of textures; whether they're idle, active, ghosted etc.
 */
typedef struct GLEStextureManagerRec {
    IMG_UINT32 ui32Refcount;

    GLEStexture *psObjList;	/* list of textures registered */
    GLEStexture *psActiveList;	/* list of textures actually active */
    GLESghost   *apsGhostList[GLES_TEXTURE_LATENCY];	/* list of textures ghosted for each latent frame */
	
	IMG_UINT32     ui32GhostMem;
	IMG_UINT32     ui32CurrentFrame;

    PVRSRV_MEM_INFO *psDummyTexture;

} GLEStextureManager;

typedef IMG_VOID (*PFNReadSpan)(GLESContext *, GLESpixelSpanInfo *);
typedef IMG_VOID (*PFNCopySpan)(IMG_VOID *, IMG_VOID *, IMG_UINT32);
typedef IMG_VOID (*PFNCopyPaletteSpan)(IMG_VOID *, IMG_VOID *, IMG_UINT32, const IMG_VOID *);


/*
** Per Context rendering state.
*/
typedef struct GLEStextureMachineRec {
    /* Texture object for the default texture */
    GLEStexture *psDefaultTexture;

    /* Currently bound texture object */
    GLEStexture *apsBoundTexture[GLES_MAX_TEXTURE_UNITS];
    
	IMG_BOOL	abTexUnitValid[GLES_MAX_TEXTURE_UNITS];

    /* Stores pointers to texture objects, retrieved by name */
    GLESnamesArray *psNamesArray; 

    GLEStextureManager *psTextureManager;

    /* Early initialization function for texture manager */
    IMG_VOID (*pfnInitTextureManager)(GLESContext *gc);

	/* Default copy functions for RGB/A UB data */
	const GLEStextureFormat *psDefaultRGBFormat;
	const GLEStextureFormat *psDefaultRGBAFormat;

	PFNCopySpan pfnDefaultRGBCopySpan;
	PFNCopySpan pfnDefaultRGBACopySpan;

    /* Create a texture with the given name and target */
} GLEStextureMachine;

IMG_VOID SetupTexNameArray(GLESnamesArray *psNamesArray);
IMG_BOOL CreateTextureState(GLESContext *gc, GLESContext *psSharedContext);
IMG_VOID InitTextureState(GLESContext *gc);
IMG_VOID FreeTextureState(GLESContext *gc);
IMG_BOOL CreateTextureMemory(GLESContext *gc, GLEStexture *psTex);
IMG_VOID ReadBackTextureData(GLEStexture *psTex, IMG_UINT32 ui32SrcLevel, IMG_UINT32 ui32DstLevel, IMG_VOID *pvBuffer);
IMG_VOID TranslateLevel(GLESContext *gc, GLEStexture *psTex, IMG_UINT32 ui32Lod);
IMG_VOID SetupTextureBlendWords(GLESContext *gc);
IMG_VOID TexMgrAdvanceOneFrame(GLESContext *gc);
IMG_VOID SetupTwiddleFns(GLEStexture *psTex);
IMG_VOID CopyTextureData(GLESContext *gc, PVRSRV_MEM_INFO *psDstInfo, PVRSRV_MEM_INFO *psSrcInfo);
IMG_BOOL TextureMakeResident(GLESContext *gc, GLEStexture *psTex);
IMG_BOOL ValidateTextureUnits(GLESContext *gc);
IMG_UINT32 GetMipMapOffset(IMG_UINT32 ui32MapLevel, IMG_UINT32 ui32TopUSize, IMG_UINT32 ui32TopVSize);
IMG_UINT32 GetCompressedMipMapOffset(IMG_UINT32 ui32MapLevel, IMG_UINT32 ui32TopUSize, 
									 IMG_UINT32 ui32TopVSize, IMG_BOOL bIs2Bpp);
IMG_VOID TexEnvCombine(GLESContext *gc, GLenum pname, GLenum e);
IMG_UINT32 CalcCombineControlWord(GLEStextureEnvState *psEnvState, IMG_BOOL *pbHasFactorCol, IMG_BOOL *pbIsDot3);


#endif /* _TEXTURE_ */

⌨️ 快捷键说明

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