132001f49Smrg/* 232001f49Smrg * 'Texture leak' test 332001f49Smrg * 432001f49Smrg * Allocates and uses an additional texture of the maximum supported size for 532001f49Smrg * each frame. This tests the system's ability to cope with using increasing 632001f49Smrg * amounts of texture memory. 732001f49Smrg * 832001f49Smrg * Michel Dänzer July 2009 This program is in the public domain. 932001f49Smrg */ 1032001f49Smrg 1132001f49Smrg 1232001f49Smrg#include <math.h> 1332001f49Smrg#include <stdio.h> 1432001f49Smrg#include <stdlib.h> 1532001f49Smrg#include <string.h> 1632001f49Smrg#include <sys/time.h> 1732001f49Smrg#include <unistd.h> 1832001f49Smrg#include <GL/glew.h> 1932001f49Smrg#include "glut_wrap.h" 2032001f49Smrg 2132001f49Smrg 2232001f49SmrgGLint size; 2332001f49SmrgGLvoid *image; 2432001f49Smrgstatic GLuint numTexObj; 2532001f49Smrgstatic GLuint *texObj; 2632001f49Smrg 2732001f49Smrg 2832001f49Smrgstatic void Idle( void ) 2932001f49Smrg{ 3032001f49Smrg glutPostRedisplay(); 3132001f49Smrg} 3232001f49Smrg 3332001f49Smrg 3432001f49Smrgstatic void DrawObject(void) 3532001f49Smrg{ 3632001f49Smrg static const GLfloat tex_coords[] = { 0.0, 0.0, 1.0, 1.0, 0.0 }; 3732001f49Smrg static const GLfloat vtx_coords[] = { -1.0, -1.0, 1.0, 1.0, -1.0 }; 3832001f49Smrg GLint i, j; 3932001f49Smrg 4032001f49Smrg glEnable(GL_TEXTURE_2D); 4132001f49Smrg 4232001f49Smrg for (i = 0; i < numTexObj; i++) { 4332001f49Smrg glBindTexture(GL_TEXTURE_2D, texObj[i]); 4432001f49Smrg glBegin(GL_QUADS); 4532001f49Smrg for (j = 0; j < 4; j++ ) { 4632001f49Smrg glTexCoord2f(tex_coords[j], tex_coords[j+1]); 4732001f49Smrg glVertex2f( vtx_coords[j], vtx_coords[j+1] ); 4832001f49Smrg } 4932001f49Smrg glEnd(); 5032001f49Smrg } 5132001f49Smrg} 5232001f49Smrg 5332001f49Smrg 5432001f49Smrgstatic void Display( void ) 5532001f49Smrg{ 5632001f49Smrg struct timeval start, end; 5732001f49Smrg 5832001f49Smrg texObj = realloc(texObj, ++numTexObj * sizeof(*texObj)); 5932001f49Smrg 6032001f49Smrg /* allocate a texture object */ 6132001f49Smrg glGenTextures(1, texObj + (numTexObj - 1)); 6232001f49Smrg 6332001f49Smrg glBindTexture(GL_TEXTURE_2D, texObj[numTexObj - 1]); 6432001f49Smrg glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 6532001f49Smrg glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 6632001f49Smrg memset(image, (16 * numTexObj) & 0xff, 4 * size * size); 6732001f49Smrg glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size, size, 0, 6832001f49Smrg GL_RGBA, GL_UNSIGNED_BYTE, image); 6932001f49Smrg 7032001f49Smrg gettimeofday(&start, NULL); 7132001f49Smrg 7232001f49Smrg glClear( GL_COLOR_BUFFER_BIT ); 7332001f49Smrg 7432001f49Smrg glPushMatrix(); 7532001f49Smrg glScalef(5.0, 5.0, 5.0); 7632001f49Smrg DrawObject(); 7732001f49Smrg glPopMatrix(); 7832001f49Smrg 7932001f49Smrg glutSwapBuffers(); 8032001f49Smrg 8132001f49Smrg glFinish(); 8232001f49Smrg gettimeofday(&end, NULL); 8332001f49Smrg printf("Rendering frame took %lu ms using %u MB of textures\n", 8432001f49Smrg end.tv_sec * 1000 + end.tv_usec / 1000 - start.tv_sec * 1000 - 8532001f49Smrg start.tv_usec / 1000, numTexObj * 4 * size / 1024 * size / 1024); 8632001f49Smrg 8732001f49Smrg sleep(1); 8832001f49Smrg} 8932001f49Smrg 9032001f49Smrg 9132001f49Smrgstatic void Reshape( int width, int height ) 9232001f49Smrg{ 9332001f49Smrg glViewport( 0, 0, width, height ); 9432001f49Smrg glMatrixMode( GL_PROJECTION ); 9532001f49Smrg glLoadIdentity(); 9632001f49Smrg glOrtho( -6.0, 6.0, -6.0, 6.0, 10.0, 100.0 ); 9732001f49Smrg glMatrixMode( GL_MODELVIEW ); 9832001f49Smrg glLoadIdentity(); 9932001f49Smrg glTranslatef( 0.0, 0.0, -70.0 ); 10032001f49Smrg} 10132001f49Smrg 10232001f49Smrg 10332001f49Smrgstatic void Init( int argc, char *argv[] ) 10432001f49Smrg{ 10532001f49Smrg glGetIntegerv(GL_MAX_TEXTURE_SIZE, &size); 10632001f49Smrg printf("%d x %d max texture size\n", size, size); 10732001f49Smrg 10832001f49Smrg image = malloc(4 * size * size); 10932001f49Smrg if (!image) { 11032001f49Smrg fprintf(stderr, "Failed to allocate %u bytes of memory\n", 4 * size * size); 11132001f49Smrg exit(1); 11232001f49Smrg } 11332001f49Smrg 11432001f49Smrg glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 11532001f49Smrg 11632001f49Smrg glShadeModel(GL_FLAT); 11732001f49Smrg glClearColor(0.3, 0.3, 0.4, 1.0); 11832001f49Smrg 11932001f49Smrg Idle(); 12032001f49Smrg} 12132001f49Smrg 12232001f49Smrg 12332001f49Smrgint main( int argc, char *argv[] ) 12432001f49Smrg{ 12532001f49Smrg glutInit( &argc, argv ); 12632001f49Smrg glutInitWindowSize( 300, 300 ); 12732001f49Smrg glutInitWindowPosition( 0, 0 ); 12832001f49Smrg glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE ); 12932001f49Smrg glutCreateWindow(argv[0] ); 13032001f49Smrg glewInit(); 13132001f49Smrg 13232001f49Smrg Init( argc, argv ); 13332001f49Smrg 13432001f49Smrg glutReshapeFunc( Reshape ); 13532001f49Smrg glutDisplayFunc( Display ); 13632001f49Smrg glutIdleFunc(Idle); 13732001f49Smrg 13832001f49Smrg glutMainLoop(); 13932001f49Smrg return 0; 14032001f49Smrg} 141