Функция C ++ для обнаружения DxDiag "Direct3D Acceleration" - PullRequest
2 голосов
/ 14 декабря 2009

Microsoft DxDiag может определить, имеет ли система «ускорение Direct3D».

Если система не поддерживает эту функцию, DxDiag напишет «Ускорение Direct3D недоступно» и напишет в консоли «Функциональность Direct3D недоступна. Убедитесь, что драйвер является окончательной версией от производителя оборудования».

Я хотел бы того же с функцией C ++.

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

Есть еще идеи получше?

Спасибо.

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

Ответы [ 2 ]

3 голосов
/ 15 декабря 2009

Поскольку DirectDraw теперь устарел, возможно, предпочтительнее использовать функции Direct3D.

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

LPDIRECT3D9 d3d = Direct3DCreate9( D3D_SDK_VERSION );

D3DCAPS9 caps;

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

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

0 голосов
/ 15 декабря 2009

Вы можете получить доступ к DX Diag через IDXDiagContainer и IDXDiagProvider

...