[Mesa-dev] [PATCH 2/3] main: Checking for cube completeness in GetTextureImage.

Laura Ekstrand laura at jlekstrand.net
Wed Dec 31 17:26:53 PST 2014


This is part of a potential solution to Khronos Bug 13223.  Cube completeness
is a concept from glGenerateMipmap, but it seems reasonable to check for it in
GetTextureImage when the target is GL_TEXTURE_CUBE_MAP.
---
 src/mesa/main/texgetimage.c | 41 +++++++++++++++++++++++++++++------------
 1 file changed, 29 insertions(+), 12 deletions(-)

diff --git a/src/mesa/main/texgetimage.c b/src/mesa/main/texgetimage.c
index 5b4d294..060c68a 100644
--- a/src/mesa/main/texgetimage.c
+++ b/src/mesa/main/texgetimage.c
@@ -1105,18 +1105,35 @@ _mesa_GetTextureImage( GLuint texture, GLint level, GLenum format,
                      "glGetTextureImage(insufficient cube map storage)");
          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,
-                        "glGetTextureImage(insufficient cube map storage)");
-            return;
-         }
+
+      /*
+       * This is part of a potential solution to a bug in the spec. 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 returned data has a consistent format and size
+       * and therefore fits in the user's buffer.
+       */
+      if (!_mesa_cube_level_complete(texObj, level)) {
+         /*
+          * Precedence for this error:
+          * In Section 8.14.4 Manual Mipmap Generation, the OpenGL 4.5 Core
+          * Profile spec (30.10.2014) says:
+          *    "An INVALID_OPERATION error is generated by
+          *    GenerateTextureMipmap if the effective target is
+          *    TEXTURE_CUBE_MAP or TEXTURE_CUBE_MAP_ARRAY, and the texture
+          *    object is not cube complete or cube array complete,
+          *    respectively."
+          */
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "glGetTextureImage(cube map incomplete)");
+         return;
       }
 
 
-- 
2.1.0



More information about the mesa-dev mailing list