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.
|
|
/******************************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; \ } \ } \ }
|