diff options
Diffstat (limited to 'utils/xbox/vxconsole/tex_profile.cpp')
| -rw-r--r-- | utils/xbox/vxconsole/tex_profile.cpp | 993 |
1 files changed, 993 insertions, 0 deletions
diff --git a/utils/xbox/vxconsole/tex_profile.cpp b/utils/xbox/vxconsole/tex_profile.cpp new file mode 100644 index 0000000..8c3ddf1 --- /dev/null +++ b/utils/xbox/vxconsole/tex_profile.cpp @@ -0,0 +1,993 @@ +//========= 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; +}
\ No newline at end of file |