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.
993 lines
30 KiB
993 lines
30 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// TEX_PROFILE.CPP |
|
// |
|
// Texture Profiling Display. |
|
//=====================================================================================// |
|
#include "vxconsole.h" |
|
|
|
#define TEXPROFILE_MAXCOUNTERS 64 |
|
#define TEXPROFILE_MAXSAMPLES 512 |
|
|
|
#define TEXPROFILE_MAJORTICKSIZE 4 |
|
#define TEXPROFILE_MAJORTICKBYTES ( TEXPROFILE_MAJORTICKSIZE*1024.0f*1024.0f ) |
|
|
|
#define TEXPROFILE_HISTORY_MAJORTICKHEIGHT 100 |
|
#define TEXPROFILE_HISTORY_NUMMINORTICKS 3 |
|
#define TEXPROFILE_HISTORY_LABELWIDTH 50 |
|
#define TEXPROFILE_HISTORY_SCALESTEPS 5 |
|
#define TEXPROFILE_HISTORY_MINSCALE 0.3f |
|
#define TEXPROFILE_HISTORY_MAXSCALE 3.0f |
|
|
|
#define TEXPROFILE_SAMPLES_ITEMHEIGHT 15 |
|
#define TEXPROFILE_SAMPLES_BARHEIGHT 10 |
|
#define TEXPROFILE_SAMPLES_MAJORTICKWIDTH 200 |
|
#define TEXPROFILE_SAMPLES_LABELWIDTH 150 |
|
#define TEXPROFILE_SAMPLES_LABELGAP 5 |
|
#define TEXPROFILE_SAMPLES_NUMMINORTICKS 3 |
|
#define TEXPROFILE_SAMPLES_PEAKHOLDTIME 3000 |
|
#define TEXPROFILE_SAMPLES_SCALESTEPS 10 |
|
#define TEXPROFILE_SAMPLES_MINSCALE 0.3f |
|
#define TEXPROFILE_SAMPLES_MAXSCALE 3.0f |
|
|
|
#define ID_TEXPROFILE_SAMPLES 1 |
|
#define ID_TEXPROFILE_HISTORY 2 |
|
|
|
typedef struct |
|
{ |
|
unsigned int samples[TEXPROFILE_MAXSAMPLES]; |
|
unsigned int peakSample; |
|
char label[64]; |
|
COLORREF color; |
|
} profileCounter_t; |
|
|
|
HWND g_texProfile_hWndSamples; |
|
HWND g_texProfile_hWndHistory; |
|
int g_texProfile_numCounters; |
|
profileCounter_t g_texProfile_counters[TEXPROFILE_MAXCOUNTERS]; |
|
RECT g_texProfile_samplesWindowRect; |
|
RECT g_texProfile_historyWindowRect; |
|
DWORD g_texProfile_lastPeakTime; |
|
bool g_texProfile_history_tickMarks = true; |
|
bool g_texProfile_history_colors = true; |
|
int g_texProfile_history_scale; |
|
bool g_texProfile_samples_tickMarks = true; |
|
bool g_texProfile_samples_colors = true; |
|
int g_texProfile_samples_scale; |
|
int g_texProfile_numSamples; |
|
int g_texProfile_currentFrame; |
|
|
|
//----------------------------------------------------------------------------- |
|
// TexProfile_LoadConfig |
|
// |
|
//----------------------------------------------------------------------------- |
|
void TexProfile_LoadConfig() |
|
{ |
|
int numArgs; |
|
char buff[256]; |
|
|
|
// profile samples |
|
Sys_GetRegistryString( "texProfileSamplesWindowRect", buff, "", sizeof( buff ) ); |
|
numArgs = sscanf( buff, "%d %d %d %d", &g_texProfile_samplesWindowRect.left, &g_texProfile_samplesWindowRect.top, &g_texProfile_samplesWindowRect.right, &g_texProfile_samplesWindowRect.bottom ); |
|
if ( numArgs != 4 || g_texProfile_samplesWindowRect.left < 0 || g_texProfile_samplesWindowRect.top < 0 || g_texProfile_samplesWindowRect.right < 0 || g_texProfile_samplesWindowRect.bottom < 0 ) |
|
memset( &g_texProfile_samplesWindowRect, 0, sizeof( g_texProfile_samplesWindowRect ) ); |
|
Sys_GetRegistryInteger( "texProfileSamplesScale", 0, g_texProfile_samples_scale ); |
|
if ( g_texProfile_samples_scale < -TEXPROFILE_SAMPLES_SCALESTEPS || g_texProfile_samples_scale > TEXPROFILE_SAMPLES_SCALESTEPS ) |
|
g_texProfile_samples_scale = 0; |
|
|
|
// profile history |
|
Sys_GetRegistryString( "texProfileHistoryWindowRect", buff, "", sizeof( buff ) ); |
|
numArgs = sscanf( buff, "%d %d %d %d", &g_texProfile_historyWindowRect.left, &g_texProfile_historyWindowRect.top, &g_texProfile_historyWindowRect.right, &g_texProfile_historyWindowRect.bottom ); |
|
if ( numArgs != 4 || g_texProfile_historyWindowRect.left < 0 || g_texProfile_historyWindowRect.top < 0 || g_texProfile_historyWindowRect.right < 0 || g_texProfile_historyWindowRect.bottom < 0 ) |
|
memset( &g_texProfile_historyWindowRect, 0, sizeof( g_texProfile_historyWindowRect ) ); |
|
Sys_GetRegistryInteger( "texProfileHistoryScale", 0, g_texProfile_history_scale ); |
|
if ( g_texProfile_history_scale < -TEXPROFILE_HISTORY_SCALESTEPS || g_texProfile_history_scale > TEXPROFILE_HISTORY_SCALESTEPS ) |
|
g_texProfile_history_scale = 0; |
|
|
|
Sys_GetRegistryInteger( "texProfileCurrentFrame", 0, g_texProfile_currentFrame ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// TexProfile_SaveConfig |
|
// |
|
//----------------------------------------------------------------------------- |
|
void TexProfile_SaveConfig() |
|
{ |
|
char buff[256]; |
|
WINDOWPLACEMENT wp; |
|
|
|
// profile samples |
|
if ( g_texProfile_hWndSamples ) |
|
{ |
|
memset( &wp, 0, sizeof( wp ) ); |
|
wp.length = sizeof( WINDOWPLACEMENT ); |
|
GetWindowPlacement( g_texProfile_hWndSamples, &wp ); |
|
g_texProfile_samplesWindowRect = wp.rcNormalPosition; |
|
sprintf( buff, "%d %d %d %d", wp.rcNormalPosition.left, wp.rcNormalPosition.top, wp.rcNormalPosition.right, wp.rcNormalPosition.bottom ); |
|
Sys_SetRegistryString( "texProfileSamplesWindowRect", buff ); |
|
} |
|
Sys_SetRegistryInteger( "texProfileSamplesScale", g_texProfile_samples_scale ); |
|
|
|
// profile history |
|
if ( g_texProfile_hWndHistory ) |
|
{ |
|
memset( &wp, 0, sizeof( wp ) ); |
|
wp.length = sizeof( WINDOWPLACEMENT ); |
|
GetWindowPlacement( g_texProfile_hWndHistory, &wp ); |
|
g_texProfile_historyWindowRect = wp.rcNormalPosition; |
|
sprintf( buff, "%d %d %d %d", wp.rcNormalPosition.left, wp.rcNormalPosition.top, wp.rcNormalPosition.right, wp.rcNormalPosition.bottom ); |
|
Sys_SetRegistryString( "texProfileHistoryWindowRect", buff ); |
|
} |
|
Sys_SetRegistryInteger( "texProfileHistoryScale", g_texProfile_history_scale ); |
|
|
|
Sys_SetRegistryInteger( "texProfileCurrentFrame", g_texProfile_currentFrame ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// TexProfile_SetTitle |
|
// |
|
//----------------------------------------------------------------------------- |
|
void TexProfile_SetTitle() |
|
{ |
|
char titleBuff[128]; |
|
|
|
if ( g_texProfile_hWndSamples ) |
|
{ |
|
strcpy( titleBuff, "D3D Usage Snapshot" ); |
|
if ( VProf_GetState() == VPROF_TEXTURE || VProf_GetState() == VPROF_TEXTUREFRAME ) |
|
strcat( titleBuff, " [ON]" ); |
|
if ( g_texProfile_currentFrame ) |
|
strcat( titleBuff, " [FRAME]" ); |
|
|
|
SetWindowText( g_texProfile_hWndSamples, titleBuff ); |
|
} |
|
|
|
if ( g_texProfile_hWndHistory ) |
|
{ |
|
strcpy( titleBuff, "D3D Usage History" ); |
|
if ( VProf_GetState() == VPROF_TEXTURE || VProf_GetState() == VPROF_TEXTUREFRAME ) |
|
strcat( titleBuff, " [ON]" ); |
|
if ( g_texProfile_currentFrame ) |
|
strcat( titleBuff, " [FRAME]" ); |
|
|
|
SetWindowText( g_texProfile_hWndHistory, titleBuff ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// TexProfile_UpdateWindow |
|
// |
|
//----------------------------------------------------------------------------- |
|
void TexProfile_UpdateWindow() |
|
{ |
|
if ( g_texProfile_hWndSamples && !IsIconic( g_texProfile_hWndSamples ) ) |
|
{ |
|
// visible - force a client repaint |
|
InvalidateRect( g_texProfile_hWndSamples, NULL, true ); |
|
} |
|
|
|
if ( g_texProfile_hWndHistory && !IsIconic( g_texProfile_hWndHistory ) ) |
|
{ |
|
// visible - force a client repaint |
|
InvalidateRect( g_texProfile_hWndHistory, NULL, true ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// rc_SetTexProfile |
|
// |
|
//----------------------------------------------------------------------------- |
|
int rc_SetTexProfile( char* commandPtr ) |
|
{ |
|
int i; |
|
char* cmdToken; |
|
int retAddr; |
|
int retVal; |
|
int errCode = -1; |
|
xrProfile_t* localList; |
|
int profileList; |
|
int numProfiles; |
|
|
|
// get numProfiles |
|
cmdToken = GetToken( &commandPtr ); |
|
if ( !cmdToken[0] ) |
|
goto cleanUp; |
|
sscanf( cmdToken,"%x",&numProfiles ); |
|
|
|
// get profile attributes |
|
cmdToken = GetToken( &commandPtr ); |
|
if ( !cmdToken[0] ) |
|
goto cleanUp; |
|
sscanf( cmdToken, "%x", &profileList ); |
|
|
|
// get retAddr |
|
cmdToken = GetToken( &commandPtr ); |
|
if ( !cmdToken[0] ) |
|
goto cleanUp; |
|
sscanf( cmdToken,"%x",&retAddr ); |
|
|
|
localList = new xrProfile_t[numProfiles]; |
|
memset( localList, 0, numProfiles*sizeof( xrProfile_t ) ); |
|
|
|
// get the caller's profile list |
|
DmGetMemory( ( void* )profileList, numProfiles*sizeof( xrProfile_t ), localList, NULL ); |
|
|
|
g_texProfile_numCounters = numProfiles; |
|
if ( g_texProfile_numCounters > TEXPROFILE_MAXCOUNTERS-1 ) |
|
g_texProfile_numCounters = TEXPROFILE_MAXCOUNTERS-1; |
|
|
|
for ( i=0; i<g_texProfile_numCounters; i++ ) |
|
{ |
|
// swap the structure |
|
localList[i].color = BigDWord( localList[i].color ); |
|
|
|
// clear the old counter |
|
memset( &g_texProfile_counters[i], 0, sizeof( profileCounter_t ) ); |
|
|
|
V_strncpy( g_texProfile_counters[i].label, localList[i].labelString, sizeof( g_texProfile_counters[i].label ) ); |
|
g_texProfile_counters[i].color = localList[i].color; |
|
} |
|
|
|
// build out the reserved last counter as total count |
|
memset( &g_texProfile_counters[g_texProfile_numCounters], 0, sizeof( profileCounter_t ) ); |
|
strcpy( g_texProfile_counters[g_texProfile_numCounters].label, "Total" ); |
|
g_texProfile_counters[i].color = RGB( 255,255,255 ); |
|
g_texProfile_numCounters++; |
|
|
|
// set the return code |
|
retVal = g_texProfile_numCounters-1; |
|
int xboxRetVal = BigDWord( retVal ); |
|
DmSetMemory( ( void* )retAddr, sizeof( int ), &xboxRetVal, NULL ); |
|
|
|
DebugCommand( "0x%8.8x = SetTexProfile( 0x%8.8x, 0x%8.8x )\n", retVal, numProfiles, profileList ); |
|
|
|
delete [] localList; |
|
|
|
// success |
|
errCode = 0; |
|
|
|
cleanUp: |
|
return ( errCode ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// rc_SetTexProfileData |
|
// |
|
//----------------------------------------------------------------------------- |
|
int rc_SetTexProfileData( char* commandPtr ) |
|
{ |
|
int i; |
|
char* cmdToken; |
|
int errCode = -1; |
|
int counters; |
|
int currentSample; |
|
int total; |
|
bool newPeaks; |
|
unsigned int localCounters[TEXPROFILE_MAXCOUNTERS]; |
|
DWORD newTime; |
|
|
|
// get profiles |
|
cmdToken = GetToken( &commandPtr ); |
|
if ( !cmdToken[0] ) |
|
goto cleanUp; |
|
sscanf( cmdToken, "%x", &counters ); |
|
|
|
// get the caller's profile list |
|
if ( g_texProfile_numCounters ) |
|
DmGetMemory( ( void* )counters, ( g_texProfile_numCounters-1 )*sizeof( int ), localCounters, NULL ); |
|
|
|
// timeout peaks |
|
newTime = Sys_GetSystemTime(); |
|
if ( newTime - g_texProfile_lastPeakTime > TEXPROFILE_SAMPLES_PEAKHOLDTIME ) |
|
{ |
|
g_texProfile_lastPeakTime = newTime; |
|
newPeaks = true; |
|
} |
|
else |
|
newPeaks = false; |
|
|
|
// next sample |
|
currentSample = g_texProfile_numSamples % TEXPROFILE_MAXSAMPLES; |
|
g_texProfile_numSamples++; |
|
|
|
total = 0; |
|
for ( i=0; i<g_texProfile_numCounters; i++ ) |
|
{ |
|
if ( i != g_texProfile_numCounters-1 ) |
|
{ |
|
g_texProfile_counters[i].samples[currentSample] = localCounters[i]; |
|
total += localCounters[i]; |
|
} |
|
else |
|
{ |
|
// reserved total counter |
|
g_texProfile_counters[i].samples[currentSample] = total; |
|
} |
|
|
|
if ( newPeaks || g_texProfile_counters[i].peakSample < g_texProfile_counters[i].samples[currentSample] ) |
|
g_texProfile_counters[i].peakSample = g_texProfile_counters[i].samples[currentSample]; |
|
} |
|
|
|
DebugCommand( "SetTexProfileData( 0x%8.8x )\n", counters ); |
|
|
|
TexProfile_UpdateWindow(); |
|
|
|
// success |
|
errCode = 0; |
|
|
|
cleanUp: |
|
return ( errCode ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// TexProfile_ZoomIn |
|
// |
|
//----------------------------------------------------------------------------- |
|
void TexProfile_ZoomIn( int& scale, int numSteps ) |
|
{ |
|
scale++; |
|
if ( scale > numSteps ) |
|
{ |
|
scale = numSteps; |
|
return; |
|
} |
|
TexProfile_UpdateWindow(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// TexProfile_ZoomOut |
|
// |
|
//----------------------------------------------------------------------------- |
|
void TexProfile_ZoomOut( int& scale, int numSteps ) |
|
{ |
|
scale--; |
|
if ( scale < -numSteps ) |
|
{ |
|
scale = -numSteps; |
|
return; |
|
} |
|
TexProfile_UpdateWindow(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// TexProfile_CalcScale |
|
// |
|
//----------------------------------------------------------------------------- |
|
float TexProfile_CalcScale( int scale, int numSteps, float min, float max ) |
|
{ |
|
float t; |
|
|
|
// from integral scale [-numSteps..numSteps] to float scale [min..max] |
|
t = ( float )( scale + numSteps )/( float )( 2*numSteps ); |
|
t = min + t*( max-min ); |
|
|
|
return t; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// TexProfileSamples_Draw |
|
// |
|
//----------------------------------------------------------------------------- |
|
void TexProfileSamples_Draw( HDC hdc, RECT* clientRect ) |
|
{ |
|
int i; |
|
int j; |
|
int x; |
|
int y; |
|
int x0; |
|
int y0; |
|
int w; |
|
float t; |
|
float scale; |
|
float sample; |
|
char labelBuff[128]; |
|
HPEN hBlackPen; |
|
HPEN hPenOld; |
|
HPEN hGreyPen; |
|
HBRUSH hColoredBrush; |
|
HBRUSH hbrushOld; |
|
HFONT hFontOld; |
|
RECT rect; |
|
int currentSample; |
|
int numTicks; |
|
int tickWidth; |
|
int windowWidth; |
|
int windowHeight; |
|
|
|
hBlackPen = CreatePen( PS_SOLID, 1, RGB( 0,0,0 ) ); |
|
hGreyPen = CreatePen( PS_SOLID, 1, Sys_ColorScale( g_backgroundColor, 0.85f ) ); |
|
hPenOld = ( HPEN )SelectObject( hdc, hBlackPen ); |
|
hFontOld = SelectFont( hdc, g_hProportionalFont ); |
|
|
|
SetBkColor( hdc, g_backgroundColor ); |
|
|
|
// zoom |
|
scale = TexProfile_CalcScale( g_texProfile_samples_scale, TEXPROFILE_SAMPLES_SCALESTEPS, TEXPROFILE_SAMPLES_MINSCALE, TEXPROFILE_SAMPLES_MAXSCALE ); |
|
tickWidth = ( int )( TEXPROFILE_SAMPLES_MAJORTICKWIDTH*scale ); |
|
windowWidth = clientRect->right-clientRect->left; |
|
windowHeight = clientRect->bottom-clientRect->top; |
|
|
|
numTicks = ( windowWidth-TEXPROFILE_SAMPLES_LABELWIDTH )/tickWidth + 1; |
|
if ( numTicks < 0 ) |
|
numTicks = 1; |
|
|
|
rect.left = 0; |
|
rect.right = TEXPROFILE_SAMPLES_LABELWIDTH; |
|
rect.top = 0; |
|
rect.bottom = TEXPROFILE_SAMPLES_ITEMHEIGHT; |
|
DrawText( hdc, "Name", -1, &rect, DT_LEFT ); |
|
|
|
// draw size ticks |
|
x = TEXPROFILE_SAMPLES_LABELWIDTH; |
|
y = 0; |
|
for ( i=0; i<numTicks; i++ ) |
|
{ |
|
// tick labels |
|
rect.left = x-40; |
|
rect.right = x+40; |
|
rect.top = y; |
|
rect.bottom = y+TEXPROFILE_SAMPLES_ITEMHEIGHT; |
|
sprintf( labelBuff, "%dMB", i*TEXPROFILE_MAJORTICKSIZE ); |
|
DrawText( hdc, labelBuff, -1, &rect, DT_CENTER ); |
|
|
|
// major ticks |
|
x0 = x; |
|
y0 = y + TEXPROFILE_SAMPLES_ITEMHEIGHT; |
|
SelectObject( hdc, hBlackPen ); |
|
MoveToEx( hdc, x0, y0, NULL ); |
|
LineTo( hdc, x0, y0+windowHeight ); |
|
|
|
if ( g_texProfile_samples_tickMarks && g_texProfile_samples_scale > -TEXPROFILE_SAMPLES_SCALESTEPS ) |
|
{ |
|
// minor ticks |
|
x0 = x; |
|
y0 = y + TEXPROFILE_SAMPLES_ITEMHEIGHT; |
|
SelectObject( hdc, hGreyPen ); |
|
for ( j=0; j<TEXPROFILE_SAMPLES_NUMMINORTICKS; j++ ) |
|
{ |
|
x0 += tickWidth/( TEXPROFILE_SAMPLES_NUMMINORTICKS+1 ); |
|
|
|
MoveToEx( hdc, x0, y0, NULL ); |
|
LineTo( hdc, x0, y0+windowHeight ); |
|
} |
|
} |
|
x += tickWidth; |
|
} |
|
|
|
// seperator |
|
SelectObject( hdc, hBlackPen ); |
|
MoveToEx( hdc, 0, TEXPROFILE_SAMPLES_ITEMHEIGHT, NULL ); |
|
LineTo( hdc, windowWidth, TEXPROFILE_SAMPLES_ITEMHEIGHT ); |
|
|
|
// draw labels |
|
x = 0; |
|
y = TEXPROFILE_SAMPLES_ITEMHEIGHT; |
|
for ( i=0; i<g_texProfile_numCounters; i++ ) |
|
{ |
|
if ( !g_texProfile_counters[i].label ) |
|
continue; |
|
|
|
rect.left = x; |
|
rect.right = x+TEXPROFILE_SAMPLES_LABELWIDTH-TEXPROFILE_SAMPLES_LABELGAP; |
|
rect.top = y; |
|
rect.bottom = y+TEXPROFILE_SAMPLES_ITEMHEIGHT; |
|
DrawText( hdc, g_texProfile_counters[i].label, -1, &rect, DT_VCENTER|DT_RIGHT|DT_SINGLELINE|DT_END_ELLIPSIS|DT_MODIFYSTRING ); |
|
|
|
// draw the under line |
|
MoveToEx( hdc, x, y+TEXPROFILE_SAMPLES_ITEMHEIGHT, NULL ); |
|
LineTo( hdc, x+TEXPROFILE_SAMPLES_LABELWIDTH, y+TEXPROFILE_SAMPLES_ITEMHEIGHT ); |
|
|
|
y += TEXPROFILE_SAMPLES_ITEMHEIGHT; |
|
} |
|
|
|
// draw bars |
|
SelectObject( hdc, hBlackPen ); |
|
x = TEXPROFILE_SAMPLES_LABELWIDTH; |
|
y = TEXPROFILE_SAMPLES_ITEMHEIGHT; |
|
currentSample = g_texProfile_numSamples-1; |
|
if ( currentSample < 0 ) |
|
currentSample = 0; |
|
else |
|
currentSample %= TEXPROFILE_MAXSAMPLES; |
|
for ( i=0; i<g_texProfile_numCounters; i++ ) |
|
{ |
|
if ( !g_texProfile_counters[i].label ) |
|
continue; |
|
|
|
hColoredBrush = CreateSolidBrush( g_texProfile_samples_colors ? g_texProfile_counters[i].color : g_backgroundColor ); |
|
hbrushOld = ( HBRUSH )SelectObject( hdc, hColoredBrush ); |
|
|
|
// bar - count is in bytes, scale to major tick |
|
t = ( float )g_texProfile_counters[i].samples[currentSample]/TEXPROFILE_MAJORTICKBYTES; |
|
w = ( int )( t * ( float )tickWidth ); |
|
if ( w > windowWidth ) |
|
w = windowWidth; |
|
x0 = x; |
|
y0 = y + ( TEXPROFILE_SAMPLES_ITEMHEIGHT-TEXPROFILE_SAMPLES_BARHEIGHT )/2 + 1; |
|
Rectangle( hdc, x0, y0, x0 + w, y0 + TEXPROFILE_SAMPLES_BARHEIGHT ); |
|
|
|
// peak |
|
t = ( float )g_texProfile_counters[i].peakSample/TEXPROFILE_MAJORTICKBYTES; |
|
w = ( int )( t * ( float )tickWidth ); |
|
if ( w > windowWidth ) |
|
w = windowWidth; |
|
x0 = x + w; |
|
y0 = y + TEXPROFILE_SAMPLES_ITEMHEIGHT/2 + 1; |
|
|
|
POINT points[4]; |
|
points[0].x = x0; |
|
points[0].y = y0-4; |
|
points[1].x = x0+4; |
|
points[1].y = y0; |
|
points[2].x = x0; |
|
points[2].y = y0+4; |
|
points[3].x = x0-4; |
|
points[3].y = y0; |
|
Polygon( hdc, points, 4 ); |
|
|
|
SelectObject( hdc, hbrushOld ); |
|
DeleteObject( hColoredBrush ); |
|
|
|
// draw peak sizes |
|
sample = ( float )g_texProfile_counters[i].peakSample/1024.0f; |
|
if ( sample >= 0.01F ) |
|
{ |
|
sprintf( labelBuff, "%.2f MB", sample/1024.0f ); |
|
rect.left = x0 + 8; |
|
rect.right = x0 + 8 + 100; |
|
rect.top = y; |
|
rect.bottom = y + TEXPROFILE_SAMPLES_ITEMHEIGHT; |
|
DrawText( hdc, labelBuff, -1, &rect, DT_VCENTER|DT_LEFT|DT_SINGLELINE ); |
|
} |
|
|
|
y += TEXPROFILE_SAMPLES_ITEMHEIGHT; |
|
} |
|
|
|
SelectObject( hdc, hFontOld ); |
|
SelectObject( hdc, hPenOld ); |
|
DeleteObject( hBlackPen ); |
|
DeleteObject( hGreyPen ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// TexProfileHistory_Draw |
|
// |
|
//----------------------------------------------------------------------------- |
|
void TexProfileHistory_Draw( HDC hdc, RECT* clientRect ) |
|
{ |
|
char labelBuff[128]; |
|
HPEN hBlackPen; |
|
HPEN hPenOld; |
|
HPEN hNullPen; |
|
HPEN hGreyPen; |
|
HBRUSH hColoredBrush; |
|
HBRUSH hBrushOld; |
|
HFONT hFontOld; |
|
int currentSample; |
|
int numTicks; |
|
int tickHeight; |
|
int windowWidth; |
|
int windowHeight; |
|
int x; |
|
int y; |
|
int y0; |
|
int i; |
|
int j; |
|
int h; |
|
int numbars; |
|
RECT rect; |
|
float t; |
|
float scale; |
|
|
|
hBlackPen = CreatePen( PS_SOLID, 1, RGB( 0,0,0 ) ); |
|
hGreyPen = CreatePen( PS_SOLID, 1, Sys_ColorScale( g_backgroundColor, 0.85f ) ); |
|
hNullPen = CreatePen( PS_NULL, 0, RGB( 0,0,0 ) ); |
|
hPenOld = ( HPEN )SelectObject( hdc, hBlackPen ); |
|
hFontOld = SelectFont( hdc, g_hProportionalFont ); |
|
|
|
// zoom |
|
scale = TexProfile_CalcScale( g_texProfile_history_scale, TEXPROFILE_HISTORY_SCALESTEPS, TEXPROFILE_HISTORY_MINSCALE, TEXPROFILE_HISTORY_MAXSCALE ); |
|
tickHeight = ( int )( TEXPROFILE_HISTORY_MAJORTICKHEIGHT*scale ); |
|
windowWidth = clientRect->right-clientRect->left; |
|
windowHeight = clientRect->bottom-clientRect->top; |
|
|
|
numTicks = windowHeight/tickHeight + 2; |
|
if ( numTicks < 0 ) |
|
numTicks = 1; |
|
|
|
SetBkColor( hdc, g_backgroundColor ); |
|
|
|
x = 0; |
|
y = windowHeight; |
|
for ( i=0; i<numTicks; i++ ) |
|
{ |
|
// major ticks |
|
SelectObject( hdc, hBlackPen ); |
|
MoveToEx( hdc, 0, y, NULL ); |
|
LineTo( hdc, windowWidth, y ); |
|
|
|
if ( g_texProfile_history_tickMarks && g_texProfile_history_scale > -TEXPROFILE_HISTORY_SCALESTEPS ) |
|
{ |
|
// minor ticks |
|
y0 = y; |
|
SelectObject( hdc, hGreyPen ); |
|
for ( j=0; j<TEXPROFILE_HISTORY_NUMMINORTICKS; j++ ) |
|
{ |
|
y0 += tickHeight/( TEXPROFILE_SAMPLES_NUMMINORTICKS+1 ); |
|
MoveToEx( hdc, 0, y0, NULL ); |
|
LineTo( hdc, windowWidth, y0 ); |
|
} |
|
} |
|
|
|
// tick labels |
|
if ( i ) |
|
{ |
|
rect.left = windowWidth-50; |
|
rect.right = windowWidth; |
|
rect.top = y-20; |
|
rect.bottom = y; |
|
sprintf( labelBuff, "%dMB", i*TEXPROFILE_MAJORTICKSIZE ); |
|
DrawText( hdc, labelBuff, -1, &rect, DT_RIGHT|DT_SINGLELINE|DT_BOTTOM ); |
|
} |
|
|
|
y -= tickHeight; |
|
} |
|
|
|
// vertical bars |
|
if ( g_texProfile_numSamples ) |
|
{ |
|
SelectObject( hdc, hNullPen ); |
|
|
|
numbars = windowWidth-TEXPROFILE_HISTORY_LABELWIDTH; |
|
currentSample = g_texProfile_numSamples-1; |
|
for ( x=numbars-1; x>=0; x-=4 ) |
|
{ |
|
// all the counters at this sample |
|
y = windowHeight; |
|
for ( j=0; j<g_texProfile_numCounters-1; j++ ) |
|
{ |
|
if ( !g_texProfile_counters[j].label ) |
|
continue; |
|
|
|
t = ( float )g_texProfile_counters[j].samples[currentSample % TEXPROFILE_MAXSAMPLES]/TEXPROFILE_MAJORTICKBYTES; |
|
h = ( int )( t * ( float )tickHeight ); |
|
if ( h ) |
|
{ |
|
if ( h > windowHeight ) |
|
h = windowHeight; |
|
|
|
hColoredBrush = CreateSolidBrush( g_texProfile_history_colors ? g_texProfile_counters[j].color : RGB( 80,80,80 ) ); |
|
hBrushOld = ( HBRUSH )SelectObject( hdc, hColoredBrush ); |
|
|
|
Rectangle( hdc, x-4, y-h, x, y+1 ); |
|
y -= h; |
|
|
|
SelectObject( hdc, hBrushOld ); |
|
DeleteObject( hColoredBrush ); |
|
} |
|
} |
|
currentSample--; |
|
if ( currentSample < 0 ) |
|
{ |
|
// no data |
|
break; |
|
} |
|
} |
|
} |
|
|
|
SelectObject( hdc, hFontOld ); |
|
SelectObject( hdc, hPenOld ); |
|
DeleteObject( hBlackPen ); |
|
DeleteObject( hGreyPen ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// TexProfile_WndProc |
|
// |
|
//----------------------------------------------------------------------------- |
|
LRESULT CALLBACK TexProfile_WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) |
|
{ |
|
WORD wID = LOWORD( wParam ); |
|
HDC hdc; |
|
PAINTSTRUCT ps; |
|
RECT rect; |
|
int id; |
|
bool bIsSamples; |
|
bool bIsHistory; |
|
CREATESTRUCT *createStructPtr; |
|
bool bIsEnabled; |
|
|
|
// identify window |
|
id = ( int )GetWindowLong( hwnd, GWL_USERDATA+0 ); |
|
bIsSamples = ( id == ID_TEXPROFILE_SAMPLES ); |
|
bIsHistory = ( id == ID_TEXPROFILE_HISTORY ); |
|
|
|
switch ( message ) |
|
{ |
|
case WM_CREATE: |
|
// set the window identifier |
|
createStructPtr = ( CREATESTRUCT* )lParam; |
|
SetWindowLong( hwnd, GWL_USERDATA+0, ( LONG )createStructPtr->lpCreateParams ); |
|
|
|
// reset peaks |
|
g_texProfile_lastPeakTime = 0; |
|
return 0L; |
|
|
|
case WM_DESTROY: |
|
TexProfile_SaveConfig(); |
|
|
|
if ( bIsSamples ) |
|
g_texProfile_hWndSamples = NULL; |
|
else if ( bIsHistory ) |
|
g_texProfile_hWndHistory = NULL; |
|
|
|
if ( VProf_GetState() == VPROF_TEXTURE || VProf_GetState() == VPROF_TEXTUREFRAME ) |
|
{ |
|
VProf_Enable( VPROF_OFF ); |
|
} |
|
return 0L; |
|
|
|
case WM_INITMENU: |
|
if ( bIsSamples ) |
|
{ |
|
CheckMenuItem( ( HMENU )wParam, IDM_TEXPROFILE_TICKMARKS, MF_BYCOMMAND | ( g_texProfile_samples_tickMarks ? MF_CHECKED : MF_UNCHECKED ) ); |
|
CheckMenuItem( ( HMENU )wParam, IDM_TEXPROFILE_COLORS, MF_BYCOMMAND | ( g_texProfile_samples_colors ? MF_CHECKED : MF_UNCHECKED ) ); |
|
} |
|
else if ( bIsHistory ) |
|
{ |
|
CheckMenuItem( ( HMENU )wParam, IDM_TEXPROFILE_TICKMARKS, MF_BYCOMMAND | ( g_texProfile_history_tickMarks ? MF_CHECKED : MF_UNCHECKED ) ); |
|
CheckMenuItem( ( HMENU )wParam, IDM_TEXPROFILE_COLORS, MF_BYCOMMAND | ( g_texProfile_history_colors ? MF_CHECKED : MF_UNCHECKED ) ); |
|
} |
|
CheckMenuItem( ( HMENU )wParam, IDM_TEXPROFILE_ENABLE, MF_BYCOMMAND | ( ( VProf_GetState() == VPROF_TEXTURE || VProf_GetState() == VPROF_TEXTUREFRAME ) ? MF_CHECKED : MF_UNCHECKED ) ); |
|
CheckMenuItem( ( HMENU )wParam, IDM_TEXPROFILE_CURRENTFRAME, MF_BYCOMMAND | ( g_texProfile_currentFrame ? MF_CHECKED : MF_UNCHECKED ) ); |
|
return 0L; |
|
|
|
case WM_PAINT: |
|
GetClientRect( hwnd, &rect ); |
|
hdc = BeginPaint( hwnd, &ps ); |
|
if ( bIsSamples ) |
|
TexProfileSamples_Draw( hdc, &rect ); |
|
else if ( bIsHistory ) |
|
TexProfileHistory_Draw( hdc, &rect ); |
|
EndPaint( hwnd, &ps ); |
|
return 0L; |
|
|
|
case WM_SIZE: |
|
// force a redraw |
|
TexProfile_UpdateWindow(); |
|
return 0L; |
|
|
|
case WM_KEYDOWN: |
|
switch ( wParam ) |
|
{ |
|
case VK_INSERT: |
|
if ( bIsSamples ) |
|
TexProfile_ZoomIn( g_texProfile_samples_scale, TEXPROFILE_SAMPLES_SCALESTEPS ); |
|
else if ( bIsHistory ) |
|
TexProfile_ZoomIn( g_texProfile_history_scale, TEXPROFILE_HISTORY_SCALESTEPS ); |
|
return 0L; |
|
|
|
case VK_DELETE: |
|
if ( bIsSamples ) |
|
TexProfile_ZoomOut( g_texProfile_samples_scale, TEXPROFILE_SAMPLES_SCALESTEPS ); |
|
else if ( bIsHistory ) |
|
TexProfile_ZoomOut( g_texProfile_history_scale, TEXPROFILE_HISTORY_SCALESTEPS ); |
|
return 0L; |
|
} |
|
break; |
|
|
|
case WM_COMMAND: |
|
switch ( wID ) |
|
{ |
|
case IDM_TEXPROFILE_TICKMARKS: |
|
if ( bIsSamples ) |
|
g_texProfile_samples_tickMarks ^= 1; |
|
else if ( bIsHistory ) |
|
g_texProfile_history_tickMarks ^= 1; |
|
TexProfile_UpdateWindow(); |
|
return 0L; |
|
|
|
case IDM_TEXPROFILE_COLORS: |
|
if ( bIsSamples ) |
|
g_texProfile_samples_colors ^= 1; |
|
else if ( bIsHistory ) |
|
g_texProfile_history_colors ^= 1; |
|
TexProfile_UpdateWindow(); |
|
return 0L; |
|
|
|
case IDM_TEXPROFILE_ZOOMIN: |
|
if ( bIsSamples ) |
|
TexProfile_ZoomIn( g_texProfile_samples_scale, TEXPROFILE_SAMPLES_SCALESTEPS ); |
|
else if ( bIsHistory ) |
|
TexProfile_ZoomIn( g_texProfile_history_scale, TEXPROFILE_HISTORY_SCALESTEPS ); |
|
return 0L; |
|
|
|
case IDM_TEXPROFILE_ZOOMOUT: |
|
if ( bIsSamples ) |
|
TexProfile_ZoomOut( g_texProfile_samples_scale, TEXPROFILE_SAMPLES_SCALESTEPS ); |
|
else if ( bIsHistory ) |
|
TexProfile_ZoomOut( g_texProfile_history_scale, TEXPROFILE_HISTORY_SCALESTEPS ); |
|
return 0L; |
|
|
|
case IDM_TEXPROFILE_ENABLE: |
|
bIsEnabled = ( VProf_GetState() == VPROF_TEXTURE || VProf_GetState() == VPROF_TEXTUREFRAME ); |
|
bIsEnabled ^= 1; |
|
if ( !bIsEnabled ) |
|
VProf_Enable( VPROF_OFF ); |
|
else |
|
{ |
|
if ( !g_texProfile_currentFrame ) |
|
VProf_Enable( VPROF_TEXTURE ); |
|
else |
|
VProf_Enable( VPROF_TEXTUREFRAME ); |
|
} |
|
TexProfile_SetTitle(); |
|
return 0L; |
|
|
|
case IDM_TEXPROFILE_CURRENTFRAME: |
|
bIsEnabled = ( VProf_GetState() == VPROF_TEXTURE || VProf_GetState() == VPROF_TEXTUREFRAME ); |
|
g_texProfile_currentFrame ^= 1; |
|
if ( bIsEnabled ) |
|
{ |
|
if ( !g_texProfile_currentFrame ) |
|
VProf_Enable( VPROF_TEXTURE ); |
|
else |
|
VProf_Enable( VPROF_TEXTUREFRAME ); |
|
} |
|
TexProfile_SetTitle(); |
|
return 0L; |
|
} |
|
break; |
|
} |
|
return ( DefWindowProc( hwnd, message, wParam, lParam ) ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// TexProfileHistory_Open |
|
// |
|
//----------------------------------------------------------------------------- |
|
void TexProfileHistory_Open() |
|
{ |
|
HWND hWnd; |
|
|
|
if ( g_texProfile_hWndHistory ) |
|
{ |
|
// only one profile instance |
|
if ( IsIconic( g_texProfile_hWndHistory ) ) |
|
ShowWindow( g_texProfile_hWndHistory, SW_RESTORE ); |
|
SetForegroundWindow( g_texProfile_hWndHistory ); |
|
return; |
|
} |
|
|
|
if ( VProf_GetState() == VPROF_OFF ) |
|
{ |
|
if ( !g_texProfile_currentFrame ) |
|
VProf_Enable( VPROF_TEXTURE ); |
|
else |
|
VProf_Enable( VPROF_TEXTUREFRAME ); |
|
} |
|
|
|
hWnd = CreateWindowEx( |
|
WS_EX_CLIENTEDGE, |
|
"TEXPROFILEHISTORYCLASS", |
|
"", |
|
WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX|WS_MINIMIZEBOX|WS_MAXIMIZEBOX, |
|
0, |
|
0, |
|
600, |
|
500, |
|
g_hDlgMain, |
|
NULL, |
|
g_hInstance, |
|
( void* )ID_TEXPROFILE_HISTORY ); |
|
g_texProfile_hWndHistory = hWnd; |
|
|
|
TexProfile_SetTitle(); |
|
|
|
if ( g_texProfile_historyWindowRect.right && g_texProfile_historyWindowRect.bottom ) |
|
MoveWindow( g_texProfile_hWndHistory, g_texProfile_historyWindowRect.left, g_texProfile_historyWindowRect.top, g_texProfile_historyWindowRect.right-g_texProfile_historyWindowRect.left, g_texProfile_historyWindowRect.bottom-g_texProfile_historyWindowRect.top, FALSE ); |
|
ShowWindow( g_texProfile_hWndHistory, SHOW_OPENWINDOW ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// TexProfileSamples_Open |
|
// |
|
//----------------------------------------------------------------------------- |
|
void TexProfileSamples_Open() |
|
{ |
|
HWND hWnd; |
|
|
|
if ( g_texProfile_hWndSamples ) |
|
{ |
|
// only one profile instance |
|
if ( IsIconic( g_texProfile_hWndSamples ) ) |
|
ShowWindow( g_texProfile_hWndSamples, SW_RESTORE ); |
|
SetForegroundWindow( g_texProfile_hWndSamples ); |
|
return; |
|
} |
|
|
|
if ( VProf_GetState() == VPROF_OFF ) |
|
{ |
|
if ( !g_texProfile_currentFrame ) |
|
VProf_Enable( VPROF_TEXTURE ); |
|
else |
|
VProf_Enable( VPROF_TEXTUREFRAME ); |
|
} |
|
|
|
hWnd = CreateWindowEx( |
|
WS_EX_CLIENTEDGE, |
|
"TEXPROFILESAMPLESCLASS", |
|
"", |
|
WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX|WS_MINIMIZEBOX|WS_MAXIMIZEBOX, |
|
0, |
|
0, |
|
600, |
|
500, |
|
g_hDlgMain, |
|
NULL, |
|
g_hInstance, |
|
( void* )ID_TEXPROFILE_SAMPLES ); |
|
g_texProfile_hWndSamples = hWnd; |
|
|
|
TexProfile_SetTitle(); |
|
|
|
if ( g_texProfile_samplesWindowRect.right && g_texProfile_samplesWindowRect.bottom ) |
|
MoveWindow( g_texProfile_hWndSamples, g_texProfile_samplesWindowRect.left, g_texProfile_samplesWindowRect.top, g_texProfile_samplesWindowRect.right-g_texProfile_samplesWindowRect.left, g_texProfile_samplesWindowRect.bottom-g_texProfile_samplesWindowRect.top, FALSE ); |
|
ShowWindow( g_texProfile_hWndSamples, SHOW_OPENWINDOW ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// TexProfile_Clear |
|
// |
|
//----------------------------------------------------------------------------- |
|
void TexProfile_Clear() |
|
{ |
|
// clear counters and history |
|
g_texProfile_numCounters = 0; |
|
g_texProfile_numSamples = 0; |
|
|
|
TexProfile_UpdateWindow(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// TexProfile_Init |
|
// |
|
//----------------------------------------------------------------------------- |
|
bool TexProfile_Init() |
|
{ |
|
WNDCLASS wndclass; |
|
|
|
// set up our window class |
|
memset( &wndclass, 0, sizeof( wndclass ) ); |
|
wndclass.style = 0; |
|
wndclass.lpfnWndProc = TexProfile_WndProc; |
|
wndclass.cbClsExtra = 0; |
|
wndclass.cbWndExtra = 0; |
|
wndclass.hInstance = g_hInstance; |
|
wndclass.hIcon = g_hIcons[ICON_APPLICATION]; |
|
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); |
|
wndclass.hbrBackground = g_hBackgroundBrush; |
|
wndclass.lpszMenuName = MAKEINTRESOURCE( MENU_TEXPROFILE ); |
|
wndclass.lpszClassName = "TEXPROFILESAMPLESCLASS"; |
|
if ( !RegisterClass( &wndclass ) ) |
|
return false; |
|
|
|
// set up our window class |
|
memset( &wndclass, 0, sizeof( wndclass ) ); |
|
wndclass.style = 0; |
|
wndclass.lpfnWndProc = TexProfile_WndProc; |
|
wndclass.cbClsExtra = 0; |
|
wndclass.cbWndExtra = 0; |
|
wndclass.hInstance = g_hInstance; |
|
wndclass.hIcon = g_hIcons[ICON_APPLICATION]; |
|
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); |
|
wndclass.hbrBackground = g_hBackgroundBrush; |
|
wndclass.lpszMenuName = MAKEINTRESOURCE( MENU_TEXPROFILE ); |
|
wndclass.lpszClassName = "TEXPROFILEHISTORYCLASS"; |
|
if ( !RegisterClass( &wndclass ) ) |
|
return false; |
|
|
|
TexProfile_LoadConfig(); |
|
|
|
return true; |
|
} |