Community
cancel
Showing results for 
Search instead for 
Did you mean: 
heppe
Beginner
297 Views

programmatic query of video memory?

We need to know the amount of video memory on the graphics card. That allows us to calibrate the cumulative size of all device objects (vertex buffers, index buffers, frame buffers and textures) that we cansafely allocating before we run into stability and performance issues. We have some code that does it on XP, but need to come up with something for vista. An ATI developer guy recommended using the opengl command,

glgetintegerv(GL_VBO_FREE_MEMORY_ATI)
Is that supported on Intel express chipsets?  Can it be trusted?  If not (on either question), what alternatives are available?  Is there anything that can be pulled out of the windows registry?
Thanks,
Travis
0 Kudos
8 Replies
Chuck_De_Sylva
Beginner
297 Views

Do you have to use Ogl? Because there are Dx calls to easily do this.
heppe
Beginner
297 Views

We can't (yet) assume that dx10 will be available, so IDXGIAdapter::GetDesc() is out, and

IDirect3DDevice9::GetAvailableTextureMem() lumps system memory in as well, making it less than useful.  
If it were available somewhere in the windows registry (as it is on XP), that would be ideal.
We can switch back and forth from ogl and d3d at our users' option, so we need a solution for both.
-Travis
Chuck_De_Sylva
Beginner
297 Views

Can you use Device.GetAvailableVideoMemory(SurfaceCaps, Int32, Int32) Method from Dx10?
ILevi1
Valued Contributor I
297 Views

Since when Intel IGP supports DX10 API? By the way, that is a horrible way to find out the amount of video memory — it takes a lot of time to initialize DirectX and they are clearly using OpenGL so why should they require two APIs for the application to work?

If this is a Windows application perhaps this would work:

#include 
#include 

const char *str_key1 = { "HARDWAREDEVICEMAPVIDEO" };
const char *str_key2 = { "DeviceVideo0" };
const char *str_key3 = { "systemcurrentcontrolset" };
const char *str_key4 = { "HardwareInformation.MemorySize" };

DWORD GetVideoMemorySizeBytes(void)
{
	LONG	s;
	HKEY	key;
	DWORD	type, buf_size, rv = 0;
	LPBYTE	buf;
	char	*ptr;

	s = RegOpenKeyEx(HKEY_LOCAL_MACHINE, str_key1, 0, KEY_READ, &key);

	if (s != ERROR_SUCCESS) {
		goto bail_out;
	}

	type = REG_SZ;

	s = RegQueryValueEx(key, str_key2, NULL, &type, NULL, &buf_size);

	if (s != ERROR_SUCCESS) {
		goto bail_out;
	}

	buf = (LPBYTE)malloc(buf_size);

	if (buf == NULL) {
		goto bail_out;
	}

	s = RegQueryValueEx(key, str_key2, NULL, &type, buf, &buf_size);

	if (s != ERROR_SUCCESS) {
		goto bail_out;
	}

	RegCloseKey(key);

	ptr = strstr(strlwr((char*)buf), str_key3);

	s = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ptr, 0, KEY_READ, &key);

	if (s != ERROR_SUCCESS) {
		goto bail_out;
	}

	type = REG_BINARY;
	buf_size = 4;

	s = RegQueryValueEx(key, str_key4, NULL, &type, (LPBYTE)&rv, &buf_size);

bail_out:
	if (buf != NULL) {
		free(buf);
	}
	if (key != NULL) {
		RegCloseKey(key);
	}

	return rv;
}

