Files
Jedi-Academy/code/win32/xbox_texture_man.h
2013-04-04 14:32:05 -07:00

127 lines
3.1 KiB
C++

/*
* UNPUBLISHED -- Rights reserved under the copyright laws of the
* United States. Use of a copyright notice is precautionary only and
* does not imply publication or disclosure.
*
* THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION
* OF VICARIOUS VISIONS, INC. ANY DUPLICATION, MODIFICATION,
* DISTRIBUTION, OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR
* EXPRESS WRITTEN PERMISSION OF VICARIOUS VISIONS, INC.
*/
#ifndef __XBOX_TEXTURE_MAN_H__
#define __XBOX_TEXTURE_MAN_H__
#include "glw_win_dx8.h"
#include <xtl.h>
// Texture allocator that never frees anything, just grows until it's totally reset:
class StaticTextureAllocator
{
public:
StaticTextureAllocator( void ) { }
void Initialize( unsigned long size )
{
base = (unsigned char *) D3D_AllocContiguousMemory( size, 0 );
allocPoint = 0;
poolSize = size;
maxAlloc = 0;
swappedSize = 0;
swappedPoint = 0;
}
// No bookkeeping necessary, texNum is unused:
void *Allocate( unsigned long size, GLuint texNum )
{
#ifndef FINAL_BUILD
if( allocPoint + size > poolSize )
throw "Static texture pool full";
#endif
// Current location:
void *retVal = base + allocPoint;
// Advance, then round up:
allocPoint += size;
allocPoint = (allocPoint + 127) & ~127;
#ifndef FINAL_BUILD
if( allocPoint > maxAlloc )
maxAlloc = allocPoint;
#endif
return retVal;
}
void Reset( void )
{
// Just move our allocation marker back to the start:
allocPoint = 0;
}
// This is used by the bink code to make room for a giant texture
// that doesn't need to live at the same time as any others
void SwapTextureMemory( unsigned long size )
{
assert( !swappedPoint && !swappedSize && (size < poolSize) );
// Save off old texturePoint:
swappedPoint = allocPoint;
swappedSize = size;
// Reset texture pool to the beginning of the block:
allocPoint = 0;
// Save whatever's there now:
DWORD dwWritten = 0;
HANDLE h = CreateFile( "Z:\\texswap", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 );
assert( h != INVALID_HANDLE_VALUE );
if( !WriteFile( h, base, size, &dwWritten, NULL ) || (dwWritten != size) )
assert( 0 );
CloseHandle( h );
}
void UnswapTextureMemory( void )
{
assert( swappedSize );
// Read back the data we dumped out before:
DWORD dwRead = 0;
HANDLE h = CreateFile( "Z:\\texswap", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
assert( h != INVALID_HANDLE_VALUE );
if( !ReadFile( h, base, swappedSize, &dwRead, NULL ) || (dwRead != swappedSize) )
assert( 0 );
CloseHandle( h );
// Reset texture point
allocPoint = swappedPoint;
swappedPoint = 0;
swappedSize = 0;
}
unsigned long Size( void )
{
return allocPoint;
}
private:
unsigned char *base;
unsigned long allocPoint;
unsigned long poolSize;
unsigned long maxAlloc;
// Extra bookkeeping for Bink texture nastiness:
unsigned long swappedSize;
unsigned long swappedPoint;
};
// Global texture allocators:
extern StaticTextureAllocator gTextures;
#endif