Mesa (master): mesa: make glFramebuffer* check immutable texture level bounds

Kenneth Graunke kwg at kemper.freedesktop.org
Sat Oct 7 20:28:14 UTC 2017


Module: Mesa
Branch: master
Commit: 37e128b9b7fc99bc57edb031e0481658e524f1a4
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=37e128b9b7fc99bc57edb031e0481658e524f1a4

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Sat Oct  7 11:19:42 2017 -0700

mesa: make glFramebuffer* check immutable texture level bounds

When a texture is immutable, we can't tack on extra levels
after-the-fact like we could with glTexImage. So check against that
level limit and return an error if it's surpassed.

This fixes:
KHR-GL45.geometry_shader.layered_fbo.fb_texture_invalid_level_number

(Based on a patch by Ilia Mirkin.)

Reviewed-by: Antia Puentes <apuentes at igalia.com> [imirkin v2]
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

---

 src/mesa/main/fbobject.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index 0867ff70fa..f4552076a2 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -3223,11 +3223,19 @@ check_layer(struct gl_context *ctx, GLenum target, GLint layer,
  * \return true if no errors, false if errors
  */
 static bool
-check_level(struct gl_context *ctx, GLenum target, GLint level,
-            const char *caller)
+check_level(struct gl_context *ctx, struct gl_texture_object *texObj,
+            GLenum target, GLint level, const char *caller)
 {
-   if ((level < 0) ||
-       (level >= _mesa_max_texture_levels(ctx, target))) {
+   /* Section 9.2.8 of the OpenGL 4.6 specification says:
+    *
+    *    "If texture refers to an immutable-format texture, level must be
+    *     greater than or equal to zero and smaller than the value of
+    *     TEXTURE_VIEW_NUM_LEVELS for texture."
+    */
+   const int max_levels = texObj->Immutable ? texObj->ImmutableLevels :
+                          _mesa_max_texture_levels(ctx, target);
+
+   if (level < 0 || level >= max_levels) {
       _mesa_error(ctx, GL_INVALID_VALUE,
                   "%s(invalid level %d)", caller, level);
       return false;
@@ -3393,7 +3401,7 @@ framebuffer_texture_with_dims(int dims, GLenum target,
       if ((dims == 3) && !check_layer(ctx, texObj->Target, layer, caller))
          return;
 
-      if (!check_level(ctx, textarget, level, caller))
+      if (!check_level(ctx, texObj, textarget, level, caller))
          return;
    }
 
@@ -3539,7 +3547,7 @@ frame_buffer_texture(GLuint framebuffer, GLenum target,
                return;
          }
 
-         if (!check_level(ctx, texObj->Target, level, func))
+         if (!check_level(ctx, texObj, texObj->Target, level, func))
             return;
       }
 




More information about the mesa-commit mailing list