int main(int argc, char *argv[])
{
	printf("Video memory size : %ld bytes
", GetVideoMemorySizeBytes());
}
7oby
New Contributor II
297 Views

IgorLevicki:
Since when Intel IGP supports DX10 API?


Since 15.9 (v7.15.10.1472) released 04/25/2008 or the former non-public 15.9 beta.

ILevi1
Valued Contributor I
297 Views

I see, nice to know that.

Still, using DX10 API just to query video memory size would limit the application use only to those systems running Vista, so it is a pretty senseless suggestion anyway.

heppe1
Beginner
297 Views

In addition to OpenGL, we also support dx9 and plan to start a dx10 (or perhaps dx11) implementation soon. When dx9 or dx10 is already in use, we can use such calls. Pulling in another API (dx10, or even dx9 for that matter) just to query video memory size is not a good solution. We'll hardcode a budget for ourselves rather than do something like that.

Of course, if we can get a solution within OpenGL, that would be the best solution of all.

-Travis

jc_denton
Beginner
297 Views

Quoting - Igor Levicki

Since when Intel IGP supports DX10 API? By the way, that is a horrible way to find out the amount of video memory - it takes a lot of time to initialize DirectX and they are clearly using OpenGL so why should they require two APIs for the application to work?

If this is a Windows application perhaps this would work:

#include 
#include 

const char *str_key1 = { "HARDWAREDEVICEMAPVIDEO" };
const char *str_key2 = { "DeviceVideo0" };
const char *str_key3 = { "systemcurrentcontrolset" };
const char *str_key4 = { "HardwareInformation.MemorySize" };

DWORD GetVideoMemorySizeBytes(void)
{
	LONG	s;
	HKEY	key;
	DWORD	type, buf_size, rv = 0;
	LPBYTE	buf;
	char	*ptr;

......
......
......

Thanks for the post first of all. My goal was to gain performance improvement & stability, by making system specific resource caching decisions in our game. Above code snippet turned out really helpful. However, I had to modify it a little to get working since there could be more than one REG_DWORDs that you need to iterate through to get the location of hardware information section. I posting the modified version of above code snippet that has been tested to work with vista as welll as with XP.



#include
#include

const char *strConstHwDeviceMapVideo = { "HARDWARE\DEVICEMAP\VIDEO" };
const char *strConstMaxObjectNumber = { "MaxObjectNumber" };
const char *strConstSystemCurrentControlSet = { "system\currentcontrolset" };
const char *strConstHwInfoMemSize = { "HardwareInformation.MemorySize" };

DWORD GetVideoMemorySizeBytes(void)
{
LONG s;
HKEY key, key2 = NULL;
DWORD type, buf_size, rv = 0, iMaxObjectNumber = 0;
LPBYTE buf = NULL;
char *ptr = NULL;
char strDeviceVideo[20] = { "\Device\Video0" };

s = RegOpenKeyEx(HKEY_LOCAL_MACHINE, strConstHwDeviceMapVideo, 0, KEY_READ, &key);


if (s != ERROR_SUCCESS) {
goto bail_out;
}

// Find total number of obects to be queried
type = REG_DWORD;
buf_size = 4;

s = RegQueryValueEx(key, strConstMaxObjectNumber, NULL, &type, ( LPBYTE )&iMaxObjectNumber, &buf_size );

if (s != ERROR_SUCCESS) {
goto bail_out;
}

for( int i = 0; i <= (int)iMaxObjectNumber; i++ )
{
strDeviceVideo[ 13 ] = '0' + i;
type = REG_SZ;

s = RegQueryValueEx(key, strDeviceVideo, NULL, &type, NULL, &buf_size);

if (s != ERROR_SUCCESS) {
goto bail_out;
}


if( NULL != buf ) {
free( buf );
}

buf = (LPBYTE)malloc(buf_size);

if (buf == NULL) {
goto bail_out;
}

s = RegQueryValueEx(key, strDeviceVideo, NULL, &type, buf, &buf_size);

if (s != ERROR_SUCCESS) {
goto bail_out;
}

ptr = strstr( _strlwr((char*)buf), strConstSystemCurrentControlSet );

if( NULL == ptr )
continue;

s = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ptr, 0, KEY_READ, &key2);

if (s != ERROR_SUCCESS) {
goto bail_out;
}

type = REG_BINARY;
buf_size = 4;

s = RegQueryValueEx(key2, strConstHwInfoMemSize, NULL, &type, (LPBYTE)&rv, &buf_size);

if ( ERROR_SUCCESS == s ) {
break;
}

if (key != NULL) {
RegCloseKey(key2);
}
}

bail_out:
if (buf != NULL) {
free(buf);
}

if (key != NULL) {
RegCloseKey(key);
}

if (key != NULL) {
RegCloseKey(key2);
}

return rv;
}


int _tmain(int argc, _TCHAR* argv[])
{
printf("Video memory size : %ld bytes", GetVideoMemorySizeBytes());
return 0;
}

Reply