D3D12CreateDevice выбрасывает _com_error - PullRequest
0 голосов
/ 04 февраля 2019

D3D12CreateDevice в следующем коде выдает исключение _com_error, даже если указан адаптер:

#include "d3dx12.h"

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

Исключение, выданное в 0x00007FFB1E315549 в test.exe: исключение Microsoft C ++: _com_error в расположении памяти 0x0000002906BC90E0.

Но этот пример программы от Microsoft не выдает _com_error из D3D12CreateDevice.Поведение D3D12CreateDevice странное, потому что, если я переименую папку HelloTriangle в HelloTriangle2, снова появится исключение.

Я проверил HRESULT из D3D12CreateDevice, и он возвращает 0 (НОЛЬ), что успешно.Но я все еще получаю _com_error.Мой адаптер поддерживает DX12 аппаратно.

1 Ответ

0 голосов
/ 04 февраля 2019

Исключения могут использоваться внутренне во время выполнения и до тех пор, пока они не распространяются из функции, которая все еще корректна.Если вы продолжите из этого исключения, оно, скорее всего, вернется.Вы не проверяете HRESULT из D3D12CreateDevice, что нужно сделать, чтобы увидеть, что он возвращает.

Основное отличие состоит в том, что в примере кода используется явно перечислимый адаптер который был проверен на поддержку 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, могут по-прежнему вызывать разрыв отладчика, поэтому вы должны продолжить их.

См. Анатомия Direct3D 12 Создание устройства для подробного ознакомления ссоздание устройства Direct3D 12.

Вы также можете использовать DeviceResources для обработки всей логики создания устройства.

...