windows-nt/Source/XPSP1/NT/multimedia/opengl/test/profiler/profiler.cpp
2020-09-26 16:20:57 +08:00

394 lines
13 KiB
C++

#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <commdlg.h>
#include "prfl.h"
#include "skeltest.h"
#include "hugetest.h"
#include "primtest.h"
#include "resource.h"
#include "macros.h"
#include "square.h"
#include "large1.h"
#include "small1.h"
#include "teapot.h"
#include "large2.h"
#include "small2.h"
#include "tptlght.h"
#include "tpttxtr.h"
static LPCTSTR lpszAppName = "Profiler";
typedef PrimativeTest NewTestType;
HINSTANCE hInstance;
HWND hWndMain;
#define MAXNUMBEROFTESTS 40
SkeletonTest *tests[MAXNUMBEROFTESTS];
static int iNumberOfTests = 0;
#define DisableWindow(x) EnableWindow(x,FALSE)
LRESULT CALLBACK mainWndProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK renameDlgProc(HWND, UINT, WPARAM, LPARAM);
// Entry point of all Windows programs
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int iCmdShow)
{
MSG msg;
WNDCLASSEX wc;
HACCEL hAccel;
hInstance = hInst;
// Register Window style
wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC) mainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = DLGWINDOWEXTRA;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) COLOR_BTNSHADOW;
wc.lpszMenuName = NULL;
wc.lpszClassName = lpszAppName;
wc.hIconSm = NULL;
// Register the window class
if(RegisterClassEx(&wc) == 0)
exit(-1);
if (prfl_RegisterClass(hInstance) == FALSE)
exit(-1);
bzero(tests,sizeof(tests));
tests[0] = new SkeletonTest;
tests[1] = new HugeTest;
tests[2] = new PrimativeTest;
tests[3] = new TeapotTest;
tests[4] = new LargeTriangle;
tests[5] = new SmallTriangle;
tests[6] = new SquareTest;
tests[7] = new TeapotTextureTest;
tests[8] = new TeapotLightTest;
tests[9] = new LargeTriangle2;
tests[10] = new SmallTriangle2;
iNumberOfTests = 11;
hWndMain = CreateDialog(hInstance, lpszAppName, 0, NULL);
// I'm not sure why, but my window isn't getting a WM_INITDIALOG
// message, so we'll just force it to get one.
// Perhaps because I'm using CreateDialog instead of DialogBox?
SendMessage(hWndMain, WM_INITDIALOG, 0, 0);
hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
while(GetMessage(&msg, NULL, 0, 0)) {
if (!TranslateAccelerator(hWndMain, hAccel, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
void EnableRunmode(HWND hDlg, BOOL f) {
EnableWindow(GetDlgItem(hDlg,M_IDC_WHICHTEST), !f); // Test list
EnableWindow(GetDlgItem(hDlg,M_IDC_CONFIG), !f); // Config
EnableWindow(GetDlgItem(hDlg,M_IDC_NEW), !f); // New
EnableWindow(GetDlgItem(hDlg,M_IDC_DELETE), !f); // Delete
EnableWindow(GetDlgItem(hDlg,M_IDC_RENAME), !f); // Rename
EnableWindow(GetDlgItem(hDlg,M_IDC_RUN), !f); // Run
EnableWindow(GetDlgItem(hDlg,M_IDC_ABORT), f); // Abort
EnableWindow(GetDlgItem(hDlg,M_IDC_QUIT), !f); // Quit
if (iNumberOfTests == MAXNUMBEROFTESTS) {
EnableWindow(GetDlgItem(hDlg, M_IDC_NEW), FALSE);
EnableWindow(GetDlgItem(hDlg, M_IDC_LOAD), FALSE);
}
if (iNumberOfTests == 1)
EnableWindow(GetDlgItem(hDlg, M_IDC_DELETE), FALSE);
}
int UpdateTestList(HWND hDlg, int iRadio)
{
int i;
if (iRadio >= iNumberOfTests)
iRadio = 0;
CB_DlgResetContent(hDlg, M_IDC_WHICHTEST);
CB_DlgSetRedraw(hDlg, M_IDC_WHICHTEST, FALSE);
for (i = 0 ; i < iNumberOfTests ; i++) {
CB_DlgAddString(hDlg, M_IDC_WHICHTEST, tests[i]->QueryName());
}
CB_DlgSetRedraw(hDlg, M_IDC_WHICHTEST, TRUE);
CB_DlgSetSelect(hDlg, M_IDC_WHICHTEST, iRadio);
SetFocus(GetDlgItem(hDlg, M_IDC_RUN));
return iRadio;
};
void main_test_end_callback()
{
PostMessage(hWndMain, WM_USER, 0, 0);
}
// Window procedure, handles all messages for this window
LRESULT CALLBACK mainWndProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
static char szFileName[_MAX_PATH];
static char szTitleName[_MAX_FNAME + _MAX_EXT];
static OPENFILENAME ofn;
static int iRadio = 0;
static char szFilter[] = "Test Files (*.TST)\0*.tst\0" \
"All Files (*.*)\0*.*\0\0" ;
static char acBuffer[120];
void *pTmp;
char *pc;
HANDLE hFile;
int iControl;
int i;
switch (msg)
{
case WM_CREATE:
ofn.lStructSize = sizeof (OPENFILENAME);
ofn.hwndOwner = hDlg;
ofn.hInstance = NULL;
ofn.lpstrFilter = szFilter;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = szFileName;
ofn.nMaxFile = _MAX_PATH;
ofn.lpstrFileTitle = szTitleName;
ofn.nMaxFileTitle = _MAX_FNAME + _MAX_EXT;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = NULL;
ofn.Flags = 0; // Set in Open and Close functions
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = "tst";
ofn.lCustData = 0L;
ofn.lpfnHook = NULL;
ofn.lpTemplateName = NULL;
break;
case WM_INITDIALOG:
iRadio = UpdateTestList(hDlg,iRadio);
return 0; // WM_INITDIALOG
case WM_COMMAND:
{
iControl = LOWORD(wParam);
switch (iControl)
{
case M_IDC_WHICHTEST:
iRadio = CB_DlgGetSelect(hDlg, M_IDC_WHICHTEST);
break;
case M_IDC_CONFIG:
// if (tests[iRadio])
if (-1 == tests[iRadio]->cnfgfunct(hDlg)) {
MessageBeep(MB_OK);
fprintf(stderr,"error calling cnfgfunct()\n");
MessageBox(hDlg,"An error occured.",NULL,
MB_OK|MB_ICONERROR);
}
break;
case M_IDC_NEW: // New
if (iNumberOfTests == MAXNUMBEROFTESTS) {
MessageBox(hDlg,
"Sorry, you've already got too many tests.",
NULL, MB_OK|MB_ICONERROR);
break;
}
tests[iNumberOfTests] = new NewTestType;
iNumberOfTests++;
if (iNumberOfTests == MAXNUMBEROFTESTS) {
EnableWindow(GetDlgItem(hDlg, M_IDC_NEW), FALSE);
EnableWindow(GetDlgItem(hDlg, M_IDC_LOAD), FALSE);
}
iRadio = UpdateTestList(hDlg,iRadio);
break;
case M_IDC_DELETE: // Delete
if (iNumberOfTests == 1)
break;
delete(tests[iRadio]);
iNumberOfTests--;
tests[iRadio] = tests[iNumberOfTests];
if (iNumberOfTests == 1)
EnableWindow(GetDlgItem(hDlg, M_IDC_DELETE), FALSE);
iRadio = UpdateTestList(hDlg,iRadio);
break;
case M_IDC_RENAME: // Rename
pc = (char*)DialogBoxParam(hInstance,
MAKEINTRESOURCE(IDD_RENAME),hDlg,
(DLGPROC)renameDlgProc,
(LPARAM)tests[iRadio]->QueryName());
if (pc) {
tests[iRadio]->Rename(pc);
}
iRadio = UpdateTestList(hDlg,iRadio);
break;
case M_IDC_LOAD: // Load
if (iNumberOfTests == MAXNUMBEROFTESTS) {
MessageBox(hDlg,
"Sorry, you've already got too many tests.",
NULL, MB_OK|MB_ICONERROR);
break;
}
ofn.hwndOwner = hDlg;
ofn.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST;
if (GetOpenFileName (&ofn)) {
fprintf(stderr, "file to open: %s\n", szFileName);
} else {
fprintf(stderr, "load canceled\n");
break;
}
pTmp = prfl_AutoLoad(szFileName, &i);
if (i) {
MessageBox(hDlg, (char*)pTmp, NULL, MB_OK | MB_ICONERROR);
break;
}
tests[iNumberOfTests] = (SkeletonTest*) pTmp;
iRadio = iNumberOfTests;
iNumberOfTests++;
if (iNumberOfTests == MAXNUMBEROFTESTS) {
EnableWindow(GetDlgItem(hDlg, M_IDC_NEW), FALSE);
EnableWindow(GetDlgItem(hDlg, M_IDC_LOAD), FALSE);
}
iRadio = UpdateTestList(hDlg,iRadio);
break;
case M_IDC_SAVE: // Save
ofn.hwndOwner = hDlg;
ofn.Flags = OFN_HIDEREADONLY;
if (GetSaveFileName (&ofn)) {
fprintf(stderr,"file to save: %s\n",szFileName);
} else {
fprintf(stderr,"save canceled\n");
break;
}
hFile = CreateFile(szFileName, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile == INVALID_HANDLE_VALUE) {
fprintf(stderr,"Error opening file: %d\n",GetLastError());
break;
}
i = tests[iRadio]->Save(hFile);
if (i < 0) {
sprintf(acBuffer,"Error number %d while reading file",i);
MessageBox(hDlg,acBuffer,NULL,MB_OK|MB_ICONERROR);
}
if (!CloseHandle(hFile))
fprintf(stderr,"Error closing file: %d\n",GetLastError());
break;
case M_IDC_RUN: // Run
EnableRunmode(hDlg,TRUE);
if (!prfl_StartTest(tests[iRadio],
tests[iRadio]->QueryName(),
main_test_end_callback)) {
fprintf(stderr,"%cError: StartTest == FALSE\n",7);
}
break;
case M_IDC_ABORT:
prfl_StopTest();
KillTimer(hDlg,101);
EnableRunmode(hDlg,FALSE);
break;
case M_IDC_QUIT: // Quit
DestroyWindow(hDlg);
break;
default: // This is an error!
MessageBeep(0);
return DefWindowProc(hDlg,msg,wParam,lParam);
}
}
return 0; // WM_COMMAND
case WM_TIMER:
KillTimer(hDlg,101);
case WM_USER:
if (prfl_TestRunning()) {
SetTimer(hDlg, 101, 1, NULL);
} else {
char acStr[200];
double dNumCalls, dDuration, dResult;
dNumCalls = prfl_GetCount();
dDuration = prfl_GetDuration();
dResult = prfl_GetResult();
sprintf(acStr,
"Test:\t%s\r"
"duration (ms):\t%.10g\r"
"frames drawn: \t%.10g\r"
"FPS: \t%.10g\r"
"%-12s: \t%.10g\r"
"%cPS: \t%.10g",
tests[iRadio]->QueryName(),
dDuration,
dNumCalls,
dNumCalls*1000/dDuration,
tests[iRadio]->td.acTestStatName, dResult,
*tests[iRadio]->td.acTestStatName,dResult*1000/dDuration);
MessageBox(hDlg,acStr,"Test Results",MB_ICONINFORMATION|MB_OK);
EnableRunmode(hDlg,FALSE);
}
return 0; // WM_TIMER
case WM_DESTROY:
PostQuitMessage(0);
return 0; // WM_DESTROY
}
return DefWindowProc(hDlg,msg,wParam,lParam);
}
BOOL CALLBACK renameDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
static char acBuffer[120];
switch (msg)
{
case WM_INITDIALOG:
SetDlgItemText(hDlg, M_IDC_NEWNAME, (char*) lParam);
return TRUE;
case WM_COMMAND:
{
int i = LOWORD(wParam);
switch (i)
{
case IDOK:
GetDlgItemText(hDlg,M_IDC_NEWNAME,acBuffer,sizeof(acBuffer));
EndDialog(hDlg, (int) acBuffer);
break;
case IDCANCEL:
EndDialog(hDlg, 0);
break;
}
}
return 0; // WM_COMMAND
}
return 0;
}