Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Stokes <mogurijin@gmail.com>2010-11-17 08:28:25 +0300
committerMitchell Stokes <mogurijin@gmail.com>2010-11-17 08:28:25 +0300
commit1bb98b41944dadf69645cf3b99bcabd9834f9240 (patch)
tree5c700ba234517211190bf7865c0ee7a353475b94 /source/blender/gpu
parentf791d74f102dcfed69a95d605e3c634f76a070ab (diff)
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
Diffstat (limited to 'source/blender/gpu')
-rw-r--r--source/blender/gpu/GPU_extensions.h4
-rw-r--r--source/blender/gpu/intern/gpu_draw.c11
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c29
3 files changed, 43 insertions, 1 deletions
diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h
index a7f43d3b0ae..d545a553da9 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -104,6 +104,10 @@ int GPU_type_matches(GPUDeviceType device, GPUOSType os, GPUDriverType driver);
- 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);
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index a93d8cbbb8e..2d15d3efae9 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -540,11 +540,13 @@ int GPU_verify_image(Image *ima, ImageUser *iuser, int tftile, int compare, int
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_unused_buffers(void)
void GPU_free_image(Image *ima)
{
+ ImBuf *ibuf;
+
if(!BLI_thread_is_main()) {
gpu_queue_image_for_free(ima);
return;
@@ -827,6 +831,13 @@ void GPU_free_image(Image *ima)
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 */
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index 70a74aafead..4298ec8d44d 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -66,11 +66,12 @@ static struct GPUGlobal {
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 @@ int GPU_color_depth()
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 @@ static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, in
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 @@ static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, in
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 @@ void GPU_texture_free(GPUTexture *tex)
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);
}
}