[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33120] trunk/blender/source: Adding monitoring for (approximate) VRAM used by textures.

Mitchell Stokes mogurijin at gmail.com
Wed Nov 17 06:28:26 CET 2010


Revision: 33120
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33120
Author:   moguri
Date:     2010-11-17 06:28:25 +0100 (Wed, 17 Nov 2010)

Log Message:
-----------
Adding monitoring for (approximate) VRAM used by textures. The information is currently only used in the profiling data of the BGE.

Here is a image of it in action:
http://www.pasteall.org/pic/show.php?id=6351

What it monitors:
  * VRAM used by textures created via bf_gpu and BL_Textures

What it does not monitor:
  * VRAM used by the Blender ui
  * VRAM used by 2d filters
  * VRAM allocated by the user via KX_Scene.pre_draw and KX_Scene.pre_draw

Modified Paths:
--------------
    trunk/blender/source/blender/gpu/GPU_extensions.h
    trunk/blender/source/blender/gpu/intern/gpu_draw.c
    trunk/blender/source/blender/gpu/intern/gpu_extensions.c
    trunk/blender/source/gameengine/Ketsji/BL_Texture.cpp
    trunk/blender/source/gameengine/Ketsji/BL_Texture.h
    trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp

Modified: trunk/blender/source/blender/gpu/GPU_extensions.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_extensions.h	2010-11-17 04:02:19 UTC (rev 33119)
+++ trunk/blender/source/blender/gpu/GPU_extensions.h	2010-11-17 05:28:25 UTC (rev 33120)
@@ -104,6 +104,10 @@
 	- if created with from_blender, will not free the texture
 */
 
+unsigned int GPU_texture_vram_usage(void);
+void GPU_texture_vram_add(unsigned int amount);
+void GPU_texture_vram_subtract(unsigned int amount);
+
 GPUTexture *GPU_texture_create_1D(int w, float *pixels);
 GPUTexture *GPU_texture_create_2D(int w, int h, float *pixels);
 GPUTexture *GPU_texture_create_3D(int w, int h, int depth, float *fpixels);

Modified: trunk/blender/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_draw.c	2010-11-17 04:02:19 UTC (rev 33119)
+++ trunk/blender/source/blender/gpu/intern/gpu_draw.c	2010-11-17 05:28:25 UTC (rev 33120)
@@ -540,11 +540,13 @@
 
 	if (!(gpu_get_mipmap() && mipmap)) {
 		glTexImage2D(GL_TEXTURE_2D, 0,  GL_RGBA,  rectw, recth, 0, GL_RGBA, GL_UNSIGNED_BYTE, rect);
+		GPU_texture_vram_add(rectw*recth*4);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter(1));
 	}
 	else {
 		gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, rectw, recth, GL_RGBA, GL_UNSIGNED_BYTE, rect);
+		GPU_texture_vram_add((rectw*recth*4) + (rectw*recth*4)/3);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gpu_get_mipmap_filter(0));
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter(1));
 
@@ -817,6 +819,8 @@
 
 void GPU_free_image(Image *ima)
 {
+	ImBuf *ibuf;
+
 	if(!BLI_thread_is_main()) {
 		gpu_queue_image_for_free(ima);
 		return;
@@ -827,6 +831,13 @@
 		glDeleteTextures(1, (GLuint *)&ima->bindcode);
 		ima->bindcode= 0;
 		ima->tpageflag &= ~IMA_MIPMAP_COMPLETE;
+
+		// Calculate how much vram was freed
+		ibuf = BKE_image_get_ibuf(ima, NULL);
+		if (!gpu_get_mipmap())
+			GPU_texture_vram_subtract(ibuf->x*ibuf->y*4);
+		else
+			GPU_texture_vram_subtract((ibuf->x*ibuf->y*4)+(ibuf->x*ibuf->y*4)/3);
 	}
 
 	/* free glsl image binding */

Modified: trunk/blender/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_extensions.c	2010-11-17 04:02:19 UTC (rev 33119)
+++ trunk/blender/source/blender/gpu/intern/gpu_extensions.c	2010-11-17 05:28:25 UTC (rev 33120)
@@ -66,11 +66,12 @@
 	GLuint currentfb;
 	int glslsupport;
 	int extdisabled;
+	unsigned int texturevram; // An approximation of how much vram is being used for textures
 	int colordepth;
 	GPUDeviceType device;
 	GPUOSType os;
 	GPUDriverType driver;
-} GG = {1, 0, 0, 0};
+} GG = {1, 0, 0, 0, 0};
 
 /* GPU Types */
 
@@ -185,6 +186,21 @@
     return GG.colordepth;
 }
 
