intel: Skip texture validation logic when nothing has changed.
authorEric Anholt <eric@anholt.net>
Thu, 20 Dec 2012 22:09:32 +0000 (14:09 -0800)
committerEric Anholt <eric@anholt.net>
Fri, 28 Dec 2012 19:05:23 +0000 (11:05 -0800)
Improves GLBenchmark 2.1 offscreen performance by 3.2% +/- 1.5% (n=52).

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/intel/intel_mipmap_tree.c
src/mesa/drivers/dri/intel/intel_tex.c
src/mesa/drivers/dri/intel/intel_tex_image.c
src/mesa/drivers/dri/intel/intel_tex_obj.h
src/mesa/drivers/dri/intel/intel_tex_validate.c

index 181130bd2ac8a2c1b885d9a8097bf0dbf8aa9fc5..8d814bd6d4a50c62d999e733d2151518ce8061bf 100644 (file)
@@ -771,6 +771,8 @@ intel_miptree_copy_teximage(struct intel_context *intel,
                            struct intel_mipmap_tree *dst_mt)
 {
    struct intel_mipmap_tree *src_mt = intelImage->mt;
+   struct intel_texture_object *intel_obj =
+      intel_texture_object(intelImage->base.Base.TexObject);
    int level = intelImage->base.Base.Level;
    int face = intelImage->base.Base.Face;
    GLuint depth = intelImage->base.Base.Depth;
@@ -780,6 +782,7 @@ intel_miptree_copy_teximage(struct intel_context *intel,
    }
 
    intel_miptree_reference(&intelImage->mt, dst_mt);
+   intel_obj->needs_validate = true;
 }
 
 bool
index 6820f9804e11495313e0441d09b38767f213d7db..a2a3693749029e6a912f4ec803ceda1d21c7eb23 100644 (file)
@@ -36,6 +36,8 @@ intelNewTextureObject(struct gl_context * ctx, GLuint name, GLenum target)
    DBG("%s\n", __FUNCTION__);
    _mesa_initialize_texture_object(&obj->base, name, target);
 
+   obj->needs_validate = true;
+
    return &obj->base;
 }
 
@@ -107,6 +109,8 @@ intel_alloc_texture_image_buffer(struct gl_context *ctx,
           image->Width, image->Height, image->Depth, intel_image->mt);
    }
 
+   intel_texobj->needs_validate = true;
+
    return true;
 }
 
index cc4d49fcf0b5f9547655dc933cce2e5e792382f3..7361e6a359e3bba8c8b0ec21f510b606cd30f4f5 100644 (file)
@@ -274,6 +274,7 @@ intel_set_texture_image_region(struct gl_context *ctx,
                                                     region);
    if (intel_image->mt == NULL)
        return;
+   intel_texobj->needs_validate = true;
 
    intel_image->mt->offset = offset;
    intel_image->base.RowStride = region->pitch;
index d1a5f05f9fcdaf12146135ba49677bbcb8858783..8c166b4021925e1f4713334b89be550f0e5c4594 100644 (file)
@@ -49,6 +49,12 @@ struct intel_texture_object
     * regions will be copied to this region and the old storage freed.
     */
    struct intel_mipmap_tree *mt;
+
+   /**
+    * Set when mipmap trees in the texture images of this texture object
+    * might not all be the mipmap tree above.
+    */
+   bool needs_validate;
 };
 
 
index 3f21601a8a97693a6e896b4bbbd39d6bdc0467b9..fee584263878dcad294f1e54023327ac1d2d33fd 100644 (file)
@@ -21,12 +21,18 @@ intel_update_max_level(struct intel_texture_object *intelObj,
                       struct gl_sampler_object *sampler)
 {
    struct gl_texture_object *tObj = &intelObj->base;
+   int maxlevel;
 
    if (sampler->MinFilter == GL_NEAREST ||
        sampler->MinFilter == GL_LINEAR) {
-      intelObj->_MaxLevel = tObj->BaseLevel;
+      maxlevel = tObj->BaseLevel;
    } else {
-      intelObj->_MaxLevel = tObj->_MaxLevel;
+      maxlevel = tObj->_MaxLevel;
+   }
+
+   if (intelObj->_MaxLevel != maxlevel) {
+      intelObj->_MaxLevel = maxlevel;
+      intelObj->needs_validate = true;
    }
 }
 
@@ -55,6 +61,12 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
    /* What levels must the tree include at a minimum?
     */
    intel_update_max_level(intelObj, sampler);
+   if (intelObj->mt && intelObj->mt->first_level != tObj->BaseLevel)
+      intelObj->needs_validate = true;
+
+   if (!intelObj->needs_validate)
+      return true;
+
    firstImage = intel_texture_image(tObj->Image[0][tObj->BaseLevel]);
 
    /* Check tree can hold all active levels.  Check tree matches
@@ -122,6 +134,8 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
       }
    }
 
+   intelObj->needs_validate = false;
+
    return true;
 }