mesa: measure fill rate for drawing a large quad with basic shading/texture modes

This commit is contained in:
Brian
2008-04-01 16:07:09 -06:00
parent bccd3f138c
commit 792d524aed
2 changed files with 211 additions and 0 deletions

View File

@@ -40,6 +40,7 @@ SOURCES = \
fbotest1.c \
fbotest2.c \
fbotexture.c \
fillrate.c \
fog.c \
fogcoord.c \
fptest1.c \
@@ -166,6 +167,13 @@ mipmap_view.o: mipmap_view.c readtex.h
$(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
fillrate: fillrate.o readtex.o
$(CC) $(CFLAGS) fillrate.o readtex.o $(LIBS) -o $@
fillrate.o: fillrate.c readtex.h
$(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
readtex.o: readtex.c
$(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@

203
progs/tests/fillrate.c Normal file
View File

@@ -0,0 +1,203 @@
/**
* Measure fill rates for basic shading/texturing modes.
*
* Brian Paul
* 1 April 2008
*/
#define GL_GLEXT_PROTOTYPES
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
#include "readtex.h"
#define TEXTURE_1_FILE "../images/tile.rgb"
#define TEXTURE_2_FILE "../images/reflect.rgb"
static int Win;
static int Width = 1010, Height = 1010;
static GLuint Textures[2];
/**
* Draw quad 10 pixels shorter, narrower than window size.
*/
static void
DrawQuad(void)
{
glBegin(GL_POLYGON);
glColor3f(1.0, 0.5, 0.5);
glMultiTexCoord2f(GL_TEXTURE0, 0, 0);
glMultiTexCoord2f(GL_TEXTURE1, 0, 0);
glVertex2f(5, 5);
glColor3f(0.5, 1.0, 0.5);
glMultiTexCoord2f(GL_TEXTURE0, 1, 0);
glMultiTexCoord2f(GL_TEXTURE1, 1, 0);
glVertex2f(Width - 5, 5);
glColor3f(0.5, 0.5, 1.0);
glMultiTexCoord2f(GL_TEXTURE0, 1, 1);
glMultiTexCoord2f(GL_TEXTURE1, 1, 1);
glVertex2f(Width - 5, Height - 5);
glColor3f(1.0, 0.5, 1.0);
glMultiTexCoord2f(GL_TEXTURE0, 0, 1);
glMultiTexCoord2f(GL_TEXTURE1, 0, 1);
glVertex2f(5, Height - 5);
glEnd();
}
/**
* Compute rate for drawing large quad with given shading/texture state.
*/
static void
RunTest(GLenum shading, GLuint numTextures, GLenum texFilter)
{
const GLdouble minPeriod = 2.0;
GLdouble t0, t1;
GLdouble texels, rate;
GLint i, iters;
glActiveTexture(GL_TEXTURE0);
if (numTextures > 0) {
glBindTexture(GL_TEXTURE_2D, Textures[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texFilter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texFilter);
glEnable(GL_TEXTURE_2D);
}
else {
glDisable(GL_TEXTURE_2D);
}
glActiveTexture(GL_TEXTURE1);
if (numTextures > 1) {
glBindTexture(GL_TEXTURE_2D, Textures[1]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texFilter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texFilter);
glEnable(GL_TEXTURE_2D);
}
else {
glDisable(GL_TEXTURE_2D);
}
glShadeModel(shading);
glFinish();
iters = 1;
do {
iters *= 4;
t0 = glutGet(GLUT_ELAPSED_TIME) * 0.001;
for (i = 0; i < iters; i++) {
DrawQuad();
}
glFinish();
t1 = glutGet(GLUT_ELAPSED_TIME) * 0.001;
} while (t1 - t0 < minPeriod);
glutSwapBuffers();
texels = iters * (Width - 10) * (Height - 10);
rate = texels / (t1 - t0);
rate /= 1000000.0; /* megatexels/second */
printf("%s ", shading == GL_FLAT ? "GL_FLAT" : "GL_SMOOTH");
printf("Textures=%u ", numTextures);
printf("Filter=%s: ", texFilter == GL_LINEAR ? "GL_LINEAR" : "GL_NEAREST");
printf("%g MPixels/sec\n", rate);
}
static void
Draw(void)
{
glClear(GL_COLOR_BUFFER_BIT);
RunTest(GL_FLAT, 0, GL_NEAREST);
RunTest(GL_SMOOTH, 0, GL_NEAREST);
RunTest(GL_SMOOTH, 1, GL_NEAREST);
RunTest(GL_SMOOTH, 1, GL_LINEAR);
RunTest(GL_SMOOTH, 2, GL_NEAREST);
RunTest(GL_SMOOTH, 2, GL_LINEAR);
glutSwapBuffers();
}
static void
Reshape(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, 0, height, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
Width = width;
Height = height;
}
static void
Key(unsigned char key, int x, int y)
{
(void) x;
(void) y;
switch (key) {
case 27:
glutDestroyWindow(Win);
exit(0);
break;
}
glutPostRedisplay();
}
static void
Init(void)
{
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
glGenTextures(2, Textures);
glBindTexture(GL_TEXTURE_2D, Textures[0]);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
if (!LoadRGBMipmaps(TEXTURE_1_FILE, GL_RGB)) {
printf("Error: couldn't load texture image\n");
exit(1);
}
glBindTexture(GL_TEXTURE_2D, Textures[1]);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
if (!LoadRGBMipmaps(TEXTURE_2_FILE, GL_RGB)) {
printf("Error: couldn't load texture image\n");
exit(1);
}
}
int
main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowPosition(0, 0);
glutInitWindowSize(Width, Height);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
Win = glutCreateWindow(argv[0]);
glutReshapeFunc(Reshape);
glutKeyboardFunc(Key);
glutDisplayFunc(Draw);
Init();
glutMainLoop();
return 0;
}