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;
