mesa: add _mesa_total_texture_memory() debug function
authorBrian Paul <brianp@vmware.com>
Fri, 6 Apr 2012 21:45:39 +0000 (15:45 -0600)
committerBrian Paul <brianp@vmware.com>
Wed, 11 Apr 2012 13:00:01 +0000 (07:00 -0600)
This function can be called in gdb to find out how much memory is used
by all texture objects.

src/mesa/main/texobj.c
src/mesa/main/texobj.h

index 4c3eed2b6e6ccdd5be12b1f98fb2f836ab1451fe..155b255a7212864c0e5766b7540a4f7ee2329002 100644 (file)
@@ -841,6 +841,65 @@ _mesa_get_fallback_texture(struct gl_context *ctx, gl_texture_index tex)
 }
 
 
+/**
+ * Compute the size of the given texture object, in bytes.
+ */
+static GLuint
+texture_size(const struct gl_texture_object *texObj)
+{
+   const GLuint numFaces = texObj->Target == GL_TEXTURE_CUBE_MAP ? 6 : 1;
+   GLuint face, level, size = 0;
+
+   for (face = 0; face < numFaces; face++) {
+      for (level = 0; level < MAX_TEXTURE_LEVELS; level++) {
+         const struct gl_texture_image *img = texObj->Image[face][level];
+         if (img) {
+            GLuint sz = _mesa_format_image_size(img->TexFormat, img->Width,
+                                                img->Height, img->Depth);
+            size += sz;
+         }
+      }
+   }
+
+   return size;
+}
+
+
+/**
+ * Callback called from _mesa_HashWalk()
+ */
+static void
+count_tex_size(GLuint key, void *data, void *userData)
+{
+   const struct gl_texture_object *texObj =
+      (const struct gl_texture_object *) data;
+   GLuint *total = (GLuint *) userData;
+
+   *total = *total + texture_size(texObj);
+}
+
+
+/**
+ * Compute total size (in bytes) of all textures for the given context.
+ * For debugging purposes.
+ */
+GLuint
+_mesa_total_texture_memory(struct gl_context *ctx)
+{
+   GLuint tgt, total = 0;
+
+   _mesa_HashWalk(ctx->Shared->TexObjects, count_tex_size, &total);
+
+   /* plus, the default texture objects */
+   for (tgt = 0; tgt < NUM_TEXTURE_TARGETS; tgt++) {
+      total += texture_size(ctx->Shared->DefaultTex[tgt]);
+   }
+
+   return total;
+}
+
+
+
 /*@}*/
 
 
index c020b901382d12934e517fca1e940bc3a6ba3d1e..23e1ade090c10e5c72873e031d8b93903d63ddfc 100644 (file)
@@ -112,6 +112,9 @@ _mesa_dirty_texobj(struct gl_context *ctx, struct gl_texture_object *texObj,
 extern struct gl_texture_object *
 _mesa_get_fallback_texture(struct gl_context *ctx, gl_texture_index tex);
 
+extern GLuint
+_mesa_total_texture_memory(struct gl_context *ctx);
+
 extern void
 _mesa_unlock_context_textures( struct gl_context *ctx );