D3D11CreateDeviceAndSwapChain Fails to succeed

D3D11CreateDeviceAndSwapChain Fails to succeed

本文关键字:succeed to Fails D3D11CreateDeviceAndSwapChain      更新时间:2023-10-16

我目前有一个for循环,一旦hr成功,就应该中断它,但它没有成功,这会在以后给我带来问题。

HRESULT hr = S_OK;
    UINT createDeviceFlags = 0;
#ifdef _DEBUG
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
    D3D_DRIVER_TYPE driverTypes[] =
    {
        D3D_DRIVER_TYPE_HARDWARE,
        D3D_DRIVER_TYPE_WARP,
        D3D_DRIVER_TYPE_REFERENCE,
    };
    UINT numDriverTypes = ARRAYSIZE(driverTypes);
    D3D_FEATURE_LEVEL featureLevels[] =
    {
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1,
        D3D_FEATURE_LEVEL_10_0,
    };
 UINT numFeatureLevels = ARRAYSIZE(featureLevels);
    DXGI_SWAP_CHAIN_DESC sd;
    ZeroMemory(&sd, sizeof(sd));
    sd.BufferCount = 1;
    sd.BufferDesc.Width = _WindowWidth;
    sd.BufferDesc.Height = _WindowHeight;
    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    sd.BufferDesc.RefreshRate.Numerator = 60;
    sd.BufferDesc.RefreshRate.Denominator = 1;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    sd.OutputWindow = _hWnd;
    sd.SampleDesc.Count = 1;
    sd.SampleDesc.Quality = 0;
    sd.Windowed = TRUE;    
for (UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++)
        {
            _driverType = driverTypes[driverTypeIndex];
            hr = D3D11CreateDeviceAndSwapChain(nullptr, _driverType, nullptr, createDeviceFlags, featureLevels, numFeatureLevels,
                                               D3D11_SDK_VERSION, &sd, &_pSwapChain, &_pd3dDevice, &_featureLevel, &_pImmediateContext);
            if (SUCCEEDED(hr))
                break;
        }

很明显,for循环中的D3D11CreateDeviceAndSwapChain返回的值不是successed,更糟糕的是,当我在另一台电脑上运行这个程序时,它运行得很好!我已经更新了所有的驱动程序,重新启动了我的电脑,卸载了所有的防病毒软件,但仍然没有运气。有什么想法吗?

您尚未说明正在使用的操作系统,但最有可能的故障原因是您的系统没有安装正确的Direct3D SDK调试层。在这种情况下,如果您尝试创建具有D3D11_CREATE_DEVICE_DEBUG的设备,它将失败。一个快速测试是,如果您的Release版本成功创建了设备,但Debug版本没有。

要为您的操作系统安装正确的SDK层:

  • Windows 7 RTM->传统的DirectX SDK可以做到这一点
  • Windows 7 SP1与KB2670838更新(又名DirectX 11.1)->您必须安装Windows 8.x SDK;旧版DirectX SDK版本已过期
  • Windows8Windows 8.1->Windows8.x SDK安装它
  • Windows 10->这是Windows 10的一项按需功能。请注意,如果您从10240升级到10586,则需要重新启用FOD

请参阅Direct3D SDK调试层技巧

另一种可能性是,您的系统没有Feature Level 10.0或更高版本的视频卡,但如果代码尝试使用WARP,则可以使用它。

参见Direct3D 11创建设备的解剖

您应该查看DirectX工具包和Direct3D Win32游戏模板。

最终解决了问题。

微软发布了Windows10的更新,自动删除了对DirectX11的支持。必须重新启用。如果有人在Windows 10中遇到这个问题,要重新启用DirectX11,请转到:

设置->应用程序->管理->添加额外的图形支持

(显然我需要等待21个小时才能接受我自己的答案…)

正如您所说,相同的代码在其他机器上运行得很好,这意味着您的gpu中有问题,请尝试使用WARP或Reference设备运行,从列表中删除D3D_DRIVER_TYPE_HARDWARE,然后重试。

尝试使用

D3D_DRIVER_TYPE driverTypes[] =
    {
        D3D_DRIVER_TYPE_WARP,
        D3D_DRIVER_TYPE_REFERENCE,
    };

请在此处阅读有关驱动程序类型的详细信息What';WARP驱动程序、参考驱动程序和软件驱动程序之间的区别是什么?

根据我自己对DX11和COM:的理解

  1. 根据rastertek.com,以下是相关的代码片段和解释:

请注意,如果用户没有DirectX 11视频卡,此函数调用将无法创建设备和设备上下文。此外,如果您自己正在测试DirectX 11功能,但没有DirectX 11视频卡,则可以用D3D_DRIVER_TYPE_REFERENCE替换D3D_DRIVER_TYPE_HARDWARE,DirectX将使用您的CPU而不是视频卡硬件进行绘制。请注意,它的运行速度是1/1000,但对于那些还没有在所有机器上安装DirectX 11视频卡的人来说,这是很好的。

// Create the swap chain, Direct3D device, and Direct3D device context.
result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, &featureLevel, 1, 
                       D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, &m_device, NULL, &m_deviceContext);
if(FAILED(result))
{
    return false;
}

出于调试目的,请尝试将驱动程序类型标志更改为D3D_driver_type_REFERENCE。如果这是有效的,你可能没有DX11 GPU。

  1. 根据另一个stackoverflow问题,所选的答案可能对您将来有用,MSDN也有一篇关于DX11 HRESULT返回代码和COM错误处理的文章

现在可以做的最好的事情是通过将MSDN文章中的每个枚举传递到if语句中来找到HRESULT的值。例如:

if (hr == E_OUTOFMEMORY) {
//do whatever
}