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
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; \
|
|
} \
|
|
} \
|
|
}
|
|
|