DirectX 12设备在创建后立即挂起

DirectX 12设备在创建后立即挂起,directx,directx-12,Directx,Directx 12,我在创建DirectX 12命令队列时遇到一个奇怪的错误。 其他DX12应用程序能够在同一台机器上成功启动 我的电脑使用D3D\u功能\u级别\u 11\u 0if块。 用于测试的图形卡是NVIDIA GT 740,具有361.75个驱动程序 这是正在使用的代码(最小化): 第二个错误: The GPU will not respond to more commands, most likely because some other application submitted invalid c

我在创建DirectX 12命令队列时遇到一个奇怪的错误。 其他DX12应用程序能够在同一台机器上成功启动

我的电脑使用
D3D\u功能\u级别\u 11\u 0
if
块。 用于测试的图形卡是NVIDIA GT 740,具有361.75个驱动程序

这是正在使用的代码(最小化):

第二个错误:

The GPU will not respond to more commands, most likely because some other application submitted invalid commands.
The calling application should re-create the device and continue.

这很可能是某种驱动程序错误。检查您的硬件是否有更新的驱动程序。您应该尝试在本文中使用Direct3D12游戏模板,看看它们是否遇到相同的问题(有关模板的更多详细信息,请参阅)

您为各种功能级别调用D3D12CreateDevice的级联模式是不常见的,也不是必需的。如果应用程序可以在Direct3D功能级别11.0或更高版本上运行,则只需使用一次
D3D_功能级别11_0
。您应该将支持的最低功能级别传递给此函数

如果Direct3D 12设备确实支持更高的功能级别,您可以通过检查单个功能或使用
D3D12\u feature\u feature\u LEVELS
来发现:

// Create the DX12 API device object.
DX::ThrowIfFailed(D3D12CreateDevice(
    adapter.Get(),
    m_d3dMinFeatureLevel,
    IID_PPV_ARGS(&m_d3dDevice)
    ));

// Determine maximum supported feature level for this device
static const D3D_FEATURE_LEVEL s_featureLevels[] =
{
    D3D_FEATURE_LEVEL_12_1,
    D3D_FEATURE_LEVEL_12_0,
    D3D_FEATURE_LEVEL_11_1,
    D3D_FEATURE_LEVEL_11_0,
};

D3D12_FEATURE_DATA_FEATURE_LEVELS featLevels =
{
    _countof(s_featureLevels), s_featureLevels, D3D_FEATURE_LEVEL_11_0
};

HRESULT hr = m_d3dDevice->CheckFeatureSupport(D3D12_FEATURE_FEATURE_LEVELS,
    &featLevels, sizeof(featLevels));
if (SUCCEEDED(hr))
{
    m_d3dFeatureLevel = featLevels.MaxSupportedFeatureLevel;
}
else
{
    m_d3dFeatureLevel = m_d3dMinFeatureLevel;
}
请记住,
D3D\U功能等级12\U 0
D3D\U功能等级12\U 1
基本上只是
D3D\U功能等级11\U 1
,一些可选功能是强制性的。如果你的应用程序已经在11.x上检查它们,那么没有理由“要求”12.0或12.1。看


对于绝大多数Direct3D 12游戏和应用程序,
D3D\U功能级别11\U 0
D3D\U功能级别11\U 1
都是不错的选择。请记住,虽然AMD/ATI很早就支持功能级别11.1,但NVIDIA DirectX 11 parts仅在一段时间内支持11.0和一些可选功能。

我对if树的推理是,较新的功能级别可能比传统级别具有更好的驱动程序支持,因此它们的性能可能会更好一些。你给出的例子很有效,我现在正试图弄清楚为什么它有效而我的无效。无论你要求什么功能级别,设备都是一样的。您想知道设备是否支持更高的功能级别的唯一原因是,您的应用程序可以使用需要它的API功能。
CheckFeatureSupport
检查告诉您这一点。
The GPU will not respond to more commands, most likely because some other application submitted invalid commands.
The calling application should re-create the device and continue.
// Create the DX12 API device object.
DX::ThrowIfFailed(D3D12CreateDevice(
    adapter.Get(),
    m_d3dMinFeatureLevel,
    IID_PPV_ARGS(&m_d3dDevice)
    ));

// Determine maximum supported feature level for this device
static const D3D_FEATURE_LEVEL s_featureLevels[] =
{
    D3D_FEATURE_LEVEL_12_1,
    D3D_FEATURE_LEVEL_12_0,
    D3D_FEATURE_LEVEL_11_1,
    D3D_FEATURE_LEVEL_11_0,
};

D3D12_FEATURE_DATA_FEATURE_LEVELS featLevels =
{
    _countof(s_featureLevels), s_featureLevels, D3D_FEATURE_LEVEL_11_0
};

HRESULT hr = m_d3dDevice->CheckFeatureSupport(D3D12_FEATURE_FEATURE_LEVELS,
    &featLevels, sizeof(featLevels));
if (SUCCEEDED(hr))
{
    m_d3dFeatureLevel = featLevels.MaxSupportedFeatureLevel;
}
else
{
    m_d3dFeatureLevel = m_d3dMinFeatureLevel;
}