diff --git a/src/rhi/qrhid3d11.cpp b/src/rhi/qrhid3d11.cpp index ba5f2cc58e1695c883a051c868cd783c03694e13..fde45bd8af11331bde64640f3cc712c3fc5f3fd9 100644 --- a/src/rhi/qrhid3d11.cpp +++ b/src/rhi/qrhid3d11.cpp @@ -101,11 +101,40 @@ void QRhiD3D11::create() if (debugLayer) flags |= D3D11_CREATE_DEVICE_DEBUG; + HRESULT hr = CreateDXGIFactory2(0, IID_IDXGIFactory2, reinterpret_cast(&dxgiFactory)); + if (FAILED(hr)) { + qWarning("Failed to create DXGI factory: %s", qPrintable(comErrorMessage(hr))); + return; + } + if (!importedDevice) { + IDXGIAdapter1 *adapterToUse = nullptr; + IDXGIAdapter1 *adapter; + int requestedAdapterIndex = -1; + if (qEnvironmentVariableIsSet("QT_D3D_ADAPTER_INDEX")) + requestedAdapterIndex = qEnvironmentVariableIntValue("QT_D3D_ADAPTER_INDEX"); + for (int adapterIndex = 0; dxgiFactory->EnumAdapters1(adapterIndex, &adapter) != DXGI_ERROR_NOT_FOUND; ++adapterIndex) { + DXGI_ADAPTER_DESC1 desc; + adapter->GetDesc1(&desc); + const QString name = QString::fromUtf16((char16_t *) desc.Description); + qDebug("Adapter %d: '%s' (flags 0x%x)", adapterIndex, qPrintable(name), desc.Flags); + if (!adapterToUse && (requestedAdapterIndex < 0 || requestedAdapterIndex == adapterIndex)) { + adapterToUse = adapter; + qDebug(" using this adapter"); + } else { + adapter->Release(); + } + } + if (!adapterToUse) { + qWarning("No adapter"); + return; + } + ID3D11DeviceContext *ctx = nullptr; - HRESULT hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, flags, + HRESULT hr = D3D11CreateDevice(adapterToUse, D3D_DRIVER_TYPE_UNKNOWN, nullptr, flags, nullptr, 0, D3D11_SDK_VERSION, &dev, &featureLevel, &ctx); + adapterToUse->Release(); if (FAILED(hr)) { qWarning("Failed to create D3D11 device and context: %s", qPrintable(comErrorMessage(hr))); return; @@ -120,25 +149,23 @@ void QRhiD3D11::create() Q_ASSERT(dev && context); featureLevel = dev->GetFeatureLevel(); } - - HRESULT hr = CreateDXGIFactory2(0, IID_IDXGIFactory2, reinterpret_cast(&dxgiFactory)); - if (FAILED(hr)) { - qWarning("Failed to create DXGI factory: %s", qPrintable(comErrorMessage(hr))); - return; - } - - qDebug("D3D11"); } void QRhiD3D11::destroy() { if (!importedDevice) { - if (context) + if (context) { context->Release(); - context = nullptr; - if (dev) + context = nullptr; + } + if (dev) { dev->Release(); - dev = nullptr; + dev = nullptr; + } + } + if (dxgiFactory) { + dxgiFactory->Release(); + dxgiFactory = nullptr; } } diff --git a/src/rhi/qrhid3d11_p.h b/src/rhi/qrhid3d11_p.h index b69157fb11b66ac62764e985c31e4aa20c127527..3ce8fc48a88245a36350e37ed30454c9c7ff8553 100644 --- a/src/rhi/qrhid3d11_p.h +++ b/src/rhi/qrhid3d11_p.h @@ -452,7 +452,7 @@ public: ID3D11Device *dev = nullptr; ID3D11DeviceContext1 *context = nullptr; D3D_FEATURE_LEVEL featureLevel; - IDXGIFactory2 *dxgiFactory; + IDXGIFactory2 *dxgiFactory = nullptr; static const int FRAMES_IN_FLIGHT = QD3D11SwapChain::BUFFER_COUNT; int currentFrameSlot = 0; // 0..FRAMES_IN_FLIGHT-1 diff --git a/todo.txt b/todo.txt index a5367e3050402fe4466c4de438b665565b16af76..c7669a9ba2a26666077f2ac72b863c1a64c63594 100644 --- a/todo.txt +++ b/todo.txt @@ -4,7 +4,6 @@ mtl: fix Dynamic for non-uniform buffers mtl: forcing immut. to Shared should not need multiple backing buffers mtl: textures mtl: mrt -d3d: show something about adapter or such when starting up d3d: msaa (onscreen) mtl: msaa (onscreen) test cubemap @@ -43,6 +42,7 @@ bytecode (fxc/dxc) for d3d? bytecode for metal? +++ done +d3d: very basic adapter selection what's up with instance step rate remove geometry shader from enum hlsl version config to qsb