[Piglit] [PATCH] max-texture-size: allow INVALID_VALUE if first TexImage fails with OUT_OF_MEMORY

Marek Olšák maraeo at gmail.com
Thu Jun 14 19:28:54 PDT 2012


The GL spec says that the behavior of a command returning OUT_OF_MEMORY is
undefined, therefore the following call to TexSubImage may return INVALID_VALUE.
(e.g. if TexWidth is 0 because the call to TexImage had no effect because
of OUT_OF_MEMORY, then the check "xoffset+width > TexWidth" in TexSubImage will
always set INVALID_VALUE)
---
 tests/texturing/max-texture-size.c |   30 ++++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

diff --git a/tests/texturing/max-texture-size.c b/tests/texturing/max-texture-size.c
index 92316d4..0767d30 100644
--- a/tests/texturing/max-texture-size.c
+++ b/tests/texturing/max-texture-size.c
@@ -157,6 +157,7 @@ ValidateTexSize (GLenum target,  GLenum internalformat, bool useProxy)
 	int maxSide, k;
 	GLfloat *pixels = NULL;
 	GLenum err = GL_NO_ERROR;
+	GLboolean first_oom;
 
 	/* Query the largest supported texture size */
 	glGetIntegerv(getMaxTarget(target), &maxSide);
@@ -198,6 +199,7 @@ ValidateTexSize (GLenum target,  GLenum internalformat, bool useProxy)
 				     0, GL_RGBA, GL_FLOAT, NULL);
 
 			err = glGetError();
+			first_oom = err == GL_OUT_OF_MEMORY;
 			/* Report a GL error other than GL_OUT_OF_MEMORY */
 			if (err != GL_NO_ERROR && err != GL_OUT_OF_MEMORY) {
 				free(pixels);
@@ -209,8 +211,10 @@ ValidateTexSize (GLenum target,  GLenum internalformat, bool useProxy)
 					GL_FLOAT, pixels);
 
 			err = glGetError();
-			/* Report a GL error other than GL_OUT_OF_MEMORY */
-			if (err != GL_NO_ERROR && err != GL_OUT_OF_MEMORY) {
+			/* Report a GL error other than GL_OUT_OF_MEMORY and
+                         * INVALID_VALUE */
+			if (err != GL_NO_ERROR && err != GL_OUT_OF_MEMORY &&
+                            (!first_oom || err != GL_INVALID_VALUE)) {
 				free(pixels);
 				printf("Unexpected GL error: 0x%x\n", err);
 				return false;
@@ -235,6 +239,7 @@ ValidateTexSize (GLenum target,  GLenum internalformat, bool useProxy)
 				     maxSide, 0, GL_RGBA, GL_FLOAT, NULL);
 
 			err = glGetError();
+			first_oom = err == GL_OUT_OF_MEMORY;
 			/* Report a GL error other than GL_OUT_OF_MEMORY */
 			if (err != GL_NO_ERROR && err != GL_OUT_OF_MEMORY) {
 				free(pixels);
@@ -246,8 +251,10 @@ ValidateTexSize (GLenum target,  GLenum internalformat, bool useProxy)
 					GL_RGBA, GL_FLOAT, pixels);
 
 			err = glGetError();
-			/* Report a GL error other than GL_OUT_OF_MEMORY */
-			if (err != GL_NO_ERROR && err != GL_OUT_OF_MEMORY) {
+			/* Report a GL error other than GL_OUT_OF_MEMORY and
+                         * INVALID_VALUE */
+			if (err != GL_NO_ERROR && err != GL_OUT_OF_MEMORY &&
+                            (!first_oom || err != GL_INVALID_VALUE)) {
 				free(pixels);
 				printf("Unexpected GL error: 0x%x\n", err);
 				return false;
@@ -289,6 +296,7 @@ ValidateTexSize (GLenum target,  GLenum internalformat, bool useProxy)
 				     NULL);
 
 			err = glGetError();
+			first_oom = err == GL_OUT_OF_MEMORY;
 			/* Report a GL error other than GL_OUT_OF_MEMORY */
 			if (err != GL_NO_ERROR && err != GL_OUT_OF_MEMORY) {
 				printf("Unexpected GL error: 0x%x\n", err);
@@ -300,8 +308,10 @@ ValidateTexSize (GLenum target,  GLenum internalformat, bool useProxy)
 					maxSide/2, maxSide/2, GL_RGBA,
 					GL_FLOAT, pixels);
 			err = glGetError();
-			/* Report a GL error other than GL_OUT_OF_MEMORY */
-			if (err != GL_NO_ERROR && err != GL_OUT_OF_MEMORY) {
+			/* Report a GL error other than GL_OUT_OF_MEMORY and
+                         * INVALID_VALUE */
+			if (err != GL_NO_ERROR && err != GL_OUT_OF_MEMORY &&
+                            (!first_oom || err != GL_INVALID_VALUE)) {
 				free(pixels);
 				printf("Unexpected GL error: 0x%x\n", err);
 				return false;
@@ -326,6 +336,7 @@ ValidateTexSize (GLenum target,  GLenum internalformat, bool useProxy)
 
 	case GL_TEXTURE_CUBE_MAP_ARB:
 		if (!useProxy) {
+			first_oom = GL_FALSE;
 			for (k = 0; k < 6; k++) {
 				glTexImage2D(
 				GL_TEXTURE_CUBE_MAP_POSITIVE_X + k,
@@ -333,6 +344,7 @@ ValidateTexSize (GLenum target,  GLenum internalformat, bool useProxy)
 				GL_RGBA, GL_FLOAT, NULL);
 
 				err = glGetError();
+				first_oom = first_oom || err == GL_OUT_OF_MEMORY;
 				/* Report a GL error other than GL_OUT_OF_MEMORY */
 				if (err != GL_NO_ERROR && err != GL_OUT_OF_MEMORY) {
 					printf("Unexpected GL error: 0x%x\n", err);
@@ -353,8 +365,10 @@ ValidateTexSize (GLenum target,  GLenum internalformat, bool useProxy)
 					return true;
 				}
 
-				/* Report a GL error other than GL_OUT_OF_MEMORY */
-				if (err != GL_NO_ERROR && err != GL_OUT_OF_MEMORY) {
+				/* Report a GL error other than GL_OUT_OF_MEMORY and
+                                 * INVALID_VALUE */
+				if (err != GL_NO_ERROR && err != GL_OUT_OF_MEMORY &&
+                                    (!first_oom || err != GL_INVALID_VALUE)) {
 					printf("Unexpected GL error: 0x%x\n", err);
 					free(pixels);
 					return false;
-- 
1.7.9.5



More information about the Piglit mailing list