Back to DXGI_SWAP_EFFECT_FLIP_DISCARD and update to DXG11_4

This fix a mem leak.
This commit is contained in:
GabsPuNs
2026-04-17 19:36:33 -04:00
parent b9f73b00e2
commit 0354e35e4d

View File

@@ -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