diff options
author | Marek Olšák <maraeo@gmail.com> | 2012-06-15 04:18:18 +0200 |
---|---|---|
committer | Marek Olšák <maraeo@gmail.com> | 2012-06-23 03:36:07 +0200 |
commit | 9ab2672bf117526cf33063bc6aef6d2933e7594e (patch) | |
tree | b18fbefd9525fad64fad9dc99433a7801c501015 | |
parent | d7908a283c27d9cc6fdf6eb820234f060b9a3701 (diff) |
max-texture-size: allow INVALID_VALUE if first TexImage fails with OUT_OF_MEMORY
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)
Reviewed-by: Brian Paul <brianp@vmware.com>
-rw-r--r-- | tests/texturing/max-texture-size.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/tests/texturing/max-texture-size.c b/tests/texturing/max-texture-size.c index 2355f529c..8c6455e9c 100644 --- a/tests/texturing/max-texture-size.c +++ b/tests/texturing/max-texture-size.c @@ -159,6 +159,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); @@ -200,6 +201,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); @@ -211,8 +213,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; @@ -237,6 +241,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); @@ -248,8 +253,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; @@ -291,6 +298,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); @@ -302,8 +310,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; @@ -328,6 +338,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, @@ -335,6 +346,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); @@ -355,8 +367,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; |