1/** 2 * Measure fill rates for basic shading/texturing modes. 3 * 4 * Brian Paul 5 * 1 April 2008 6 */ 7 8 9#include <stdio.h> 10#include <stdlib.h> 11#include <math.h> 12#include <GL/glew.h> 13#include "glut_wrap.h" 14#include "readtex.h" 15 16#define TEXTURE_1_FILE DEMOS_DATA_DIR "tile.rgb" 17#define TEXTURE_2_FILE DEMOS_DATA_DIR "reflect.rgb" 18 19static int Win; 20static int Width = 1010, Height = 1010; 21static GLuint Textures[2]; 22 23 24/** 25 * Draw quad 10 pixels shorter, narrower than window size. 26 */ 27static void 28DrawQuad(void) 29{ 30 glBegin(GL_POLYGON); 31 32 glColor3f(1.0, 0.5, 0.5); 33 glMultiTexCoord2f(GL_TEXTURE0, 0, 0); 34 glMultiTexCoord2f(GL_TEXTURE1, 0, 0); 35 glVertex2f(5, 5); 36 37 glColor3f(0.5, 1.0, 0.5); 38 glMultiTexCoord2f(GL_TEXTURE0, 1, 0); 39 glMultiTexCoord2f(GL_TEXTURE1, 1, 0); 40 glVertex2f(Width - 5, 5); 41 42 glColor3f(0.5, 0.5, 1.0); 43 glMultiTexCoord2f(GL_TEXTURE0, 1, 1); 44 glMultiTexCoord2f(GL_TEXTURE1, 1, 1); 45 glVertex2f(Width - 5, Height - 5); 46 47 glColor3f(1.0, 0.5, 1.0); 48 glMultiTexCoord2f(GL_TEXTURE0, 0, 1); 49 glMultiTexCoord2f(GL_TEXTURE1, 0, 1); 50 glVertex2f(5, Height - 5); 51 52 glEnd(); 53} 54 55 56/** 57 * Compute rate for drawing large quad with given shading/texture state. 58 */ 59static void 60RunTest(GLenum shading, GLuint numTextures, GLenum texFilter) 61{ 62 const GLdouble minPeriod = 2.0; 63 GLdouble t0, t1; 64 GLdouble pixels, rate; 65 GLint i, iters; 66 67 glActiveTexture(GL_TEXTURE0); 68 if (numTextures > 0) { 69 glBindTexture(GL_TEXTURE_2D, Textures[0]); 70 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texFilter); 71 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texFilter); 72 glEnable(GL_TEXTURE_2D); 73 } 74 else { 75 glDisable(GL_TEXTURE_2D); 76 } 77 78 glActiveTexture(GL_TEXTURE1); 79 if (numTextures > 1) { 80 glBindTexture(GL_TEXTURE_2D, Textures[1]); 81 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texFilter); 82 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texFilter); 83 glEnable(GL_TEXTURE_2D); 84 } 85 else { 86 glDisable(GL_TEXTURE_2D); 87 } 88 89 glShadeModel(shading); 90 91 92 glFinish(); 93 94 iters = 1; 95 do { 96 iters *= 4; 97 t0 = glutGet(GLUT_ELAPSED_TIME) * 0.001; 98 for (i = 0; i < iters; i++) { 99 DrawQuad(); 100 } 101 glFinish(); 102 t1 = glutGet(GLUT_ELAPSED_TIME) * 0.001; 103 } while (t1 - t0 < minPeriod); 104 105 glutSwapBuffers(); 106 107 pixels = (double) iters * (Width - 10) * (Height - 10); 108 rate = pixels / (t1 - t0); 109 rate /= 1000000.0; /* megapixels/second */ 110 111 printf("%s ", shading == GL_FLAT ? "GL_FLAT" : "GL_SMOOTH"); 112 printf("Textures=%u ", numTextures); 113 printf("Filter=%s: ", texFilter == GL_LINEAR ? "GL_LINEAR" : "GL_NEAREST"); 114 printf("%g MPixels/sec\n", rate); 115} 116 117 118static void 119Draw(void) 120{ 121 glClear(GL_COLOR_BUFFER_BIT); 122 123 RunTest(GL_FLAT, 0, GL_NEAREST); 124 RunTest(GL_SMOOTH, 0, GL_NEAREST); 125 RunTest(GL_SMOOTH, 1, GL_NEAREST); 126 RunTest(GL_SMOOTH, 1, GL_LINEAR); 127 RunTest(GL_SMOOTH, 2, GL_NEAREST); 128 RunTest(GL_SMOOTH, 2, GL_LINEAR); 129 130 glutSwapBuffers(); 131} 132 133 134static void 135Reshape(int width, int height) 136{ 137 glViewport(0, 0, width, height); 138 glMatrixMode(GL_PROJECTION); 139 glLoadIdentity(); 140 glOrtho(0, width, 0, height, -1, 1); 141 glMatrixMode(GL_MODELVIEW); 142 glLoadIdentity(); 143 Width = width; 144 Height = height; 145} 146 147 148static void 149Key(unsigned char key, int x, int y) 150{ 151 (void) x; 152 (void) y; 153 switch (key) { 154 case 27: 155 glutDestroyWindow(Win); 156 exit(0); 157 break; 158 } 159 glutPostRedisplay(); 160} 161 162 163static void 164Init(void) 165{ 166 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); 167 168 glGenTextures(2, Textures); 169 170 glBindTexture(GL_TEXTURE_2D, Textures[0]); 171 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 172 173 if (!LoadRGBMipmaps(TEXTURE_1_FILE, GL_RGB)) { 174 printf("Error: couldn't load texture image\n"); 175 exit(1); 176 } 177 178 glBindTexture(GL_TEXTURE_2D, Textures[1]); 179 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 180 181 if (!LoadRGBMipmaps(TEXTURE_2_FILE, GL_RGB)) { 182 printf("Error: couldn't load texture image\n"); 183 exit(1); 184 } 185 186} 187 188 189int 190main(int argc, char *argv[]) 191{ 192 glutInit(&argc, argv); 193 glutInitWindowPosition(0, 0); 194 glutInitWindowSize(Width, Height); 195 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 196 Win = glutCreateWindow(argv[0]); 197 glewInit(); 198 glutReshapeFunc(Reshape); 199 glutKeyboardFunc(Key); 200 glutDisplayFunc(Draw); 201 Init(); 202 glutMainLoop(); 203 return 0; 204} 205