summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <maraeo@gmail.com>2012-06-15 04:18:18 +0200
committerMarek Olšák <maraeo@gmail.com>2012-06-23 03:36:07 +0200
commit9ab2672bf117526cf33063bc6aef6d2933e7594e (patch)
treeb18fbefd9525fad64fad9dc99433a7801c501015
parentd7908a283c27d9cc6fdf6eb820234f060b9a3701 (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.c30
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;