Initial commit.
This commit is contained in:
126
code/win32/xbox_texture_man.h
Normal file
126
code/win32/xbox_texture_man.h
Normal file
@@ -0,0 +1,126 @@
|
||||
|
||||
/*
|
||||
* 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
|
||||
Reference in New Issue
Block a user