mesa: fix invalid target error handling for teximage
[mesa.git] / src / mesa / main / teximage.c
index e940ecd732309a70a8029b450f0724dc3ac408a9..b80d5a9b675f98375113653daf3d192b0f3b9830 100644 (file)
@@ -2205,6 +2205,15 @@ texsubimage_error_check(struct gl_context *ctx, GLuint dimensions,
       return GL_TRUE;
    }
 
+   if (!texture_formats_agree(texImage->InternalFormat, format)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "%s(incompatible internalFormat = %s, format = %s)",
+                  callerName,
+                  _mesa_enum_to_string(texImage->InternalFormat),
+                  _mesa_enum_to_string(format));
+      return GL_TRUE;
+   }
+
    GLenum internalFormat = _mesa_is_gles(ctx) ?
       oes_float_internal_format(ctx, texImage->InternalFormat, type) :
       texImage->InternalFormat;
@@ -2979,17 +2988,18 @@ teximage(struct gl_context *ctx, GLboolean compressed, GLuint dims,
 
    internalFormat = override_internal_format(internalFormat, width, height);
 
+   if (!no_error &&
+       /* target error checking */
+       !legal_teximage_target(ctx, dims, target)) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "%s%uD(target=%s)",
+                  func, dims, _mesa_enum_to_string(target));
+      return;
+   }
+
    if (!texObj)
       texObj = _mesa_get_current_tex_object(ctx, target);
 
    if (!no_error) {
-      /* target error checking */
-      if (!legal_teximage_target(ctx, dims, target)) {
-         _mesa_error(ctx, GL_INVALID_ENUM, "%s%uD(target=%s)",
-                     func, dims, _mesa_enum_to_string(target));
-         return;
-      }
-
       /* general error checking */
       if (compressed) {
          if (compressed_texture_error_check(ctx, dims, target, texObj,
@@ -5588,7 +5598,7 @@ compressed_tex_sub_image(unsigned dim, GLenum target, GLuint textureOrIndex,
                          const GLvoid *data, enum tex_mode mode,
                          const char *caller)
 {
-   struct gl_texture_object *texObj;
+   struct gl_texture_object *texObj = NULL;
    struct gl_texture_image *texImage;
    bool no_error = false;
    GET_CURRENT_CONTEXT(ctx);
@@ -5622,14 +5632,9 @@ compressed_tex_sub_image(unsigned dim, GLenum target, GLuint textureOrIndex,
       case TEX_MODE_CURRENT_ERROR:
       default:
          assert(textureOrIndex == 0);
-         texObj = _mesa_get_current_tex_object(ctx, target);
          break;
    }
 
-   if (!texObj)
-      return;
-
-
    if (!no_error &&
        compressed_subtexture_target_check(ctx, target, dim, format,
                                           mode == TEX_MODE_DSA_ERROR,
@@ -5637,7 +5642,12 @@ compressed_tex_sub_image(unsigned dim, GLenum target, GLuint textureOrIndex,
       return;
    }
 
-   if (!no_error && !texObj)
+   if (mode == TEX_MODE_CURRENT_NO_ERROR ||
+       mode == TEX_MODE_CURRENT_ERROR) {
+      texObj = _mesa_get_current_tex_object(ctx, target);
+   }
+
+   if (!texObj)
       return;
 
    if (!no_error &&