|
|
发表于 2006-6-13 11:02:00
|
显示全部楼层
Re:如何取得本地显存大小及非本地显存大小
static CardInfomation pi;
static BOOL bInit=FALSE;
if(bInit)
return pi;
/* LPDIRECTDRAW7 pDraw;
DDCAPS ddhalcaps,ddhelcaps;
if(SUCCEEDED(DirectDrawCreateEx( NULL, (VOID**)&pDraw,IID_IDirectDraw7, NULL )))
ddhalcaps.dwSize=sizeof(DDCAPS);
ddhalcaps.dwSize=sizeof(DDCAPS);
pDraw->GetCaps(&ddhalcaps,&ddhelcaps);
DDSCAPS2 d2;
ZeroMemory(&d2,sizeof(DDSCAPS2));
d2.dwCaps=DDSCAPS_NONLOCALVIDMEM;
DWORD dwNoLocalMemory,dwViableNoLocalMemory;
pDraw->GetAvailableVidMem(&d2,&dwNoLocalMemory,&dwViableNoLocalMemory);
SAFE_RELEASE(pDraw);
pi.VideoMemorySize=ddhalcaps.dwVidMemFree;
pi.AgpMemorySize=dwViableNoLocalMemory;
pi.bAgpSupport=pi.AgpMemorySize>0?TRUE:FALSE;*/
//return pi;
TCHAR wszPath[MAX_PATH];
::GetSystemDirectory( wszPath, MAX_PATH );
strcat( wszPath, "\\ddraw.dll" );
IDirectDraw7* DDobject;
HINSTANCE ddrawLib = LoadLibrary( wszPath );
if( ddrawLib )
{
HRESULT (WINAPI* _DirectDrawCreateEx)( GUID* lpGUID, void** lplpDD, REFIID iid, IUnknown* pUnkOuter ) = (HRESULT (WINAPI*)( GUID* lpGUID, void** lplpDD, REFIID iid, IUnknown* pUnkOuter ))GetProcAddress( ddrawLib, "DirectDrawCreateEx" );
if( _DirectDrawCreateEx )
{
HRESULT (WINAPI* _DirectDrawEnumerateEx)( LPDDENUMCALLBACKEXA, LPVOID, DWORD ) = (HRESULT (WINAPI*)( LPDDENUMCALLBACKEXA, LPVOID, DWORD )) GetProcAddress( ddrawLib, "DirectDrawEnumerateExA" );
if( _DirectDrawEnumerateEx )
{
//
// DirectDraw 7 will enumerate 1 device (NULL). Or a NULL device and then a GUID for each adapter.
//
//_DirectDrawEnumerateEx( DDEnumCB, this, DDENUM_ATTACHEDSECONDARYDEVICES );
//
// Create a DirectDraw object for the device specified
//
HRESULT result = _DirectDrawCreateEx( NULL, (void**)&DDobject, IID_IDirectDraw7, NULL );
if( SUCCEEDED(result) )
{
DDobject->SetCooperativeLevel( NULL, DDSCL_NORMAL );
//
// See how much memory is on the card
//
DDSCAPS2 ddscaps2;
DWORD Junk;
DWORD VideoMemory=-1;
DWORD Temp=0;
memset( &ddscaps2, 0, sizeof(ddscaps2) );
ddscaps2.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_VIDEOMEMORY;
DDobject->GetAvailableVidMem( &ddscaps2, &Temp, &Junk );
if( Temp>0 && Temp<VideoMemory )
VideoMemory=Temp;
ddscaps2.dwCaps = DDSCAPS_3DDEVICE | DDSCAPS_LOCALVIDMEM | DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY;
DDobject->GetAvailableVidMem( &ddscaps2, &Temp, &Junk );
if( Temp>0 && Temp<VideoMemory )
VideoMemory=Temp;
ddscaps2.dwCaps = DDSCAPS_LOCALVIDMEM | DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY;
DDobject->GetAvailableVidMem( &ddscaps2, &Temp, &Junk );
if( Temp>0 && Temp<VideoMemory )
VideoMemory=Temp;
ddscaps2.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY;
DDobject->GetAvailableVidMem( &ddscaps2, &Temp, &Junk );
if( Temp>0 && Temp<VideoMemory )
VideoMemory=Temp;
if(VideoMemory==-1)
pi.VideoMemorySize=0;
else
pi.VideoMemorySize=BoundMemory(VideoMemory);
ddscaps2.dwCaps=DDSCAPS_NONLOCALVIDMEM;
DDobject->GetAvailableVidMem( &ddscaps2, &Temp, &Junk );
pi.AgpMemorySize=Temp;
//
// If cannot get memory size, there must be a problem with D3D / DirectDraw
//
// Clean up ddraw7
//
DDobject->Release();
}
}
}
//
// Release ddraw7 object
//
FreeLibrary( ddrawLib );
}
pi.bAgpSupport=pi.AgpMemorySize>0?TRUE:FALSE;
return pi; |
|