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.
233 lines
4.1 KiB
233 lines
4.1 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include "HardwareMatrixState.h"
|
||
|
#include <limits.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include "studio.h"
|
||
|
#include "studiomdl.h"
|
||
|
|
||
|
CHardwareMatrixState::CHardwareMatrixState()
|
||
|
{
|
||
|
m_LRUCounter = 0;
|
||
|
m_NumMatrices = 0;
|
||
|
m_matrixState = NULL;
|
||
|
m_savedMatrixState = NULL;
|
||
|
}
|
||
|
|
||
|
void CHardwareMatrixState::Init( int numHardwareMatrices )
|
||
|
{
|
||
|
m_NumMatrices = numHardwareMatrices;
|
||
|
delete [] m_matrixState;
|
||
|
m_matrixState = new MatrixState_t[m_NumMatrices];
|
||
|
Assert( m_matrixState );
|
||
|
delete [] m_savedMatrixState;
|
||
|
m_savedMatrixState = new MatrixState_t[m_NumMatrices];
|
||
|
Assert( m_savedMatrixState );
|
||
|
m_LRUCounter = 0;
|
||
|
m_AllocatedMatrices = 0;
|
||
|
|
||
|
int i;
|
||
|
for( i = 0; i < m_NumMatrices; i++ )
|
||
|
{
|
||
|
m_matrixState[i].allocated = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool CHardwareMatrixState::AllocateMatrix( int globalMatrixID )
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
if( IsMatrixAllocated( globalMatrixID ) )
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
for( i = 0; i < m_NumMatrices; i++ )
|
||
|
{
|
||
|
if( !m_matrixState[i].allocated )
|
||
|
{
|
||
|
m_matrixState[i].globalMatrixID = globalMatrixID;
|
||
|
m_matrixState[i].allocated = true;
|
||
|
m_matrixState[i].lastUsageID = m_LRUCounter++;
|
||
|
++m_AllocatedMatrices;
|
||
|
DumpState();
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
DumpState();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
int CHardwareMatrixState::FindLocalLRUIndex( void )
|
||
|
{
|
||
|
int oldestLRUCounter = INT_MAX;
|
||
|
int i;
|
||
|
int oldestID = 0;
|
||
|
|
||
|
for( i = 0; i < m_NumMatrices; i++ )
|
||
|
{
|
||
|
if( !m_matrixState[i].allocated )
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
if( m_matrixState[i].lastUsageID < oldestLRUCounter )
|
||
|
{
|
||
|
oldestLRUCounter = m_matrixState[i].lastUsageID;
|
||
|
oldestID = i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Assert( oldestLRUCounter != INT_MAX );
|
||
|
return oldestID;
|
||
|
}
|
||
|
|
||
|
void CHardwareMatrixState::DeallocateLRU( void )
|
||
|
{
|
||
|
int id;
|
||
|
|
||
|
id = FindLocalLRUIndex();
|
||
|
m_matrixState[id].allocated = false;
|
||
|
--m_AllocatedMatrices;
|
||
|
}
|
||
|
|
||
|
void CHardwareMatrixState::DeallocateLRU( int n )
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
for( i = 0; i < n; i++ )
|
||
|
{
|
||
|
DeallocateLRU();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool CHardwareMatrixState::IsMatrixAllocated( int globalMatrixID ) const
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
for( i = 0; i < m_NumMatrices; i++ )
|
||
|
{
|
||
|
if( m_matrixState[i].globalMatrixID == globalMatrixID &&
|
||
|
m_matrixState[i].allocated )
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
void CHardwareMatrixState::DeallocateAll()
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
DumpState();
|
||
|
for( i = 0; i < m_NumMatrices; i++ )
|
||
|
{
|
||
|
m_matrixState[i].allocated = false;
|
||
|
m_matrixState[i].globalMatrixID = INT_MAX;
|
||
|
m_matrixState[i].lastUsageID = INT_MAX;
|
||
|
}
|
||
|
m_AllocatedMatrices = 0;
|
||
|
DumpState();
|
||
|
}
|
||
|
|
||
|
void CHardwareMatrixState::SaveState( void )
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
for( i = 0; i < m_NumMatrices; i++ )
|
||
|
{
|
||
|
m_savedMatrixState[i] = m_matrixState[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CHardwareMatrixState::RestoreState( void )
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
for( i = 0; i < m_NumMatrices; i++ )
|
||
|
{
|
||
|
m_matrixState[i] = m_savedMatrixState[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int CHardwareMatrixState::AllocatedMatrixCount() const
|
||
|
{
|
||
|
return m_AllocatedMatrices;
|
||
|
}
|
||
|
|
||
|
int CHardwareMatrixState::FreeMatrixCount() const
|
||
|
{
|
||
|
return m_NumMatrices - m_AllocatedMatrices;
|
||
|
}
|
||
|
|
||
|
int CHardwareMatrixState::GetNthBoneGlobalID( int n ) const
|
||
|
{
|
||
|
int i;
|
||
|
int m = 0;
|
||
|
|
||
|
for( i = 0; i < m_NumMatrices; i++ )
|
||
|
{
|
||
|
if( m_matrixState[i].allocated )
|
||
|
{
|
||
|
if( n == m )
|
||
|
{
|
||
|
return m_matrixState[i].globalMatrixID;
|
||
|
}
|
||
|
m++;
|
||
|
}
|
||
|
}
|
||
|
Assert( 0 );
|
||
|
MdlError( "GetNthBoneGlobalID() Failure\n" );
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void CHardwareMatrixState::DumpState( void )
|
||
|
{
|
||
|
int i;
|
||
|
static char buf[256];
|
||
|
|
||
|
//#ifndef _DEBUG
|
||
|
return;
|
||
|
//#endif
|
||
|
|
||
|
OutputDebugString( "DumpState\n:" );
|
||
|
for( i = 0; i < m_NumMatrices; i++ )
|
||
|
{
|
||
|
if( m_matrixState[i].allocated )
|
||
|
{
|
||
|
sprintf( buf, "%d: allocated: %s lastUsageID: %d globalMatrixID: %d\n",
|
||
|
i,
|
||
|
m_matrixState[i].allocated ? "true " : "false",
|
||
|
m_matrixState[i].lastUsageID,
|
||
|
m_matrixState[i].globalMatrixID );
|
||
|
OutputDebugString( buf );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int CHardwareMatrixState::FindHardwareMatrix( int globalMatrixID )
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
for( i = 0; i < m_NumMatrices; i++ )
|
||
|
{
|
||
|
if( m_matrixState[i].globalMatrixID == globalMatrixID )
|
||
|
{
|
||
|
return i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Assert( 0 );
|
||
|
MdlError( "barfing in FindHardwareMatrix\n" );
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|