From 7dbc379d807640a1b8e7b69da855aee68eff72d3 Mon Sep 17 00:00:00 2001 From: FakeMichau <49685661+FakeMichau@users.noreply.github.com> Date: Tue, 1 Sep 2026 03:40:48 +0200 Subject: [PATCH] Avoid a potential use after free with some shaders --- OptiScaler/shaders/hudless_compare/HC_Dx12.cpp | 18 +++++++++--------- OptiScaler/shaders/render_ui/RUI_Dx12.cpp | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/OptiScaler/shaders/hudless_compare/HC_Dx12.cpp b/OptiScaler/shaders/hudless_compare/HC_Dx12.cpp index f16396b1..b26f45ee 100644 --- a/OptiScaler/shaders/hudless_compare/HC_Dx12.cpp +++ b/OptiScaler/shaders/hudless_compare/HC_Dx12.cpp @@ -7,6 +7,8 @@ #include +using Microsoft::WRL::ComPtr; + inline static int GetFormatGroup(DXGI_FORMAT format) { switch (format) @@ -228,7 +230,7 @@ bool HC_Dx12::Dispatch(IDXGISwapChain3* sc, ID3D12GraphicsCommandList* cmdList, } // Get SwapChain Buffer - ID3D12Resource* scBuffer = nullptr; + ComPtr scBuffer; auto scIndex = sc->GetCurrentBackBufferIndex(); auto result = sc->GetBuffer(scIndex, IID_PPV_ARGS(&scBuffer)); @@ -238,8 +240,6 @@ bool HC_Dx12::Dispatch(IDXGISwapChain3* sc, ID3D12GraphicsCommandList* cmdList, return false; } - scBuffer->Release(); - // Check Hudless Buffer D3D12_RESOURCE_DESC hudlessDesc = hudless->GetDesc(); @@ -252,7 +252,7 @@ bool HC_Dx12::Dispatch(IDXGISwapChain3* sc, ID3D12GraphicsCommandList* cmdList, _counter++; _counter = _counter % HC_NUM_OF_HEAPS; - if (!CreateBufferResource(_counter, _device, scBuffer, D3D12_RESOURCE_STATE_COPY_DEST)) + if (!CreateBufferResource(_counter, _device, scBuffer.Get(), D3D12_RESOURCE_STATE_COPY_DEST)) { LOG_ERROR("CreateBufferResource error!"); return false; @@ -260,12 +260,12 @@ bool HC_Dx12::Dispatch(IDXGISwapChain3* sc, ID3D12GraphicsCommandList* cmdList, // Copy Swapchain Buffer to read buffer SetBufferState(_counter, cmdList, D3D12_RESOURCE_STATE_COPY_DEST); - ResourceBarrier(cmdList, scBuffer, D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_COPY_SOURCE); + ResourceBarrier(cmdList, scBuffer.Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_COPY_SOURCE); if (_buffer[_counter] != nullptr) - cmdList->CopyResource(_buffer[_counter], scBuffer); + cmdList->CopyResource(_buffer[_counter], scBuffer.Get()); - ResourceBarrier(cmdList, scBuffer, D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET); + ResourceBarrier(cmdList, scBuffer.Get(), D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET); SetBufferState(_counter, cmdList, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); if (state != D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE) @@ -285,7 +285,7 @@ bool HC_Dx12::Dispatch(IDXGISwapChain3* sc, ID3D12GraphicsCommandList* cmdList, CreateShaderResourceView(_device, hudless, currentHeap.GetSrvCPU(0)); CreateShaderResourceView(_device, _buffer[_counter], currentHeap.GetSrvCPU(1)); - CreateRenderTargetView(_device, scBuffer, currentHeap.GetRtvCPU(0), 0); + CreateRenderTargetView(_device, scBuffer.Get(), currentHeap.GetRtvCPU(0), 0); InternalCompareParams constants {}; constants.DiffThreshold = 0.003f; @@ -325,7 +325,7 @@ bool HC_Dx12::Dispatch(IDXGISwapChain3* sc, ID3D12GraphicsCommandList* cmdList, cmdList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); cmdList->DrawInstanced(3, 1, 0, 0); - ResourceBarrier(cmdList, scBuffer, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT); + ResourceBarrier(cmdList, scBuffer.Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT); if (state != D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE) ResourceBarrier(cmdList, hudless, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, state); diff --git a/OptiScaler/shaders/render_ui/RUI_Dx12.cpp b/OptiScaler/shaders/render_ui/RUI_Dx12.cpp index eb4178db..6398aafc 100644 --- a/OptiScaler/shaders/render_ui/RUI_Dx12.cpp +++ b/OptiScaler/shaders/render_ui/RUI_Dx12.cpp @@ -9,6 +9,8 @@ #include +using Microsoft::WRL::ComPtr; + bool RUI_Dx12::CreateBufferResource(UINT index, ID3D12Device* InDevice, ID3D12Resource* InSource, D3D12_RESOURCE_STATES InState) { @@ -171,7 +173,7 @@ bool RUI_Dx12::Dispatch(IDXGISwapChain3* sc, ID3D12GraphicsCommandList* cmdList, } // Get SwapChain Buffer - ID3D12Resource* scBuffer = nullptr; + ComPtr scBuffer; auto scIndex = sc->GetCurrentBackBufferIndex(); auto result = sc->GetBuffer(scIndex, IID_PPV_ARGS(&scBuffer)); @@ -181,8 +183,6 @@ bool RUI_Dx12::Dispatch(IDXGISwapChain3* sc, ID3D12GraphicsCommandList* cmdList, return false; } - scBuffer->Release(); - // Check Hudless Buffer D3D12_RESOURCE_DESC hudlessDesc = hudless->GetDesc(); @@ -195,7 +195,7 @@ bool RUI_Dx12::Dispatch(IDXGISwapChain3* sc, ID3D12GraphicsCommandList* cmdList, _counter++; _counter = _counter % HC_NUM_OF_HEAPS; - if (!CreateBufferResource(_counter, _device, scBuffer, D3D12_RESOURCE_STATE_COPY_DEST)) + if (!CreateBufferResource(_counter, _device, scBuffer.Get(), D3D12_RESOURCE_STATE_COPY_DEST)) { LOG_ERROR("CreateBufferResource error!"); return false; @@ -203,12 +203,12 @@ bool RUI_Dx12::Dispatch(IDXGISwapChain3* sc, ID3D12GraphicsCommandList* cmdList, // Copy Swapchain Buffer to read buffer SetBufferState(_counter, cmdList, D3D12_RESOURCE_STATE_COPY_DEST); - ResourceBarrier(cmdList, scBuffer, D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_COPY_SOURCE); + ResourceBarrier(cmdList, scBuffer.Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_COPY_SOURCE); if (_buffer[_counter] != nullptr) - cmdList->CopyResource(_buffer[_counter], scBuffer); + cmdList->CopyResource(_buffer[_counter], scBuffer.Get()); - ResourceBarrier(cmdList, scBuffer, D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET); + ResourceBarrier(cmdList, scBuffer.Get(), D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET); SetBufferState(_counter, cmdList, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); if (state != D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE) @@ -223,7 +223,7 @@ bool RUI_Dx12::Dispatch(IDXGISwapChain3* sc, ID3D12GraphicsCommandList* cmdList, // Create views CreateShaderResourceView(_device, hudless, currentHeap.GetSrvCPU(0)); CreateShaderResourceView(_device, _buffer[_counter], currentHeap.GetSrvCPU(1)); - CreateRenderTargetView(_device, scBuffer, currentHeap.GetRtvCPU(0), 0); + CreateRenderTargetView(_device, scBuffer.Get(), currentHeap.GetRtvCPU(0), 0); ID3D12DescriptorHeap* heaps[] = { currentHeap.GetHeapCSU() }; cmdList->SetDescriptorHeaps(_countof(heaps), heaps); @@ -253,7 +253,7 @@ bool RUI_Dx12::Dispatch(IDXGISwapChain3* sc, ID3D12GraphicsCommandList* cmdList, cmdList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); cmdList->DrawInstanced(3, 1, 0, 0); - ResourceBarrier(cmdList, scBuffer, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT); + ResourceBarrier(cmdList, scBuffer.Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT); if (state != D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE) ResourceBarrier(cmdList, hudless, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, state);