Mesa (master): mesa: fix glPopAttrib for many texture fields

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Jan 30 21:52:58 UTC 2021


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

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Sat Dec 19 01:19:35 2020 -0500

mesa: fix glPopAttrib for many texture fields

Move the fields that should be restored by glPopAttrib into the Attrib
structure, which is the only portion of texture objects that is restored
by glPopAttrib. Also moves fields that should not be restored by glPopAttrib
out of the Attrib structure.

This is based on the GL 4.6 Compatibility spec.

Reviewed-by: Zoltán Böszörményi <zboszor at gmail.com>
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8181>

---

 src/gallium/frontends/dri/dri2.c                 |  8 ++--
 src/mesa/drivers/common/meta_blit.c              |  4 +-
 src/mesa/drivers/dri/i965/brw_blorp.c            |  4 +-
 src/mesa/drivers/dri/i965/brw_draw.c             | 10 ++---
 src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 20 ++++-----
 src/mesa/drivers/dri/i965/genX_state_upload.c    |  4 +-
 src/mesa/drivers/dri/i965/intel_copy_image.c     |  8 ++--
 src/mesa/drivers/dri/i965/intel_fbo.c            |  8 ++--
 src/mesa/drivers/dri/i965/intel_tex.c            | 10 ++---
 src/mesa/drivers/dri/i965/intel_tex_image.c      | 16 +++----
 src/mesa/main/fbobject.c                         |  2 +-
 src/mesa/main/formatquery.c                      |  2 +-
 src/mesa/main/mipmap.c                           |  2 +-
 src/mesa/main/mtypes.h                           | 20 ++++-----
 src/mesa/main/shaderimage.c                      |  2 +-
 src/mesa/main/texobj.c                           |  6 +--
 src/mesa/main/texobj.h                           |  2 +-
 src/mesa/main/texparam.c                         | 36 ++++++++--------
 src/mesa/main/textureview.c                      | 54 +++++++++++++-----------
 src/mesa/state_tracker/st_atom_image.c           |  8 ++--
 src/mesa/state_tracker/st_atom_sampler.c         |  4 +-
 src/mesa/state_tracker/st_cb_copyimage.c         |  8 ++--
 src/mesa/state_tracker/st_cb_fbo.c               |  7 +--
 src/mesa/state_tracker/st_cb_texture.c           | 29 +++++++------
 src/mesa/state_tracker/st_gen_mipmap.c           |  4 +-
 src/mesa/state_tracker/st_sampler_view.c         | 21 +++++----
 src/mesa/state_tracker/st_texture.c              |  8 ++--
 27 files changed, 159 insertions(+), 148 deletions(-)

diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c
index b0c0d7eafbe..fe114a14f0d 100644
--- a/src/gallium/frontends/dri/dri2.c
+++ b/src/gallium/frontends/dri/dri2.c
@@ -1925,10 +1925,10 @@ dri2_interop_export_object(__DRIcontext *_ctx,
          }
 
          out->internal_format = obj->Image[0][0]->InternalFormat;
-         out->view_minlevel = obj->MinLevel;
-         out->view_numlevels = obj->NumLevels;
-         out->view_minlayer = obj->MinLayer;
-         out->view_numlayers = obj->NumLayers;
+         out->view_minlevel = obj->Attrib.MinLevel;
+         out->view_numlevels = obj->Attrib.NumLevels;
+         out->view_minlayer = obj->Attrib.MinLayer;
+         out->view_numlayers = obj->Attrib.NumLayers;
       }
    }
 
