Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

268 lines
12 KiB

/******************************Module*Header**********************************\
*
* *******************
* * D3D SAMPLE CODE *
* *******************
*
* Module Name: d3dtext.h
*
* Content: D3D Texture management related definitions and macros
*
* Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved.
* Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved.
\*****************************************************************************/
#ifdef __TEXTURES
#pragma message ("FILE : "__FILE__" : Multiple Inclusion");
#endif
#define __TEXTURES
//-----------------------------------------------------------------------------
// Texture validation macros
//-----------------------------------------------------------------------------
#define TC_MAGIC_DISABLE 0xd3d10000
#define TC_MAGIC_NO 0xd3d10100
#define CHECK_D3DSURFACE_VALIDITY(ptr) \
((ptr) != NULL && (ptr)->MagicNo == TC_MAGIC_NO)
#define CHECK_TEXTURESTRUCT_VALIDITY(ptr) \
( ((ptr) != NULL) && \
( ((ptr)->MagicNo == TC_MAGIC_NO) || \
((ptr)->MagicNo == TC_MAGIC_DISABLE) ) \
)
//-----------------------------------------------------------------------------
// Texture structure definitions
//-----------------------------------------------------------------------------
// We only handle one single mipmap on this sample driver since the P2 doesn't
// natively support them
#if D3D_MIPMAPPING
#define MAX_MIP_LEVELS 12
#else
#define MAX_MIP_LEVELS 1
#endif // D3D_MIPMAPPING
// stores information needed to quickly setup a mipmap level on
// the chip. At the moment this is Partial Products and widths/heights
typedef struct tagMIPTEXTURE {
// Widths and heights for this mip level
INT logWidth;
INT logHeight;
// Partial products for this mip level
ULONG ulPackedPP;
// Offset in pixels to start of the texture
// for the current miplevel
DWORD PixelOffset;
} MIPTEXTURE;
typedef struct _permedia_d3dtexture
{
// Magic number to verify validity of pointer
ULONG MagicNo ;
// the following four memebers are exact replicates
// of those in DDRAWI_DDRAWSURFACE_GBL
DWORD dwCaps;
DWORD dwCaps2;
FLATPTR fpVidMem; // pointer to video memory
LONG lPitch; // pitch of surface
DWORD dwRGBBitCount;
UINT_PTR lSurfaceOffset;
// Width and Height of texture
WORD wWidth;
WORD wHeight;
// The AGP that the last texture came from
DWORD dwGARTDevLast;
BOOL bMipMap;
DWORD m_dwBytes;
DWORD m_dwPriority;
DWORD m_dwTicks;
DWORD m_dwHeapIndex;
ULONG HandleListIndex; // indicating which list it's with
// For setting up MipMaps
MIPTEXTURE MipLevels[MAX_MIP_LEVELS];
DWORD dwFlags;
DWORD dwKeyLow;
DWORD dwKeyHigh;
PermediaSurfaceData* pTextureSurface;
DWORD dwPaletteHandle;
// The number of mipmap levels this texture should have
int iMipLevels;
} PERMEDIA_D3DTEXTURE, *PPERMEDIA_D3DTEXTURE;
//-----------------------------------------------------------------------------
// DX7 Texture management definitions
//-----------------------------------------------------------------------------
typedef struct _permedia_d3dpalette
{
DWORD dwFlags;
WORD wStartIndex;
WORD wNumEntries;
PALETTEENTRY ColorTable[256]; // array of palette entries, could be dynamic later
} PERMEDIA_D3DPALETTE, *PPERMEDIA_D3DPALETTE;
#define LISTGROWSIZE 1024
typedef struct _DWLIST
{
PPERMEDIA_D3DTEXTURE *dwSurfaceList; // array to hold handles,
// dynamically allocated
// dwSurfaceList[0] is the number
// of entries in dwSurfaceList
// if allocated
PPERMEDIA_D3DPALETTE *dwPaletteList; // array to hold handles,
// dynamically allocated
// dwPaletteList[0] is the number
// of entries in dwPaletteList
// if allocated
LPVOID pDDLcl; // owning ddraw pointer as a key
} DWLIST;
typedef DWLIST FAR* LPDWLIST;
extern DWLIST HandleList[];
extern LPDWLIST GetSurfaceHandleList(LPVOID);
void ReleaseSurfaceHandleList(LPVOID);
PERMEDIA_D3DPALETTE *PaletteHandleToPtr(UINT_PTR phandle,
PERMEDIA_D3DCONTEXT* pContext);
//-----------------------------------------------------------------------------
// Texture debugging
//-----------------------------------------------------------------------------
// Tracing/Debugging functions
void DumpTexture(PPDev ppdev,
PERMEDIA_D3DTEXTURE* pTexture,
DDPIXELFORMAT* pPixelFormat);
#ifdef DBG
#define DISPTEXTURE(arg) DumpTexture arg
#else
#define DISPTEXTURE(arg)
#endif
//-----------------------------------------------------------------------------
// Texture hash table definitions
//-----------------------------------------------------------------------------
#define TEXTURE_HASH_SIZE 256 // these many entries in the hash table
void InitTextureHashTable(PERMEDIA_D3DCONTEXT *pContext);
// Then the hash funtion is just an 'and'
#define TEXTURE_HASH_OF(i) ((i) & 0xff)
PERMEDIA_D3DTEXTURE *TextureHandleToPtr(UINT_PTR thandle,
PERMEDIA_D3DCONTEXT* pContext);
void StorePermediaLODLevel(PPDev ppdev,
PERMEDIA_D3DTEXTURE* pTexture,
LPDDRAWI_DDRAWSURFACE_LCL pSurf,
int LOD);
//-----------------------------------------------------------------------------
// Texture coordinate wrapping macros
//-----------------------------------------------------------------------------
#define FLUSH_DUE_TO_WRAP(par)
#define DONT_FLUSH_DUE_TO_WRAP(par)
#define WRAP(par, wrapit) if(wrapit) { \
float elp; \
float erp; \
float emp; \
elp = (float)fabs(par##1 - par##0); \
erp = (float)fabs(par##2 - par##1); \
emp = (float)fabs(par##0 - par##2); \
if( (elp > (float)0.5) && (erp > (float)0.5) ) \
{ \
if (par##1 < par##2) { par##1 += 1.0; } \
else { par##2 += 1.0; par##0 += 1.0; } \
FLUSH_DUE_TO_WRAP(par); \
} \
else if( (erp > (float)0.5) && (emp > (float)0.5) ) \
{ \
if (par##2 < par##0) { par##2 += 1.0; } \
else { par##0 += 1.0; par##1 += 1.0; } \
FLUSH_DUE_TO_WRAP(par); \
} \
else if( (emp > (float)0.5) && (elp > (float)0.5) ) \
{ \
if(par##0 < par##1) { par##0 += 1.0; } \
else { par##1 += 1.0; par##2 += 1.0; } \
FLUSH_DUE_TO_WRAP(par); \
} \
else \
{ \
DONT_FLUSH_DUE_TO_WRAP(par); \
} \
} else { \
DONT_FLUSH_DUE_TO_WRAP(par); \
}
#define WRAP_LINE(par, wrapit) if(wrapit) { \
float elp; \
elp = (float)fabs(par##1 - par##0); \
if(elp > (float)0.5) \
{ \
if (par##1 < par##0) { par##1 += 1.0; } \
else { par##0 += 1.0;} \
FLUSH_DUE_TO_WRAP(par); \
} \
else \
{ \
DONT_FLUSH_DUE_TO_WRAP(par); \
} \
} else { \
DONT_FLUSH_DUE_TO_WRAP(par); \
}
//-----------------------------------------------------------------------------
// Texture coordinate recentering macros
//-----------------------------------------------------------------------------
// Keeps the texture coordinates centered around 0
// and avoid exceeding the texel wrapping limit.
#define RECENTER_TEX_COORDS(Maxf, Maxi, fTC0, fTC1, fTC2) \
{ \
long tcmax; \
unsigned long tcmin; \
int i; \
\
tcmax = LONG_AT(fTC0); \
if (tcmax < LONG_AT(fTC1)) tcmax = LONG_AT(fTC1); \
if (tcmax < LONG_AT(fTC2)) tcmax = LONG_AT(fTC2); \
if (tcmax >= *(long *)&Maxf) \
{ \
myFtoi(&i, *(float *)&tcmax); \
i -= Maxi; \
fTC0 -= i; \
fTC1 -= i; \
fTC2 -= i; \
} \
else \
{ \
tcmin = ULONG_AT(fTC0); \
if (tcmin < ULONG_AT(fTC1)) tcmin = ULONG_AT(fTC1); \
if (tcmin < ULONG_AT(fTC2)) tcmin = ULONG_AT(fTC2); \
if (*(float *)&tcmin <= -Maxf) \
{ \
myFtoi(&i, *(float *)&tcmin); \
i += Maxi; \
fTC0 -= i; \
fTC1 -= i; \
fTC2 -= i; \
} \
} \
}