gl_harness.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:4k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1996. */
  2. /* This program is freely distributable without licensing fees 
  3.    and is provided without guarantee or warrantee expressed or 
  4.    implied. This program is -not- in the public domain. */
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <GL/glut.h>
  9. extern testInit(int argc, char **argv, int width, int height);
  10. extern testRender(void);
  11. int testIterationsStep, testDisplayMode, testMinimumTestTime;
  12. float timeEnd, timeStart;
  13. int error;
  14. int renders = 0, damaged = 0;
  15. /* ARGSUSED */
  16. void
  17. report(int value)
  18. {
  19.   float duration;
  20.   duration = (timeEnd - timeStart) / 1000.0;
  21.   printf("Renders/second = %gn",
  22.     renders / duration);
  23.   printf("  after %d iterations over %g secondsn",
  24.     renders, duration);
  25.   if (error != GL_NO_ERROR)
  26.     printf("OpenGL errors occurred during test; RESULTS ARE DUBIOUS.n");
  27.   if (damaged != 1)
  28.     printf("Window disturbed during test; RESULTS ARE DUBIOUS.n");
  29.   printf("n");
  30.   exit(damaged != 1);
  31. }
  32. /* ARGSUSED */
  33. void
  34. ensureEventsGotten(int value)
  35. {
  36.   /* Hack.  Creating a new window _ensures_ any outstanding
  37.      expose event from popping the window will be retrieved. */
  38.   glutCreateWindow("dummy");
  39.   glutHideWindow();
  40.   glutTimerFunc(1, report, 0);
  41. }
  42. void
  43. displayDone(void)
  44. {
  45.   if (glutLayerGet(GLUT_NORMAL_DAMAGED))
  46.     damaged++;
  47. }
  48. /* ARGSUSED */
  49. void
  50. done(int value)
  51. {
  52.   glFinish();
  53.   timeEnd = glutGet(GLUT_ELAPSED_TIME);
  54.   error = glGetError();
  55.   /* Pop the window.  If the window was obscured by another
  56.      window during the test, raising the window should generate
  57.      an expose event we want to catch. */
  58.   glutPopWindow();
  59.   /* The test is over so only notice an expose and do not run
  60.      the testRender routine. */
  61.   glutDisplayFunc(displayDone);
  62.   glutTimerFunc(1, ensureEventsGotten, 0);
  63. }
  64. void
  65. display(void)
  66. {
  67.   int i;
  68.   if (glutLayerGet(GLUT_NORMAL_DAMAGED)) {
  69.     damaged++;
  70.     if (damaged == 1) {
  71.       glutTimerFunc(testMinimumTestTime * 1000, done, 0);
  72.       timeStart = glutGet(GLUT_ELAPSED_TIME);
  73.     }
  74.   }
  75.   for (i = 0; i < testIterationsStep; i++) {
  76.     testRender();
  77.     renders++;
  78.   }
  79.   glutPostRedisplay();
  80. }
  81. void
  82. visible(int state)
  83. {
  84.   if (state == GLUT_NOT_VISIBLE)
  85.     damaged++;
  86. }
  87. int
  88. main(int argc, char **argv)
  89. {
  90.   char *newArgv[100];
  91.   int newArgc, i;
  92.   /* Defaults; testInit may override these. */
  93.   testIterationsStep = 5;
  94.   testDisplayMode = GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH;
  95.   testMinimumTestTime = 10;  /* seconds */
  96.   glutInit(&argc, argv);
  97.   newArgc = 1;
  98.   newArgv[0] = argv[0];
  99.   for (i = 1; i < argc; i++) {
  100.     if (!strcmp("-time", argv[i])) {
  101.       i++;
  102.       if (argv[i] == NULL) {
  103.         fprintf(stderr, "%s: -time option needs argumentn", argv[0]);
  104.         exit(1);
  105.       }
  106.       testMinimumTestTime = (int) strtol(argv[i], NULL, 0);
  107.     } else if (!strcmp("-mode", argv[i])) {
  108.       i++;
  109.       if (argv[i] == NULL) {
  110.         fprintf(stderr, "%s: -mode option needs argumentn", argv[0]);
  111.         exit(1);
  112.       }
  113.       testDisplayMode = (int) strtol(argv[i], NULL, 0);
  114.     } else if (!strcmp("-iters", argv[i])) {
  115.       i++;
  116.       if (argv[i] == NULL) {
  117.         fprintf(stderr, "%s: -mode option needs argumentn", argv[0]);
  118.         exit(1);
  119.       }
  120.       testIterationsStep = (int) strtol(argv[i], NULL, 0);
  121.     } else {
  122.       newArgv[newArgc] = argv[i];
  123.       newArgc++;
  124.     }
  125.   }
  126.   newArgv[newArgc] = NULL;
  127.   glutInitDisplayMode(testDisplayMode);
  128.   glutCreateWindow("OpenGL performance test");
  129.   glutDisplayFunc(display);
  130.   glutVisibilityFunc(visible);
  131.   testInit(newArgc, newArgv,
  132.     glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  133.   glutMainLoop();
  134.   return 0;             /* ANSI C requires main to return int. */
  135. }