2009-12-14 4 views
2

Microsoft DxDiag может определить, имеет ли система «ускорение Direct3D».Функция C++ для обнаружения DxDiag «Direct3D Acceleration»

Если у системы нет возможности, DxDiag напишет «Direct3D Acceleration not available» и будет записывать в консоль «Direct3D функциональность недоступна. Вы должны убедиться, что драйвер является окончательной версией от производителя оборудования».

Мне бы хотелось, чтобы у C++ была такая же функция.

Я сделал несколько тестов, и следующая функция, похоже, выполняет эту работу.

Любая другая лучшая идея?

спасибо.

Алессандро

#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); 
} 

ответ

3

В настоящее время осуждается DirectDraw, это может быть предпочтительнее использовать функции Direct3D.

Если целью является обнаружение возможности 3D-ускорения для приложения, я бы инициализировал Direct3D, а затем проверить, доступен ли HAL Device Type.

LPDIRECT3D9 d3d = Direct3DCreate9(D3D_SDK_VERSION); 

D3DCAPS9 caps; 

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

Вы можете проверить достоверность этого кода, заставляя рендеринга программного обеспечения в панели управления DirectX, проверив «только программное обеспечение» флажок на вкладке Direct3D.
Проверьте код с установленным флажком и без него и проверьте, соответствует ли он вашим потребностям.

Смежные вопросы