Функция C++ для обнаружения DxDiag "Direct3D Acceleration"
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 ответа
Поскольку 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.
Протестируйте код с установленным флажком и без него и посмотрите, подходит ли он вам.
Вы можете получить доступ к DX Diag через IDXDiagContainer и IDXDiagProvider