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.
 
 
 
 
 
 

54 lines
2.3 KiB

#ifndef TEXMAN_INCLUDED
#define TEXMAN_INCLUDED
#define MAXLOGTEXSIZE 25
typedef class TextureCacheManager *LPTextureCacheManager;
/*
The texture cache manager does all cache management. The data structure used is
a hash table with the hash variable being the log (base 2) of the total size of
the texture in pixels. Each bucket corresponding to a texture size is a list of
CacheInfos. The LRU algorithm works as follows:
1. Is the texture corresponding to the GL handle in the cache?
2. If it is, increment the timestamp and return the D3D handle.
3. If not, attempt to allocate a DirectDraw surface. If there is no memory,
we need to free some texture and try again (see step 4), else add a CacheInfo
corresponding to this newly allocated DirectDraw surface, QI it for a texture
object and return the D3D handle.
4. We have to reuse some old textures, so try to find the oldest texture of the
same size. If we find such a texture, just Blt the new texture onto the old.
If a texture of the same size is not available, we freeup some bigger textures
and go to step 3.
*/
class TextureCacheManager {
LPD3DBUCKET tcm_bucket[MAXLOGTEXSIZE];
unsigned int tcm_ticks, numvidtex;
LPDIRECT3DI lpDirect3DI;
// Replace a texture of size k with a new texture corresponding to glhandle
//LPD3DBUCKET replace(int k, LPDIRECT3DTEXTUREI lpD3DTexI);
// Free the oldest texture of same size as lpD3DTexI
BOOL freeNode(LPD3DI_TEXTUREBLOCK lpBlock, LPD3DBUCKET* lplpBucket);
//remove any HW handle that's not with lpBlock->lpDevI,save lpBlock->hTex,keep surface
void replace(LPD3DBUCKET bucket,LPD3DI_TEXTUREBLOCK lpBlock);
public:
HRESULT allocNode(LPD3DI_TEXTUREBLOCK lpBlock);
TextureCacheManager(LPDIRECT3DI lpD3DI);
~TextureCacheManager();
//remove all HW handles and release surface
void remove(LPD3DBUCKET bucket);
// Empty the entire cache
void EvictTextures();
void cleanup(); // clean up invalidated nodes by destructors of texture/texture3
BOOL CheckIfLost(); // check if any of the managed textures are lost
inline void TimeStamp(LPD3DBUCKET bucket){bucket->ticks=tcm_ticks++;}
inline void TimeStamp(){++tcm_ticks;}
};
#endif