mirror of
https://github.com/optiscaler/OptiScaler.git
synced 2026-09-23 13:56:19 +00:00
More resource tracking work
This commit is contained in:
@@ -91,6 +91,11 @@ RectHeight=auto
|
||||
; true or false - Default (auto) is false
|
||||
AlwaysTrackHeaps=auto
|
||||
|
||||
; Track resource release
|
||||
; Most probably will tanks performance!!!
|
||||
; true or false - Default (auto) is false
|
||||
HudfixTrackRelease=auto
|
||||
|
||||
; Makes a copy of Depth to be used with Hudfix FG call
|
||||
; Setting it false most probably cause occasional garbling
|
||||
; true or false - Default (auto) is true
|
||||
|
||||
@@ -95,6 +95,7 @@ bool Config::Reload(std::filesystem::path iniPath)
|
||||
|
||||
FGHudfixHalfSync.set_from_config(readBool("OptiFG", "HudfixHalfSync"));
|
||||
FGHudfixFullSync.set_from_config(readBool("OptiFG", "HudfixFullSync"));
|
||||
FGHudfixTrackRelease.set_from_config(readBool("OptiFG", "HudfixTrackRelease"));
|
||||
}
|
||||
|
||||
// Framerate
|
||||
@@ -607,6 +608,7 @@ bool Config::SaveIni()
|
||||
|
||||
ini.SetValue("OptiFG", "HudfixHalfSync", GetBoolValue(Instance()->FGHudfixHalfSync.value_for_config()).c_str());
|
||||
ini.SetValue("OptiFG", "HudfixFullSync", GetBoolValue(Instance()->FGHudfixFullSync.value_for_config()).c_str());
|
||||
ini.SetValue("OptiFG", "HudfixTrackRelease", GetBoolValue(Instance()->FGHudfixTrackRelease.value_for_config()).c_str());
|
||||
}
|
||||
|
||||
// Framerate
|
||||
|
||||
@@ -226,9 +226,7 @@
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<LanguageStandard>stdcpplatest</LanguageStandard>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
@@ -275,9 +273,7 @@ copy NUL "$(SolutionDir)x64\Release\a\!! EXTRACT ALL FILES TO GAME FOLDER !!" /Y
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<LanguageStandard>stdcpplatest</LanguageStandard>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
|
||||
@@ -467,6 +467,21 @@
|
||||
<ClInclude Include="spoofing\Vulkan_Spoofing.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="framegen\ffx\FSRFG_Dx12.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="framegen\IFGFeature.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="framegen\IFGFeature_Dx12.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="hudfix\Hudfix_Dx12.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="resource_tracking\ResTrack_dx12.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Config.cpp">
|
||||
@@ -734,6 +749,21 @@
|
||||
<ClCompile Include="include\imgui\imgui_impl_uwp.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="framegen\ffx\FSRFG_Dx12.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="framegen\IFGFeature.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="framegen\IFGFeature_Dx12.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="hudfix\Hudfix_Dx12.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="resource_tracking\ResTrack_dx12.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="OptiScaler.rc" />
|
||||
|
||||
@@ -1044,7 +1044,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
|
||||
break;
|
||||
|
||||
case DLL_THREAD_DETACH:
|
||||
//LOG_DEBUG_ONLY("DLL_THREAD_DETACH from module: {0:X}, count: {1}", (UINT64)hModule, loadCount);
|
||||
//LOG_DEBUG_ONLY("DLL_THREAD_DETACH from module: {0:X}, count: {1}", (UINT64)hModule, loadCount);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -158,7 +158,7 @@ static HRESULT hkFGPresent(void* This, UINT SyncInterval, UINT Flags)
|
||||
|
||||
auto lockAccuired = false;
|
||||
if (!(Flags & DXGI_PRESENT_TEST || Flags & DXGI_PRESENT_RESTART) && fg != nullptr && fg->IsActive() &&
|
||||
fg->TargetFrame() < fg->FrameCount() && Config::Instance()->FGUseMutexForSwaphain.value_or_default()) // && fg->Mutex.getOwner() != 2)
|
||||
fg->TargetFrame() < fg->FrameCount() && Config::Instance()->FGUseMutexForSwaphain.value_or_default() && fg->Mutex.getOwner() != 2)
|
||||
{
|
||||
LOG_TRACE("Waiting FG->Mutex 2, current: {}", fg->Mutex.getOwner());
|
||||
fg->Mutex.lock(2);
|
||||
|
||||
@@ -1690,6 +1690,14 @@ bool MenuCommon::RenderMenu()
|
||||
}
|
||||
ShowHelpMarker("Always track resources, might cause performace issues\nbut also might fix HudFix related crashes!");
|
||||
|
||||
auto tr = Config::Instance()->FGHudfixTrackRelease.value_or_default();
|
||||
if (ImGui::Checkbox("Track Resource Release", &tr))
|
||||
{
|
||||
Config::Instance()->FGHudfixTrackRelease = tr;
|
||||
LOG_DEBUG("Enabled set FGHudfixTrackRelease: {}", tr);
|
||||
}
|
||||
ShowHelpMarker("Track resource releases\nMost probably WILL TANK PERFORMANCE");
|
||||
|
||||
ImGui::TreePop();
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
#define VER_MAJOR_VERSION 0
|
||||
#define VER_MINOR_VERSION 7
|
||||
#define VER_HOTFIX_VERSION 7
|
||||
#define VER_BUILD_NUMBER 10
|
||||
#define VER_BUILD_NUMBER 11
|
||||
|
||||
#define VER_PRE_RELEASE
|
||||
|
||||
|
||||
@@ -28,6 +28,10 @@ static UINT _trackMark = 1;
|
||||
typedef void(*PFN_CreateRenderTargetView)(ID3D12Device* This, ID3D12Resource* pResource, D3D12_RENDER_TARGET_VIEW_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor);
|
||||
typedef void(*PFN_CreateShaderResourceView)(ID3D12Device* This, ID3D12Resource* pResource, D3D12_SHADER_RESOURCE_VIEW_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor);
|
||||
typedef void(*PFN_CreateUnorderedAccessView)(ID3D12Device* This, ID3D12Resource* pResource, ID3D12Resource* pCounterResource, D3D12_UNORDERED_ACCESS_VIEW_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor);
|
||||
typedef void(*PFN_CreateDepthStencilView)(ID3D12Device* This, ID3D12Resource* pResource, const D3D12_DEPTH_STENCIL_VIEW_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor);
|
||||
typedef void(*PFN_CreateConstantBufferView)(ID3D12Device* This, const D3D12_CONSTANT_BUFFER_VIEW_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor);
|
||||
|
||||
typedef void(*PFN_CreateSampler)(ID3D12Device* This, const D3D12_SAMPLER_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor);
|
||||
|
||||
typedef HRESULT(*PFN_CreateDescriptorHeap)(ID3D12Device* This, D3D12_DESCRIPTOR_HEAP_DESC* pDescriptorHeapDesc, REFIID riid, void** ppvHeap);
|
||||
typedef void(*PFN_CopyDescriptors)(ID3D12Device* This, UINT NumDestDescriptorRanges, D3D12_CPU_DESCRIPTOR_HANDLE* pDestDescriptorRangeStarts, UINT* pDestDescriptorRangeSizes, UINT NumSrcDescriptorRanges, D3D12_CPU_DESCRIPTOR_HANDLE* pSrcDescriptorRangeStarts, UINT* pSrcDescriptorRangeSizes, D3D12_DESCRIPTOR_HEAP_TYPE DescriptorHeapsType);
|
||||
@@ -59,6 +63,10 @@ typedef void(*PFN_DiscardResource)(ID3D12GraphicsCommandList* This, ID3D12Resour
|
||||
static PFN_CreateRenderTargetView o_CreateRenderTargetView = nullptr;
|
||||
static PFN_CreateShaderResourceView o_CreateShaderResourceView = nullptr;
|
||||
static PFN_CreateUnorderedAccessView o_CreateUnorderedAccessView = nullptr;
|
||||
static PFN_CreateDepthStencilView o_CreateDepthStencilView = nullptr;
|
||||
static PFN_CreateConstantBufferView o_CreateConstantBufferView = nullptr;
|
||||
static PFN_CreateSampler o_CreateSampler = nullptr;
|
||||
|
||||
static PFN_CreateDescriptorHeap o_CreateDescriptorHeap = nullptr;
|
||||
static PFN_CopyDescriptors o_CopyDescriptors = nullptr;
|
||||
static PFN_CopyDescriptorsSimple o_CopyDescriptorsSimple = nullptr;
|
||||
@@ -89,6 +97,19 @@ static std::mutex _resourceMutex;
|
||||
// heaps
|
||||
static std::vector<HeapInfo> fgHeaps;
|
||||
|
||||
struct HeapCacheTLS
|
||||
{
|
||||
HeapInfo* ptr = nullptr;
|
||||
unsigned genSeen = 0;
|
||||
};
|
||||
|
||||
static thread_local HeapCacheTLS cache;
|
||||
static thread_local HeapCacheTLS cacheRTV;
|
||||
static thread_local HeapCacheTLS cacheCBV;
|
||||
static thread_local HeapCacheTLS cacheSRV;
|
||||
static thread_local HeapCacheTLS cacheUAV;
|
||||
static std::atomic<unsigned> gHeapGeneration{ 1 };
|
||||
|
||||
#ifdef USE_RESOURCE_DISCARD
|
||||
// created resources
|
||||
static ankerl::unordered_dense::map <ID3D12Resource*, std::vector<size_t>> fgHandlesByResources;
|
||||
@@ -253,13 +274,101 @@ static SIZE_T GetCPUHandle(ID3D12Device* This, SIZE_T gpuHandle, D3D12_DESCRIPTO
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static HeapInfo* GetHeapByCpuHandle(SIZE_T cpuHandle)
|
||||
static HeapInfo* GetHeapByCpuHandleCBV(SIZE_T cpuHandle)
|
||||
{
|
||||
std::shared_lock<std::shared_mutex> lock(heapMutex);
|
||||
unsigned currentGen = gHeapGeneration.load(std::memory_order_relaxed);
|
||||
|
||||
if (cacheCBV.genSeen == currentGen && cacheCBV.ptr && cacheCBV.ptr->cpuStart <= cpuHandle && cpuHandle < cacheCBV.ptr->cpuEnd)
|
||||
return cacheCBV.ptr;
|
||||
|
||||
for (size_t i = 0; i < fgHeaps.size(); i++)
|
||||
{
|
||||
if (fgHeaps[i].cpuStart <= cpuHandle && fgHeaps[i].cpuEnd > cpuHandle)
|
||||
return &fgHeaps[i];
|
||||
{
|
||||
cacheCBV.ptr = &fgHeaps[i];
|
||||
cacheCBV.genSeen = currentGen;
|
||||
return cacheCBV.ptr;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static HeapInfo* GetHeapByCpuHandleRTV(SIZE_T cpuHandle)
|
||||
{
|
||||
unsigned currentGen = gHeapGeneration.load(std::memory_order_relaxed);
|
||||
|
||||
if (cacheRTV.genSeen == currentGen && cacheRTV.ptr && cacheRTV.ptr->cpuStart <= cpuHandle && cpuHandle < cacheRTV.ptr->cpuEnd)
|
||||
return cacheRTV.ptr;
|
||||
|
||||
for (size_t i = 0; i < fgHeaps.size(); i++)
|
||||
{
|
||||
if (fgHeaps[i].cpuStart <= cpuHandle && fgHeaps[i].cpuEnd > cpuHandle)
|
||||
{
|
||||
cacheRTV.ptr = &fgHeaps[i];
|
||||
cacheRTV.genSeen = currentGen;
|
||||
return cacheRTV.ptr;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static HeapInfo* GetHeapByCpuHandleSRV(SIZE_T cpuHandle)
|
||||
{
|
||||
unsigned currentGen = gHeapGeneration.load(std::memory_order_relaxed);
|
||||
|
||||
if (cacheSRV.genSeen == currentGen && cacheSRV.ptr && cacheSRV.ptr->cpuStart <= cpuHandle && cpuHandle < cacheSRV.ptr->cpuEnd)
|
||||
return cacheSRV.ptr;
|
||||
|
||||
for (size_t i = 0; i < fgHeaps.size(); i++)
|
||||
{
|
||||
if (fgHeaps[i].cpuStart <= cpuHandle && fgHeaps[i].cpuEnd > cpuHandle)
|
||||
{
|
||||
cacheSRV.ptr = &fgHeaps[i];
|
||||
cacheSRV.genSeen = currentGen;
|
||||
return cacheSRV.ptr;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static HeapInfo* GetHeapByCpuHandleUAV(SIZE_T cpuHandle)
|
||||
{
|
||||
unsigned currentGen = gHeapGeneration.load(std::memory_order_relaxed);
|
||||
|
||||
if (cacheUAV.genSeen == currentGen && cacheUAV.ptr && cacheUAV.ptr->cpuStart <= cpuHandle && cpuHandle < cacheUAV.ptr->cpuEnd)
|
||||
return cacheUAV.ptr;
|
||||
|
||||
for (size_t i = 0; i < fgHeaps.size(); i++)
|
||||
{
|
||||
if (fgHeaps[i].cpuStart <= cpuHandle && fgHeaps[i].cpuEnd > cpuHandle)
|
||||
{
|
||||
cacheUAV.ptr = &fgHeaps[i];
|
||||
cacheUAV.genSeen = currentGen;
|
||||
return cacheUAV.ptr;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static HeapInfo* GetHeapByCpuHandle(SIZE_T cpuHandle)
|
||||
{
|
||||
unsigned currentGen = gHeapGeneration.load(std::memory_order_relaxed);
|
||||
|
||||
if (cache.genSeen == currentGen && cache.ptr && cache.ptr->cpuStart <= cpuHandle && cpuHandle < cache.ptr->cpuEnd)
|
||||
return cache.ptr;
|
||||
|
||||
for (size_t i = 0; i < fgHeaps.size(); i++)
|
||||
{
|
||||
if (fgHeaps[i].cpuStart <= cpuHandle && fgHeaps[i].cpuEnd > cpuHandle)
|
||||
{
|
||||
cache.ptr = &fgHeaps[i];
|
||||
cache.genSeen = currentGen;
|
||||
return cache.ptr;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
@@ -267,7 +376,6 @@ static HeapInfo* GetHeapByCpuHandle(SIZE_T cpuHandle)
|
||||
|
||||
static HeapInfo* GetHeapByGpuHandle(SIZE_T gpuHandle)
|
||||
{
|
||||
std::shared_lock<std::shared_mutex> lock(heapMutex);
|
||||
for (size_t i = 0; i < fgHeaps.size(); i++)
|
||||
{
|
||||
if (fgHeaps[i].gpuStart <= gpuHandle && fgHeaps[i].gpuEnd >= gpuHandle)
|
||||
@@ -433,6 +541,45 @@ static void hkDiscardResource(ID3D12GraphicsCommandList* This, ID3D12Resource* p
|
||||
|
||||
#pragma region Resource input hooks
|
||||
|
||||
static void hkCreateSampler(ID3D12Device* This, const D3D12_SAMPLER_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor)
|
||||
{
|
||||
o_CreateSampler(This, pDesc, DestDescriptor);
|
||||
|
||||
//if (DestDescriptor.ptr != 0)
|
||||
//{
|
||||
// auto heap = GetHeapByCpuHandle(DestDescriptor.ptr);
|
||||
|
||||
// if (heap != nullptr)
|
||||
// heap->SetByCpuHandle(DestDescriptor.ptr, {});
|
||||
//}
|
||||
}
|
||||
|
||||
static void hkCreateDepthStencilView(ID3D12Device* This, ID3D12Resource* pResource, const D3D12_DEPTH_STENCIL_VIEW_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor)
|
||||
{
|
||||
o_CreateDepthStencilView(This, pResource, pDesc, DestDescriptor);
|
||||
|
||||
//if (DestDescriptor.ptr != 0)
|
||||
//{
|
||||
// auto heap = GetHeapByCpuHandle(DestDescriptor.ptr);
|
||||
|
||||
// if (heap != nullptr)
|
||||
// heap->SetByCpuHandle(DestDescriptor.ptr, {});
|
||||
//}
|
||||
}
|
||||
|
||||
static void hkCreateConstantBufferView(ID3D12Device* This, const D3D12_CONSTANT_BUFFER_VIEW_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor)
|
||||
{
|
||||
o_CreateConstantBufferView(This, pDesc, DestDescriptor);
|
||||
|
||||
if (DestDescriptor.ptr != 0)
|
||||
{
|
||||
auto heap = GetHeapByCpuHandleCBV(DestDescriptor.ptr);
|
||||
|
||||
if (heap != nullptr)
|
||||
heap->ClearByCpuHandle(DestDescriptor.ptr);
|
||||
}
|
||||
}
|
||||
|
||||
static void hkCreateRenderTargetView(ID3D12Device* This, ID3D12Resource* pResource, D3D12_RENDER_TARGET_VIEW_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor)
|
||||
{
|
||||
// force hdr for swapchain buffer
|
||||
@@ -454,26 +601,24 @@ static void hkCreateRenderTargetView(ID3D12Device* This, ID3D12Resource* pResour
|
||||
|
||||
o_CreateRenderTargetView(This, pResource, pDesc, DestDescriptor);
|
||||
|
||||
if (pResource == nullptr)
|
||||
if (pResource == nullptr || (pDesc != nullptr && pDesc->ViewDimension != D3D12_RTV_DIMENSION_TEXTURE2D))
|
||||
{
|
||||
LOG_TRACE("Unbind: {:X}", DestDescriptor.ptr);
|
||||
LOG_DEBUG_ONLY("Unbind: {:X}", DestDescriptor.ptr);
|
||||
|
||||
auto heap = GetHeapByCpuHandle(DestDescriptor.ptr);
|
||||
|
||||
#ifdef USE_RESOURCE_DISCARD
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(_resourceMutex);
|
||||
auto temp = heap->GetByCpuHandle(DestDescriptor.ptr);
|
||||
|
||||
if (temp != nullptr && temp->buffer != nullptr)
|
||||
RemoveResourceHeap(temp->buffer, DestDescriptor.ptr);
|
||||
}
|
||||
#endif
|
||||
auto heap = GetHeapByCpuHandleRTV(DestDescriptor.ptr);
|
||||
|
||||
if (heap != nullptr)
|
||||
heap->SetByCpuHandle(DestDescriptor.ptr, {});
|
||||
{
|
||||
#ifdef USE_RESOURCE_DISCARD
|
||||
if (heap->buffer != nullptr)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(_resourceMutex);
|
||||
RemoveResourceHeap(heap->buffer, DestDescriptor.ptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
return;
|
||||
heap->ClearByCpuHandle(DestDescriptor.ptr);
|
||||
}
|
||||
}
|
||||
|
||||
if (pResource == nullptr || pDesc == nullptr || pDesc->ViewDimension != D3D12_RTV_DIMENSION_TEXTURE2D)
|
||||
@@ -503,7 +648,7 @@ static void hkCreateRenderTargetView(ID3D12Device* This, ID3D12Resource* pResour
|
||||
|
||||
#endif // _DEBUG
|
||||
|
||||
auto heap = GetHeapByCpuHandle(DestDescriptor.ptr);
|
||||
auto heap = GetHeapByCpuHandleRTV(DestDescriptor.ptr);
|
||||
if (heap != nullptr)
|
||||
{
|
||||
#ifdef USE_RESOURCE_DISCARD
|
||||
@@ -543,11 +688,11 @@ static void hkCreateShaderResourceView(ID3D12Device* This, ID3D12Resource* pReso
|
||||
|
||||
o_CreateShaderResourceView(This, pResource, pDesc, DestDescriptor);
|
||||
|
||||
if (pResource == nullptr)
|
||||
if (pResource == nullptr || (pDesc != nullptr && pDesc->ViewDimension != D3D12_SRV_DIMENSION_TEXTURE2D))
|
||||
{
|
||||
LOG_TRACE("Unbind: {:X}", DestDescriptor.ptr);
|
||||
LOG_DEBUG_ONLY("Unbind: {:X}", DestDescriptor.ptr);
|
||||
|
||||
auto heap = GetHeapByCpuHandle(DestDescriptor.ptr);
|
||||
auto heap = GetHeapByCpuHandleSRV(DestDescriptor.ptr);
|
||||
|
||||
#ifdef USE_RESOURCE_DISCARD
|
||||
{
|
||||
@@ -560,9 +705,7 @@ static void hkCreateShaderResourceView(ID3D12Device* This, ID3D12Resource* pReso
|
||||
#endif
|
||||
|
||||
if (heap != nullptr)
|
||||
heap->SetByCpuHandle(DestDescriptor.ptr, {});
|
||||
|
||||
return;
|
||||
heap->ClearByCpuHandle(DestDescriptor.ptr);
|
||||
}
|
||||
|
||||
if (pResource == nullptr || pDesc == nullptr || pDesc->ViewDimension != D3D12_SRV_DIMENSION_TEXTURE2D)
|
||||
@@ -592,7 +735,7 @@ static void hkCreateShaderResourceView(ID3D12Device* This, ID3D12Resource* pReso
|
||||
|
||||
#endif // _DEBUG
|
||||
|
||||
auto heap = GetHeapByCpuHandle(DestDescriptor.ptr);
|
||||
auto heap = GetHeapByCpuHandleSRV(DestDescriptor.ptr);
|
||||
if (heap != nullptr)
|
||||
{
|
||||
#ifdef USE_RESOURCE_DISCARD
|
||||
@@ -631,11 +774,11 @@ static void hkCreateUnorderedAccessView(ID3D12Device* This, ID3D12Resource* pRes
|
||||
|
||||
o_CreateUnorderedAccessView(This, pResource, pCounterResource, pDesc, DestDescriptor);
|
||||
|
||||
if (pResource == nullptr)
|
||||
if (pResource == nullptr || (pDesc != nullptr && pDesc->ViewDimension != D3D12_UAV_DIMENSION_TEXTURE2D))
|
||||
{
|
||||
LOG_TRACE("Unbind: {:X}", DestDescriptor.ptr);
|
||||
LOG_DEBUG_ONLY("Unbind: {:X}", DestDescriptor.ptr);
|
||||
|
||||
auto heap = GetHeapByCpuHandle(DestDescriptor.ptr);
|
||||
auto heap = GetHeapByCpuHandleUAV(DestDescriptor.ptr);
|
||||
|
||||
#ifdef USE_RESOURCE_DISCARD
|
||||
{
|
||||
@@ -648,9 +791,7 @@ static void hkCreateUnorderedAccessView(ID3D12Device* This, ID3D12Resource* pRes
|
||||
#endif
|
||||
|
||||
if (heap != nullptr)
|
||||
heap->SetByCpuHandle(DestDescriptor.ptr, {});
|
||||
|
||||
return;
|
||||
heap->ClearByCpuHandle(DestDescriptor.ptr);
|
||||
}
|
||||
|
||||
if (pResource == nullptr || pDesc == nullptr || pDesc->ViewDimension != D3D12_UAV_DIMENSION_TEXTURE2D)
|
||||
@@ -680,8 +821,7 @@ static void hkCreateUnorderedAccessView(ID3D12Device* This, ID3D12Resource* pRes
|
||||
|
||||
#endif // _DEBUG
|
||||
|
||||
|
||||
auto heap = GetHeapByCpuHandle(DestDescriptor.ptr);
|
||||
auto heap = GetHeapByCpuHandleUAV(DestDescriptor.ptr);
|
||||
if (heap != nullptr)
|
||||
{
|
||||
#ifdef USE_RESOURCE_DISCARD
|
||||
@@ -803,6 +943,7 @@ static HRESULT hkCreateDescriptorHeap(ID3D12Device* This, D3D12_DESCRIPTOR_HEAP_
|
||||
{
|
||||
std::unique_lock<std::shared_mutex> lock(heapMutex);
|
||||
fgHeaps.push_back(info);
|
||||
gHeapGeneration.fetch_add(1, std::memory_order_relaxed);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -821,7 +962,7 @@ static HRESULT hkCreateDescriptorHeap(ID3D12Device* This, D3D12_DESCRIPTOR_HEAP_
|
||||
ULONG ResTrack_Dx12::hkRelease(ID3D12Resource* This)
|
||||
{
|
||||
#ifndef USE_RESOURCE_DISCARD
|
||||
if(!Config::Instance()->FGHudfixTrackRelease.value_or_default())
|
||||
if (!Config::Instance()->FGHudfixTrackRelease.value_or_default())
|
||||
return o_Release(This);
|
||||
#endif
|
||||
|
||||
@@ -905,10 +1046,7 @@ void ResTrack_Dx12::hkCopyDescriptors(ID3D12Device* This,
|
||||
if (DescriptorHeapsType != D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV && DescriptorHeapsType != D3D12_DESCRIPTOR_HEAP_TYPE_RTV)
|
||||
return;
|
||||
|
||||
if (pDestDescriptorRangeStarts == nullptr || pSrcDescriptorRangeStarts == nullptr)
|
||||
return;
|
||||
|
||||
if (pDestDescriptorRangeSizes == nullptr && pSrcDescriptorRangeSizes == nullptr)
|
||||
if (pDestDescriptorRangeStarts == nullptr || (*pDestDescriptorRangeStarts).ptr == 0 || pDestDescriptorRangeSizes == nullptr)
|
||||
return;
|
||||
|
||||
if (!Config::Instance()->FGAlwaysTrackHeaps.value_or_default() && !IsHudFixActive())
|
||||
@@ -930,7 +1068,7 @@ void ResTrack_Dx12::hkCopyDescriptors(ID3D12Device* This,
|
||||
|
||||
auto size = This->GetDescriptorHandleIncrementSize(DescriptorHeapsType);
|
||||
|
||||
if (srcRangeSizes != nullptr)
|
||||
if (srcRangeStarts != nullptr && (*srcRangeStarts).ptr != 0 && srcRangeSizes != nullptr)
|
||||
{
|
||||
LOG_DEBUG_ONLY("Src based loop");
|
||||
|
||||
@@ -972,7 +1110,7 @@ void ResTrack_Dx12::hkCopyDescriptors(ID3D12Device* This,
|
||||
}
|
||||
#endif
|
||||
|
||||
dstHeap->SetByCpuHandle(destHandle, {});
|
||||
dstHeap->ClearByCpuHandle(destHandle);
|
||||
}
|
||||
|
||||
if (destRangeSizes == nullptr || destRangeSizes[destRangeIndex] == destIndex)
|
||||
@@ -1017,7 +1155,7 @@ void ResTrack_Dx12::hkCopyDescriptors(ID3D12Device* This,
|
||||
RemoveResourceHeap(temp->buffer, destHandle);
|
||||
}
|
||||
#endif
|
||||
dstHeap->SetByCpuHandle(destHandle, {});
|
||||
dstHeap->ClearByCpuHandle(destHandle);
|
||||
|
||||
if (destRangeSizes == nullptr || destRangeSizes[destRangeIndex] == destIndex)
|
||||
{
|
||||
@@ -1079,9 +1217,16 @@ void ResTrack_Dx12::hkCopyDescriptors(ID3D12Device* This,
|
||||
{
|
||||
LOG_DEBUG_ONLY("dstRangeIndex: {}, dstIndex: {}, srcRangeIndex: {}, srcIndex: {}", i, j, srcRangeIndex, srcIndex);
|
||||
|
||||
HeapInfo* srcHeap = nullptr;
|
||||
unsigned long long srcHandle = 0;
|
||||
|
||||
// source
|
||||
auto srcHandle = srcRangeStarts[srcRangeIndex].ptr + srcIndex * size;
|
||||
auto srcHeap = GetHeapByCpuHandle(srcHandle);
|
||||
if (srcRangeStarts != nullptr && (*srcRangeStarts).ptr != 0)
|
||||
{
|
||||
srcHandle = srcRangeStarts[srcRangeIndex].ptr + srcIndex * size;
|
||||
srcHeap = GetHeapByCpuHandle(srcHandle);
|
||||
}
|
||||
|
||||
auto destHandle = destRangeStarts[i].ptr + j * size;
|
||||
auto dstHeap = GetHeapByCpuHandle(destHandle);
|
||||
|
||||
@@ -1102,7 +1247,7 @@ void ResTrack_Dx12::hkCopyDescriptors(ID3D12Device* This,
|
||||
}
|
||||
#endif
|
||||
|
||||
dstHeap->SetByCpuHandle(destHandle, {});
|
||||
dstHeap->ClearByCpuHandle(destHandle);
|
||||
}
|
||||
|
||||
if (srcRangeSizes == nullptr || srcRangeSizes[srcRangeIndex] == srcIndex)
|
||||
@@ -1148,7 +1293,7 @@ void ResTrack_Dx12::hkCopyDescriptors(ID3D12Device* This,
|
||||
}
|
||||
#endif
|
||||
|
||||
dstHeap->SetByCpuHandle(destHandle, {});
|
||||
dstHeap->ClearByCpuHandle(destHandle);
|
||||
|
||||
if (srcRangeSizes == nullptr || srcRangeSizes[srcRangeIndex] == srcIndex)
|
||||
{
|
||||
@@ -1208,38 +1353,41 @@ void ResTrack_Dx12::hkCopyDescriptorsSimple(ID3D12Device* This, UINT NumDescript
|
||||
|
||||
for (size_t i = 0; i < NumDescriptors; i++)
|
||||
{
|
||||
HeapInfo* srcHeap = nullptr;
|
||||
unsigned long long srcHandle = 0;
|
||||
|
||||
// source
|
||||
auto srcHandle = SrcDescriptorRangeStart.ptr + i * size;
|
||||
auto srcHeap = GetHeapByCpuHandle(srcHandle);
|
||||
auto destHandle = DestDescriptorRangeStart.ptr + i * size;
|
||||
auto dstHeap = GetHeapByCpuHandle(destHandle);
|
||||
|
||||
if (srcHeap == nullptr)
|
||||
if (SrcDescriptorRangeStart.ptr != 0)
|
||||
{
|
||||
if (dstHeap != nullptr)
|
||||
{
|
||||
#ifdef USE_RESOURCE_DISCARD
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(_resourceMutex);
|
||||
auto temp = dstHeap->GetByCpuHandle(destHandle);
|
||||
|
||||
if (temp != nullptr && temp->buffer != nullptr)
|
||||
RemoveResourceHeap(temp->buffer, destHandle);
|
||||
}
|
||||
#endif
|
||||
|
||||
dstHeap->SetByCpuHandle(destHandle, {});
|
||||
}
|
||||
|
||||
continue;
|
||||
srcHandle = SrcDescriptorRangeStart.ptr + i * size;
|
||||
srcHeap = GetHeapByCpuHandle(srcHandle);
|
||||
}
|
||||
|
||||
auto buffer = srcHeap->GetByCpuHandle(srcHandle);
|
||||
auto destHandle = DestDescriptorRangeStart.ptr + i * size;
|
||||
auto dstHeap = GetHeapByCpuHandle(destHandle);
|
||||
|
||||
// destination
|
||||
if (dstHeap == nullptr)
|
||||
continue;
|
||||
|
||||
if (srcHeap == nullptr)
|
||||
{
|
||||
#ifdef USE_RESOURCE_DISCARD
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(_resourceMutex);
|
||||
auto temp = dstHeap->GetByCpuHandle(destHandle);
|
||||
|
||||
if (temp != nullptr && temp->buffer != nullptr)
|
||||
RemoveResourceHeap(temp->buffer, destHandle);
|
||||
}
|
||||
#endif
|
||||
|
||||
dstHeap->ClearByCpuHandle(destHandle);
|
||||
continue;
|
||||
}
|
||||
|
||||
auto buffer = srcHeap->GetByCpuHandle(srcHandle);
|
||||
|
||||
if (buffer == nullptr)
|
||||
{
|
||||
#ifdef USE_RESOURCE_DISCARD
|
||||
@@ -1252,7 +1400,7 @@ void ResTrack_Dx12::hkCopyDescriptorsSimple(ID3D12Device* This, UINT NumDescript
|
||||
}
|
||||
#endif
|
||||
|
||||
dstHeap->SetByCpuHandle(destHandle, {});
|
||||
dstHeap->ClearByCpuHandle(destHandle);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1367,7 +1515,7 @@ void ResTrack_Dx12::hkOMSetRenderTargets(ID3D12GraphicsCommandList* This, UINT N
|
||||
|
||||
if (RTsSingleHandleToDescriptorRange)
|
||||
{
|
||||
heap = GetHeapByCpuHandle(pRenderTargetDescriptors[0].ptr);
|
||||
heap = GetHeapByCpuHandleRTV(pRenderTargetDescriptors[0].ptr);
|
||||
if (heap == nullptr)
|
||||
{
|
||||
LOG_DEBUG_ONLY("No heap!");
|
||||
@@ -1380,7 +1528,7 @@ void ResTrack_Dx12::hkOMSetRenderTargets(ID3D12GraphicsCommandList* This, UINT N
|
||||
{
|
||||
handle = pRenderTargetDescriptors[i];
|
||||
|
||||
heap = GetHeapByCpuHandle(handle.ptr);
|
||||
heap = GetHeapByCpuHandleRTV(handle.ptr);
|
||||
if (heap == nullptr)
|
||||
{
|
||||
LOG_DEBUG_ONLY("No heap!");
|
||||
@@ -1873,12 +2021,15 @@ void ResTrack_Dx12::HookDevice(ID3D12Device* device)
|
||||
PVOID* pVTable = *(PVOID**)realDevice;
|
||||
|
||||
// hudless
|
||||
o_CreateRenderTargetView = (PFN_CreateRenderTargetView)pVTable[20];
|
||||
o_CreateDescriptorHeap = (PFN_CreateDescriptorHeap)pVTable[14];
|
||||
o_CopyDescriptors = (PFN_CopyDescriptors)pVTable[23];
|
||||
o_CopyDescriptorsSimple = (PFN_CopyDescriptorsSimple)pVTable[24];
|
||||
o_CreateConstantBufferView = (PFN_CreateConstantBufferView)pVTable[17];
|
||||
o_CreateShaderResourceView = (PFN_CreateShaderResourceView)pVTable[18];
|
||||
o_CreateUnorderedAccessView = (PFN_CreateUnorderedAccessView)pVTable[19];
|
||||
o_CreateRenderTargetView = (PFN_CreateRenderTargetView)pVTable[20];
|
||||
o_CreateDepthStencilView = (PFN_CreateDepthStencilView)pVTable[21];
|
||||
o_CreateSampler = (PFN_CreateSampler)pVTable[22];
|
||||
o_CopyDescriptors = (PFN_CopyDescriptors)pVTable[23];
|
||||
o_CopyDescriptorsSimple = (PFN_CopyDescriptorsSimple)pVTable[24];
|
||||
|
||||
// Apply the detour
|
||||
if (o_CreateDescriptorHeap != nullptr || o_CreateRenderTargetView != nullptr)
|
||||
@@ -1891,9 +2042,18 @@ void ResTrack_Dx12::HookDevice(ID3D12Device* device)
|
||||
|
||||
if (Config::Instance()->FGType.value_or_default() == OptiFG && Config::Instance()->OverlayMenu.value_or_default())
|
||||
{
|
||||
if (o_CreateConstantBufferView != nullptr)
|
||||
DetourAttach(&(PVOID&)o_CreateConstantBufferView, hkCreateConstantBufferView);
|
||||
|
||||
if (o_CreateRenderTargetView != nullptr)
|
||||
DetourAttach(&(PVOID&)o_CreateRenderTargetView, hkCreateRenderTargetView);
|
||||
|
||||
//if (o_CreateDepthStencilView != nullptr)
|
||||
// DetourAttach(&(PVOID&)o_CreateDepthStencilView, hkCreateDepthStencilView);
|
||||
|
||||
//if (o_CreateSampler != nullptr)
|
||||
// DetourAttach(&(PVOID&)o_CreateSampler, hkCreateSampler);
|
||||
|
||||
if (o_CreateShaderResourceView != nullptr)
|
||||
DetourAttach(&(PVOID&)o_CreateShaderResourceView, hkCreateShaderResourceView);
|
||||
|
||||
@@ -1905,6 +2065,7 @@ void ResTrack_Dx12::HookDevice(ID3D12Device* device)
|
||||
|
||||
if (o_CopyDescriptorsSimple != nullptr)
|
||||
DetourAttach(&(PVOID&)o_CopyDescriptorsSimple, hkCopyDescriptorsSimple);
|
||||
|
||||
}
|
||||
|
||||
DetourTransactionCommit();
|
||||
|
||||
@@ -35,16 +35,14 @@ typedef struct HeapInfo
|
||||
|
||||
HeapInfo(SIZE_T cpuStart, SIZE_T cpuEnd, SIZE_T gpuStart, SIZE_T gpuEnd, UINT numResources, UINT increment, UINT type)
|
||||
: cpuStart(cpuStart), cpuEnd(cpuEnd), gpuStart(gpuStart), gpuEnd(gpuEnd), numDescriptors(numResources), increment(increment), info(new ResourceInfo[numResources]), type(type)
|
||||
{}
|
||||
{
|
||||
}
|
||||
|
||||
ResourceInfo* GetByCpuHandle(SIZE_T cpuHandle) const
|
||||
{
|
||||
if (cpuStart > cpuHandle || cpuEnd < cpuHandle)
|
||||
return nullptr;
|
||||
|
||||
auto index = (cpuHandle - cpuStart) / increment;
|
||||
|
||||
if (index >= numDescriptors || info[index].buffer == nullptr)
|
||||
if (info[index].buffer == nullptr)
|
||||
return nullptr;
|
||||
|
||||
return &info[index];
|
||||
@@ -52,12 +50,9 @@ typedef struct HeapInfo
|
||||
|
||||
ResourceInfo* GetByGpuHandle(SIZE_T gpuHandle) const
|
||||
{
|
||||
if (gpuStart > gpuHandle || gpuEnd < gpuHandle)
|
||||
return nullptr;
|
||||
|
||||
auto index = (gpuHandle - gpuStart) / increment;
|
||||
|
||||
if (index >= numDescriptors || info[index].buffer == nullptr)
|
||||
if (info[index].buffer == nullptr)
|
||||
return nullptr;
|
||||
|
||||
return &info[index];
|
||||
@@ -65,30 +60,33 @@ typedef struct HeapInfo
|
||||
|
||||
void SetByCpuHandle(SIZE_T cpuHandle, ResourceInfo setInfo) const
|
||||
{
|
||||
if (cpuStart > cpuHandle || cpuEnd < cpuHandle)
|
||||
return;
|
||||
|
||||
auto index = (cpuHandle - cpuStart) / increment;
|
||||
|
||||
if (index >= numDescriptors)
|
||||
return;
|
||||
|
||||
info[index] = setInfo;
|
||||
}
|
||||
|
||||
void SetByGpuHandle(SIZE_T gpuHandle, ResourceInfo setInfo) const
|
||||
{
|
||||
if (gpuStart > gpuHandle || gpuEnd < gpuHandle)
|
||||
return;
|
||||
|
||||
auto index = (gpuHandle - gpuStart) / increment;
|
||||
|
||||
if (index >= numDescriptors)
|
||||
return;
|
||||
|
||||
info[index] = setInfo;
|
||||
}
|
||||
} heap_info;
|
||||
|
||||
void ClearByCpuHandle(SIZE_T cpuHandle) const
|
||||
{
|
||||
auto index = (cpuHandle - cpuStart) / increment;
|
||||
|
||||
if (info[index].buffer != nullptr)
|
||||
info[index].buffer = nullptr;
|
||||
}
|
||||
|
||||
void ClearByGpuHandle(SIZE_T gpuHandle) const
|
||||
{
|
||||
auto index = (gpuHandle - gpuStart) / increment;
|
||||
|
||||
if (info[index].buffer != nullptr)
|
||||
info[index].buffer = nullptr;
|
||||
}
|
||||
|
||||
} heap_info;
|
||||
#else
|
||||
// Vector version for lower heap usage
|
||||
typedef struct HeapInfo
|
||||
@@ -103,7 +101,8 @@ typedef struct HeapInfo
|
||||
std::vector<ResourceInfo> info;
|
||||
|
||||
HeapInfo(SIZE_T cpuStart, SIZE_T cpuEnd, SIZE_T gpuStart, SIZE_T gpuEnd, UINT numResources, UINT increment, UINT type)
|
||||
: cpuStart(cpuStart), cpuEnd(cpuEnd), gpuStart(gpuStart), gpuEnd(gpuEnd), numDescriptors(numResources), increment(increment), info(numResources), type(type) {}
|
||||
: cpuStart(cpuStart), cpuEnd(cpuEnd), gpuStart(gpuStart), gpuEnd(gpuEnd), numDescriptors(numResources), increment(increment), info(numResources), type(type) {
|
||||
}
|
||||
|
||||
ResourceInfo* GetByCpuHandle(SIZE_T cpuHandle)
|
||||
{
|
||||
@@ -161,14 +160,14 @@ private:
|
||||
inline static std::mutex _drawMutex;
|
||||
|
||||
static bool IsHudFixActive();
|
||||
|
||||
|
||||
static void hkCopyDescriptors(ID3D12Device* This,
|
||||
UINT NumDestDescriptorRanges, D3D12_CPU_DESCRIPTOR_HANDLE* pDestDescriptorRangeStarts, UINT* pDestDescriptorRangeSizes,
|
||||
UINT NumSrcDescriptorRanges, D3D12_CPU_DESCRIPTOR_HANDLE* pSrcDescriptorRangeStarts, UINT* pSrcDescriptorRangeSizes,
|
||||
D3D12_DESCRIPTOR_HEAP_TYPE DescriptorHeapsType);
|
||||
static void hkCopyDescriptorsSimple(ID3D12Device* This, UINT NumDescriptors, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptorRangeStart,
|
||||
D3D12_CPU_DESCRIPTOR_HANDLE SrcDescriptorRangeStart, D3D12_DESCRIPTOR_HEAP_TYPE DescriptorHeapsType);
|
||||
|
||||
|
||||
static void hkSetGraphicsRootDescriptorTable(ID3D12GraphicsCommandList* This, UINT RootParameterIndex, D3D12_GPU_DESCRIPTOR_HANDLE BaseDescriptor);
|
||||
static void hkOMSetRenderTargets(ID3D12GraphicsCommandList* This, UINT NumRenderTargetDescriptors, D3D12_CPU_DESCRIPTOR_HANDLE* pRenderTargetDescriptors,
|
||||
BOOL RTsSingleHandleToDescriptorRange, D3D12_CPU_DESCRIPTOR_HANDLE* pDepthStencilDescriptor);
|
||||
|
||||
Reference in New Issue
Block a user