فهرست منبع

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

Kolja Strohm 11 ماه پیش
والد
کامیت
fe0ac1639b
2فایلهای تغییر یافته به همراه69 افزوده شده و 6 حذف شده
  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);