intel: Clarify first_level/last_level vs baselevel/maxlevel by deletion.
authorEric Anholt <eric@anholt.net>
Thu, 6 Jan 2011 00:02:42 +0000 (16:02 -0800)
committerEric Anholt <eric@anholt.net>
Thu, 6 Jan 2011 00:11:30 +0000 (16:11 -0800)
This has always been ugly about our texture code -- object base/max
level vs intel object first/last level vs image level vs miptree
first/last level.  We now get rid of intelObj->first_level which is
just tObj->BaseLevel, and make intelObj->_MaxLevel clearly based off
of tObj->_MaxLevel instead of duplicating its code (incorrectly, as
image->MaxLog2 only considers width/height and not depth!)

src/mesa/drivers/dri/i915/i830_texstate.c
src/mesa/drivers/dri/i915/i915_texstate.c
src/mesa/drivers/dri/i965/brw_fallback.c
src/mesa/drivers/dri/i965/brw_wm_sampler_state.c
src/mesa/drivers/dri/i965/brw_wm_surface_state.c
src/mesa/drivers/dri/intel/intel_tex_obj.h
src/mesa/drivers/dri/intel/intel_tex_validate.c

index 26ce5c375b687493fa9f7780d2e404293c18771a..c35b4b5ed06d1a1b3a77809656f1141f45b8b028 100644 (file)
@@ -140,9 +140,9 @@ i830_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3)
    /* Get first image here, since intelObj->firstLevel will get set in
     * the intel_finalize_mipmap_tree() call above.
     */
-   firstImage = tObj->Image[0][intelObj->firstLevel];
+   firstImage = tObj->Image[0][tObj->BaseLevel];
 
-   intel_miptree_get_image_offset(intelObj->mt, intelObj->firstLevel, 0, 0,
+   intel_miptree_get_image_offset(intelObj->mt, tObj->BaseLevel, 0, 0,
                                  &dst_x, &dst_y);
 
    drm_intel_bo_reference(intelObj->mt->region->buffer);
index c724a214967c1485a302879d4109e7bc8e76f9f9..af140c85f502fb47181607bd348ab0853daf590d 100644 (file)
@@ -156,7 +156,7 @@ i915_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3)
    /* Get first image here, since intelObj->firstLevel will get set in
     * the intel_finalize_mipmap_tree() call above.
     */
-   firstImage = tObj->Image[0][intelObj->firstLevel];
+   firstImage = tObj->Image[0][tObj->BaseLevel];
 
    drm_intel_bo_reference(intelObj->mt->region->buffer);
    i915->state.tex_buffer[unit] = intelObj->mt->region->buffer;
