2009-12-14 9 views
2

Microsoft DxDiag peut détecter si un système a "Direct3D Acceleration". Si le système n'a pas la capacité, DxDiag écrira "Accélération Direct3D non disponible" et écrira dans la console "La fonctionnalité Direct3D n'est pas disponible Vous devez vérifier que le pilote est une version finale du fabricant du matériel."Fonction C++ pour la détection DxDiag "Direct3D Acceleration"

Je voudrais la même chose avec une fonction C++. J'ai fait quelques tests et la fonction suivante semble faire le travail.

Une autre idée?

Merci.

Alessandro

#include <ddraw.h> 
#include <atlbase.h> 

bool has3D() 
{ 
    CComPtr<IDirectDraw> dd; 
    HRESULT hr = ::DirectDrawCreate(0, &dd, 0); 
    if (hr != DD_OK) return false; 

    DDCAPS hel_caps, hw_caps; 
    ::ZeroMemory(&hel_caps, sizeof(DDCAPS)); 
    ::ZeroMemory(&hw_caps, sizeof(DDCAPS)); 
    hw_caps.dwSize = sizeof(DDCAPS); 
    hel_caps.dwSize = sizeof(DDCAPS); 
    hr = dd->GetCaps(&hw_caps, &hel_caps); 
    if (hr != DD_OK) return false; 

    return (hw_caps.dwCaps & DDCAPS_3D) && (hel_caps.dwCaps & DDCAPS_3D); 
} 

Répondre

3

Comme DirectDraw est maintenant dépréciée, il est peut-être préférable d'utiliser les fonctions de Direct3D.

Si le but est de détecter si l'accélération 3D est disponible pour une application, j'initialiserais Direct3D et ensuite vérifierais si le HAL Device Type est disponible.

LPDIRECT3D9 d3d = Direct3DCreate9(D3D_SDK_VERSION); 

D3DCAPS9 caps; 

if (FAILED(d3d->GetDeviceCaps(D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL, &caps))) 
{ 
    return false;  
} 

Vous pouvez vérifier la validité de ce code en forçant le rendu logiciel dans le Panneau de configuration DirectX en cochant la case à cocher « Logiciel uniquement » dans l'onglet Direct3D.
Testez le code avec et sans la case cochée pour voir si cela correspond à vos besoins.