diff --git a/src/mesa/drivers/common/meta_blit.c b/src/mesa/drivers/common/meta_blit.c
index 161ed713dd7..26b054bd819 100644
--- a/src/mesa/drivers/common/meta_blit.c
+++ b/src/mesa/drivers/common/meta_blit.c
@@ -178,7 +178,7 @@ blitframebuffer_texture(struct gl_context *ctx,
    fb_tex_blit.tex_obj = texObj;
    fb_tex_blit.baseLevelSave = texObj->Attrib.BaseLevel;
    fb_tex_blit.maxLevelSave = texObj->Attrib.MaxLevel;
-   fb_tex_blit.stencilSamplingSave = texObj->Attrib.StencilSampling;
+   fb_tex_blit.stencilSamplingSave = texObj->StencilSampling;
 
    if (glsl_version) {
       setup_glsl_blit_framebuffer(ctx, blit, drawFb, rb, target, do_depth);
@@ -338,7 +338,7 @@ _mesa_meta_fb_tex_blit_end(struct gl_context *ctx, GLenum target,
                                    &blit->maxLevelSave, false);
 
       /* If ARB_stencil_texturing is not supported, the mode won't have changed. */
-      if (texObj->Attrib.StencilSampling != blit->stencilSamplingSave) {
+      if (texObj->StencilSampling != blit->stencilSamplingSave) {
          /* GLint so the compiler won't complain about type signedness mismatch
           * in the call to _mesa_texture_parameteriv below.
           */
diff --git a/src/mesa/drivers/dri/i965/brw_blorp.c b/src/mesa/drivers/dri/i965/brw_blorp.c
index 2f08d0b3d4d..c65a534116e 100644
--- a/src/mesa/drivers/dri/i965/brw_blorp.c
+++ b/src/mesa/drivers/dri/i965/brw_blorp.c
@@ -745,8 +745,8 @@ brw_blorp_copytexsubimage(struct brw_context *brw,
       apply_y_flip(&srcY0, &srcY1, src_rb->Height);
 
    /* Account for face selection and texture view MinLayer */
-   int dst_slice = slice + dst_image->TexObject->MinLayer + dst_image->Face;
-   int dst_level = dst_image->Level + dst_image->TexObject->MinLevel;
+   int dst_slice = slice + dst_image->TexObject->Attrib.MinLayer + dst_image->Face;
+   int dst_level = dst_image->Level + dst_image->TexObject->Attrib.MinLevel;
 
    brw_blorp_blit_miptrees(brw,
                            src_mt, src_irb->mt_level, src_irb->mt_layer,
diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c
index c82a7385f2f..3dc44205ad7 100644
--- a/src/mesa/drivers/dri/i965/brw_draw.c
+++ b/src/mesa/drivers/dri/i965/brw_draw.c
@@ -547,11 +547,11 @@ brw_predraw_resolve_inputs(struct brw_context *brw, bool rendering,
 
       unsigned min_level, min_layer, num_levels, num_layers;
       if (tex_obj->base.Immutable) {
-         min_level  = tex_obj->base.MinLevel;
-         num_levels = MIN2(tex_obj->base.NumLevels, tex_obj->_MaxLevel + 1);
-         min_layer  = tex_obj->base.MinLayer;
+         min_level  = tex_obj->base.Attrib.MinLevel;
+         num_levels = MIN2(tex_obj->base.Attrib.NumLevels, tex_obj->_MaxLevel + 1);
+         min_layer  = tex_obj->base.Attrib.MinLayer;
          num_layers = tex_obj->base.Target != GL_TEXTURE_3D ?
-                      tex_obj->base.NumLayers : INTEL_REMAINING_LAYERS;
+                      tex_obj->base.Attrib.NumLayers : INTEL_REMAINING_LAYERS;
       } else {
          min_level  = tex_obj->base.Attrib.BaseLevel;
          num_levels = tex_obj->_MaxLevel - tex_obj->base.Attrib.BaseLevel + 1;
@@ -586,7 +586,7 @@ brw_predraw_resolve_inputs(struct brw_context *brw, bool rendering,
 
       brw_cache_flush_for_read(brw, tex_obj->mt->bo);
 
-      if (tex_obj->base.Attrib.StencilSampling ||
+      if (tex_obj->base.StencilSampling ||
           tex_obj->mt->format == MESA_FORMAT_S_UINT8) {
          intel_update_r8stencil(brw, tex_obj->mt);
       }
diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
index a448571585b..51613dc75e5 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
@@ -491,7 +491,7 @@ static void brw_update_texture_surface(struct gl_context *ctx,
        */
       unsigned view_num_layers;
       if (obj->Immutable && obj->Target != GL_TEXTURE_3D) {
-         view_num_layers = obj->NumLayers;
+         view_num_layers = obj->Attrib.NumLayers;
       } else {
          view_num_layers = mt->surf.dim == ISL_SURF_DIM_3D ?
                               mt->surf.logical_level0_px.depth :
@@ -566,7 +566,7 @@ static void brw_update_texture_surface(struct gl_context *ctx,
          }
       }
 
-      if (obj->Attrib.StencilSampling && firstImage->_BaseFormat == GL_DEPTH_STENCIL) {
+      if (obj->StencilSampling && firstImage->_BaseFormat == GL_DEPTH_STENCIL) {
          if (devinfo->gen <= 7) {
             assert(mt->shadow_mt && !mt->stencil_mt->shadow_needs_update);
             mt = mt->shadow_mt;
@@ -587,9 +587,9 @@ static void brw_update_texture_surface(struct gl_context *ctx,
 
       struct isl_view view = {
          .format = format,
-         .base_level = obj->MinLevel + obj->Attrib.BaseLevel,
+         .base_level = obj->Attrib.MinLevel + obj->Attrib.BaseLevel,
          .levels = intel_obj->_MaxLevel - obj->Attrib.BaseLevel + 1,
-         .base_array_layer = obj->MinLayer,
+         .base_array_layer = obj->Attrib.MinLayer,
          .array_len = view_num_layers,
          .swizzle = {
             .r = swizzle_to_scs(GET_SWZ(swizzle, 0), need_green_to_blue),
@@ -1151,7 +1151,7 @@ is_depth_texture(struct intel_texture_object *iobj)
 {
    GLenum base_format = _mesa_get_format_base_format(iobj->_Format);
    return base_format == GL_DEPTH_COMPONENT ||
-          (base_format == GL_DEPTH_STENCIL && !iobj->base.Attrib.StencilSampling);
+          (base_format == GL_DEPTH_STENCIL && !iobj->base.StencilSampling);
 }
 
 static void
@@ -1550,20 +1550,20 @@ update_image_surface(struct brw_context *brw,
                base_layer = 0;
                num_layers = minify(mt->surf.logical_level0_px.depth, u->Level);
             } else {
-               assert(obj->Immutable || obj->MinLayer == 0);
-               base_layer = obj->MinLayer;
+               assert(obj->Immutable || obj->Attrib.MinLayer == 0);
+               base_layer = obj->Attrib.MinLayer;
                num_layers = obj->Immutable ?
-                                obj->NumLayers :
+                                obj->Attrib.NumLayers :
                                 mt->surf.logical_level0_px.array_len;
             }
          } else {
-            base_layer = obj->MinLayer + u->_Layer;
+            base_layer = obj->Attrib.MinLayer + u->_Layer;
             num_layers = 1;
          }
 
          struct isl_view view = {
             .format = format,
-            .base_level = obj->MinLevel + u->Level,
+            .base_level = obj->Attrib.MinLevel + u->Level,
             .levels = 1,
             .base_array_layer = base_layer,
             .array_len = num_layers,
diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c b/src/mesa/drivers/dri/i965/genX_state_upload.c
index d46eb3a49e8..65b1d82d09c 100644
--- a/src/mesa/drivers/dri/i965/genX_state_upload.c
+++ b/src/mesa/drivers/dri/i965/genX_state_upload.c
@@ -5321,7 +5321,7 @@ genX(update_sampler_state)(struct brw_context *brw,
 
 #if GEN_GEN == 6
    samp_st.BaseMipLevel =
-      CLAMP(texObj->MinLevel + texObj->Attrib.BaseLevel, 0, hw_max_lod);
+      CLAMP(texObj->Attrib.MinLevel + texObj->Attrib.BaseLevel, 0, hw_max_lod);
    samp_st.MinandMagStateNotEqual =
       samp_st.MinModeFilter != samp_st.MagModeFilter;
 #endif
@@ -5336,7 +5336,7 @@ genX(update_sampler_state)(struct brw_context *brw,
        wrap_mode_needs_border_color(wrap_r)) {
       genX(upload_default_color)(brw, sampler, format, base_format,
                                  texObj->_IsIntegerFormat,
-                                 texObj->Attrib.StencilSampling,
+                                 texObj->StencilSampling,
                                  &border_color_offset);
    }
 #if GEN_GEN < 6
diff --git a/src/mesa/drivers/dri/i965/intel_copy_image.c b/src/mesa/drivers/dri/i965/intel_copy_image.c
index 00593235d1e..5fb8622655a 100644
--- a/src/mesa/drivers/dri/i965/intel_copy_image.c
+++ b/src/mesa/drivers/dri/i965/intel_copy_image.c
@@ -81,13 +81,13 @@ intel_copy_image_sub_data(struct gl_context *ctx,
 
    if (src_image) {
       src_mt = intel_texture_image(src_image)->mt;
-      src_level = src_image->Level + src_image->TexObject->MinLevel;
+      src_level = src_image->Level + src_image->TexObject->Attrib.MinLevel;
 
       /* Cube maps actually have different images per face */
       if (src_image->TexObject->Target == GL_TEXTURE_CUBE_MAP)
          src_z = src_image->Face;
 
-      src_z += src_image->TexObject->MinLayer;
+      src_z += src_image->TexObject->Attrib.MinLayer;
    } else {
       assert(src_renderbuffer);
       src_mt = intel_renderbuffer(src_renderbuffer)->mt;
@@ -98,13 +98,13 @@ intel_copy_image_sub_data(struct gl_context *ctx,
    if (dst_image) {
       dst_mt = intel_texture_image(dst_image)->mt;
 
-      dst_level = dst_image->Level + dst_image->TexObject->MinLevel;
+      dst_level = dst_image->Level + dst_image->TexObject->Attrib.MinLevel;
 
       /* Cube maps actually have different images per face */
       if (dst_image->TexObject->Target == GL_TEXTURE_CUBE_MAP)
          dst_z = dst_image->Face;
 
-      dst_z += dst_image->TexObject->MinLayer;
+      dst_z += dst_image->TexObject->Attrib.MinLayer;
    } else {
       assert(dst_renderbuffer);
       dst_mt = intel_renderbuffer(dst_renderbuffer)->mt;
diff --git a/src/mesa/drivers/dri/i965/intel_fbo.c b/src/mesa/drivers/dri/i965/intel_fbo.c
index b1f24d4d1d3..6761a9e224a 100644
--- a/src/mesa/drivers/dri/i965/intel_fbo.c
+++ b/src/mesa/drivers/dri/i965/intel_fbo.c
@@ -540,8 +540,8 @@ intel_renderbuffer_update_wrapper(struct brw_context *brw,
    rb->AllocStorage = intel_nop_alloc_storage;
 
    /* adjust for texture view parameters */
-   layer += image->TexObject->MinLayer;
-   level += image->TexObject->MinLevel;
+   layer += image->TexObject->Attrib.MinLayer;
+   level += image->TexObject->Attrib.MinLevel;
 
    intel_miptree_check_level_layer(mt, level, layer);
    irb->mt_level = level;
@@ -549,8 +549,8 @@ intel_renderbuffer_update_wrapper(struct brw_context *brw,
 
    if (!layered) {
       irb->layer_count = 1;
-   } else if (mt->target != GL_TEXTURE_3D && image->TexObject->NumLayers > 0) {
-      irb->layer_count = image->TexObject->NumLayers;
+   } else if (mt->target != GL_TEXTURE_3D && image->TexObject->Attrib.NumLayers > 0) {
+      irb->layer_count = image->TexObject->Attrib.NumLayers;
    } else {
       irb->layer_count = mt->surf.dim == ISL_SURF_DIM_3D ?
                             minify(mt->surf.logical_level0_px.depth, level) :
diff --git a/src/mesa/drivers/dri/i965/intel_tex.c b/src/mesa/drivers/dri/i965/intel_tex.c
index b8341d5462b..e08102321e7 100644
--- a/src/mesa/drivers/dri/i965/intel_tex.c
+++ b/src/mesa/drivers/dri/i965/intel_tex.c
@@ -231,8 +231,8 @@ intel_map_texture_image(struct gl_context *ctx,
       slice = tex_image->Face;
 
    intel_miptree_map(brw, mt,
-                     tex_image->Level + tex_image->TexObject->MinLevel,
-                     slice + tex_image->TexObject->MinLayer,
+                     tex_image->Level + tex_image->TexObject->Attrib.MinLevel,
+                     slice + tex_image->TexObject->Attrib.MinLayer,
                      x, y, w, h, mode,
                      (void **)map, &stride);
 
@@ -251,8 +251,8 @@ intel_unmap_texture_image(struct gl_context *ctx,
       slice = tex_image->Face;
 
    intel_miptree_unmap(brw, mt,
-         tex_image->Level + tex_image->TexObject->MinLevel,
-         slice + tex_image->TexObject->MinLayer);
+         tex_image->Level + tex_image->TexObject->Attrib.MinLevel,
+         slice + tex_image->TexObject->Attrib.MinLayer);
 }
 
 static GLboolean
@@ -274,7 +274,7 @@ intel_texture_view(struct gl_context *ctx,
     * except it hasn't copied our mt pointers, etc.
     */
    const int numFaces = _mesa_num_tex_faces(texObj->Target);
-   const int numLevels = texObj->NumLevels;
+   const int numLevels = texObj->Attrib.NumLevels;
 
    int face;
    int level;
diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c b/src/mesa/drivers/dri/i965/intel_tex_image.c
index fd3ea8a6db3..d5efb92d631 100644
--- a/src/mesa/drivers/dri/i965/intel_tex_image.c
+++ b/src/mesa/drivers/dri/i965/intel_tex_image.c
@@ -136,8 +136,8 @@ intel_texsubimage_blorp(struct brw_context *brw, GLuint dims,
                         const struct gl_pixelstore_attrib *packing)
 {
    struct intel_texture_image *intel_image = intel_texture_image(tex_image);
-   const unsigned mt_level = tex_image->Level + tex_image->TexObject->MinLevel;
-   const unsigned mt_z = tex_image->TexObject->MinLayer + tex_image->Face + z;
+   const unsigned mt_level = tex_image->Level + tex_image->TexObject->Attrib.MinLevel;
+   const unsigned mt_z = tex_image->TexObject->Attrib.MinLayer + tex_image->Face + z;
 
    /* The blorp path can't understand crazy format hackery */
    if (_mesa_base_tex_format(&brw->ctx, tex_image->InternalFormat) !=
@@ -228,7 +228,7 @@ intel_texsubimage_tiled_memcpy(struct gl_context * ctx,
       return false;
 
    /* If this is a nontrivial texture view, let another path handle it instead. */
-   if (texImage->TexObject->MinLayer)
+   if (texImage->TexObject->Attrib.MinLayer)
       return false;
 
    if (!image->mt ||
@@ -249,7 +249,7 @@ intel_texsubimage_tiled_memcpy(struct gl_context * ctx,
    if (devinfo->gen < 5 && brw->has_swizzling)
       return false;
 
-   int level = texImage->Level + texImage->TexObject->MinLevel;
+   int level = texImage->Level + texImage->TexObject->Attrib.MinLevel;
 
    /* Since we are going to write raw data to the miptree, we need to resolve
     * any pending fast color clears before we start.
@@ -702,8 +702,8 @@ intel_gettexsubimage_blorp(struct brw_context *brw,
                            const struct gl_pixelstore_attrib *packing)
 {
    struct intel_texture_image *intel_image = intel_texture_image(tex_image);
-   const unsigned mt_level = tex_image->Level + tex_image->TexObject->MinLevel;
-   const unsigned mt_z = tex_image->TexObject->MinLayer + tex_image->Face + z;
+   const unsigned mt_level = tex_image->Level + tex_image->TexObject->Attrib.MinLevel;
+   const unsigned mt_z = tex_image->TexObject->Attrib.MinLayer + tex_image->Face + z;
 
    /* The blorp path can't understand crazy format hackery */
    if (_mesa_base_tex_format(&brw->ctx, tex_image->InternalFormat) !=
@@ -781,7 +781,7 @@ intel_gettexsubimage_tiled_memcpy(struct gl_context *ctx,
       return false;
 
    /* If this is a nontrivial texture view, let another path handle it instead. */
-   if (texImage->TexObject->MinLayer)
+   if (texImage->TexObject->Attrib.MinLayer)
       return false;
 
    if (!image->mt ||
@@ -802,7 +802,7 @@ intel_gettexsubimage_tiled_memcpy(struct gl_context *ctx,
    if (devinfo->gen < 5 && brw->has_swizzling)
       return false;
 
-   int level = texImage->Level + texImage->TexObject->MinLevel;
+   int level = texImage->Level + texImage->TexObject->Attrib.MinLevel;
 
    /* Since we are going to write raw data to the miptree, we need to resolve
     * any pending fast color clears before we start.
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index 798f59d2499..267e2f1319a 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -3710,7 +3710,7 @@ check_level(struct gl_context *ctx, struct gl_texture_object *texObj,
     *     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 :
+   const int max_levels = texObj->Immutable ? texObj->Attrib.ImmutableLevels :
                           _mesa_max_texture_levels(ctx, target);
 
    if (level < 0 || level >= max_levels) {
diff --git a/src/mesa/main/formatquery.c b/src/mesa/main/formatquery.c
index 006e7ff32d8..d1a74fb0d22 100644
--- a/src/mesa/main/formatquery.c
+++ b/src/mesa/main/formatquery.c
@@ -1458,7 +1458,7 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
        * just with the purpose of getting the value.
        */
       struct gl_texture_object *tex_obj = _mesa_new_texture_object(ctx, 0, target);
-      buffer[0] = tex_obj->ImageFormatCompatibilityType;
+      buffer[0] = tex_obj->Attrib.ImageFormatCompatibilityType;
       _mesa_delete_texture_object(ctx, tex_obj);
 
       break;
diff --git a/src/mesa/main/mipmap.c b/src/mesa/main/mipmap.c
index fca74602e92..3836f8b4c65 100644
--- a/src/mesa/main/mipmap.c
+++ b/src/mesa/main/mipmap.c
@@ -62,7 +62,7 @@ _mesa_compute_num_levels(struct gl_context *ctx,
    numLevels = texObj->Attrib.BaseLevel + baseImage->MaxNumLevels;
    numLevels = MIN2(numLevels, (GLuint) texObj->Attrib.MaxLevel + 1);
    if (texObj->Immutable)
-      numLevels = MIN2(numLevels, texObj->NumLevels);
+      numLevels = MIN2(numLevels, texObj->Attrib.NumLevels);
    assert(numLevels >= 1);
 
    return numLevels;
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index d3e3ff73501..69c72955ec9 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -970,8 +970,13 @@ struct gl_texture_object_attrib
    GLenum Swizzle[4];          /**< GL_EXT_texture_swizzle */
    GLushort _Swizzle;          /**< same as Swizzle, but SWIZZLE_* format */
    GLenum16 DepthMode;         /**< GL_ARB_depth_texture */
-   bool StencilSampling;       /**< Should we sample stencil instead of depth? */
+   GLenum16 ImageFormatCompatibilityType; /**< GL_ARB_shader_image_load_store */
+   GLushort MinLayer;          /**< GL_ARB_texture_view */
+   GLushort NumLayers;         /**< GL_ARB_texture_view */
    GLboolean GenerateMipmap;   /**< GL_SGIS_generate_mipmap */
+   GLbyte ImmutableLevels;     /**< ES 3.0 / ARB_texture_view */
+   GLubyte MinLevel;           /**< GL_ARB_texture_view */
+   GLubyte NumLevels;          /**< GL_ARB_texture_view */
 };
 
 /**
@@ -1013,7 +1018,6 @@ struct gl_texture_object
    GLbyte _MaxLevel;           /**< actual max mipmap level (q in the spec) */
    GLfloat _MaxLambda;         /**< = _MaxLevel - BaseLevel (q - p in spec) */
    GLint CropRect[4];          /**< GL_OES_draw_texture */
-   GLbyte ImmutableLevels;     /**< ES 3.0 / ARB_texture_view */
    GLboolean _BaseComplete;    /**< Is the base texture level valid? */
    GLboolean _MipmapComplete;  /**< Is the whole mipmap valid? */
    GLboolean _IsIntegerFormat; /**< Does the texture store integer values? */
@@ -1025,24 +1029,20 @@ struct gl_texture_object
    GLboolean _IsHalfFloat;     /**< GL_OES_half_float_texture */
    bool HandleAllocated;       /**< GL_ARB_bindless_texture */
 
+   /* This should not be restored by glPopAttrib: */
+   bool StencilSampling;       /**< Should we sample stencil instead of depth? */
+
    /** GL_OES_EGL_image_external */
    GLubyte RequiredTextureImageUnits;
 
-   GLubyte MinLevel;            /**< GL_ARB_texture_view */
-   GLubyte NumLevels;           /**< GL_ARB_texture_view */
-   GLushort MinLayer;            /**< GL_ARB_texture_view */
-   GLushort NumLayers;           /**< GL_ARB_texture_view */
-
    /** GL_EXT_memory_object */
    GLenum16 TextureTiling;
 
-   /** GL_ARB_shader_image_load_store */
-   GLenum16 ImageFormatCompatibilityType;
-
    /** GL_ARB_texture_buffer_object */
    GLenum16 BufferObjectFormat;
    /** Equivalent Mesa format for BufferObjectFormat. */
    mesa_format _BufferObjectFormat;
+   /* TODO: BufferObject->Name should be restored by glPopAttrib(GL_TEXTURE_BIT); */
    struct gl_buffer_object *BufferObject;
 
    /** GL_ARB_texture_buffer_range */
diff --git a/src/mesa/main/shaderimage.c b/src/mesa/main/shaderimage.c
index d1fd25b8f3d..7a47585ce05 100644
--- a/src/mesa/main/shaderimage.c
+++ b/src/mesa/main/shaderimage.c
@@ -495,7 +495,7 @@ _mesa_is_image_unit_valid(struct gl_context *ctx, struct gl_image_unit *u)
    if (!tex_format)
       return GL_FALSE;
 
-   switch (t->ImageFormatCompatibilityType) {
+   switch (t->Attrib.ImageFormatCompatibilityType) {
    case GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE:
       if (_mesa_get_format_bytes(tex_format) !=
           _mesa_get_format_bytes(u->_ActualFormat))
diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
index 3911e2d8fb8..0b0252a0c6a 100644
--- a/src/mesa/main/texobj.c
+++ b/src/mesa/main/texobj.c
@@ -352,7 +352,7 @@ _mesa_initialize_texture_object( struct gl_context *ctx,
    obj->Sampler.Attrib.CompareMode = GL_NONE;         /* ARB_shadow */
    obj->Sampler.Attrib.CompareFunc = GL_LEQUAL;       /* ARB_shadow */
    obj->Attrib.DepthMode = ctx->API == API_OPENGL_CORE ? GL_RED : GL_LUMINANCE;
-   obj->Attrib.StencilSampling = false;
+   obj->StencilSampling = false;
    obj->Sampler.Attrib.CubeMapSeamless = GL_FALSE;
    obj->Sampler.HandleAllocated = GL_FALSE;
    obj->Attrib.Swizzle[0] = GL_RED;
@@ -363,7 +363,7 @@ _mesa_initialize_texture_object( struct gl_context *ctx,
    obj->Sampler.Attrib.sRGBDecode = GL_DECODE_EXT;
    obj->BufferObjectFormat = GL_R8;
    obj->_BufferObjectFormat = MESA_FORMAT_R_UNORM8;
-   obj->ImageFormatCompatibilityType = GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE;
+   obj->Attrib.ImageFormatCompatibilityType = GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE;
 
    /* GL_ARB_bindless_texture */
    _mesa_init_texture_handles(obj);
@@ -710,7 +710,7 @@ _mesa_test_texobj_completeness( const struct gl_context *ctx,
       /* Adjust max level for views: the data store may have more levels than
        * the view exposes.
        */
-      t->_MaxLevel = MAX2(MIN2(t->_MaxLevel, t->NumLevels - 1), 0);
+      t->_MaxLevel = MAX2(MIN2(t->_MaxLevel, t->Attrib.NumLevels - 1), 0);
    }
 
    /* Compute _MaxLambda = q - p in the spec used during mipmapping */
diff --git a/src/mesa/main/texobj.h b/src/mesa/main/texobj.h
index ce5539263ba..313be779ddc 100644
--- a/src/mesa/main/texobj.h
+++ b/src/mesa/main/texobj.h
@@ -143,7 +143,7 @@ _mesa_is_texture_complete(const struct gl_texture_object *texObj,
     */
    if (!isMultisample &&
        (texObj->_IsIntegerFormat ||
-        (texObj->Attrib.StencilSampling &&
+        (texObj->StencilSampling &&
          img->_BaseFormat == GL_DEPTH_STENCIL)) &&
        (sampler->Attrib.MagFilter != GL_NEAREST ||
         (sampler->Attrib.MinFilter != GL_NEAREST &&
diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c
index d99ed4f1408..a05615e2386 100644
--- a/src/mesa/main/texparam.c
+++ b/src/mesa/main/texparam.c
@@ -386,7 +386,7 @@ set_tex_parameteri(struct gl_context *ctx,
 
       /** See note about ARB_texture_storage below */
       if (texObj->Immutable)
-         texObj->Attrib.BaseLevel = MIN2(texObj->ImmutableLevels - 1, params[0]);
+         texObj->Attrib.BaseLevel = MIN2(texObj->Attrib.ImmutableLevels - 1, params[0]);
       else
          texObj->Attrib.BaseLevel = params[0];
 
@@ -413,7 +413,7 @@ set_tex_parameteri(struct gl_context *ctx,
        */
       if (texObj->Immutable)
           texObj->Attrib.MaxLevel = CLAMP(params[0], texObj->Attrib.BaseLevel,
-                                   texObj->ImmutableLevels - 1);
+                                   texObj->Attrib.ImmutableLevels - 1);
       else
          texObj->Attrib.MaxLevel = params[0];
 
@@ -503,10 +503,10 @@ set_tex_parameteri(struct gl_context *ctx,
          if (!stencil && params[0] != GL_DEPTH_COMPONENT)
             goto invalid_param;
 
-         if (texObj->Attrib.StencilSampling == stencil)
+         if (texObj->StencilSampling == stencil)
             return GL_FALSE;
 
-         texObj->Attrib.StencilSampling = stencil;
+         texObj->StencilSampling = stencil;
          return GL_TRUE;
       }
       goto invalid_pname;
@@ -2246,7 +2246,7 @@ get_tex_parameterfv(struct gl_context *ctx,
          if (!_mesa_has_ARB_stencil_texturing(ctx) && !_mesa_is_gles31(ctx))
             goto invalid_pname;
          *params = (GLfloat)
-            (obj->Attrib.StencilSampling ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT);
+            (obj->StencilSampling ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT);
          break;
       case GL_TEXTURE_LOD_BIAS:
          if (_mesa_is_gles(ctx))
@@ -2302,7 +2302,7 @@ get_tex_parameterfv(struct gl_context *ctx,
 
       case GL_TEXTURE_IMMUTABLE_LEVELS:
          if (_mesa_is_gles3(ctx) || _mesa_has_texture_view(ctx))
-            *params = (GLfloat) obj->ImmutableLevels;
+            *params = (GLfloat) obj->Attrib.ImmutableLevels;
          else
             goto invalid_pname;
          break;
@@ -2310,25 +2310,25 @@ get_tex_parameterfv(struct gl_context *ctx,
       case GL_TEXTURE_VIEW_MIN_LEVEL:
          if (!_mesa_has_texture_view(ctx))
             goto invalid_pname;
-         *params = (GLfloat) obj->MinLevel;
+         *params = (GLfloat) obj->Attrib.MinLevel;
          break;
 
       case GL_TEXTURE_VIEW_NUM_LEVELS:
          if (!_mesa_has_texture_view(ctx))
             goto invalid_pname;
-         *params = (GLfloat) obj->NumLevels;
+         *params = (GLfloat) obj->Attrib.NumLevels;
          break;
 
       case GL_TEXTURE_VIEW_MIN_LAYER:
          if (!_mesa_has_texture_view(ctx))
             goto invalid_pname;
-         *params = (GLfloat) obj->MinLayer;
+         *params = (GLfloat) obj->Attrib.MinLayer;
          break;
 
       case GL_TEXTURE_VIEW_NUM_LAYERS:
          if (!_mesa_has_texture_view(ctx))
             goto invalid_pname;
-         *params = (GLfloat) obj->NumLayers;
+         *params = (GLfloat) obj->Attrib.NumLayers;
          break;
 
       case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
@@ -2346,7 +2346,7 @@ get_tex_parameterfv(struct gl_context *ctx,
       case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:
          if (!ctx->Extensions.ARB_shader_image_load_store)
             goto invalid_pname;
-         *params = (GLfloat) obj->ImageFormatCompatibilityType;
+         *params = (GLfloat) obj->Attrib.ImageFormatCompatibilityType;
          break;
 
       case GL_TEXTURE_TARGET:
@@ -2508,7 +2508,7 @@ get_tex_parameteriv(struct gl_context *ctx,
          if (!_mesa_has_ARB_stencil_texturing(ctx) && !_mesa_is_gles31(ctx))
             goto invalid_pname;
          *params = (GLint)
-            (obj->Attrib.StencilSampling ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT);
+            (obj->StencilSampling ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT);
          break;
       case GL_TEXTURE_LOD_BIAS:
          if (_mesa_is_gles(ctx))
@@ -2568,7 +2568,7 @@ get_tex_parameteriv(struct gl_context *ctx,
       case GL_TEXTURE_IMMUTABLE_LEVELS:
          if (_mesa_is_gles3(ctx) ||
              (_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_view))
-            *params = obj->ImmutableLevels;
+            *params = obj->Attrib.ImmutableLevels;
          else
             goto invalid_pname;
          break;
@@ -2576,25 +2576,25 @@ get_tex_parameteriv(struct gl_context *ctx,
       case GL_TEXTURE_VIEW_MIN_LEVEL:
          if (!ctx->Extensions.ARB_texture_view)
             goto invalid_pname;
-         *params = (GLint) obj->MinLevel;
+         *params = (GLint) obj->Attrib.MinLevel;
          break;
 
       case GL_TEXTURE_VIEW_NUM_LEVELS:
          if (!ctx->Extensions.ARB_texture_view)
             goto invalid_pname;
-         *params = (GLint) obj->NumLevels;
+         *params = (GLint) obj->Attrib.NumLevels;
          break;
 
       case GL_TEXTURE_VIEW_MIN_LAYER:
          if (!ctx->Extensions.ARB_texture_view)
             goto invalid_pname;
-         *params = (GLint) obj->MinLayer;
+         *params = (GLint) obj->Attrib.MinLayer;
          break;
 
       case GL_TEXTURE_VIEW_NUM_LAYERS:
          if (!ctx->Extensions.ARB_texture_view)
             goto invalid_pname;
-         *params = (GLint) obj->NumLayers;
+         *params = (GLint) obj->Attrib.NumLayers;
          break;
 
       case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
@@ -2612,7 +2612,7 @@ get_tex_parameteriv(struct gl_context *ctx,
       case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:
          if (!ctx->Extensions.ARB_shader_image_load_store)
             goto invalid_pname;
-         *params = obj->ImageFormatCompatibilityType;
+         *params = obj->Attrib.ImageFormatCompatibilityType;
          break;
 
       case GL_TEXTURE_TARGET:
diff --git a/src/mesa/main/textureview.c b/src/mesa/main/textureview.c
index 2986afb7c11..48596487d22 100644
--- a/src/mesa/main/textureview.c
+++ b/src/mesa/main/textureview.c
@@ -486,34 +486,34 @@ _mesa_set_texture_view_state(struct gl_context *ctx,
     */
 
    texObj->Immutable = GL_TRUE;
-   texObj->ImmutableLevels = levels;
-   texObj->MinLevel = 0;
-   texObj->NumLevels = levels;
-   texObj->MinLayer = 0;
-   texObj->NumLayers = 1;
+   texObj->Attrib.ImmutableLevels = levels;
+   texObj->Attrib.MinLevel = 0;
+   texObj->Attrib.NumLevels = levels;
+   texObj->Attrib.MinLayer = 0;
+   texObj->Attrib.NumLayers = 1;
    switch (target) {
    case GL_TEXTURE_1D_ARRAY:
-      texObj->NumLayers = texImage->Height;
+      texObj->Attrib.NumLayers = texImage->Height;
       break;
 
    case GL_TEXTURE_2D_MULTISAMPLE:
-      texObj->NumLevels = 1;
-      texObj->ImmutableLevels = 1;
+      texObj->Attrib.NumLevels = 1;
+      texObj->Attrib.ImmutableLevels = 1;
       break;
 
    case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
-      texObj->NumLevels = 1;
-      texObj->ImmutableLevels = 1;
+      texObj->Attrib.NumLevels = 1;
+      texObj->Attrib.ImmutableLevels = 1;
       FALLTHROUGH;
       /* fallthrough to set NumLayers */
 
    case GL_TEXTURE_2D_ARRAY:
    case GL_TEXTURE_CUBE_MAP_ARRAY:
-      texObj->NumLayers = texImage->Depth;
+      texObj->Attrib.NumLayers = texImage->Depth;
       break;
 
    case GL_TEXTURE_CUBE_MAP:
-      texObj->NumLayers = 6;
+      texObj->Attrib.NumLayers = 6;
       break;
    }
 }
@@ -540,8 +540,8 @@ texture_view(struct gl_context *ctx, struct gl_texture_object *origTexObj,
                                            internalformat, GL_NONE, GL_NONE);
    if (texFormat == MESA_FORMAT_NONE) return;
 
-   newViewNumLevels = MIN2(numlevels, origTexObj->NumLevels - minlevel);
-   newViewNumLayers = MIN2(numlayers, origTexObj->NumLayers - minlayer);
+   newViewNumLevels = MIN2(numlevels, origTexObj->Attrib.NumLevels - minlevel);
+   newViewNumLayers = MIN2(numlayers, origTexObj->Attrib.NumLayers - minlayer);
 
    faceTarget = _mesa_cube_face_target(origTexObj->Target, minlayer);
 
@@ -687,12 +687,12 @@ texture_view(struct gl_context *ctx, struct gl_texture_object *origTexObj,
       return; /* Already recorded error */
    }
 
-   texObj->MinLevel = origTexObj->MinLevel + minlevel;
-   texObj->MinLayer = origTexObj->MinLayer + minlayer;
-   texObj->NumLevels = newViewNumLevels;
-   texObj->NumLayers = newViewNumLayers;
+   texObj->Attrib.MinLevel = origTexObj->Attrib.MinLevel + minlevel;
+   texObj->Attrib.MinLayer = origTexObj->Attrib.MinLayer + minlayer;
+   texObj->Attrib.NumLevels = newViewNumLevels;
+   texObj->Attrib.NumLayers = newViewNumLayers;
    texObj->Immutable = GL_TRUE;
-   texObj->ImmutableLevels = origTexObj->ImmutableLevels;
+   texObj->Attrib.ImmutableLevels = origTexObj->Attrib.ImmutableLevels;
    texObj->Target = target;
    texObj->TargetIndex = _mesa_tex_target_to_index(ctx, target);
    assert(texObj->TargetIndex < NUM_TEXTURE_TARGETS);
@@ -800,21 +800,25 @@ _mesa_TextureView(GLuint texture, GLenum target, GLuint origtexture,
     * If minlevel or minlayer is greater than level or layer, respectively,
     * return INVALID_VALUE.
     */
-   newViewMinLevel = origTexObj->MinLevel + minlevel;
-   newViewMinLayer = origTexObj->MinLayer + minlayer;
-   if (newViewMinLevel >= (origTexObj->MinLevel + origTexObj->NumLevels)) {
+   newViewMinLevel = origTexObj->Attrib.MinLevel + minlevel;
+   newViewMinLayer = origTexObj->Attrib.MinLayer + minlayer;
+   if (newViewMinLevel >= (origTexObj->Attrib.MinLevel +
+                           origTexObj->Attrib.NumLevels)) {
       _mesa_error(ctx, GL_INVALID_VALUE,
                   "glTextureView(new minlevel (%d) > orig minlevel (%d)"
                   " + orig numlevels (%d))",
-                  newViewMinLevel, origTexObj->MinLevel, origTexObj->NumLevels);
+                  newViewMinLevel, origTexObj->Attrib.MinLevel,
+                  origTexObj->Attrib.NumLevels);
       return;
    }
 
-   if (newViewMinLayer >= (origTexObj->MinLayer + origTexObj->NumLayers)) {
+   if (newViewMinLayer >= (origTexObj->Attrib.MinLayer +
+                           origTexObj->Attrib.NumLayers)) {
       _mesa_error(ctx, GL_INVALID_VALUE,
                   "glTextureView(new minlayer (%d) > orig minlayer (%d)"
                   " + orig numlayers (%d))",
-                  newViewMinLayer, origTexObj->MinLayer, origTexObj->NumLayers);
+                  newViewMinLayer, origTexObj->Attrib.MinLayer,
+                  origTexObj->Attrib.NumLayers);
       return;
    }
 
diff --git a/src/mesa/state_tracker/st_atom_image.c b/src/mesa/state_tracker/st_atom_image.c
index 0cf63db57ab..0cb69c2ba26 100644
--- a/src/mesa/state_tracker/st_atom_image.c
+++ b/src/mesa/state_tracker/st_atom_image.c
@@ -113,7 +113,7 @@ st_convert_image(const struct st_context *st, const struct gl_image_unit *u,
       }
 
       img->resource = stObj->pt;
-      img->u.tex.level = u->Level + stObj->base.MinLevel;
+      img->u.tex.level = u->Level + stObj->base.Attrib.MinLevel;
       assert(img->u.tex.level <= img->resource->last_level);
       if (stObj->pt->target == PIPE_TEXTURE_3D) {
          if (u->Layered) {
@@ -124,11 +124,11 @@ st_convert_image(const struct st_context *st, const struct gl_image_unit *u,
             img->u.tex.last_layer = u->_Layer;
          }
       } else {
-         img->u.tex.first_layer = u->_Layer + stObj->base.MinLayer;
-         img->u.tex.last_layer = u->_Layer + stObj->base.MinLayer;
+         img->u.tex.first_layer = u->_Layer + stObj->base.Attrib.MinLayer;
+         img->u.tex.last_layer = u->_Layer + stObj->base.Attrib.MinLayer;
          if (u->Layered && img->resource->array_size > 1) {
             if (stObj->base.Immutable)
-               img->u.tex.last_layer += stObj->base.NumLayers - 1;
+               img->u.tex.last_layer += stObj->base.Attrib.NumLayers - 1;
             else
                img->u.tex.last_layer += img->resource->array_size - 1;
          }
diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
index 3ea5a25464e..a2af3a7b7e0 100644
--- a/src/mesa/state_tracker/st_atom_sampler.c
+++ b/src/mesa/state_tracker/st_atom_sampler.c
@@ -168,7 +168,7 @@ st_convert_sampler(const struct st_context *st,
       const GLboolean is_integer = texobj->_IsIntegerFormat;
       GLenum texBaseFormat = _mesa_base_tex_image(texobj)->_BaseFormat;
 
-      if (texobj->Attrib.StencilSampling)
+      if (texobj->StencilSampling)
          texBaseFormat = GL_STENCIL_INDEX;
 
       if (st->apply_texture_swizzle_to_border_color) {
@@ -212,7 +212,7 @@ st_convert_sampler(const struct st_context *st,
       GLenum texBaseFormat = _mesa_base_tex_image(texobj)->_BaseFormat;
 
       if (texBaseFormat == GL_DEPTH_COMPONENT ||
-          (texBaseFormat == GL_DEPTH_STENCIL && !texobj->Attrib.StencilSampling)) {
+          (texBaseFormat == GL_DEPTH_STENCIL && !texobj->StencilSampling)) {
          sampler->compare_mode = PIPE_TEX_COMPARE_R_TO_TEXTURE;
          sampler->compare_func = st_compare_func_to_pipe(msamp->Attrib.CompareFunc);
       }
diff --git a/src/mesa/state_tracker/st_cb_copyimage.c b/src/mesa/state_tracker/st_cb_copyimage.c
index 5d79148db7b..aae732ea372 100644
--- a/src/mesa/state_tracker/st_cb_copyimage.c
+++ b/src/mesa/state_tracker/st_cb_copyimage.c
@@ -650,8 +650,8 @@ st_CopyImageSubData(struct gl_context *ctx,
       src_level = stObj->pt != src_res ? 0 : src_image->Level;
       src_z += src_image->Face;
       if (src_image->TexObject->Immutable) {
-         src_level += src_image->TexObject->MinLevel;
-         src_z += src_image->TexObject->MinLayer;
+         src_level += src_image->TexObject->Attrib.MinLevel;
+         src_z += src_image->TexObject->Attrib.MinLayer;
       }
    } else {
       struct st_renderbuffer *src = st_renderbuffer(src_renderbuffer);
@@ -666,8 +666,8 @@ st_CopyImageSubData(struct gl_context *ctx,
       dst_level = stObj->pt != dst_res ? 0 : dst_image->Level;
       dst_z += dst_image->Face;
       if (dst_image->TexObject->Immutable) {
-         dst_level += dst_image->TexObject->MinLevel;
-         dst_z += dst_image->TexObject->MinLayer;
+         dst_level += dst_image->TexObject->Attrib.MinLevel;
+         dst_z += dst_image->TexObject->Attrib.MinLayer;
       }
    } else {
       struct st_renderbuffer *dst = st_renderbuffer(dst_renderbuffer);
diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
index 1337bc47a74..18e1841b2de 100644
--- a/src/mesa/state_tracker/st_cb_fbo.c
+++ b/src/mesa/state_tracker/st_cb_fbo.c
@@ -513,11 +513,12 @@ st_update_renderbuffer_surface(struct st_context *st,
    if (strb->is_rtt && resource->array_size > 1 &&
        stTexObj->base.Immutable) {
       const struct gl_texture_object *tex = &stTexObj->base;
-      first_layer += tex->MinLayer;
+      first_layer += tex->Attrib.MinLayer;
       if (!strb->rtt_layered)
-         last_layer += tex->MinLayer;
+         last_layer += tex->Attrib.MinLayer;
       else
-         last_layer = MIN2(first_layer + tex->NumLayers - 1, last_layer);
+         last_layer = MIN2(first_layer + tex->Attrib.NumLayers - 1,
+                           last_layer);
    }
 
    struct pipe_surface **psurf =
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index 67c1dc7f587..463944061f7 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -1459,10 +1459,10 @@ try_pbo_upload(struct gl_context *ctx, GLuint dims,
    /* Set up the surface */
    {
       unsigned level = stObj->pt != stImage->pt
-         ? 0 : texImage->TexObject->MinLevel + texImage->Level;
+         ? 0 : texImage->TexObject->Attrib.MinLevel + texImage->Level;
       unsigned max_layer = util_max_layer(texture, level);
 
-      zoffset += texImage->Face + texImage->TexObject->MinLayer;
+      zoffset += texImage->Face + texImage->TexObject->Attrib.MinLayer;
 
       struct pipe_surface templ;
       memset(&templ, 0, sizeof(templ));
@@ -1507,7 +1507,7 @@ st_TexSubImage(struct gl_context *ctx, GLuint dims,
    GLenum gl_target = texImage->TexObject->Target;
    unsigned bind;
    GLubyte *map;
-   unsigned dstz = texImage->Face + texImage->TexObject->MinLayer;
+   unsigned dstz = texImage->Face + texImage->TexObject->Attrib.MinLayer;
    unsigned dst_level = 0;
    bool throttled = false;
 
@@ -1515,7 +1515,7 @@ st_TexSubImage(struct gl_context *ctx, GLuint dims,
    st_invalidate_readpix_cache(st);
 
    if (stObj->pt == stImage->pt)
-      dst_level = texImage->TexObject->MinLevel + texImage->Level;
+      dst_level = texImage->TexObject->Attrib.MinLevel + texImage->Level;
 
    assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
           !_mesa_is_format_astc_2d(texImage->TexFormat) &&
@@ -1889,10 +1889,10 @@ st_CompressedTexSubImage(struct gl_context *ctx, GLuint dims,
    /* Set up the surface. */
    {
       unsigned level = stObj->pt != stImage->pt
-         ? 0 : texImage->TexObject->MinLevel + texImage->Level;
+         ? 0 : texImage->TexObject->Attrib.MinLevel + texImage->Level;
       unsigned max_layer = util_max_layer(texture, level);
 
-      GLint layer = z + texImage->Face + texImage->TexObject->MinLayer;
+      GLint layer = z + texImage->Face + texImage->TexObject->Attrib.MinLayer;
 
       struct pipe_surface templ;
       memset(&templ, 0, sizeof(templ));
@@ -2188,12 +2188,12 @@ st_GetTexSubImage(struct gl_context * ctx,
    }
 
    assert(texImage->Face == 0 ||
-          texImage->TexObject->MinLayer == 0 ||
+          texImage->TexObject->Attrib.MinLayer == 0 ||
           zoffset == 0);
 
    memset(&blit, 0, sizeof(blit));
    blit.src.resource = src;
-   blit.src.level = texImage->Level + texImage->TexObject->MinLevel;
+   blit.src.level = texImage->Level + texImage->TexObject->Attrib.MinLevel;
    blit.src.format = src_format;
    blit.dst.resource = dst;
    blit.dst.level = 0;
@@ -2202,7 +2202,7 @@ st_GetTexSubImage(struct gl_context * ctx,
    blit.dst.box.x = 0;
    blit.src.box.y = yoffset;
    blit.dst.box.y = 0;
-   blit.src.box.z = texImage->Face + texImage->TexObject->MinLayer + zoffset;
+   blit.src.box.z = texImage->Face + texImage->TexObject->Attrib.MinLayer + zoffset;
    blit.dst.box.z = 0;
    blit.src.box.width = blit.dst.box.width = width;
    blit.src.box.height = blit.dst.box.height = height;
@@ -2592,10 +2592,11 @@ st_CopyTexSubImage(struct gl_context *ctx, GLuint dims,
    blit.dst.resource = stImage->pt;
    blit.dst.format = dst_format;
    blit.dst.level = stObj->pt != stImage->pt
-      ? 0 : texImage->Level + texImage->TexObject->MinLevel;
+      ? 0 : texImage->Level + texImage->TexObject->Attrib.MinLevel;
    blit.dst.box.x = destX;
    blit.dst.box.y = destY;
-   blit.dst.box.z = stImage->base.Face + slice + texImage->TexObject->MinLayer;
+   blit.dst.box.z = stImage->base.Face + slice +
+                    texImage->TexObject->Attrib.MinLayer;
    blit.dst.box.width = width;
    blit.dst.box.height = height;
    blit.dst.box.depth = 1;
@@ -3134,7 +3135,7 @@ st_TextureView(struct gl_context *ctx,
    struct gl_texture_image *image = texObj->Image[0][0];
 
    const int numFaces = _mesa_num_tex_faces(texObj->Target);
-   const int numLevels = texObj->NumLevels;
+   const int numLevels = texObj->Attrib.NumLevels;
 
    int face;
    int level;
@@ -3244,8 +3245,8 @@ st_ClearTexSubImage(struct gl_context *ctx,
        * not a texture view, the offsets will be zero.
        */
       assert(stImage->pt == st_texture_object(texObj)->pt);
-      level = texImage->Level + texObj->MinLevel;
-      box.z += texObj->MinLayer;
+      level = texImage->Level + texObj->Attrib.MinLevel;
+      box.z += texObj->Attrib.MinLayer;
    }
    else {
       /* Texture level sizes may be inconsistent.  We my have "loose",
diff --git a/src/mesa/state_tracker/st_gen_mipmap.c b/src/mesa/state_tracker/st_gen_mipmap.c
index 70a56c4431e..8f39315178e 100644
--- a/src/mesa/state_tracker/st_gen_mipmap.c
+++ b/src/mesa/state_tracker/st_gen_mipmap.c
@@ -64,7 +64,7 @@ st_generate_mipmap(struct gl_context *ctx, GLenum target,
       return;
 
    if (texObj->Immutable)
-      baseLevel += texObj->MinLevel;
+      baseLevel += texObj->Attrib.MinLevel;
 
    /* not sure if this ultimately actually should work,
       but we're not supporting multisampled textures yet. */
@@ -74,7 +74,7 @@ st_generate_mipmap(struct gl_context *ctx, GLenum target,
    lastLevel = _mesa_compute_num_levels(ctx, texObj, target) - 1;
 
    if (texObj->Immutable)
-      lastLevel += texObj->MinLevel;
+      lastLevel += texObj->Attrib.MinLevel;
 
    if (lastLevel == 0)
       return;
diff --git a/src/mesa/state_tracker/st_sampler_view.c b/src/mesa/state_tracker/st_sampler_view.c
index 1516d0deb6b..0eb22cfae0f 100644
--- a/src/mesa/state_tracker/st_sampler_view.c
+++ b/src/mesa/state_tracker/st_sampler_view.c
@@ -445,10 +445,11 @@ check_sampler_swizzle(const struct st_context *st,
 static unsigned
 last_level(const struct st_texture_object *stObj)
 {
-   unsigned ret = MIN2(stObj->base.MinLevel + stObj->base._MaxLevel,
+   unsigned ret = MIN2(stObj->base.Attrib.MinLevel + stObj->base._MaxLevel,
                        stObj->pt->last_level);
    if (stObj->base.Immutable)
-      ret = MIN2(ret, stObj->base.MinLevel + stObj->base.NumLevels - 1);
+      ret = MIN2(ret, stObj->base.Attrib.MinLevel +
+                 stObj->base.Attrib.NumLevels - 1);
    return ret;
 }
 
@@ -457,7 +458,8 @@ static unsigned
 last_layer(const struct st_texture_object *stObj)
 {
    if (stObj->base.Immutable && stObj->pt->array_size > 1)
-      return MIN2(stObj->base.MinLayer + stObj->base.NumLayers - 1,
+      return MIN2(stObj->base.Attrib.MinLayer +
+                  stObj->base.Attrib.NumLayers - 1,
                   stObj->pt->array_size - 1);
    return stObj->pt->array_size - 1;
 }
@@ -479,7 +481,7 @@ get_sampler_view_format(struct st_context *st,
    if (baseFormat == GL_DEPTH_COMPONENT ||
        baseFormat == GL_DEPTH_STENCIL ||
        baseFormat == GL_STENCIL_INDEX) {
-      if (stObj->base.Attrib.StencilSampling || baseFormat == GL_STENCIL_INDEX)
+      if (stObj->base.StencilSampling || baseFormat == GL_STENCIL_INDEX)
          format = util_format_stencil_only(format);
 
       return format;
@@ -541,13 +543,14 @@ st_create_texture_sampler_view_from_stobj(struct st_context *st,
    if (stObj->level_override >= 0) {
       templ.u.tex.first_level = templ.u.tex.last_level = stObj->level_override;
    } else {
-      templ.u.tex.first_level = stObj->base.MinLevel + stObj->base.Attrib.BaseLevel;
+      templ.u.tex.first_level = stObj->base.Attrib.MinLevel +
+                                stObj->base.Attrib.BaseLevel;
       templ.u.tex.last_level = last_level(stObj);
    }
    if (stObj->layer_override >= 0) {
       templ.u.tex.first_layer = templ.u.tex.last_layer = stObj->layer_override;
    } else {
-      templ.u.tex.first_layer = stObj->base.MinLayer;
+      templ.u.tex.first_layer = stObj->base.Attrib.MinLayer;
       templ.u.tex.last_layer = last_layer(stObj);
    }
    assert(templ.u.tex.first_layer <= templ.u.tex.last_layer);
@@ -590,9 +593,11 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st,
       assert(get_sampler_view_format(st, stObj, srgb_skip_decode) == view->format);
       assert(gl_target_to_pipe(stObj->base.Target) == view->target);
       assert(stObj->level_override >= 0 ||
-             stObj->base.MinLevel + stObj->base.Attrib.BaseLevel == view->u.tex.first_level);
+             stObj->base.Attrib.MinLevel +
+             stObj->base.Attrib.BaseLevel == view->u.tex.first_level);
       assert(stObj->level_override >= 0 || last_level(stObj) == view->u.tex.last_level);
-      assert(stObj->layer_override >= 0 || stObj->base.MinLayer == view->u.tex.first_layer);
+      assert(stObj->layer_override >= 0 ||
+             stObj->base.Attrib.MinLayer == view->u.tex.first_layer);
       assert(stObj->layer_override >= 0 || last_layer(stObj) == view->u.tex.last_layer);
       assert(stObj->layer_override < 0 ||
              (stObj->layer_override == view->u.tex.first_layer &&
diff --git a/src/mesa/state_tracker/st_texture.c b/src/mesa/state_tracker/st_texture.c
index bb63eefdffe..3510704ddf8 100644
--- a/src/mesa/state_tracker/st_texture.c
+++ b/src/mesa/state_tracker/st_texture.c
@@ -268,10 +268,10 @@ st_texture_image_map(struct st_context *st, struct st_texture_image *stImage,
       level = stImage->base.Level;
 
    if (stObj->base.Immutable) {
-      level += stObj->base.MinLevel;
-      z += stObj->base.MinLayer;
+      level += stObj->base.Attrib.MinLevel;
+      z += stObj->base.Attrib.MinLayer;
       if (stObj->pt->array_size > 1)
-         d = MIN2(d, stObj->base.NumLayers);
+         d = MIN2(d, stObj->base.Attrib.NumLayers);
    }
 
    z += stImage->base.Face;
@@ -308,7 +308,7 @@ st_texture_image_unmap(struct st_context *st,
    struct pipe_transfer **transfer;
 
    if (stObj->base.Immutable)
-      slice += stObj->base.MinLayer;
+      slice += stObj->base.Attrib.MinLayer;
    transfer = &stImage->transfer[slice + stImage->base.Face].transfer;
 
    DBG("%s\n", __func__);



More information about the mesa-commit mailing list