mesa: new glTexImage error checks for GL_ARB_texture_storage
authorBrian Paul <brianp@vmware.com>
Mon, 31 Oct 2011 16:52:56 +0000 (10:52 -0600)
committerBrian Paul <brianp@vmware.com>
Mon, 31 Oct 2011 16:52:56 +0000 (10:52 -0600)
If the texture memory was allocated with glTexStorage1/2/3D() we can
only change the image data with glTexSubImage calls.

src/mesa/main/teximage.c

index acf7187fded7ae0a8398c4f2a88373048f417e35..58b0e5d089c12ac2ebb600d50bbe60e91c5add99 100644 (file)
@@ -1432,6 +1432,23 @@ legal_texsubimage_target(struct gl_context *ctx, GLuint dims, GLenum target)
 }
 
 
+/**
+ * Helper function to determine if a texture object is mutable (in terms
+ * of GL_ARB_texture_storage).
+ */
+static GLboolean
+mutable_tex_object(struct gl_context *ctx, GLenum target)
+{
+   if (ctx->Extensions.ARB_texture_storage) {
+      struct gl_texture_object *texObj =
+         _mesa_get_current_tex_object(ctx, target);
+      return !texObj->Immutable;
+   }
+   return GL_TRUE;
+}
+
+
+
 /**
  * Test the glTexImage[123]D() parameters for errors.
  * 
@@ -1643,6 +1660,12 @@ texture_error_check( struct gl_context *ctx,
       return GL_TRUE;
    }
 
+   if (!mutable_tex_object(ctx, target)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glTexImage%dD(immutable texture)", dimensions);
+      return GL_TRUE;
+   }
+
    /* if we get here, the parameters are OK */
    return GL_FALSE;
 }
@@ -1906,6 +1929,12 @@ copytexture_error_check( struct gl_context *ctx, GLuint dimensions,
       }
    }
 
+   if (!mutable_tex_object(ctx, target)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glCopyTexImage%dD(immutable texture)", dimensions);
+      return GL_TRUE;
+   }
+
    /* if we get here, the parameters are OK */
    return GL_FALSE;
 }
@@ -3107,6 +3136,11 @@ compressed_texture_error_check(struct gl_context *ctx, GLint dimensions,
       return GL_INVALID_VALUE;
    }
 
+   if (!mutable_tex_object(ctx, target)) {
+      *reason = "immutable texture";
+      return GL_INVALID_OPERATION;
+   }
+
    return GL_NO_ERROR;
 }