diff --git a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp index 80e8beef..97eaadcc 100644 --- a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp +++ b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp @@ -583,6 +583,7 @@ static bool TakeScreenshot(wstring& outFilename) return success; } +IDXGIAdapter* g_pAdapter = nullptr; ID3D11RenderTargetView* g_pRenderTargetView = nullptr; ID3D11DepthStencilView* g_pDepthStencilView = nullptr; ID3D11Texture2D* g_pDepthStencilBuffer = nullptr; @@ -927,6 +928,7 @@ HRESULT InitDevice() D3D_DRIVER_TYPE_HARDWARE, D3D_DRIVER_TYPE_WARP, D3D_DRIVER_TYPE_REFERENCE, + D3D_DRIVER_TYPE_UNKNOWN }; UINT numDriverTypes = ARRAYSIZE( driverTypes ); @@ -963,10 +965,42 @@ HRESULT InitDevice() sd.SampleDesc.Quality = 0; sd.Windowed = TRUE; + /* + * @CDevJoud: we would like to force the game to choose the highest GPU available. + * we loop over all the GPUs in the system and choose the one that are either + * Nvidia or AMD and ignore the integrated one + */ + + IDXGIFactory* pFactory = nullptr; + CreateDXGIFactory(__uuidof(IDXGIFactory), reinterpret_cast(&pFactory)); + + IDXGIAdapter* adapter = nullptr; + for (INT i = 0; pFactory->EnumAdapters(i, &adapter) != DXGI_ERROR_NOT_FOUND; i++) { + if (adapter != nullptr) { + DXGI_ADAPTER_DESC desc{}; + adapter->GetDesc(&desc); + //Nvidia GPUs + if (desc.VendorId == 0x10DE /*Nvidia GPUs*/) { + g_pAdapter = adapter; + break; + } else if (desc.VendorId == 0x1002 /*AMD GPUs*/) { + g_pAdapter = adapter; + break; + } else if(desc.VendorId == 0x8086 /*Intel GPUs*/) { + g_pAdapter = adapter; + break; + } + else { + // If there is no Adapter found just use anything + g_pAdapter = adapter; + } + } + } + for( UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++ ) { g_driverType = driverTypes[driverTypeIndex]; - hr = D3D11CreateDeviceAndSwapChain( nullptr, g_driverType, nullptr, createDeviceFlags, featureLevels, numFeatureLevels, + hr = D3D11CreateDeviceAndSwapChain( g_pAdapter, g_driverType, nullptr, createDeviceFlags, featureLevels, numFeatureLevels, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &g_featureLevel, &g_pImmediateContext ); if( HRESULT_SUCCEEDED( hr ) ) break; @@ -2297,6 +2331,7 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, // Free resources, unregister custom classes, and exit. // app.Uninit(); + g_pAdapter->Release(); g_pd3dDevice->Release(); }