diff --git a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp index f80d4a76..28b13986 100644 --- a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp +++ b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp @@ -3,6 +3,8 @@ #include "stdafx.h" +#include +#include #include #include #include @@ -162,7 +164,7 @@ static void SaveFullscreenOption(bool fullscreen) FILE *f = nullptr; if (fopen_s(&f, path, "w") == 0 && f) { - fprintf(f, "fullscreen=%d\n", fullscreen ? 1 : 0); + fprintf_s(f, "fullscreen=%d\n", fullscreen ? 1 : 0); fclose(f); } } @@ -796,13 +798,8 @@ HRESULT InitDevice() { HRESULT hr = S_OK; - RECT rc; - GetClientRect( g_hWnd, &rc ); - UINT width = rc.right - rc.left; - UINT height = rc.bottom - rc.top; -//app.DebugPrintf("width: %d, height: %d\n", width, height); - width = g_rScreenWidth; - height = g_rScreenHeight; + UINT width = g_rScreenWidth; + UINT height = g_rScreenHeight; //app.DebugPrintf("width: %d, height: %d\n", width, height); UINT createDeviceFlags = 0; @@ -826,42 +823,61 @@ HRESULT InitDevice() }; UINT numFeatureLevels = ARRAYSIZE( featureLevels ); - DXGI_SWAP_CHAIN_DESC sd; - ZeroMemory( &sd, sizeof( sd ) ); - sd.BufferCount = 2; - 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.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; - sd.OutputWindow = g_hWnd; - sd.SampleDesc.Count = 1; - sd.SampleDesc.Quality = 0; - sd.Windowed = TRUE; - for( UINT driverTypeIndex = 0; 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 ); - if( HRESULT_SUCCEEDED( hr ) ) - break; - } + { + g_driverType = driverTypes[driverTypeIndex]; + 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; + + dxgiDevice->SetMaximumFrameLatency(1); + + 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; + sd.Flags = DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT | DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;; + + IDXGISwapChain1* pNewSwapChain1 = nullptr; + hr = dxgiFactory->CreateSwapChainForHwnd(g_pd3dDevice, g_hWnd, &sd, nullptr, nullptr, &pNewSwapChain1); + if (FAILED(hr)) return hr; + + g_pSwapChain = pNewSwapChain1; + // Create a render target view - ID3D11Texture2D* pBackBuffer = nullptr; - hr = g_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer ); + 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; - ZeroMemory(&descDepth, sizeof(descDepth)); - + D3D11_TEXTURE2D_DESC descDepth = {}; descDepth.Width = width; descDepth.Height = height; descDepth.MipLevels = 1; @@ -873,25 +889,24 @@ HRESULT InitDevice() descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; descDepth.CPUAccessFlags = 0; descDepth.MiscFlags = 0; - hr = g_pd3dDevice->CreateTexture2D(&descDepth, nullptr, &g_pDepthStencilBuffer); - D3D11_DEPTH_STENCIL_VIEW_DESC descDSView; - ZeroMemory(&descDSView, sizeof(descDSView)); + hr = g_pd3dDevice->CreateTexture2D(&descDepth, nullptr, &g_pDepthStencilBuffer); + if( FAILED( hr ) ) + return hr; + + D3D11_DEPTH_STENCIL_VIEW_DESC descDSView = {}; descDSView.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; descDSView.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; descDSView.Texture2D.MipSlice = 0; hr = g_pd3dDevice->CreateDepthStencilView(g_pDepthStencilBuffer, &descDSView, &g_pDepthStencilView); - - hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, nullptr, &g_pRenderTargetView ); - pBackBuffer->Release(); if( FAILED( hr ) ) return hr; g_pImmediateContext->OMSetRenderTargets( 1, &g_pRenderTargetView, g_pDepthStencilView ); // Setup the viewport - D3D11_VIEWPORT vp; + D3D11_VIEWPORT vp = {}; vp.Width = static_cast(width); vp.Height = static_cast(height); vp.MinDepth = 0.0f; @@ -901,7 +916,6 @@ HRESULT InitDevice() g_pImmediateContext->RSSetViewports( 1, &vp ); RenderManager.Initialise(g_pd3dDevice, g_pSwapChain); - PostProcesser::GetInstance().Init(); return S_OK; @@ -916,7 +930,8 @@ void Render() const float ClearColor[4] = { 0.0f, 0.125f, 0.3f, 1.0f }; //red,green,blue,alpha g_pImmediateContext->ClearRenderTargetView( g_pRenderTargetView, ClearColor ); - g_pSwapChain->Present( 0, 0 ); + g_pImmediateContext->Flush(); + g_pSwapChain->Present(0, DXGI_PRESENT_DO_NOT_WAIT); } //-------------------------------------------------------------------------------------- @@ -998,49 +1013,48 @@ static bool ResizeD3D(int newW, int newH) bool success = false; HRESULT hr; - IDXGIDevice* dxgiDevice = nullptr; - IDXGIAdapter* dxgiAdapter = nullptr; - IDXGIFactory* dxgiFactory = nullptr; - hr = g_pd3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void**)&dxgiDevice); + 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; - hr = dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)&dxgiAdapter); - if (FAILED(hr)) { dxgiDevice->Release(); goto postReset; } - hr = dxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void**)&dxgiFactory); - dxgiAdapter->Release(); - dxgiDevice->Release(); + + dxgiDevice->SetMaximumFrameLatency(1); + + hr = dxgiDevice->GetParent(IID_PPV_ARGS(&dxgiAdapter)); + if (FAILED(hr)) goto postReset; + hr = dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory)); if (FAILED(hr)) goto postReset; // Create new swap chain at backbuffer size { - DXGI_SWAP_CHAIN_DESC sd = {}; + DXGI_SWAP_CHAIN_DESC1 sd = {}; sd.BufferCount = 2; - 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; + sd.Width = bbW; + sd.Height = bbH; + sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT; - sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; - sd.OutputWindow = g_hWnd; sd.SampleDesc.Count = 1; sd.SampleDesc.Quality = 0; - sd.Windowed = TRUE; + sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; + sd.Flags = DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT | DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; - IDXGISwapChain* pNewSwapChain = nullptr; - hr = dxgiFactory->CreateSwapChain(g_pd3dDevice, &sd, &pNewSwapChain); - dxgiFactory->Release(); - if (FAILED(hr) || pNewSwapChain == nullptr) + IDXGISwapChain1* pNewSwapChain1 = nullptr; + hr = dxgiFactory->CreateSwapChainForHwnd(g_pd3dDevice, g_hWnd, &sd, nullptr, nullptr, &pNewSwapChain1); + + if (FAILED(hr) || pNewSwapChain1 == nullptr) { app.DebugPrintf("[RESIZE] CreateSwapChain FAILED hr=0x%08X — keeping old swap chain\n", (unsigned)hr); goto postReset; } - // New swap chain created successfully — NOW destroy the old one. + // New swap chain created successfully — NOW destroy the old one. // The Renderer's internal RTV/SRV still reference the old backbuffer — // those COM objects become orphaned (tiny leak, harmless). We DON'T // release them because unknown code may also hold refs. - pOldSwapChain->Release(); - g_pSwapChain = pNewSwapChain; + pOldSwapChain->Release(); + g_pSwapChain = pNewSwapChain1; } // Patch Renderer's swap chain pointer @@ -1049,7 +1063,7 @@ static bool ResizeD3D(int newW, int newH) // Create render target views from new backbuffer { ID3D11Texture2D* pBackBuffer = nullptr; - hr = g_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer); + hr = g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); if (FAILED(hr)) goto postReset; // Our RTV @@ -1074,6 +1088,7 @@ static bool ResizeD3D(int newW, int newH) hr = g_pd3dDevice->CreateShaderResourceView(srvTexture, nullptr, ppRM_SRV); srvTexture->Release(); } + if (FAILED(hr)) goto postReset; } @@ -1143,7 +1158,7 @@ postReset: if (g_pRenderTargetView == nullptr) { ID3D11Texture2D* pBB = nullptr; - if (SUCCEEDED(g_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBB))) + if (SUCCEEDED(g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBB)))) { g_pd3dDevice->CreateRenderTargetView(pBB, nullptr, &g_pRenderTargetView); pBB->Release(); @@ -1182,11 +1197,13 @@ postReset: app.DebugPrintf("[RESIZE] FAILED but recovered views at %dx%d\n", g_rScreenWidth, g_rScreenHeight); } + g_pImmediateContext->Flush(); gdraw_D3D11_PostReset(); gdraw_D3D11_SetRendertargetSize(g_rScreenWidth, g_rScreenHeight); if (success) IggyFlushInstalledFonts(); + RenderManager.Resume(); if (success)