[Bf-blender-cvs] [80d75cb] master: Add debug option --debug-gpumem to show GPU memory used in status bar.

Antony Riakiotakis noreply at git.blender.org
Fri Apr 24 14:11:35 CEST 2015


Commit: 80d75cb3e45fe10904b887e04481761dc458c876
Author: Antony Riakiotakis
Date:   Fri Apr 24 14:11:05 2015 +0200
Branches: master
https://developer.blender.org/rB80d75cb3e45fe10904b887e04481761dc458c876

Add debug option --debug-gpumem to show GPU memory used in status bar.

Only used in ATIs and NVIDIAs. Used extensions are:

https://www.opengl.org/registry/specs/ATI/meminfo.txt
http://developer.download.nvidia.com/opengl/specs/

If you read the documentation, the numbers are not supposed to be exact
and also depend on the time when the call is made. The numbers can also
change quite quickly. It's only meant to give a rough measure of what is
going on.

===================================================================

M	source/blender/blenkernel/BKE_global.h
M	source/blender/editors/space_info/info_stats.c
M	source/blender/gpu/GPU_extensions.h
M	source/blender/gpu/intern/gpu_extensions.c
M	source/blender/python/intern/bpy_app.c
M	source/creator/creator.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index 935a922..22ddae8 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -126,10 +126,11 @@ enum {
 	G_DEBUG_FREESTYLE = (1 << 7), /* freestyle messages */
 	G_DEBUG_DEPSGRAPH = (1 << 8), /* depsgraph messages */
 	G_DEBUG_SIMDATA =   (1 << 9), /* sim debug data display */
+	G_DEBUG_GPU_MEM =   (1 << 10), /* gpu memory in status bar */
 };
 
 #define G_DEBUG_ALL  (G_DEBUG | G_DEBUG_FFMPEG | G_DEBUG_PYTHON | G_DEBUG_EVENTS | G_DEBUG_WM | G_DEBUG_JOBS | \
-                      G_DEBUG_FREESTYLE | G_DEBUG_DEPSGRAPH)
+                      G_DEBUG_FREESTYLE | G_DEBUG_DEPSGRAPH | G_DEBUG_GPU_MEM)
 
 
 /* G.fileflags */
diff --git a/source/blender/editors/space_info/info_stats.c b/source/blender/editors/space_info/info_stats.c
index a0dfb28..48a39cd 100644
--- a/source/blender/editors/space_info/info_stats.c
+++ b/source/blender/editors/space_info/info_stats.c
@@ -56,6 +56,8 @@
 #include "ED_info.h"
 #include "ED_armature.h"
 
+#include "GPU_extensions.h"
+
 #define MAX_INFO_LEN 512
 #define MAX_INFO_NUM_LEN 16
 
@@ -381,6 +383,7 @@ static void stats_string(Scene *scene)
 	Object *ob = (scene->basact) ? scene->basact->object : NULL;
 	uintptr_t mem_in_use, mmap_in_use;
 	char memstr[MAX_INFO_MEM_LEN];
+	char gpumemstr[MAX_INFO_MEM_LEN] = "";
 	char *s;
 	size_t ofs = 0;
 
@@ -416,11 +419,22 @@ static void stats_string(Scene *scene)
 
 
 	/* get memory statistics */
-	s = memstr;
-	ofs += BLI_snprintf(s + ofs, MAX_INFO_MEM_LEN - ofs, IFACE_(" | Mem:%.2fM"),
+	ofs = BLI_snprintf(memstr, MAX_INFO_MEM_LEN, IFACE_(" | Mem:%.2fM"),
 	                    (double)((mem_in_use - mmap_in_use) >> 10) / 1024.0);
 	if (mmap_in_use)
-		BLI_snprintf(s + ofs, MAX_INFO_MEM_LEN - ofs, IFACE_(" (%.2fM)"), (double)((mmap_in_use) >> 10) / 1024.0);
+		BLI_snprintf(memstr + ofs, MAX_INFO_MEM_LEN - ofs, IFACE_(" (%.2fM)"), (double)((mmap_in_use) >> 10) / 1024.0);
+
+	if (GPU_mem_stats_supported()) {
+		int gpu_free_mem, gpu_tot_memory;
+
+		GPU_mem_stats_get(&gpu_tot_memory, &gpu_free_mem);
+
+		ofs = BLI_snprintf(gpumemstr, MAX_INFO_MEM_LEN, IFACE_(" | Free GPU Mem:%.2fM"), (double)((gpu_free_mem)) / 1024.0);
+
+		if (gpu_tot_memory) {
+			BLI_snprintf(gpumemstr + ofs, MAX_INFO_MEM_LEN - ofs, IFACE_("/%.2fM"), (double)((gpu_tot_memory)) / 1024.0);
+		}
+	}
 
 	s = stats->infostr;
 	ofs = 0;
@@ -447,22 +461,23 @@ static void stats_string(Scene *scene)
 		}
 
 		ofs += BLI_strncpy_rlen(s + ofs, memstr, MAX_INFO_LEN - ofs);
