diff --git a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp index 24c24c2f..4fb86572 100644 --- a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp +++ b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp @@ -3,6 +3,7 @@ #include "stdafx.h" +#include #include #include #include @@ -497,6 +498,17 @@ static bool g_bInSizeMove = false; // true while the user is dragging the wi static int g_pendingResizeW = 0; // deferred resize dimensions static int g_pendingResizeH = 0; +static void TrimMem() +{ + if (!g_pd3dDevice) return; + + Microsoft::WRL::ComPtr dxgiDevice; + HRESULT hr = g_pd3dDevice->QueryInterface(IID_PPV_ARGS(&dxgiDevice)); + + if (SUCCEEDED(hr)) + dxgiDevice->Trim(); +} + LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; @@ -668,6 +680,8 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) ResizeD3D(newW, newH); } } + if (wParam == SIZE_MINIMIZED) + TrimMem(); } break; default: @@ -822,39 +836,57 @@ HRESULT InitDevice() }; UINT numFeatureLevels = ARRAYSIZE( featureLevels ); - DXGI_SWAP_CHAIN_DESC sd = {}; - sd.BufferCount = 1; - sd.BufferDesc.Width = width; - sd.BufferDesc.Height = height; - sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - sd.BufferDesc.RefreshRate.Numerator = 60; - sd.BufferDesc.RefreshRate.Denominator = 1; - sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT; - sd.OutputWindow = g_hWnd; - sd.SampleDesc.Count = 1; - sd.SampleDesc.Quality = 0; - sd.Windowed = TRUE; - for( auto driverTypeIndex = 0u; driverTypeIndex < numDriverTypes; driverTypeIndex++ ) { g_driverType = driverTypes[driverTypeIndex]; - hr = D3D11CreateDeviceAndSwapChain( nullptr, g_driverType, nullptr, createDeviceFlags, featureLevels, numFeatureLevels, - D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &g_featureLevel, &g_pImmediateContext ); + hr = D3D11CreateDevice( nullptr, g_driverType, nullptr, createDeviceFlags, featureLevels, + numFeatureLevels, D3D11_SDK_VERSION, &g_pd3dDevice, + &g_featureLevel, &g_pImmediateContext ); if( SUCCEEDED( hr ) ) break; } if( FAILED( hr ) ) return hr; + Microsoft::WRL::ComPtr dxgiDevice; + Microsoft::WRL::ComPtr dxgiAdapter; + Microsoft::WRL::ComPtr dxgiFactory; + + hr = g_pd3dDevice->QueryInterface(IID_PPV_ARGS(&dxgiDevice)); + if (FAILED(hr)) return hr; + hr = dxgiDevice->GetParent(IID_PPV_ARGS(&dxgiAdapter)); + if (FAILED(hr)) return hr; + hr = dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory)); + if (FAILED(hr)) return hr; + + DXGI_SWAP_CHAIN_DESC1 sd = {}; + sd.BufferCount = 2; + sd.Width = width; + sd.Height = height; + sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT; + sd.SampleDesc.Count = 1; + sd.SampleDesc.Quality = 0; + sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; + + IDXGISwapChain1* pNewSwapChain = nullptr; + hr = dxgiFactory->CreateSwapChainForHwnd(g_pd3dDevice, g_hWnd, &sd, nullptr, nullptr, &pNewSwapChain); + if (FAILED(hr)) return hr; + + g_pSwapChain = pNewSwapChain; + // Create a render target view Microsoft::WRL::ComPtr pBackBuffer; hr = g_pSwapChain->GetBuffer( 0, IID_PPV_ARGS(&pBackBuffer) ); if( FAILED( hr ) ) return hr; + hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer.Get(), nullptr, &g_pRenderTargetView ); + if( FAILED( hr ) ) + return hr; + // Create a depth stencil buffer D3D11_TEXTURE2D_DESC descDepth = {}; - descDepth.Width = width; descDepth.Height = height; descDepth.MipLevels = 1; @@ -866,6 +898,7 @@ HRESULT InitDevice() descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; descDepth.CPUAccessFlags = 0; descDepth.MiscFlags = 0; + hr = g_pd3dDevice->CreateTexture2D(&descDepth, nullptr, &g_pDepthStencilBuffer); if (FAILED(hr)) return hr; @@ -876,9 +909,6 @@ HRESULT InitDevice() descDSView.Texture2D.MipSlice = 0; hr = g_pd3dDevice->CreateDepthStencilView(g_pDepthStencilBuffer, &descDSView, &g_pDepthStencilView); - if( FAILED( hr ) ) - return hr; - hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer.Get(), nullptr, &g_pRenderTargetView ); if( FAILED( hr ) ) return hr; @@ -895,7 +925,6 @@ HRESULT InitDevice() g_pImmediateContext->RSSetViewports( 1, &vp ); RenderManager.Initialise(g_pd3dDevice, g_pSwapChain); - PostProcesser::GetInstance().Init(); return S_OK; @@ -972,6 +1001,7 @@ static bool ResizeD3D(int newW, int newH) } RenderManager.Suspend(); + TrimMem(); while (!RenderManager.Suspended()) { Sleep(1); } PostProcesser::GetInstance().Cleanup(); @@ -993,9 +1023,9 @@ static bool ResizeD3D(int newW, int newH) bool success = false; HRESULT hr; - Microsoft::WRL::ComPtr dxgiDevice; - Microsoft::WRL::ComPtr dxgiAdapter; - Microsoft::WRL::ComPtr dxgiFactory; + Microsoft::WRL::ComPtr dxgiDevice; + Microsoft::WRL::ComPtr dxgiAdapter; + Microsoft::WRL::ComPtr dxgiFactory; hr = g_pd3dDevice->QueryInterface(IID_PPV_ARGS(&dxgiDevice)); if (FAILED(hr)) goto postReset; @@ -1006,21 +1036,18 @@ static bool ResizeD3D(int newW, int newH) // Create new swap chain at backbuffer size { - DXGI_SWAP_CHAIN_DESC sd = {}; - sd.BufferCount = 1; - sd.BufferDesc.Width = bbW; - sd.BufferDesc.Height = bbH; - sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - sd.BufferDesc.RefreshRate.Numerator = 60; - sd.BufferDesc.RefreshRate.Denominator = 1; + DXGI_SWAP_CHAIN_DESC1 sd = {}; + sd.BufferCount = 2; + sd.Width = bbW; + sd.Height = bbH; + sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT; - sd.OutputWindow = g_hWnd; sd.SampleDesc.Count = 1; sd.SampleDesc.Quality = 0; - sd.Windowed = TRUE; + sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; - IDXGISwapChain* pNewSwapChain = nullptr; - hr = dxgiFactory->CreateSwapChain(g_pd3dDevice, &sd, &pNewSwapChain); + IDXGISwapChain1* pNewSwapChain = nullptr; + hr = dxgiFactory->CreateSwapChainForHwnd(g_pd3dDevice, g_hWnd, &sd, nullptr, nullptr, &pNewSwapChain); if (FAILED(hr) || pNewSwapChain == nullptr) { @@ -1181,6 +1208,7 @@ postReset: gdraw_D3D11_SetRendertargetSize(g_rScreenWidth, g_rScreenHeight); if (success) IggyFlushInstalledFonts(); + RenderManager.Resume(); if (success) @@ -2139,4 +2167,4 @@ void MemPixStuff() PIXAddNamedCounter(((float)allSectsTotal)/(4096.0f),"MemSect total pages"); } -#endif +#endif \ No newline at end of file