+unsigned int GPU_texture_vram_usage()
+{
+	return GG.texturevram;
+}
+
+void GPU_texture_vram_add(unsigned int amount)
+{
+	GG.texturevram += amount;
+}
+
+void GPU_texture_vram_subtract(unsigned int amount)
+{
+	GG.texturevram -= amount;
+}
+
 int GPU_print_error(char *str)
 {
 	GLenum errCode;
@@ -343,6 +359,8 @@
 	if (tex->target == GL_TEXTURE_1D) {
 		glTexImage1D(tex->target, 0, internalformat, tex->w, 0, format, type, 0);
 
+		GPU_texture_vram_add(tex->w*4);
+
 		if (fpixels) {
 			glTexSubImage1D(tex->target, 0, 0, w, format, type,
 				pixels? pixels: fpixels);
@@ -356,6 +374,8 @@
 		glTexImage2D(tex->target, 0, internalformat, tex->w, tex->h, 0,
 			format, type, 0);
 
+		GPU_texture_vram_add(tex->w*tex->h*4);
+
 		if (fpixels) {
 			glTexSubImage2D(tex->target, 0, 0, 0, w, h,
 				format, type, pixels? pixels: fpixels);
@@ -620,8 +640,15 @@
 		if (tex->fb)
 			GPU_framebuffer_texture_detach(tex->fb, tex);
 		if (tex->bindcode && !tex->fromblender)
+		{
 			glDeleteTextures(1, &tex->bindcode);
 
+			if (tex->target == GL_TEXTURE_2D)
+				GPU_texture_vram_subtract(tex->w*tex->h*4);
+			else
+				GPU_texture_vram_subtract(tex->w*4);
+		}
+
 		MEM_freeN(tex);
 	}
 }

Modified: trunk/blender/source/gameengine/Ketsji/BL_Texture.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/BL_Texture.cpp	2010-11-17 04:02:19 UTC (rev 33119)
+++ trunk/blender/source/gameengine/Ketsji/BL_Texture.cpp	2010-11-17 05:28:25 UTC (rev 33120)
@@ -22,6 +22,8 @@
 
 #include "KX_GameObject.h"
 
+#include "GPU_extensions.h"
+
 #define spit(x) std::cout << x << std::endl;
 
 #include "MEM_guardedalloc.h"
@@ -61,7 +63,8 @@
 	mNeedsDeleted(0),
 	mType(0),
 	mUnit(0),
-	mEnvState(0)
+	mEnvState(0),
+	mTexSize(0)
 {
 	// --
 }
@@ -77,6 +80,9 @@
 		glDeleteTextures(1, (GLuint*)&mTexture);
 		mNeedsDeleted = 0;
 		mOk = 0;
+
+		GPU_texture_vram_subtract(mTexSize);
+		mTexSize = 0;
 	}
 
 	if(mEnvState) {
@@ -165,11 +171,15 @@
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 		gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGBA, x, y, GL_RGBA, GL_UNSIGNED_BYTE, pix );
+		mTexSize = (x*y*4)+(x*y*4)/3;
+		GPU_texture_vram_add(mTexSize);
 	} 
 	else {
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 		glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, pix );
+		mTexSize = x*y*4;
+		GPU_texture_vram_add(mTexSize);
 	}
 
 	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
@@ -190,11 +200,15 @@
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 		gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGBA, nx, ny, GL_RGBA, GL_UNSIGNED_BYTE, newPixels );
+		mTexSize = (x*y*4)+(x*y*4)/3;
+		GPU_texture_vram_add(mTexSize);
 	}
 	else {
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 		glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, nx, ny, 0, GL_RGBA, GL_UNSIGNED_BYTE, newPixels );
+		mTexSize = x*y*4;
+		GPU_texture_vram_add(mTexSize);
 	}
 	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 	free(newPixels);

Modified: trunk/blender/source/gameengine/Ketsji/BL_Texture.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/BL_Texture.h	2010-11-17 04:02:19 UTC (rev 33119)
+++ trunk/blender/source/gameengine/Ketsji/BL_Texture.h	2010-11-17 05:28:25 UTC (rev 33120)
@@ -27,6 +27,7 @@
 	int					mUnit;			// Texture unit associated with mTexture
 	unsigned int		mEnvState;		// cache textureEnv
 	static unsigned int	mDisableState;	// speed up disabling calls
+	unsigned int		mTexSize;		// Size of texture in video ram
 
 	void InitNonPow2Tex(unsigned int *p,int x,int y,bool mipmap );
 	void InitGLTex(unsigned int *p,int x,int y,bool mipmap );

Modified: trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2010-11-17 04:02:19 UTC (rev 33119)
+++ trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2010-11-17 05:28:25 UTC (rev 33120)
@@ -75,6 +75,8 @@
 #include "DNA_world_types.h"
 #include "DNA_scene_types.h"
 
+#include "GPU_extensions.h"
+
 // If define: little test for Nzc: guarded drawing. If the canvas is
 // not valid, skip rendering this frame.
 //#define NZC_GUARDED_OUTPUT
@@ -1439,6 +1441,18 @@
 										m_canvas->GetHeight());
 			ycoord += 14;
 		}
+
+		// Put an extra gap in the printed results
+		ycoord += 14;
+
+		/* Print texture vram usage */
+		debugtxt.Format("Texture VRAM: %.2f MB", GPU_texture_vram_usage()/1048576.f);
+		m_rendertools->RenderText2D(RAS_IRenderTools::RAS_TEXT_PADDED,
+										debugtxt.Ptr(),
+										xcoord, ycoord,
+										m_canvas->GetWidth(),
+										m_canvas->GetHeight());
+		ycoord += 14;
 	}
 
 	/* Property display*/





More information about the Bf-blender-cvs mailing list