From 83fbee6e0be46efab4b60ba50fceb103f8937ac1 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Mon, 21 Sep 2009 11:09:00 -0600 Subject: progs/perf: offsetof() should be defined in stddef.h, include it If this breaks mingw, feel free to revert this. --- progs/perf/teximage.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'progs/perf/teximage.c') diff --git a/progs/perf/teximage.c b/progs/perf/teximage.c index 11d781fccc..634cd83558 100644 --- a/progs/perf/teximage.c +++ b/progs/perf/teximage.c @@ -50,11 +50,8 @@ static const struct vertex vertices[1] = { { 0.0, 0.0, 0.5, 0.5 }, }; -#if 0 #define VOFFSET(F) ((void *) offsetof(struct vertex, F)) -#else -#define VOFFSET(F) ((void *) &((struct vertex *)NULL)->F) -#endif + /** Called from test harness/main */ void -- cgit v1.2.3 From a7b2659f02c503bd2110b9fd9799efc113807ad9 Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Mon, 21 Sep 2009 16:55:12 +0100 Subject: progs/perf: add first attempt at a swapbuffers rate test This is pretty ugly as the original framework assumed you'd set a single window size at startup and keep it throughout, but for swapbuffers you want to test the rate at various window sizes. With luck a nicer solution can be found, but this at least lays out a marker. --- progs/perf/Makefile | 1 + progs/perf/SConscript | 1 + progs/perf/drawoverhead.c | 4 ++ progs/perf/glmain.c | 29 ++++---- progs/perf/glmain.h | 6 ++ progs/perf/swapbuffers.c | 167 ++++++++++++++++++++++++++++++++++++++++++++++ progs/perf/teximage.c | 4 ++ progs/perf/vbo.c | 4 ++ progs/perf/vertexrate.c | 5 ++ 9 files changed, 207 insertions(+), 14 deletions(-) create mode 100644 progs/perf/swapbuffers.c (limited to 'progs/perf/teximage.c') diff --git a/progs/perf/Makefile b/progs/perf/Makefile index b2fe1af26a..e8fe720eaa 100644 --- a/progs/perf/Makefile +++ b/progs/perf/Makefile @@ -16,6 +16,7 @@ LDLIBS = $(LIBS) PROG_SOURCES = \ drawoverhead.c \ fill.c \ + swapbuffers.c \ teximage.c \ vbo.c \ vertexrate.c \ diff --git a/progs/perf/SConscript b/progs/perf/SConscript index 98a4112dba..fa43d73d96 100644 --- a/progs/perf/SConscript +++ b/progs/perf/SConscript @@ -11,6 +11,7 @@ progs = [ 'drawoverhead', 'fill', 'teximage', + 'swapbuffers', 'vbo', 'vertexrate', ] diff --git a/progs/perf/drawoverhead.c b/progs/perf/drawoverhead.c index d581f4b187..0de549b0dc 100644 --- a/progs/perf/drawoverhead.c +++ b/progs/perf/drawoverhead.c @@ -108,6 +108,10 @@ DrawStateChange(unsigned count) glFinish(); } +void +PerfNextRound(void) +{ +} /** Called from test harness/main */ void diff --git a/progs/perf/glmain.c b/progs/perf/glmain.c index 83c7b8a79c..8b41b8ee82 100644 --- a/progs/perf/glmain.c +++ b/progs/perf/glmain.c @@ -33,7 +33,6 @@ static int Win; static GLfloat Xrot = 0, Yrot = 0, Zrot = 0; -static GLboolean Anim = GL_FALSE; /** Return time in seconds */ @@ -153,13 +152,23 @@ PerfShaderProgram(const char *vertShader, const char *fragShader) } +int +PerfReshapeWindow( unsigned w, unsigned h ) +{ + if (glutGet(GLUT_SCREEN_WIDTH) < w || + glutGet(GLUT_SCREEN_HEIGHT) < h) + return 0; + + glutReshapeWindow( w, h ); + glutPostRedisplay(); + return 1; +} + + static void Idle(void) { - Xrot += 3.0; - Yrot += 4.0; - Zrot += 2.0; - glutPostRedisplay(); + PerfNextRound(); } @@ -193,13 +202,6 @@ Key(unsigned char key, int x, int y) (void) x; (void) y; switch (key) { - case 'a': - Anim = !Anim; - if (Anim) - glutIdleFunc(Idle); - else - glutIdleFunc(NULL); - break; case 'z': Zrot -= step; break; @@ -251,8 +253,7 @@ main(int argc, char *argv[]) glutKeyboardFunc(Key); glutSpecialFunc(SpecialKey); glutDisplayFunc(Draw); - if (Anim) - glutIdleFunc(Idle); + glutIdleFunc(Idle); PerfInit(); glutMainLoop(); return 0; diff --git a/progs/perf/glmain.h b/progs/perf/glmain.h index 91f2eb3e74..ccfd289880 100644 --- a/progs/perf/glmain.h +++ b/progs/perf/glmain.h @@ -46,12 +46,18 @@ PerfCheckerTexture(GLsizei width, GLsizei height); extern GLuint PerfShaderProgram(const char *vertShader, const char *fragShader); +extern int +PerfReshapeWindow( unsigned w, unsigned h ); + /** Test programs must implement these functions **/ extern void PerfInit(void); +extern void +PerfNextRound(void); + extern void PerfDraw(void); diff --git a/progs/perf/swapbuffers.c b/progs/perf/swapbuffers.c new file mode 100644 index 0000000000..79ac372f27 --- /dev/null +++ b/progs/perf/swapbuffers.c @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2009 VMware, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * VMWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * Measure drawing overhead + * + * This is the first in a series of simple performance benchmarks. + * The code in this file should be as simple as possible to make it + * easily portable to other APIs. + * + * All the window-system stuff should be contained in glmain.c (or TBDmain.c). + * All the re-usable, generic code should be in common.c (XXX not done yet). + * + * Brian Paul + * 15 Sep 2009 + */ + +#include "glmain.h" +#include "common.h" + + +int WinWidth = 100, WinHeight = 100; +int real_WinWidth, real_WinHeight; /* don't know whats going on here */ + +static GLuint VBO; + +struct vertex +{ + GLfloat x, y; +}; + +static const struct vertex vertices[4] = { + { -1.0, -1.0 }, + { 1.0, -1.0 }, + { 1.0, 1.0 }, + { -1.0, 1.0 } +}; + + +/** Called from test harness/main */ +void +PerfInit(void) +{ + /* setup VBO w/ vertex data */ + glGenBuffersARB(1, &VBO); + glBindBufferARB(GL_ARRAY_BUFFER_ARB, VBO); + glBufferDataARB(GL_ARRAY_BUFFER_ARB, + sizeof(vertices), vertices, GL_STATIC_DRAW_ARB); + glVertexPointer(2, GL_FLOAT, sizeof(struct vertex), (void *) 0); + glEnableClientState(GL_VERTEX_ARRAY); + + /* misc GL state */ + glAlphaFunc(GL_ALWAYS, 0.0); +} + +static void +SwapNaked(unsigned count) +{ + unsigned i; + for (i = 0; i < count; i++) { + PerfSwapBuffers(); + } +} + + +static void +SwapClear(unsigned count) +{ + unsigned i; + for (i = 0; i < count; i++) { + glClear(GL_COLOR_BUFFER_BIT); + PerfSwapBuffers(); + } +} + +static void +SwapClearPoint(unsigned count) +{ + unsigned i; + for (i = 0; i < count; i++) { + glClear(GL_COLOR_BUFFER_BIT); + glDrawArrays(GL_POINTS, 0, 4); + PerfSwapBuffers(); + } +} + + +static const struct { + unsigned w; + unsigned h; +} sizes[] = { + { 320, 240 }, + { 640, 480 }, + { 1024, 768 }, + { 1200, 1024 }, + { 1600, 1200 } +}; + +void +PerfNextRound(void) +{ + static unsigned i; + + if (i < sizeof(sizes) / sizeof(sizes[0])) { + perf_printf("Reshape %dx%d\n", sizes[i].w, sizes[i].h); + PerfReshapeWindow( sizes[i].w, sizes[i].h ); + real_WinWidth = sizes[i].w; + real_WinHeight = sizes[i].h; + i++; + } + else { + exit(0); + } +} + + + + +/** Called from test harness/main */ +void +PerfDraw(void) +{ + double rate0; + + rate0 = PerfMeasureRate(SwapNaked); + perf_printf(" Swapbuffers (Bare) %dx%d: %s swaps/second", + real_WinWidth, real_WinHeight, + PerfHumanFloat(rate0)); + perf_printf(" %s pixels/second\n", + PerfHumanFloat(rate0 * real_WinWidth * real_WinHeight)); + + + + rate0 = PerfMeasureRate(SwapClear); + perf_printf(" Swapbuffers + Clear %dx%d: %s swaps/second", + real_WinWidth, real_WinHeight, + PerfHumanFloat(rate0)); + perf_printf(" %s pixels/second\n", + PerfHumanFloat(rate0 * real_WinWidth * real_WinHeight)); + + + rate0 = PerfMeasureRate(SwapClearPoint); + perf_printf(" Swapbuffers + Clear + DrawPoint %dx%d: %s swaps/second", + real_WinWidth, real_WinHeight, + PerfHumanFloat(rate0)); + perf_printf(" %s pixels/second\n", + PerfHumanFloat(rate0 * real_WinWidth * real_WinHeight)); +} + diff --git a/progs/perf/teximage.c b/progs/perf/teximage.c index 634cd83558..86f0ef8736 100644 --- a/progs/perf/teximage.c +++ b/progs/perf/teximage.c @@ -155,6 +155,10 @@ static const struct { { 0, 0, NULL } }; +void +PerfNextRound(void) +{ +} /** Called from test harness/main */ diff --git a/progs/perf/vbo.c b/progs/perf/vbo.c index 4b6e3f1874..03c896321b 100644 --- a/progs/perf/vbo.c +++ b/progs/perf/vbo.c @@ -142,6 +142,10 @@ static const GLsizei Sizes[] = { 0 /* end of list */ }; +void +PerfNextRound(void) +{ +} /** Called from test harness/main */ void diff --git a/progs/perf/vertexrate.c b/progs/perf/vertexrate.c index 21231d8208..b5355525d0 100644 --- a/progs/perf/vertexrate.c +++ b/progs/perf/vertexrate.c @@ -228,6 +228,11 @@ DrawRangeElementsBO(unsigned count) PerfSwapBuffers(); } +void +PerfNextRound(void) +{ +} + /** Called from test harness/main */ void -- cgit v1.2.3 From 89f2799daca94ffb46d7b305df92d0c1876ad83d Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Tue, 22 Sep 2009 11:58:09 +0100 Subject: progs/perf: reset row_length after subimage test Also test fewer sizes in teximage generally. --- progs/perf/teximage.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'progs/perf/teximage.c') diff --git a/progs/perf/teximage.c b/progs/perf/teximage.c index 86f0ef8736..9e032ad0c9 100644 --- a/progs/perf/teximage.c +++ b/progs/perf/teximage.c @@ -131,6 +131,8 @@ UploadTexSubImage2D(unsigned count) glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + } else { /* replace whole texture image at once */ @@ -180,7 +182,7 @@ PerfDraw(void) for (subImage = 0; subImage < 2; subImage++) { /* loop over texture sizes */ - for (TexSize = 16; TexSize <= maxSize; TexSize *= 2) { + for (TexSize = 16; TexSize <= maxSize; TexSize *= 4) { GLint bytesPerImage; double mbPerSec; -- cgit v1.2.3 From 6a09c9d2d891a7118bc7c07d03900d69154116ba Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Tue, 22 Sep 2009 12:35:56 +0100 Subject: progs/perf: make teximage results easier to read, more reproducible Always run the same tests on different drivers, give zero results where test image is too big for driver. Add a newline between groups of tests. --- progs/perf/teximage.c | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) (limited to 'progs/perf/teximage.c') diff --git a/progs/perf/teximage.c b/progs/perf/teximage.c index 9e032ad0c9..462117615a 100644 --- a/progs/perf/teximage.c +++ b/progs/perf/teximage.c @@ -181,34 +181,44 @@ PerfDraw(void) /* loop over glTexImage, glTexSubImage */ for (subImage = 0; subImage < 2; subImage++) { - /* loop over texture sizes */ - for (TexSize = 16; TexSize <= maxSize; TexSize *= 4) { - GLint bytesPerImage; + /* loop over a defined range of texture sizes, test only the + * ones which are legal for this driver. + */ + for (TexSize = 16; TexSize <= 4096; TexSize *= 4) { double mbPerSec; - bytesPerImage = TexSize * TexSize * 4; - TexImage = malloc(bytesPerImage); - - if (subImage) { - /* create initial, empty texture */ - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, - TexSize, TexSize, 0, - TexSrcFormat, TexSrcType, NULL); - rate = PerfMeasureRate(UploadTexSubImage2D); + if (TexSize <= maxSize) { + GLint bytesPerImage; + + bytesPerImage = TexSize * TexSize * 4; + TexImage = malloc(bytesPerImage); + + if (subImage) { + /* create initial, empty texture */ + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, + TexSize, TexSize, 0, + TexSrcFormat, TexSrcType, NULL); + rate = PerfMeasureRate(UploadTexSubImage2D); + } + else { + rate = PerfMeasureRate(UploadTexImage2D); + } + + mbPerSec = rate * bytesPerImage / (1024.0 * 1024.0); + free(TexImage); } else { - rate = PerfMeasureRate(UploadTexImage2D); + rate = 0; + mbPerSec = 0; } - mbPerSec = rate * bytesPerImage / (1024.0 * 1024.0); - perf_printf(" glTex%sImage2D(%s %d x %d): " "%.1f images/sec, %.1f MB/sec\n", (subImage ? "Sub" : ""), SrcFormats[fmt].name, TexSize, TexSize, rate, mbPerSec); - - free(TexImage); } + + perf_printf("\n"); } } -- cgit v1.2.3 From 0ec26cce366f935c093fbf2819ee7fac2af48111 Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Tue, 22 Sep 2009 17:59:24 +0100 Subject: teximage: add more tests, image formats Add a test which creates a new texture from scratch before uploading. Add more image formats. Don't run all tests on all image formats. --- progs/perf/teximage.c | 117 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 99 insertions(+), 18 deletions(-) (limited to 'progs/perf/teximage.c') diff --git a/progs/perf/teximage.c b/progs/perf/teximage.c index 462117615a..2ff2db1bd9 100644 --- a/progs/perf/teximage.c +++ b/progs/perf/teximage.c @@ -36,11 +36,26 @@ static GLuint VBO; static GLuint TexObj = 0; static GLubyte *TexImage = NULL; static GLsizei TexSize; -static GLenum TexSrcFormat, TexSrcType; +static GLenum TexIntFormat, TexSrcFormat, TexSrcType; static const GLboolean DrawPoint = GL_TRUE; static const GLboolean TexSubImage4 = GL_TRUE; +enum { + MODE_CREATE_TEXIMAGE, + MODE_TEXIMAGE, + MODE_TEXSUBIMAGE +}; + +static const char *mode_name[] = +{ + "Create_TexImage", + "TexImage", + "TexSubImage" +}; + + + struct vertex { GLfloat x, y, s, t; @@ -76,6 +91,32 @@ PerfInit(void) } + + +static void +CreateUploadTexImage2D(unsigned count) +{ + unsigned i; + for (i = 0; i < count; i++) { + if (TexObj) + glDeleteTextures(1, &TexObj); + + glGenTextures(1, &TexObj); + glBindTexture(GL_TEXTURE_2D, TexObj); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glTexImage2D(GL_TEXTURE_2D, 0, TexIntFormat, + TexSize, TexSize, 0, + TexSrcFormat, TexSrcType, TexImage); + + if (DrawPoint) + glDrawArrays(GL_POINTS, 0, 1); + } + glFinish(); +} + + static void UploadTexImage2D(unsigned count) { @@ -86,7 +127,7 @@ UploadTexImage2D(unsigned count) * in Mesa but may be optimized in other drivers. Note sure how * much difference that might make. */ - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, + glTexImage2D(GL_TEXTURE_2D, 0, TexIntFormat, TexSize, TexSize, 0, TexSrcFormat, TexSrcType, TexImage); if (DrawPoint) @@ -101,7 +142,7 @@ UploadTexSubImage2D(unsigned count) { unsigned i; for (i = 0; i < count; i++) { - if (TexSubImage4) { + if (0 && TexSubImage4) { GLsizei halfSize = (TexSize == 1) ? 1 : TexSize / 2; GLsizei halfPos = TexSize - halfSize; /* do glTexSubImage2D in four pieces */ @@ -150,11 +191,17 @@ UploadTexSubImage2D(unsigned count) /* XXX any other formats to measure? */ static const struct { GLenum format, type; + GLenum internal_format; const char *name; + GLuint texel_size; + GLboolean full_test; } SrcFormats[] = { - { GL_RGBA, GL_UNSIGNED_BYTE, "GL_RGBA/GLubyte" }, - { GL_BGRA, GL_UNSIGNED_BYTE, "GL_BGRA/GLubyte" }, - { 0, 0, NULL } + { GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA, "RGBA/ubyte", 4, GL_TRUE }, + { GL_RGB, GL_UNSIGNED_BYTE, GL_RGB, "RGB/ubyte", 3, GL_FALSE }, + { GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_RGB, "RGB/565", 2, GL_FALSE }, + { GL_BGRA, GL_UNSIGNED_BYTE, GL_RGBA, "BGRA/ubyte", 4, GL_FALSE }, + { GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LUMINANCE, "L/ubyte", 1, GL_FALSE }, + { 0, 0, 0, NULL, 0, 0 } }; void @@ -169,56 +216,90 @@ PerfDraw(void) { GLint maxSize; double rate; - GLint fmt, subImage; + GLint fmt, mode; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize); /* loop over source data formats */ for (fmt = 0; SrcFormats[fmt].format; fmt++) { + TexIntFormat = SrcFormats[fmt].internal_format; TexSrcFormat = SrcFormats[fmt].format; TexSrcType = SrcFormats[fmt].type; /* loop over glTexImage, glTexSubImage */ - for (subImage = 0; subImage < 2; subImage++) { + for (mode = 0; mode < 3; mode++) { + GLuint minsz, maxsz; + + if (SrcFormats[fmt].full_test) { + minsz = 16; + maxsz = 4096; + } + else { + minsz = maxsz = 256; + if (mode == MODE_CREATE_TEXIMAGE) + continue; + } /* loop over a defined range of texture sizes, test only the * ones which are legal for this driver. */ - for (TexSize = 16; TexSize <= 4096; TexSize *= 4) { + for (TexSize = minsz; TexSize <= maxsz; TexSize *= 4) { double mbPerSec; if (TexSize <= maxSize) { GLint bytesPerImage; - bytesPerImage = TexSize * TexSize * 4; + bytesPerImage = TexSize * TexSize * SrcFormats[fmt].texel_size; TexImage = malloc(bytesPerImage); - if (subImage) { + switch (mode) { + case MODE_TEXIMAGE: + rate = PerfMeasureRate(UploadTexImage2D); + break; + + case MODE_CREATE_TEXIMAGE: + rate = PerfMeasureRate(CreateUploadTexImage2D); + break; + + case MODE_TEXSUBIMAGE: /* create initial, empty texture */ - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, + glTexImage2D(GL_TEXTURE_2D, 0, TexIntFormat, TexSize, TexSize, 0, TexSrcFormat, TexSrcType, NULL); rate = PerfMeasureRate(UploadTexSubImage2D); - } - else { - rate = PerfMeasureRate(UploadTexImage2D); + break; + + default: + exit(1); } mbPerSec = rate * bytesPerImage / (1024.0 * 1024.0); free(TexImage); + + + { + unsigned err; + err = glGetError(); + if (err) { + perf_printf("non-zero glGetError() %d\n", err); + exit(1); + } + } + } else { rate = 0; mbPerSec = 0; } - perf_printf(" glTex%sImage2D(%s %d x %d): " + perf_printf(" %s(%s %d x %d): " "%.1f images/sec, %.1f MB/sec\n", - (subImage ? "Sub" : ""), + mode_name[mode], SrcFormats[fmt].name, TexSize, TexSize, rate, mbPerSec); } - perf_printf("\n"); + if (SrcFormats[fmt].full_test) + perf_printf("\n"); } } -- cgit v1.2.3 From da0e4e557b85761e3eb03f9cbce2c3ef140fd5ef Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 22 Sep 2009 12:25:32 -0600 Subject: progs/perf: test glGetTexImage() also --- progs/perf/teximage.c | 48 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 12 deletions(-) (limited to 'progs/perf/teximage.c') diff --git a/progs/perf/teximage.c b/progs/perf/teximage.c index 2ff2db1bd9..0f41d349b7 100644 --- a/progs/perf/teximage.c +++ b/progs/perf/teximage.c @@ -20,7 +20,7 @@ */ /** - * Measure glTexSubImage2D rate + * Measure glTex[Sub]Image2D() and glGetTexImage() rate * * Brian Paul * 16 Sep 2009 @@ -44,14 +44,17 @@ static const GLboolean TexSubImage4 = GL_TRUE; enum { MODE_CREATE_TEXIMAGE, MODE_TEXIMAGE, - MODE_TEXSUBIMAGE + MODE_TEXSUBIMAGE, + MODE_GETTEXIMAGE, + MODE_COUNT }; -static const char *mode_name[] = +static const char *mode_name[MODE_COUNT] = { "Create_TexImage", "TexImage", - "TexSubImage" + "TexSubImage", + "GetTexImage" }; @@ -170,10 +173,8 @@ UploadTexSubImage2D(unsigned count) TexSrcFormat, TexSrcType, TexImage); /* reset the unpacking state */ glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); - glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - } else { /* replace whole texture image at once */ @@ -188,6 +189,20 @@ UploadTexSubImage2D(unsigned count) } +static void +GetTexImage2D(unsigned count) +{ + unsigned i; + GLubyte *buf = (GLubyte *) malloc(TexSize * TexSize * 4); + for (i = 0; i < count; i++) { + glGetTexImage(GL_TEXTURE_2D, 0, + TexSrcFormat, TexSrcType, buf); + } + glFinish(); + free(buf); +} + + /* XXX any other formats to measure? */ static const struct { GLenum format, type; @@ -196,14 +211,16 @@ static const struct { GLuint texel_size; GLboolean full_test; } SrcFormats[] = { - { GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA, "RGBA/ubyte", 4, GL_TRUE }, - { GL_RGB, GL_UNSIGNED_BYTE, GL_RGB, "RGB/ubyte", 3, GL_FALSE }, - { GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_RGB, "RGB/565", 2, GL_FALSE }, - { GL_BGRA, GL_UNSIGNED_BYTE, GL_RGBA, "BGRA/ubyte", 4, GL_FALSE }, - { GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LUMINANCE, "L/ubyte", 1, GL_FALSE }, + { GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA, "RGBA/ubyte", 4, GL_TRUE }, + { GL_RGB, GL_UNSIGNED_BYTE, GL_RGB, "RGB/ubyte", 3, GL_FALSE }, + { GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_RGB, "RGB/565", 2, GL_FALSE }, + { GL_BGRA, GL_UNSIGNED_BYTE, GL_RGBA, "BGRA/ubyte", 4, GL_FALSE }, + { GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LUMINANCE, "L/ubyte", 1, GL_FALSE }, { 0, 0, 0, NULL, 0, 0 } }; + +/** Called from test harness/main */ void PerfNextRound(void) { @@ -227,7 +244,7 @@ PerfDraw(void) TexSrcType = SrcFormats[fmt].type; /* loop over glTexImage, glTexSubImage */ - for (mode = 0; mode < 3; mode++) { + for (mode = 0; mode < MODE_COUNT; mode++) { GLuint minsz, maxsz; if (SrcFormats[fmt].full_test) { @@ -269,6 +286,13 @@ PerfDraw(void) rate = PerfMeasureRate(UploadTexSubImage2D); break; + case MODE_GETTEXIMAGE: + glTexImage2D(GL_TEXTURE_2D, 0, TexIntFormat, + TexSize, TexSize, 0, + TexSrcFormat, TexSrcType, TexImage); + rate = PerfMeasureRate(GetTexImage2D); + break; + default: exit(1); } -- cgit v1.2.3 From aae77319c00062dc756c3ff5293b2e76b36d893d Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 23 Sep 2009 08:06:29 -0600 Subject: progs/perf: set TexSubImage4=FALSE --- progs/perf/teximage.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'progs/perf/teximage.c') diff --git a/progs/perf/teximage.c b/progs/perf/teximage.c index 0f41d349b7..a3005d0bef 100644 --- a/progs/perf/teximage.c +++ b/progs/perf/teximage.c @@ -39,7 +39,7 @@ static GLsizei TexSize; static GLenum TexIntFormat, TexSrcFormat, TexSrcType; static const GLboolean DrawPoint = GL_TRUE; -static const GLboolean TexSubImage4 = GL_TRUE; +static const GLboolean TexSubImage4 = GL_FALSE; enum { MODE_CREATE_TEXIMAGE, @@ -145,7 +145,7 @@ UploadTexSubImage2D(unsigned count) { unsigned i; for (i = 0; i < count; i++) { - if (0 && TexSubImage4) { + if (TexSubImage4) { GLsizei halfSize = (TexSize == 1) ? 1 : TexSize / 2; GLsizei halfPos = TexSize - halfSize; /* do glTexSubImage2D in four pieces */ -- cgit v1.2.3