+		ofs += BLI_strncpy_rlen(s + ofs, gpumemstr, MAX_INFO_LEN - ofs);
 	}
 	else if (ob && (ob->mode & OB_MODE_POSE)) {
-		ofs += BLI_snprintf(s + ofs, MAX_INFO_LEN - ofs, IFACE_("Bones:%s/%s %s"),
-		                    stats_fmt.totbonesel, stats_fmt.totbone, memstr);
+		ofs += BLI_snprintf(s + ofs, MAX_INFO_LEN - ofs, IFACE_("Bones:%s/%s %s%s"),
+		                    stats_fmt.totbonesel, stats_fmt.totbone, memstr, gpumemstr);
 	}
 	else if (stats_is_object_dynamic_topology_sculpt(ob)) {
-		ofs += BLI_snprintf(s + ofs, MAX_INFO_LEN - ofs, IFACE_("Verts:%s | Tris:%s"), stats_fmt.totvert,
-		                    stats_fmt.tottri);
+		ofs += BLI_snprintf(s + ofs, MAX_INFO_LEN - ofs, IFACE_("Verts:%s | Tris:%s%s"), stats_fmt.totvert,
+		                    stats_fmt.tottri, gpumemstr);
 	}
 	else {
 		ofs += BLI_snprintf(s + ofs, MAX_INFO_LEN - ofs,
-		                    IFACE_("Verts:%s | Faces:%s | Tris:%s | Objects:%s/%s | Lamps:%s/%s%s"),
+		                    IFACE_("Verts:%s | Faces:%s | Tris:%s | Objects:%s/%s | Lamps:%s/%s%s%s"),
 		                    stats_fmt.totvert, stats_fmt.totface,
 		                    stats_fmt.tottri, stats_fmt.totobjsel,
 		                    stats_fmt.totobj, stats_fmt.totlampsel,
-		                    stats_fmt.totlamp, memstr);
+		                    stats_fmt.totlamp, memstr, gpumemstr);
 	}
 
 	if (ob)
diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h
index 27a4396..f3927ba 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -71,6 +71,9 @@ int GPU_max_texture_size(void);
 int GPU_color_depth(void);
 void GPU_get_dfdy_factors(float fac[2]);
 
+bool GPU_mem_stats_supported(void);
+void GPU_mem_stats_get(int *totalmem, int *freemem);
+
 void GPU_code_generate_glsl_lib(void);
 
 /* GPU Types */
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index b095eab..54e3339 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -2084,6 +2084,34 @@ void GPU_shader_free_builtin_shaders(void)
 	}
 }
 
+bool GPU_mem_stats_supported(void)
+{
+	return (GLEW_NVX_gpu_memory_info || (GLEW_ATI_meminfo)) && (G.debug & G_DEBUG_GPU_MEM);
+}
+
+
+void GPU_mem_stats_get(int *totalmem, int *freemem)
+{
+	if (GLEW_NVX_gpu_memory_info) {
+		/* returned value in Kb */
+		glGetIntegerv(GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX, totalmem);
+
+		glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, freemem);
+	}
+	else if (GLEW_ATI_meminfo) {
+		int stats[4];
+
+		glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, stats);
+		*freemem = stats[0];
+		*totalmem = 0;
+	}
+	else {
+		*totalmem = 0;
+		*freemem = 0;
+	}
+}
+
+
 #if 0 /* unused */
 
 /* GPUPixelBuffer */
diff --git a/source/blender/python/intern/bpy_app.c b/source/blender/python/intern/bpy_app.c
index c8a4971..04ab34e 100644
--- a/source/blender/python/intern/bpy_app.c
+++ b/source/blender/python/intern/bpy_app.c
@@ -287,6 +287,7 @@ static PyGetSetDef bpy_app_getsets[] = {
 	{(char *)"debug_wm",        bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_WM},
 	{(char *)"debug_depsgraph", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_DEPSGRAPH},
 	{(char *)"debug_simdata",   bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_SIMDATA},
+    {(char *)"debug_gpumem",    bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_GPU_MEM},
 
 	{(char *)"debug_value", bpy_app_debug_value_get, bpy_app_debug_value_set, (char *)bpy_app_debug_value_doc, NULL},
 	{(char *)"tempdir", bpy_app_tempdir_get, NULL, (char *)bpy_app_tempdir_doc, NULL},
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 440710f..d86ccd6 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -1491,6 +1491,7 @@ static void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
 	BLI_argsAdd(ba, 1, NULL, "--debug-value", "<value>\n\tSet debug value of <value> on startup\n", set_debug_value, NULL);
 	BLI_argsAdd(ba, 1, NULL, "--debug-jobs",  "\n\tEnable time profiling for background jobs.", debug_mode_generic, (void *)G_DEBUG_JOBS);
 	BLI_argsAdd(ba, 1, NULL, "--debug-depsgraph", "\n\tEnable debug messages from dependency graph", debug_mode_generic, (void *)G_DEBUG_DEPSGRAPH);
+	BLI_argsAdd(ba, 1, NULL, "--debug-gpumem", "\n\tEnable GPU memory stats in status bar", debug_mode_generic, (void *)G_DEBUG_GPU_MEM);
 
 	BLI_argsAdd(ba, 1, NULL, "--verbose", "<verbose>\n\tSet logging verbosity level.", set_verbosity, NULL);




More information about the Bf-blender-cvs mailing list