|
|
@@ -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(),
|