游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3329|回复: 3

如何取得本地显存大小及非本地显存大小

[复制链接]

3

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2006-6-13 08:51:00 | 显示全部楼层 |阅读模式
我知道用Directx Caps Views可以看出:
Video (显存大小)
Video (local) 本地显存大小
Video (non-local) 非本地显存大小
Texture

请问如何通过编程取得本地可用显存(Local Video Memory)大小及非本地可用显存(non-local Video Memory)大小!!! [em3] [em3] [em3]

3

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2006-6-13 09:12:00 | 显示全部楼层

Re:如何取得本地显存大小及非本地显存大小

Up

8

主题

182

帖子

268

积分

中级会员

Rank: 3Rank: 3

积分
268
发表于 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;

3

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2006-6-13 13:24:00 | 显示全部楼层

Re:如何取得本地显存大小及非本地显存大小

谢谢hugp1973
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 16:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表