reman3/Rayman_X/cpa/tempgrp/GliGlou/MultiDRV/Src/TexBench.c

318 lines
11 KiB
C

/*
=======================================================================================
Name : TexBench.c
Author : vincent lhullier Date :25/11/98
Description : Bench function for texture
=======================================================================================
*/
#include "texbench.h"
#ifdef BENCH_TEXTURE
#include "gli_st.h"
#include "GLI_Defn.h"
#include "light_st.h"
#include "PvObj_st.h"
#include "texture.h"
#include "TEX.h"
#include "texbench.h"
#include "texarray.h"
/*
=======================================================================================
Structure and timer functions
=======================================================================================
*/
typedef struct TEXBENCH_st_Timer_
{
u_long ulLow;
u_long ulHigh;
} TEXBENCH_st_Timer;
#define RDTSC __asm _emit 0x0F __asm _emit 0x31
void TEXBENCH_fnv_ReadPentiumCounter( TEXBENCH_st_Timer *p_stTimerCount)
{
__asm
{
RDTSC
mov ebx,dword ptr p_stTimerCount
mov [ebx],eax
mov [ebx+4],edx
}
}
/*
----------------------------------------------------------------------------------------
Description : substract two timer
tr -> result = t1 - t2 (t1 > t2)
----------------------------------------------------------------------------------------
*/
void TEXBENCH_fnv_Diff( TEXBENCH_st_Timer *tr, TEXBENCH_st_Timer *t1, TEXBENCH_st_Timer *t2 )
{
tr->ulHigh = t1->ulHigh - t2->ulHigh;
if (t1->ulLow >= t2->ulLow )
{
tr->ulLow = t1->ulLow - t2->ulLow;
}
else
{
tr->ulHigh--;
tr->ulLow = 0xFFFFFFFF - (t2->ulLow - t1->ulLow - 1);
}
}
/*
=======================================================================================
Globals
=======================================================================================
*/
#define TEXBENCH_C_cComputedSize 0
#define TEXBENCH_C_cRealSize 1
#define TEXBENCH_C_cSizeLogFileName "TextureSize"
/*
* array of texture size
*/
long g_a_lTextureSize[2][ GLI_C_lNBMaxOfTextures ];
/*
* Timer
*/
TEXBENCH_st_Timer TEXBENCH_gast_Timer[ 16 ];
TEXBENCH_st_Timer TEXBENCH_gaast_TextureTimer[ 8 ][ GLI_C_lNBMaxOfTextures ];
/*
=======================================================================================
Functions
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : Init
----------------------------------------------------------------------------------------
*/
void TEXBENCH_fn_vSetTime( char _cFor )
{
TEXBENCH_fnv_ReadPentiumCounter( &TEXBENCH_gast_Timer[ _cFor ] );
}
/*
----------------------------------------------------------------------------------------
Description : Init
----------------------------------------------------------------------------------------
*/
void TEXBENCH_fn_vInitTextureSize( void )
{
memset( g_a_lTextureSize, 0, sizeof (g_a_lTextureSize) );
memset( TEXBENCH_gast_Timer, 0, sizeof (TEXBENCH_gast_Timer) );
}
/*
----------------------------------------------------------------------------------------
Description : Set size of a texture given by it's index
----------------------------------------------------------------------------------------
*/
void TEXBENCH_fn_vSetTextureSizeWithIndex( long _lTextureIndex, char _cSizeType, long _lSize )
{
g_a_lTextureSize[ _cSizeType ][ _lTextureIndex ] = _lSize;
}
/*
----------------------------------------------------------------------------------------
Description : Set size of a texture given by data pointer
----------------------------------------------------------------------------------------
*/
void TEXBENCH_fn_vSetTextureSize( GLI_tdstTexture *_p_stTexture, char _cSizeType, long _lSize )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
long lTexture;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* special for timer set calling from DLL
*/
if (_p_stTexture == NULL)
{
TEXBENCH_fnv_ReadPentiumCounter( &TEXBENCH_gaast_TextureTimer[ _cSizeType ][ _lSize ] );
return;
}
for (lTexture = 0; lTexture < GLI_C_lNBMaxOfTextures; lTexture++)
{
if (_p_stTexture == gs_aDEFTableOfTextureAlreadyRead[ lTexture ] )
{
TEXBENCH_fn_vSetTextureSizeWithIndex( lTexture, _cSizeType, _lSize );
return;
}
}
}
/*
----------------------------------------------------------------------------------------
Description : write info in log file
----------------------------------------------------------------------------------------
*/
void TEXBENCH_fn_vWriteSizeInFile( void )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char szFileName[ _MAX_PATH ];
long lFileIndex = 0;
FILE *hpFile;
long lTexture;
GLI_tdstTexture **pp_stTexture;
long a_lTotal[2];
long lDiff, lTotalDiff;
long lBitmapSize, lSize, lLod;
long lNumberOfStructureAllocated;
BOOL bTwice;
long lStringSize = 0;
TEXBENCH_st_Timer stDiff;
unsigned long a_ulTimeTotal[ 7 ];
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
while(1)
{
CreateDirectory( "log", NULL );
sprintf( szFileName, "log\\%s%03d.log", TEXBENCH_C_cSizeLogFileName, lFileIndex );
if (_access( szFileName, 0 ) != 0)
break;
lFileIndex++;
if (lFileIndex == 1000)
return;
}
hpFile = fopen( szFileName, "wt" );
fprintf(hpFile, "Texture size result\n\n" );
pp_stTexture = gs_aDEFTableOfTextureAlreadyRead;
lTotalDiff = a_lTotal[0] = a_lTotal[1] = 0;
lNumberOfStructureAllocated = 0;
for (lTexture = 0; lTexture < GLI_C_lNBMaxOfTextures; lTexture++, pp_stTexture++)
{
if (*pp_stTexture == NULL)
continue;
{
long lT2;
GLI_tdstTexture **pp_stT2;
bTwice = 0;
pp_stT2 = gs_aDEFTableOfTextureAlreadyRead;
for (lT2 = 0; lT2 < GLI_C_lNBMaxOfTextures; lT2++, pp_stT2++)
{
if (*pp_stT2 == NULL)
continue;
if (*pp_stT2 == *pp_stTexture)
continue;
if (strcmp( (*pp_stT2)->a255_cFileName, (*pp_stTexture)->a255_cFileName) == 0 )
{
bTwice = 1;
break;
}
}
}
lDiff = g_a_lTextureSize[0][lTexture] - g_a_lTextureSize[1][lTexture];
lTotalDiff += lDiff;
lBitmapSize = (*pp_stTexture)->lWidth * (*pp_stTexture)->lHeight;
if ( !( (*pp_stTexture)->lTextureCaps & GLI_C_lPaletteTexture ) )
lBitmapSize <<= 1;
lSize = lBitmapSize;
for (lLod = 0; lLod < (*pp_stTexture)->lNumberOfLod; lLod++)
{
lBitmapSize >>= 2;
lSize += lBitmapSize;
}
fprintf( hpFile, "%4d - %6d - %6d - %4d - %6d (%3d-%3d %8X %d) %s %s\n",
lTexture, g_a_lTextureSize[0][lTexture], g_a_lTextureSize[1][lTexture], lDiff, lSize,
(*pp_stTexture)->lWidth, (*pp_stTexture)->lHeight, (*pp_stTexture)->lTextureCaps, (*pp_stTexture)->lNumberOfLod,
bTwice ? "*" : " ", (*pp_stTexture)->a255_cFileName );
a_lTotal[0] += g_a_lTextureSize[0][lTexture];
a_lTotal[1] += g_a_lTextureSize[1][lTexture];
lNumberOfStructureAllocated++;
lStringSize += strlen((*pp_stTexture)->a255_cFileName) + 1;
/*
for ( pTextureLod = (*pp_stTexture)->p_NextLodOfTexture; pTextureLod != NULL; pTextureLod = pTextureLod->p_NextLodOfTexture )
lNumberOfStructureAllocated++;
*/
}
fprintf( hpFile,"\ntotal : %d - %d - %d\n", a_lTotal[0], a_lTotal[1], lTotalDiff );
fprintf( hpFile,"\nNumber of texture structure allocated : %d (size of one is %d => total size = %d)", lNumberOfStructureAllocated, sizeof( GLI_tdstTexture ), lNumberOfStructureAllocated * sizeof( GLI_tdstTexture ) );
fprintf( hpFile,"\nSize of memory taken by texture name : %d", lStringSize );
fprintf( hpFile,"\n\nTime taken (in cycles)\n" );
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gast_Timer[1], &TEXBENCH_gast_Timer[0] );
fprintf( hpFile,"Unload -> (%d,%d)\n",stDiff.ulHigh, stDiff.ulLow);
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gast_Timer[3], &TEXBENCH_gast_Timer[2] );
fprintf( hpFile,"Uncompress -> (%d,%d)\n",stDiff.ulHigh, stDiff.ulLow);
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gast_Timer[5], &TEXBENCH_gast_Timer[4] );
fprintf( hpFile,"Compression -> (%d,%d)\n",stDiff.ulHigh, stDiff.ulLow);
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gast_Timer[7], &TEXBENCH_gast_Timer[6] );
fprintf( hpFile,"Compute lod -> (%d,%d)\n",stDiff.ulHigh, stDiff.ulLow);
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gast_Timer[9], &TEXBENCH_gast_Timer[8] );
fprintf( hpFile,"Download -> (%d,%d)\n",stDiff.ulHigh, stDiff.ulLow);
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gast_Timer[11], &TEXBENCH_gast_Timer[10] );
fprintf( hpFile," part1 -> (%d,%d)\n",stDiff.ulHigh, stDiff.ulLow);
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gast_Timer[13], &TEXBENCH_gast_Timer[12] );
fprintf( hpFile," part2 -> (%d,%d)\n",stDiff.ulHigh, stDiff.ulLow);
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gast_Timer[15], &TEXBENCH_gast_Timer[14] );
fprintf( hpFile," part3 -> (%d,%d)\n",stDiff.ulHigh, stDiff.ulLow);
/*
* time for each texture
*/
fprintf( hpFile,"\n\nTime taken by each texture for download (in cycles)\n" );
pp_stTexture = gs_aDEFTableOfTextureAlreadyRead;
memset( a_ulTimeTotal, 0, sizeof(a_ulTimeTotal) );
for (lTexture = 0; lTexture < GLI_C_lNBMaxOfTextures; lTexture++, pp_stTexture++)
{
if (*pp_stTexture == NULL)
continue;
fprintf( hpFile,"%4d ", lTexture );
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gaast_TextureTimer[1][lTexture], &TEXBENCH_gaast_TextureTimer[0][lTexture] );
a_ulTimeTotal[ 0 ] += stDiff.ulLow;
fprintf( hpFile,"%10d ", stDiff.ulLow);
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gaast_TextureTimer[2][lTexture], &TEXBENCH_gaast_TextureTimer[1][lTexture] );
a_ulTimeTotal[ 1 ] += stDiff.ulLow;
fprintf( hpFile,"%10d ", stDiff.ulLow);
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gaast_TextureTimer[3][lTexture], &TEXBENCH_gaast_TextureTimer[2][lTexture] );
a_ulTimeTotal[ 2 ] += stDiff.ulLow;
fprintf( hpFile,"%10d ", stDiff.ulLow);
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gaast_TextureTimer[4][lTexture], &TEXBENCH_gaast_TextureTimer[3][lTexture] );
a_ulTimeTotal[ 3 ] += stDiff.ulLow;
fprintf( hpFile,"%10d ", stDiff.ulLow);
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gaast_TextureTimer[5][lTexture], &TEXBENCH_gaast_TextureTimer[4][lTexture] );
a_ulTimeTotal[ 4 ] += stDiff.ulLow;
fprintf( hpFile,"%10d", stDiff.ulLow);
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gaast_TextureTimer[6][lTexture], &TEXBENCH_gaast_TextureTimer[5][lTexture] );
a_ulTimeTotal[ 5 ] += stDiff.ulLow;
fprintf( hpFile,"%10d", stDiff.ulLow);
TEXBENCH_fnv_Diff( &stDiff, &TEXBENCH_gaast_TextureTimer[7][lTexture], &TEXBENCH_gaast_TextureTimer[6][lTexture] );
a_ulTimeTotal[ 6 ] += stDiff.ulLow;
fprintf( hpFile,"%10d\n", stDiff.ulLow);
}
fprintf( hpFile, "\nsum = %10d %10d %10d %10d %10d %10d %10d\n", a_ulTimeTotal[ 0 ], a_ulTimeTotal[ 1 ], a_ulTimeTotal[ 2 ], a_ulTimeTotal[ 3 ], a_ulTimeTotal[ 4 ], a_ulTimeTotal[ 5 ], a_ulTimeTotal[ 6 ] );
fclose( hpFile );
}
#endif