Module: Mesa
Branch: main
Commit: 0456f5bad11ab116391e3b11d7b8854b13f31e51
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=0456f5bad11ab116391e3b11d7b8854b13f31e51

Author: Corentin Noël <[email protected]>
Date:   Mon Sep 25 11:08:13 2023 +0200

mesa: Ensure that the baselevel will never exceed the maximal supported number

GL_TEXTURE_BASE_LEVEL is only supported up to MAX_TEXTURE_LEVELS

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25332>

---

 src/mesa/main/teximage.h |  5 +++--
 src/mesa/main/texobj.c   |  4 +---
 src/mesa/main/texobj.h   |  3 ++-
 src/mesa/main/texparam.c | 13 +++++--------
 src/mesa/main/texstate.c |  2 +-
 5 files changed, 12 insertions(+), 15 deletions(-)

diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h
index 12ba82a4997..c630e530d59 100644
--- a/src/mesa/main/teximage.h
+++ b/src/mesa/main/teximage.h
@@ -174,10 +174,11 @@ _mesa_get_texbuffer_format(const struct gl_context *ctx, 
GLenum internalFormat);
 /**
  * Return the base-level texture image for the given texture object.
  */
-static inline const struct gl_texture_image *
+static inline struct gl_texture_image *
 _mesa_base_tex_image(const struct gl_texture_object *texObj)
 {
-   return texObj->Image[0][texObj->Attrib.BaseLevel];
+   int base_level = MIN2(texObj->Attrib.BaseLevel, MAX_TEXTURE_LEVELS - 1);
+   return texObj->Image[0][base_level];
 }
 
 
diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
index 91187a5db5b..20e14ee21ee 100644
--- a/src/mesa/main/texobj.c
+++ b/src/mesa/main/texobj.c
@@ -303,9 +303,7 @@ void
 _mesa_update_texture_object_swizzle(struct gl_context *ctx,
                                     struct gl_texture_object *texObj)
 {
-   if (texObj->Attrib.BaseLevel >= MAX_TEXTURE_LEVELS)
-      return;
-   const struct gl_texture_image *img = 
texObj->Image[0][texObj->Attrib.BaseLevel];
+   const struct gl_texture_image *img = _mesa_base_tex_image(texObj);
    if (!img)
       return;
 
diff --git a/src/mesa/main/texobj.h b/src/mesa/main/texobj.h
index 5e51665c70e..6b813a07c99 100644
--- a/src/mesa/main/texobj.h
+++ b/src/mesa/main/texobj.h
@@ -34,6 +34,7 @@
 
 #include "util/glheader.h"
 #include "samplerobj.h"
+#include "teximage.h"
 
 
 #ifdef __cplusplus
@@ -118,7 +119,7 @@ _mesa_is_texture_complete(const struct gl_texture_object 
*texObj,
                           const struct gl_sampler_object *sampler,
                           bool linear_as_nearest_for_int_tex)
 {
-   struct gl_texture_image *img = texObj->Image[0][texObj->Attrib.BaseLevel];
+   struct gl_texture_image *img = _mesa_base_tex_image(texObj);
    bool isMultisample = img && img->NumSamples >= 2;
 
    /*
diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c
index 9e4eb3368ec..303e28d7eb0 100644
--- a/src/mesa/main/texparam.c
+++ b/src/mesa/main/texparam.c
@@ -416,10 +416,9 @@ set_tex_parameteri(struct gl_context *ctx,
          texObj->Attrib.BaseLevel = MIN2(texObj->Attrib.ImmutableLevels - 1, 
params[0]);
       else
          texObj->Attrib.BaseLevel = params[0];
-      if (texObj->Attrib.BaseLevel < MAX_TEXTURE_LEVELS) {
-         _mesa_update_teximage_format_swizzle(ctx, 
texObj->Image[0][texObj->Attrib.BaseLevel], texObj->Attrib.DepthMode);
-         _mesa_update_texture_object_swizzle(ctx, texObj);
-      }
+
+      _mesa_update_teximage_format_swizzle(ctx, _mesa_base_tex_image(texObj), 
texObj->Attrib.DepthMode);
+      _mesa_update_texture_object_swizzle(ctx, texObj);
 
       return GL_TRUE;
 
@@ -523,10 +522,8 @@ set_tex_parameteri(struct gl_context *ctx,
              (ctx->Extensions.ARB_texture_rg && params[0] == GL_RED)) {
             flush(ctx);
             texObj->Attrib.DepthMode = params[0];
-            if (texObj->Attrib.BaseLevel < MAX_TEXTURE_LEVELS) {
-               _mesa_update_teximage_format_swizzle(ctx, 
texObj->Image[0][texObj->Attrib.BaseLevel], texObj->Attrib.DepthMode);
-               _mesa_update_texture_object_swizzle(ctx, texObj);
-            }
+            _mesa_update_teximage_format_swizzle(ctx, 
_mesa_base_tex_image(texObj), texObj->Attrib.DepthMode);
+            _mesa_update_texture_object_swizzle(ctx, texObj);
             return GL_TRUE;
          }
          goto invalid_param;
diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c
index 1b661a7f60a..f2c0e5e5acb 100644
--- a/src/mesa/main/texstate.c
+++ b/src/mesa/main/texstate.c
@@ -541,7 +541,7 @@ update_tex_combine(struct gl_context *ctx,
    }
    else {
       const struct gl_texture_object *texObj = texUnit->_Current;
-      GLenum format = texObj->Image[0][texObj->Attrib.BaseLevel]->_BaseFormat;
+      GLenum format = _mesa_base_tex_image(texObj)->_BaseFormat;
 
       if (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL_EXT) {
          format = texObj->Attrib.DepthMode;

Reply via email to