Selaa lähdekoodia

use gpu with max dedicated video memory instead of default gpu für dx11 applications

Kolja Strohm 3 kuukautta sitten
vanhempi
commit
fe0ac1639b
2 muutettua tiedostoa jossa 69 lisäystä ja 6 poistoa
  1. 63 2
      DX11GraphicsApi.cpp
  2. 6 4
      DX12GraphicsApi.cpp

+ 63 - 2
DX11GraphicsApi.cpp

@@ -127,9 +127,12 @@ DirectX11::~DirectX11()
         d3d11Context->Release();
         d3d11Context = NULL;
         getDLLRegister()->releaseDLL("d3d11.dll");
+        getDLLRegister()->releaseDLL("dxgi.dll");
     }
 }
 
+typedef HRESULT(__stdcall* CreateDXGIFactory2Function)(UINT, REFIID, void**);
+
 typedef HRESULT(__stdcall* D3D11CreateDeviceAndSwapChainFunction)(IDXGIAdapter*,
     D3D_DRIVER_TYPE,
     HMODULE,
@@ -152,6 +155,62 @@ void DirectX11::initialize(
     //--------------------------------------------------------------------
     // Create Device
 
+    HINSTANCE dxgiDLL = getDLLRegister()->ladeDLL("dxgi.dll", "dxgi.dll");
+    if (!dxgiDLL)
+    {
+        WMessageBox(fenster->getFensterHandle(),
+            new Text("Fehler"),
+            new Text("dxgi.dll konnte nicht gefunden werden."),
+            MB_ICONERROR);
+        return;
+    }
+    CreateDXGIFactory2Function createFactory
+        = (CreateDXGIFactory2Function)GetProcAddress(
+            dxgiDLL, "CreateDXGIFactory2");
+    if (!createFactory)
+    {
+        getDLLRegister()->releaseDLL("dxgi.dll");
+        WMessageBox(fenster->getFensterHandle(),
+            new Text("Fehler"),
+            new Text(
+                "Der Einstiegspunkt CreateDXGIFactory2 fon dxgi.dll konnte "
+                "nicht gefunden werden."),
+            MB_ICONERROR);
+        return;
+    }
+    IDXGIFactory5* factory;
+    HRESULT res = createFactory(0, __uuidof(IDXGIFactory5), (void**)&factory);
+    if (FAILED(res))
+    {
+        getDLLRegister()->releaseDLL("dxgi.dll");
+        Logging::error() << "ERROR DXGI: createFactory returned " << res
+                         << "\n";
+        WMessageBox(fenster->getFensterHandle(),
+            new Text("Fehler"),
+            new Text("createFactory ist Fehlgeschlagen."),
+            MB_ICONERROR);
+        return;
+    }
+    // search for gpu with max dedicated memory
+    IDXGIAdapter* adapter = 0;
+    IDXGIAdapter* usedAdapter = 0;
+    unsigned __int64 dedicatedMemoryCount = 0;
+    for (UINT adapterID = 0;
+        DXGI_ERROR_NOT_FOUND != factory->EnumAdapters(adapterID, &adapter);
+        ++adapterID)
+    {
+        DXGI_ADAPTER_DESC desc;
+        adapter->GetDesc(&desc);
+
+        if (dedicatedMemoryCount > desc.DedicatedVideoMemory)
+        {
+            continue;
+        }
+        dedicatedMemoryCount = desc.DedicatedVideoMemory;
+        if (usedAdapter) usedAdapter->Release();
+        usedAdapter = adapter;
+    }
+
     HINSTANCE dll = getDLLRegister()->ladeDLL("d3d11.dll", "d3d11.dll");
     if (!dll)
     {
@@ -167,6 +226,7 @@ void DirectX11::initialize(
     if (!createDeviceAndSwapChain)
     {
         getDLLRegister()->releaseDLL("d3d11.dll");
+        getDLLRegister()->releaseDLL("dxgi.dll");
         WMessageBox(fenster->getFensterHandle(),
             new Text("Fehler"),
             new Text("Der Einstiegspunkt D3D11CreateDeviceAndSwapChain fon "
@@ -200,8 +260,8 @@ void DirectX11::initialize(
 #ifdef _DEBUG
     if (debugDX) flag |= D3D11_CREATE_DEVICE_DEBUG;
 #endif
-    HRESULT result = createDeviceAndSwapChain(NULL,
-        D3D_DRIVER_TYPE_HARDWARE,
+    HRESULT result = createDeviceAndSwapChain(usedAdapter,
+        D3D_DRIVER_TYPE_UNKNOWN,
         NULL,
         flag,
         &featureLevel,
@@ -215,6 +275,7 @@ void DirectX11::initialize(
     if (result != S_OK)
     {
         getDLLRegister()->releaseDLL("d3d11.dll");
+        getDLLRegister()->releaseDLL("dxgi.dll");
         Logging::error() << "ERROR: D3D11CreateDeviceAndSwapChain returned "
                          << result << "\n";
         WMessageBox(fenster->getFensterHandle(),

+ 6 - 4
DX12GraphicsApi.cpp

@@ -148,8 +148,9 @@ void DirectX12::initialize(
         getDLLRegister()->releaseDLL("d3d12.dll");
         WMessageBox(fenster->getFensterHandle(),
             new Text("Fehler"),
-            new Text("Der Einstiegspunkt CreateDXGIFactory2 fon DXGI konnte "
-                     "nicht gefunden werden."),
+            new Text(
+                "Der Einstiegspunkt CreateDXGIFactory2 fon dxgi.dll konnte "
+                "nicht gefunden werden."),
             MB_ICONERROR);
         return;
     }
@@ -202,7 +203,8 @@ void DirectX12::initialize(
     {
         getDLLRegister()->releaseDLL("dxgi.dll");
         getDLLRegister()->releaseDLL("d3d12.dll");
-        Logging::error() << "ERROR: createFactory returned " << res << "\n";
+        Logging::error() << "ERROR DXGI: createFactory returned " << res
+                         << "\n";
         WMessageBox(fenster->getFensterHandle(),
             new Text("Fehler"),
             new Text("createFactory ist Fehlgeschlagen."),
@@ -215,7 +217,7 @@ void DirectX12::initialize(
                                  DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE,
                                  __uuidof(IDXGIAdapter1),
                                  (void**)&adapter);
-         ++adapterID)
+        ++adapterID)
     {
         DXGI_ADAPTER_DESC1 desc;
         adapter->GetDesc1(&desc);