index 6796fb208dc72cc54c897bd4c74004b6af4eee98..7262cf69582d1389609d9c23462d45606df0a5ab 100644 (file)
@@ -63,8 +63,8 @@ static GLboolean do_check_fallback(struct brw_context *brw)
    for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
       struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
       if (texUnit->_ReallyEnabled) {
-        struct intel_texture_object *intelObj = intel_texture_object(texUnit->_Current);
-        struct gl_texture_image *texImage = intelObj->base.Image[0][intelObj->firstLevel];
+        struct gl_texture_object *tex_obj = texUnit->_Current;
+        struct gl_texture_image *texImage = tex_obj->Image[0][tex_obj->BaseLevel];
         if (texImage->Border) {
            DBG("FALLBACK: texture border\n");
            return GL_TRUE;
index e7c97a1cb05e2fff40c11f8968d4a4b107a7a98d..30672b4251beecb4aea7edd73a22cb3562d40b19 100644 (file)
@@ -276,9 +276,8 @@ brw_wm_sampler_populate_key(struct brw_context *brw,
         struct wm_sampler_entry *entry = &key->sampler[unit];
         struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
         struct gl_texture_object *texObj = texUnit->_Current;
-        struct intel_texture_object *intelObj = intel_texture_object(texObj);
         struct gl_texture_image *firstImage =
-           texObj->Image[0][intelObj->firstLevel];
+           texObj->Image[0][texObj->BaseLevel];
 
         memset(last_entry_end, 0, 
                (char*)entry - last_entry_end + sizeof(*entry));
index 0218d599c7dece13dc7b8a4c12a2885bf6379dcd..3b59b0b98e15455c1d930df63c2d7ae4432175a6 100644 (file)
@@ -163,7 +163,7 @@ brw_update_texture_surface( struct gl_context *ctx, GLuint unit )
    struct brw_context *brw = brw_context(ctx);
    struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
    struct intel_texture_object *intelObj = intel_texture_object(tObj);
-   struct gl_texture_image *firstImage = tObj->Image[0][intelObj->firstLevel];
+   struct gl_texture_image *firstImage = tObj->Image[0][tObj->BaseLevel];
    const GLuint surf_index = SURF_INDEX_TEXTURE(unit);
    struct brw_surface_state surf;
    void *map;
@@ -181,7 +181,7 @@ brw_update_texture_surface( struct gl_context *ctx, GLuint unit )
 /*    surf.ss0.data_return_format = BRW_SURFACERETURNFORMAT_S1; */
    surf.ss1.base_addr = intelObj->mt->region->buffer->offset; /* reloc */
 
-   surf.ss2.mip_count = intelObj->lastLevel - intelObj->firstLevel;
+   surf.ss2.mip_count = intelObj->_MaxLevel - tObj->BaseLevel;
    surf.ss2.width = firstImage->Width - 1;
    surf.ss2.height = firstImage->Height - 1;
    brw_set_surface_tiling(&surf, intelObj->mt->region->tiling);
index 5f60e0ea4f3a1bc3af6119fea49511647320bb24..e93ef4a4727937893bc890901a46102f62f76acb 100644 (file)
@@ -32,11 +32,11 @@ struct intel_texture_object
 {
    struct gl_texture_object base;       /* The "parent" object */
 
-   /* The mipmap tree must include at least these levels once
-    * validated:
+   /* This is a mirror of base._MaxLevel, updated at validate time,
+    * except that we don't bother with the non-base levels for
+    * non-mipmapped textures.
     */
-   GLuint firstLevel;
-   GLuint lastLevel;
+   unsigned int _MaxLevel;
 
    /* Offset for firstLevel image:
     */
index 8383c974c388fb86c6bcc1b5c9e40139e414754a..4d257cc71dc0505c6aac202616cfdbe5e3d95460 100644 (file)
@@ -8,46 +8,21 @@
 #define FILE_DEBUG_FLAG DEBUG_TEXTURE
 
 /**
- * Compute which mipmap levels that really need to be sent to the hardware.
- * This depends on the base image size, GL_TEXTURE_MIN_LOD,
- * GL_TEXTURE_MAX_LOD, GL_TEXTURE_BASE_LEVEL, and GL_TEXTURE_MAX_LEVEL.
+ * When validating, we only care about the texture images that could
+ * be seen, so for non-mipmapped modes we want to ignore everything
+ * but BaseLevel.
  */
 static void
-intel_calculate_first_last_level(struct intel_context *intel,
-                                struct intel_texture_object *intelObj)
+intel_update_max_level(struct intel_context *intel,
+                      struct intel_texture_object *intelObj)
 {
    struct gl_texture_object *tObj = &intelObj->base;
-   const struct gl_texture_image *const baseImage =
-      tObj->Image[0][tObj->BaseLevel];
 
-   /* These must be signed values.  MinLod and MaxLod can be negative numbers,
-    * and having firstLevel and lastLevel as signed prevents the need for
-    * extra sign checks.
-    */
-   int firstLevel = tObj->BaseLevel;
-   int lastLevel;
-
-   /* Yes, this looks overly complicated, but it's all needed.
-    */
    if (tObj->MinFilter == GL_NEAREST || tObj->MinFilter == GL_LINEAR) {
-      /* GL_NEAREST and GL_LINEAR only care about GL_TEXTURE_BASE_LEVEL.
-       */
-      lastLevel = tObj->BaseLevel;
+      intelObj->_MaxLevel = tObj->BaseLevel;
    } else {
-      /* Min/max LOD are taken into account in sampler state.  We don't
-       * want to re-layout textures just because clamping has been applied
-       * since it means a bunch of blitting around and probably no memory
-       * savings (since we have to keep the other levels around anyway).
-       */
-      lastLevel = MIN2(tObj->BaseLevel + baseImage->MaxLog2,
-                      tObj->MaxLevel);
-      /* need at least one level */
-      lastLevel = MAX2(firstLevel, lastLevel);
+      intelObj->_MaxLevel = tObj->_MaxLevel;
    }
-
-   /* save these values */
-   intelObj->firstLevel = firstLevel;
-   intelObj->lastLevel = lastLevel;
 }
 
 /**
@@ -109,8 +84,8 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
 
    /* What levels must the tree include at a minimum?
     */
-   intel_calculate_first_last_level(intel, intelObj);
-   firstImage = intel_texture_image(tObj->Image[0][intelObj->firstLevel]);
+   intel_update_max_level(intel, intelObj);
+   firstImage = intel_texture_image(tObj->Image[0][tObj->BaseLevel]);
 
    /* Fallback case:
     */
@@ -129,8 +104,8 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
     */
    if (firstImage->mt &&
        firstImage->mt != intelObj->mt &&
-       firstImage->mt->first_level <= intelObj->firstLevel &&
-       firstImage->mt->last_level >= intelObj->lastLevel) {
+       firstImage->mt->first_level <= tObj->BaseLevel &&
+       firstImage->mt->last_level >= intelObj->_MaxLevel) {
 
       if (intelObj->mt)
          intel_miptree_release(intel, &intelObj->mt);
@@ -157,8 +132,8 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
    if (intelObj->mt &&
        (intelObj->mt->target != intelObj->base.Target ||
        intelObj->mt->internal_format != firstImage->base.InternalFormat ||
-       intelObj->mt->first_level != intelObj->firstLevel ||
-       intelObj->mt->last_level != intelObj->lastLevel ||
+       intelObj->mt->first_level != tObj->BaseLevel ||
+       intelObj->mt->last_level != intelObj->_MaxLevel ||
        intelObj->mt->width0 != firstImage->base.Width ||
        intelObj->mt->height0 != firstImage->base.Height ||
        intelObj->mt->depth0 != firstImage->base.Depth ||
@@ -175,8 +150,8 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
                                           intelObj->base.Target,
                                           firstImage->base._BaseFormat,
                                           firstImage->base.InternalFormat,
-                                          intelObj->firstLevel,
-                                          intelObj->lastLevel,
+                                          tObj->BaseLevel,
+                                          intelObj->_MaxLevel,
                                           firstImage->base.Width,
                                           firstImage->base.Height,
                                           firstImage->base.Depth,
@@ -189,7 +164,7 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
     */
    nr_faces = (intelObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1;
    for (face = 0; face < nr_faces; face++) {
-      for (i = intelObj->firstLevel; i <= intelObj->lastLevel; i++) {
+      for (i = tObj->BaseLevel; i <= intelObj->_MaxLevel; i++) {
          struct intel_texture_image *intelImage =
             intel_texture_image(intelObj->base.Image[face][i]);
 
@@ -263,7 +238,7 @@ intel_tex_map_images(struct intel_context *intel,
 
    DBG("%s\n", __FUNCTION__);
 
-   for (i = intelObj->firstLevel; i <= intelObj->lastLevel; i++)
+   for (i = intelObj->base.BaseLevel; i <= intelObj->_MaxLevel; i++)
       intel_tex_map_level_images(intel, intelObj, i);
 }
 
@@ -273,6 +248,6 @@ intel_tex_unmap_images(struct intel_context *intel,
 {
    int i;
 
-   for (i = intelObj->firstLevel; i <= intelObj->lastLevel; i++)
+   for (i = intelObj->base.BaseLevel; i <= intelObj->_MaxLevel; i++)
       intel_tex_unmap_level_images(intel, intelObj, i);
 }