318 lines
11 KiB
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
|