gpt4 book ai didi

c++ - D3D12CreateDevice 抛出 _com_error

转载 作者:行者123 更新时间:2023-12-01 14:23:31 26 4
gpt4 key购买 nike

即使指定了适配器,以下代码中的 D3D12CreateDevice 也会抛出 _com_error 异常:

#include "d3dx12.h"

int main() {
ID3D12Device* device;
D3D12CreateDevice(nullptr, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device));
}

在 test.exe 中的 0x00007FFB1E315549 抛出异常:Microsoft C++ 异常:内存位置 0x0000002906BC90E0 处的 _com_error。

但是this来自 Microsoft 的示例程序不会从 D3D12CreateDevice 中抛出 _​​com_error。 D3D12CreateDevice 行为很奇怪,因为如果我将 HelloTriangle 文件夹重命名为 HelloTriangle2,异常会再次出现。

我检查了来自 D3D12CreateDevice 的 HRESULT,它返回 0(ZERO),这是成功的。但我仍然收到 _com_error。我的适配器通过硬件支持 DX12。

最佳答案

异常可以由运行时在内部使用,只要它们没有传播到函数之外就仍然是正确的。如果您从该异常继续,它可能会返回。您没有检查来自 D3D12CreateDeviceHRESULT,您应该检查它返回的内容。

主要区别在于示例代码使用的是明确枚举的适配器,该适配器已被验证支持 Direct3D 12,而您的代码依赖于默认设备。

// Helper function for acquiring the first available hardware adapter that supports Direct3D 12.
// If no such adapter can be found, *ppAdapter will be set to nullptr.
_Use_decl_annotations_
void DXSample::GetHardwareAdapter(IDXGIFactory2* pFactory, IDXGIAdapter1** ppAdapter)
{
ComPtr<IDXGIAdapter1> adapter;
*ppAdapter = nullptr;

for (UINT adapterIndex = 0; DXGI_ERROR_NOT_FOUND != pFactory->EnumAdapters1(adapterIndex, &adapter); ++adapterIndex)
{
DXGI_ADAPTER_DESC1 desc;
adapter->GetDesc1(&desc);

if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)
{
// Don't select the Basic Render Driver adapter.
// If you want a software adapter, pass in "/warp" on the command line.
continue;
}

// Check to see if the adapter supports Direct3D 12, but don't create the
// actual device yet.
if (SUCCEEDED(D3D12CreateDevice(adapter.Get(), D3D_FEATURE_LEVEL_11_0, _uuidof(ID3D12Device), nullptr)))
{
break;
}
}

*ppAdapter = adapter.Detach();
}

如果您的系统没有支持 Direct3D 12 的设备,那么示例代码将使用 WARP 软件设备,而您的代码也没有这样做。

因此您的默认视频设备可能不支持 Direct3D 12,并且您的系统上什至可能没有任何支持它的视频设备。也就是说,在 Direct3D 运行时内抛出的 C++ 异常仍然会触发调试器中断,因此您必须继续它们。

参见 Anatomy of Direct3D 12 Create Device有关创建 Direct3D 12 设备的详细演练。

You may also want to make use of DeviceResources to handle all the logic for device creation.

关于c++ - D3D12CreateDevice 抛出 _com_error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54515510/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com