mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/GabsPuNs-MinecraftConsoles.git
synced 2026-07-17 19:18:10 +00:00
Back to DXGI_SWAP_EFFECT_FLIP_DISCARD and update to DXG11_4
This fix a mem leak.
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
#include <dxgi1_4.h>
|
||||
#include <wrl/client.h>
|
||||
#include <assert.h>
|
||||
#include <iostream>
|
||||
@@ -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<IDXGIDevice3> 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<IDXGIDevice3> dxgiDevice;
|
||||
Microsoft::WRL::ComPtr<IDXGIAdapter3> dxgiAdapter;
|
||||
Microsoft::WRL::ComPtr<IDXGIFactory4> 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<ID3D11Texture2D> 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<IDXGIDevice> dxgiDevice;
|
||||
Microsoft::WRL::ComPtr<IDXGIAdapter> dxgiAdapter;
|
||||
Microsoft::WRL::ComPtr<IDXGIFactory> dxgiFactory;
|
||||
Microsoft::WRL::ComPtr<IDXGIDevice3> dxgiDevice;
|
||||
Microsoft::WRL::ComPtr<IDXGIAdapter3> dxgiAdapter;
|
||||
Microsoft::WRL::ComPtr<IDXGIFactory4> 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
|
||||
Reference in New Issue
Block a user