D3D12CreateDevice抛出_com_error

问题描述 投票:0回答:1

D3D12CreateDevice在下面的代码抛出,即使指定了适配器的_com_error异常:

#include "d3dx12.h"

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

在内存位置0x0000002906BC90E0 _com_error:在异常抛出TEST.EXE在0x00007FFB1E315549:微软C ++异常。

但是从微软this示例程序不从D3D12CreateDevice抛出_com_error。 D3D12CreateDevice行为怪异,因为如果我HelloTriangle文件夹重命名为HelloTriangle2,异常再次出现。

我查了HRESULT从D3D12CreateDevice,并返回0(零),这是成功的。但我仍然得到_com_error。我的适配器硬件支持DX12。

c++ visual-c++ exception-handling directx directx-12
1个回答
0
投票

异常可以在内部运行时使用,只要它们不会传播的是仍然是正确的功能。如果你从异常继续,它可能会返回。你是不是检查从HRESULTD3D12CreateDevice,你应该做的,看看它返回。

主要的区别是,示例代码使用其经过验证,支持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,你甚至可能不会有支持它的系统上的任何视频设备。这就是说,C ++异常的Direct3D运行中抛出仍然可以触发一个调试器休息,所以你必须继续这样做。

Anatomy of Direct3D 12 Create Device用于创建一个Direct3D 12装置的详细解说。

您可能还希望利用DeviceResources来处理所有设备创建的逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.