mirror of
https://github.com/optiscaler/OptiScaler.git
synced 2026-10-08 21:11:39 +00:00
Avoid a potential use after free with some shaders
This commit is contained in:
1 parent
4f17a05da8
commit
7dbc379d80
2 files changed
+18
-18
No files matched your search
@@ -7,6 +7,8 @@
|
||||
|
||||
#include <Config.h>
|
||||
|
||||
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<ID3D12Resource> 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);
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
|
||||
#include <Config.h>
|
||||
|
||||
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<ID3D12Resource> 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);
|
||||
|
||||
Reference in new issue
Block a user