Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

API to get the graphics or video memory

I want to get the adpater RAM or graphics RAM which you can see in Display settings or Device manager using API. I am in C++ application.

I have tried seraching on net and as per my RnD I have come to conclusion that we can get the graphics memory info from 1. DirectX SDK structure called DXGI_ADAPTER_DESC. But what if I dont want to use DirectX API. 2. Win32_videocontroller : But this class does not always give you adapterRAM info if availability of video controller is offline. I have checked it on vista.

Is there any other way to get the graphics RAM?

like image 716
amritad Avatar asked Dec 08 '09 11:12

amritad


People also ask

How do I check my graphics video memory?

In the Display Settings box, select Advanced Display Settings and then choose the Display Adapter properties option. On the Adapter tab in the box, you should see the brand of the graphics card and its memory amount listed.

How do I find my graphics processor and video RAM?

Here's where to look. On the Windows search bar, type dxdiag. Wait for it to open then click either Display 1 or Display 2 to view your other GPU. Under Display Memory, you'll be able to see how much dedicated VRAM the GPU has.

Is video memory and graphics memory same?

Yes that is the same as the GPU Memory. The only exception to this is on some lower-end computers use a technique called shared graphics memory in which the integrated graphics card uses some of the RAM as video memory.

What is video graphics memory?

VRAM (video RAM) refers to any type of random access memory (RAM) specifically used to store image data for a computer display. VRAM's purpose is to ensure the even and smooth execution of graphics display.


2 Answers

There is NO way to directly get graphics RAM on windows, windows prevents you doing this as it maintains control over what is displayed.

You CAN, however, create a DirectX device. Get the back buffer surface and then lock it. After locking you can fill it with whatever you want and then unlock and call present. This is slow, though, as you have to copy the video memory back across the bus into main memory. Some cards also use "swizzled" formats that it has to un-swizzle as it copies. This adds further time to doing it and some cards will even ban you from doing it.

In general you want to avoid directly accessing the video card and letting windows/DirectX do the drawing for you. Under D3D1x Im' pretty sure you can do it via an IDXGIOutput though. It really is something to try and avoid though ...

You can write to a linear array via standard win32 (This example assumes C) but its quite involved.

First you need the linear array.

    unsigned int* pBits = malloc( width * height );

Then you need to create a bitmap and select it to the DC.

    HBITMAP hBitmap = ::CreateBitmap( width, height, 1, 32, NULL );
    SelectObject( hDC, (HGDIOBJ)hBitmap );

You can then fill the pBits array as you please. When you've finished you can then set the bitmap's bits.

    ::SetBitmapBits( hBitmap, width * height * 4, (void*)pBits )

When you've finished using your bitmap don't forget to delete it (Using DeleteObject) AND free your linear array!

Edit: There is only one way to reliably get the video ram and that is to go through the DX Diag interfaces. Have a look at IDxDiagProvider and IDxDiagContainer in the DX SDK.

like image 53
Goz Avatar answered Nov 15 '22 00:11

Goz


Win32_videocontroller is your best course to get the amount of gfx memory. That's how its done in Doom3 source.

You say "..availability of video controller is offline. I have checked it on vista." Under what circumstances would the video controller be offline?

Incidentally, you can find the Doom3 source here. The function you're looking for is called Sys_GetVideoRam and it's in a file called win_shared.cpp, although if you do a solution wide search it'll turn it up for you.

like image 45
fishfood Avatar answered Nov 15 '22 00:11

fishfood