main: Checking for cube completeness in TextureSubImage.
authorLaura Ekstrand <laura@jlekstrand.net>
Mon, 15 Dec 2014 22:57:34 +0000 (14:57 -0800)
committerLaura Ekstrand <laura@jlekstrand.net>
Thu, 8 Jan 2015 19:37:30 +0000 (11:37 -0800)
This is part of a potential solution to a spec bug.  Cube completeness
is a concept from glGenerateMipmap, but it seems reasonable to check for it in
TextureSubImage when target=GL_TEXTURE_CUBE_MAP.

Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
src/mesa/main/teximage.c

index d95967cc28e878f41c61d8f3555e5a38d2c5ad4c..e41ce32806aa49616f986b7aefae29d5b6bb2266 100644 (file)
@@ -3557,19 +3557,41 @@ texturesubimage(struct gl_context *ctx, GLuint dims,
                      dims);
          return;
       }
-      for (i = 0; i < 6; ++i) { /* For each face. */
-         if (!texObj->Image[i][level]) {
-            /* Not enough image planes for a cube map.  The spec does not say
-             * what should happen in this case because the user has always
-             * specified each cube face separately (using
-             * GL_TEXTURE_CUBE_MAP_POSITIVE_X+i) in previous GL versions.
-             * This is addressed in Khronos Bug 13223.
-             */
-            _mesa_error(ctx, GL_INVALID_OPERATION,
-                        "glTextureSubImage%uD(insufficient cube map storage)",
-                        dims);
-            return;
-         }
+
+      /*
+       * What do we do if the user created a texture with the following code
+       * and then called this function with its handle?
+       *
+       *    GLuint tex;
+       *    glCreateTextures(GL_TEXTURE_CUBE_MAP, 1, &tex);
+       *    glBindTexture(GL_TEXTURE_CUBE_MAP, tex);
+       *    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, ...);
+       *    glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, ...);
+       *    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, ...);
+       *    // Note: GL_TEXTURE_CUBE_MAP_NEGATIVE_Y not set, or given the
+       *    // wrong format, or given the wrong size, etc.
+       *    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, ...);
+       *    glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, ...);
+       *
+       * A bug has been filed against the spec for this case.  In the
+       * meantime, we will check for cube completeness.
+       *
+       * According to Section 8.17 Texture Completeness in the OpenGL 4.5
+       * Core Profile spec (30.10.2014):
+       *    "[A] cube map texture is cube complete if the
+       *    following conditions all hold true: The [base level] texture
+       *    images of each of the six cube map faces have identical, positive,
+       *    and square dimensions. The [base level] images were each specified
+       *    with the same internal format."
+       *
+       * It seems reasonable to check for cube completeness of an arbitrary
+       * level here so that the image data has a consistent format and size.
+       */
+      if (!_mesa_cube_level_complete(texObj, level)) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "glTextureSubImage%uD(cube map incomplete)",
+                     dims);
+         return;
       }
 
       /* Copy in each face. */