Skip to main content
GameDev.net gamedev.net
🔒 Locked

Check video ram usage

Started by proanim Mar 20, 2013 at 11:13 PM 10 replies 7.2k views
Original Post
proanim
proanim

How can I check how much video ram is being used/free (in this case when using opengl)? First thing I can think of is to find a way to check memory amount used by the image or whatever related to graphics and with it calculate used/free memory. But this is probably incorrect and/or ineffective. Do graphic apis have this functionality built in?

zacaj
zacaj

If you're using GL2+, just do this:


int getFreeVideoMemory()
{
	int availableKB[4];
#ifdef GL234
	if(GLEW_NVX_gpu_memory_info)
		glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX,&availableKB[0]);
	int temp=GLEW_ATI_meminfo;
	if(GLEW_ATI_meminfo)
		glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI,availableKB);
	return availableKB[0];
#endif
	return 0;
}
proanim
proanim

Does that work with GL 3.2?

zacaj
zacaj

It *should*. I use it with GL 3.3 just fine.

proanim
proanim

I have 1gb video ram but i always get different result, i added


std::ofstream outfile;
outfile.open ("log.txt", std::fstream::out | std::fstream::app);
outfile << (int)availableKB << std::endl;
outfile << std::endl;
outfile.close();

between #endif and return 0;

and the output is


2554664 //first run

2488132 //second run

3799208 // third run

I called the function only once after initializing opengl.

Is there something that i am doing wrong?

What does #ifdef GL234 do?

zacaj
zacaj
The ifdef GL234 is just a compiler flag I use in my engine to shay that I'm running open opengl version 2,3, or 4. You can remove it and the endif completely.

Which brand is your card?

Try initializing availableKB to -1 or something to make sure it's being set. Also note that it's an array, try printing (int)availableKB[0]
proanim
proanim

Which brand is your card?

I am using ATI, but I was looking for universal solution regardless of brand.

Try initializing availableKB to -1 or something to make sure it's being set. Also note that it's an array, try printing (int)availableKB[0]

if i set availableKB to anything the value will not change afterwards, and printing (int)availableKB[0] gives negative value.

zacaj
zacaj

There is no universal solution. You have to use manufacturer/brand/? specific extensions.

If you use this, does it print out either brand?


int getFreeVideoMemory()
{
	int availableKB[]={-1,-1,-1,-1};
	if(GLEW_NVX_gpu_memory_info)
        {
		glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX,&availableKB[0]);
	        printf("NVidia card\n");
        }
        int temp=GLEW_ATI_meminfo;
	if(GLEW_ATI_meminfo)
        {
		glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI,availableKB);
                printf("ATI card\n");
        }
	return availableKB[0];
}
proanim
proanim

no it doesn't print out anything

21st Century Moose
21st Century Moose

There are plenty of factors that could cause the amount of available video RAM to vary. On a modern OS the window manager may be using some of the video RAM. On windows Vista or higher video RAM is virtualized so results can vary. Video RAM may be fragmented from previous runs so free space can be affected. With anything that uses a dedicated/shared memory architecture (e.g. Intel) you'll get a figure that may be just the amount of dedicated RAM left (i.e. quite low) or may be the total of dedicated + available system memory, or anything in between. Basically this isn't a figure that you should be basing crucial decisions in your program on; instead it seems better to me to use rough ballparks (e.g. with GL 3.x level hardware things are fairly well standardized at the ~1gb mark or higher).

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls. 
proanim
proanim

Turns out that ATI Radeon HD 6450 1GB DDR3 for whatever reason doesn't have support for GLEW_ATI_meminfo

I changed GLEW_ATI_meminfo to GL_ATI_meminfo and now the program prints out brand of the card.

There is no support for GL_ATI_meminfo or GL_NVX_gpu_memory_info but the code seems to work no problem with this.

But I still get negative value.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.