📄 texture.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 + -