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

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * This program is under the GNU GPL.
  3.  * Use at your own risk.
  4.  *
  5.  * written by David Bucciarelli (tech.hmw@plus.it)
  6.  *            Humanware s.r.l.
  7.  */
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <math.h>
  12. #include <GL/glut.h>
  13. typedef struct {
  14.   char *name;
  15.   char *unit;
  16.   void (*init)(void);
  17.   int (*run)(int, int);
  18.   int type;
  19.   int numsize;
  20.   int size[10];
  21. } benchmark;
  22. static int frontbuffer=1;
  23. /***************************************************************************/
  24. static void init_test01(void)
  25. {
  26.   glMatrixMode(GL_PROJECTION);
  27.   glLoadIdentity();
  28.   gluOrtho2D(-0.5,639.5,-0.5,479.5);
  29.   glMatrixMode(GL_MODELVIEW);
  30.   glShadeModel(GL_FLAT);
  31.   glDisable(GL_DEPTH_TEST);
  32.   glClearColor(0.0,0.1,1.0,0.0);
  33.   glClear(GL_COLOR_BUFFER_BIT);
  34.   glColor3f(1.0,0.0,0.0);
  35. }
  36. /* ARGSUSED */
  37. static int test01(int size, int num)
  38. {
  39.   int x,y;
  40.   glBegin(GL_POINTS);
  41.   for(y=0;y<num;y++)
  42.     for(x=0;x<480;x++)
  43.       glVertex2i(x,x);
  44.   glEnd();
  45.   return 480*num;
  46. }
  47. /***************************************************************************/
  48. static void init_test02(void)
  49. {
  50.   glMatrixMode(GL_PROJECTION);
  51.   glLoadIdentity();
  52.   gluOrtho2D(-0.5,639.5,-0.5,479.5);
  53.   glMatrixMode(GL_MODELVIEW);
  54.   glShadeModel(GL_SMOOTH);
  55.   glDisable(GL_DEPTH_TEST);
  56.   glClearColor(0.0,0.1,1.0,0.0);
  57.   glClear(GL_COLOR_BUFFER_BIT);
  58. }
  59. static int test02(int size, int num)
  60. {
  61.   int x,y;
  62.   glBegin(GL_LINES);
  63.   for(y=0;y<num;y++)
  64.     for(x=0;x<size;x++) {
  65.       glColor3f(0.0,1.0,y/(float)num);
  66.       glVertex2i(0,size-1);
  67.       glColor3f(1.0,0.0,x/(float)size);
  68.       glVertex2i(x,x);
  69.     }
  70.   glEnd();
  71.   return num*size;
  72. }
  73. /***************************************************************************/
  74. static void init_test03(void)
  75. {
  76.   glMatrixMode(GL_PROJECTION);
  77.   glLoadIdentity();
  78.   glOrtho(-0.5,639.5,-0.5,479.5,1.0,-1000.0*480.0);
  79.   glMatrixMode(GL_MODELVIEW);
  80.   glShadeModel(GL_SMOOTH);
  81.   glEnable(GL_DEPTH_TEST);
  82.   glClearColor(0.0,0.1,1.0,0.0);
  83.   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  84. }
  85. static int test03(int size, int num)
  86. {
  87.   int x,y,z;
  88.   glBegin(GL_TRIANGLES);
  89.   for(y=0;y<num;y++)
  90.     for(x=0;x<size;x+=5) {
  91.       z=num*size-(y*size+x);
  92.       glColor3f(0.0,1.0,0.0);
  93.       glVertex3i(0,x,z);
  94.       glColor3f(1.0,0.0,x/(float)size);
  95.       glVertex3i(size-1-x,0,z);
  96.       glColor3f(1.0,x/(float)size,0.0);
  97.       glVertex3i(x,size-1-x,z);
  98.     }
  99.   glEnd();
  100.   return size*num/5;
  101. }
  102. /***************************************************************************/
  103. static void init_test04(void)
  104. {
  105.   int x,y;
  106.   GLubyte tex[128*128*3];
  107.   GLenum gluerr;
  108.   glMatrixMode(GL_PROJECTION);
  109.   glLoadIdentity();
  110.   glOrtho(-0.5,639.5,-0.5,479.5,1.0,-1000.0*480.0);
  111.   glMatrixMode(GL_MODELVIEW);
  112.   glShadeModel(GL_SMOOTH);
  113.   glEnable(GL_DEPTH_TEST);
  114.   glEnable(GL_BLEND);
  115.   glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  116.   for(y=0;y<128;y++)
  117.     for(x=0;x<128;x++) {
  118.       tex[(x+y*128)*3+0]=((x % (128/4)) < (128/8)) ? 255 : 0;
  119.       tex[(x+y*128)*3+1]=((y % (128/4)) < (128/8)) ? 255 : 0;
  120.       tex[(x+y*128)*3+2]=x;
  121.     }
  122.   glPixelStorei(GL_UNPACK_ALIGNMENT,1);
  123.   if((gluerr=gluBuild2DMipmaps(GL_TEXTURE_2D,3,128,128,GL_RGB,
  124.        GL_UNSIGNED_BYTE,(GLvoid *)(&tex[0])))) {
  125.     fprintf(stderr,"GLULib%sn",gluErrorString(gluerr));
  126.     exit(-1);
  127.   }
  128.   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  129.   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  130.   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_LINEAR);
  131.   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  132.   glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
  133.   glEnable(GL_TEXTURE_2D);
  134.   glClearColor(0.0,0.1,1.0,0.0);
  135.   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  136. }
  137. static int test04(int size, int num)
  138. {
  139.   int x,y,z;
  140.   glBegin(GL_TRIANGLES);
  141.   for(y=0;y<num;y++)
  142.     for(x=0;x<size;x+=5) {
  143.       z=num*size-(y*size+x);
  144.       glTexCoord2f(1.0,1.0);
  145.       glColor3f(1.0,0.0,0.0);
  146.       glVertex3i(0,x,z);
  147.       glTexCoord2f(0.0,1.0);
  148.       glColor3f(0.0,1.0,0.0);
  149.       glVertex3i(size-1-x,0,z);
  150.       glTexCoord2f(1.0,0.0);
  151.       glColor3f(0.0,0.0,1.0);
  152.       glVertex3i(x,size-1-x,z);
  153.     }
  154.   glEnd();
  155.   return num*size/5;
  156. }
  157. /***************************************************************************/
  158. static void init_test05(void)
  159. {
  160.   int x,y;
  161.   GLubyte tex[128*128*3];
  162.   GLenum gluerr;
  163.   glMatrixMode(GL_PROJECTION);
  164.   glLoadIdentity();
  165.   glOrtho(-0.5,639.5,-0.5,479.5,-1.0,1.0);
  166.   glMatrixMode(GL_MODELVIEW);
  167.   glShadeModel(GL_SMOOTH);
  168.   glEnable(GL_DEPTH_TEST);
  169.   glEnable(GL_BLEND);
  170.   glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  171.   for(y=0;y<128;y++)
  172.     for(x=0;x<128;x++) {
  173.       tex[(x+y*128)*3+0]=((x % (128/4)) < (128/8)) ? 255 : 0;
  174.       tex[(x+y*128)*3+1]=((y % (128/4)) < (128/8)) ? 255 : 0;
  175.       tex[(x+y*128)*3+2]=x;
  176.     }
  177.   glPixelStorei(GL_UNPACK_ALIGNMENT,1);
  178.   if((gluerr=gluBuild2DMipmaps(GL_TEXTURE_2D,3,128,128,GL_RGB,
  179.        GL_UNSIGNED_BYTE,(GLvoid *)(&tex[0])))) {
  180.     fprintf(stderr,"GLULib%sn",gluErrorString(gluerr));
  181.     exit(-1);
  182.   }
  183.   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  184.   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  185.   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_LINEAR);
  186.   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  187.   glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
  188.   glEnable(GL_TEXTURE_2D);
  189.   glDepthFunc(GL_ALWAYS);
  190.   glClearColor(0.0,0.1,1.0,0.0);
  191.   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  192. }
  193. static int test05(int size, int num)
  194. {
  195.   int y;
  196.   float v0[3];
  197.   float v1[3];
  198.   float v2[3];
  199.   float v3[3];
  200.   float cv0[3]={1.0,0.0,0.0};
  201.   float cv1[3]={1.0,1.0,0.0};
  202.   float cv2[3]={1.0,0.0,1.0};
  203.   float cv3[3]={1.0,1.0,1.0};
  204.   float tv0[3]={0.0,0.0};
  205.   float tv1[3]={1.0,0.0};
  206.   float tv2[3]={0.0,1.0};
  207.   float tv3[3]={1.0,1.0};
  208.   v0[0] = 320-size/2;
  209.   v0[1] = 240-size/2;
  210.   v0[2] = 0.0;
  211.   v1[0] = 320+size/2;
  212.   v1[1] = 240-size/2;
  213.   v1[2] = 0.0;
  214.   v2[0] = 320-size/2;
  215.   v2[1] = 240+size/2;
  216.   v2[2] = 0.0;
  217.   v3[0] = 320+size/2;
  218.   v3[1] = 240+size/2;
  219.   v3[2] = 0.0;
  220.   glBegin(GL_TRIANGLE_STRIP);
  221.   for(y=0;y<num;y++) {
  222.     glColor3fv(cv0);
  223.     glTexCoord2fv(tv0);
  224.     glVertex3fv(v0);
  225.     glColor3fv(cv1);
  226.     glTexCoord2fv(tv1);
  227.     glVertex3fv(v1);
  228.     glColor3fv(cv2);
  229.     glTexCoord2fv(tv2);
  230.     glVertex3fv(v2);
  231.     glColor3fv(cv3);
  232.     glTexCoord2fv(tv3);
  233.     glVertex3fv(v3);
  234.   }
  235.   glEnd();
  236.   return 4*num-2;
  237. }
  238. /***************************************************************************/
  239. static void init_test06(void)
  240. {
  241.   glMatrixMode(GL_PROJECTION);
  242.   glLoadIdentity();
  243.   gluOrtho2D(-0.5,639.5,-0.5,479.5);
  244.   glMatrixMode(GL_MODELVIEW);
  245.   glShadeModel(GL_SMOOTH);
  246.   glEnable(GL_DEPTH_TEST);
  247.   glClearColor(0.0,0.1,1.0,0.0);
  248.   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  249. }
  250. /* ARGSUSED */
  251. static int test06(int size, int num)
  252. {
  253.   int y;
  254.   for(y=0;y<num;y++) {
  255.     glClearColor(y/(float)num,0.1,1.0,0.0);
  256.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  257.   }
  258.   return num;
  259. }
  260. /***************************************************************************/
  261. #define BMARKS_TIME 5.0
  262. #define NUM_BMARKS 6
  263. /* 554 ~= sqrt(640*480) */
  264. static benchmark bmarks[NUM_BMARKS]={
  265.   {"Simple Points","Pnts",init_test01,test01,0,0,{0,0,0,0,0,0,0,0,0,0}},
  266.   {"Smooth Lines","Lins",init_test02,test02,1,5,{480,250,100,50,25,0,0,0,0,0}},
  267.   {"ZSmooth Triangles","Tris",init_test03,test03,1,5,{480,250,100,50,25,0,0,0,0,0}},
  268.   {"ZSmooth Tex Blend Triangles","Tris",init_test04,test04,1,5,{480,250,100,50,25,0,0,0,0,0}},
  269.   {"ZSmooth Tex Blend TMesh Triangles","Tris",init_test05,test05,2,8,{400,250,100,50,25,10,5,2,0,0}},
  270.   {"Color/Depth Buffer Clears","Clrs",init_test06,test06,3,0,{554,0,0,0,0,0,0,0,0,0}}
  271. };
  272. /***************************************************************************/
  273. static void dotest0param(benchmark *bmark)
  274. {
  275.   float stime,etime,dtime,tottime,maxtime,mintime;
  276.   int num,numelem,calibnum,j;
  277.   glPushAttrib(GL_ALL_ATTRIB_BITS);
  278.   bmark->init();
  279.   stime=glutGet(GLUT_ELAPSED_TIME);
  280.   dtime=0.0;
  281.   calibnum=0;
  282.   while(dtime<2.0) {
  283.     bmark->run(0,1);
  284.     glFinish();
  285.     etime=glutGet(GLUT_ELAPSED_TIME);
  286.     dtime=(etime-stime)/1000.0;
  287.     calibnum++;
  288.   }
  289.   glPopAttrib();
  290.   fprintf(stderr,"Elapsed time for the calibration test (%d): %fn",calibnum,dtime);
  291.   num=(int)((BMARKS_TIME/dtime)*calibnum);
  292.   if(num<1)
  293.     num=1;
  294.   fprintf(stderr,"Selected number of benchmark iterations: %dn",num);
  295.   mintime=HUGE_VAL;
  296.   maxtime=-HUGE_VAL;
  297.   for(tottime=0.0,j=0;j<5;j++) {
  298.     glPushAttrib(GL_ALL_ATTRIB_BITS);
  299.     bmark->init();
  300.     stime=glutGet(GLUT_ELAPSED_TIME);
  301.     numelem=bmark->run(0,num);
  302.     glFinish();
  303.     etime=glutGet(GLUT_ELAPSED_TIME);
  304.     glPopAttrib();
  305.     dtime=(etime-stime)/1000.0;
  306.     tottime+=dtime;
  307.     fprintf(stderr,"Elapsed time for run %d: %fn",j,dtime);
  308.     if(dtime<mintime)
  309.       mintime=dtime;
  310.     if(dtime>maxtime)
  311.       maxtime=dtime;
  312.   }
  313.   tottime-=mintime+maxtime;
  314.   fprintf(stdout,"%sn%f %s/sec",bmark->name,numelem/(tottime/3.0),bmark->unit);
  315.   if(bmark->type==3)
  316.     fprintf(stdout,", MPixel Fill/sec: %fnn",
  317.     (numelem*bmark->size[0]*(float)bmark->size[0])/(1000000.0*tottime/3.0));
  318.   else
  319.     fprintf(stdout,"nn");
  320. }
  321. /***************************************************************************/
  322. static void dotest1param(benchmark *bmark)
  323. {
  324.   float stime,etime,dtime,tottime,maxtime,mintime;
  325.   int num,numelem,calibnum,j,k;
  326.   fprintf(stdout,"%sn",bmark->name);
  327.   for(j=0;j<bmark->numsize;j++) {
  328.     fprintf(stderr,"Current size: %dn",bmark->size[j]);
  329.     glPushAttrib(GL_ALL_ATTRIB_BITS);
  330.     bmark->init();
  331.     stime=glutGet(GLUT_ELAPSED_TIME);
  332.     dtime=0.0;
  333.     calibnum=0;
  334.     while(dtime<2.0) {
  335.       bmark->run(bmark->size[j],1);
  336.       glFinish();
  337.       etime=glutGet(GLUT_ELAPSED_TIME);
  338.       dtime=(etime-stime)/1000.0;
  339.       calibnum++;
  340.     }
  341.     glPopAttrib();
  342.     fprintf(stderr,"Elapsed time for the calibration test (%d): %fn",calibnum,dtime);
  343.     num=(int)((BMARKS_TIME/dtime)*calibnum);
  344.     if(num<1)
  345.       num=1;
  346.     fprintf(stderr,"Selected number of benchmark iterations: %dn",num);
  347.     mintime=HUGE_VAL;
  348.     maxtime=-HUGE_VAL;
  349.     for(numelem=1,tottime=0.0,k=0;k<5;k++) {
  350.       glPushAttrib(GL_ALL_ATTRIB_BITS);
  351.       bmark->init();
  352.       stime=glutGet(GLUT_ELAPSED_TIME);
  353.       numelem=bmark->run(bmark->size[j],num);
  354.       glFinish();
  355.       etime=glutGet(GLUT_ELAPSED_TIME);
  356.       glPopAttrib();
  357.       dtime=(etime-stime)/1000.0;
  358.       tottime+=dtime;
  359.       fprintf(stderr,"Elapsed time for run %d: %fn",k,dtime);
  360.       if(dtime<mintime)
  361. mintime=dtime;
  362.       if(dtime>maxtime)
  363. maxtime=dtime;
  364.     }
  365.     tottime-=mintime+maxtime;
  366.     fprintf(stdout,"SIZE=%03d => %f %s/sec",bmark->size[j],numelem/(tottime/3.0),bmark->unit);
  367.     if(bmark->type==2)
  368.       fprintf(stdout,", MPixel Fill/sec: %fn",
  369.       (numelem*bmark->size[j]*bmark->size[j]/2)/(1000000.0*tottime/3.0));
  370.     else
  371.       fprintf(stdout,"n");
  372.   }
  373.   fprintf(stdout,"nn");
  374. }
  375. /***************************************************************************/
  376. static void display(void)
  377. {
  378.   int i;
  379.   if(frontbuffer)
  380.     glDrawBuffer(GL_FRONT);
  381.   else
  382.     glDrawBuffer(GL_BACK);
  383.   for(i=0;i<NUM_BMARKS;i++) {
  384.     fprintf(stderr,"Benchmark: %dn",i);
  385.     switch(bmarks[i].type) {
  386.     case 0:
  387.     case 3:
  388.       dotest0param(&bmarks[i]);
  389.       break;
  390.     case 1:
  391.     case 2:
  392.       dotest1param(&bmarks[i]);
  393.       break;
  394.     }
  395.   }
  396.   exit(0);
  397. }
  398. int main(int ac, char **av)
  399. {
  400.   fprintf(stderr,"GLTest v1.0nWritten by David Bucciarellin");
  401.   if(ac==2)
  402.     frontbuffer=0;
  403.   glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
  404.   glutInitWindowPosition(0,0);
  405.   glutInitWindowSize(640,480);
  406.   glutCreateWindow("OpenGL/Mesa Performances");
  407.   glutDisplayFunc(display);
  408.   glutMainLoop();
  409.   return 0;             /* ANSI C requires main to return int. */
  410. }