C ++函数做DxDiag“Direct3D加速”检测

时间:2009-12-14 15:13:48

标签: directx directdraw

Microsoft DxDiag可以检测系统是否具有“Direct3D加速”。

如果系统没有该功能,DxDiag将编写“Direct3D Acceleration not available”并在控制台中写入“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 个答案:

答案 0 :(得分: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;    
}

您可以通过选中Direct3D标签中的“仅软件”复选框强制在DirectX控制面板中进行软件渲染来检查此代码的有效性。
在选中和不选中复选框的情况下测试代码,看看它是否符合您的需求。

答案 1 :(得分:0)

您可以通过IDXDiagContainerIDXDiagProvider

访问DX Diag