//========= 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 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 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 -TEXPROFILE_SAMPLES_SCALESTEPS ) { // minor ticks x0 = x; y0 = y + TEXPROFILE_SAMPLES_ITEMHEIGHT; SelectObject( hdc, hGreyPen ); for ( j=0; j 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 -TEXPROFILE_HISTORY_SCALESTEPS ) { // minor ticks y0 = y; SelectObject( hdc, hGreyPen ); for ( j=0; j=0; x-=4 ) { // all the counters at this sample y = windowHeight; for ( j=0; j 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; }