Added ResourceTracking fine tuning options

This commit is contained in:
cdozdil
2025-10-26 22:35:09 +03:00
parent 4b661d5358
commit 3fa4fd0032
9 changed files with 771 additions and 626 deletions
+28
View File
@@ -216,6 +216,34 @@ HUDLimit=auto
; true or false - Default (auto) is false
HUDFixExtended=auto
; Do not use CreateRenderTargetView for resource tracking
; true or false - Default (auto) is false
HudfixDisableRTV=auto
; Do not use CreateShaderResourceView for resource tracking
; true or false - Default (auto) is false
HudfixDisableSRV=auto
; Do not use CreateUnorderedAccessView for resource tracking
; true or false - Default (auto) is false
HudfixDisableUAV=auto
; Do not use OMSetRenderTargets for resource tracking
; true or false - Default (auto) is false
HudfixDisableOM=auto
; Do not use DrawInstanced for resource tracking
; true or false - Default (auto) is false
HudfixDisableDI=auto
; Do not use DrawIndexedInstanced for resource tracking
; true or false - Default (auto) is false
HudfixDisableDII=auto
; Do not use Dispatch for resource tracking
; true or false - Default (auto) is false
HudfixDisableDispatch=auto
; Prevent swapchain buffers to be used as Hudless
; Might help fixing overlay issues but also might reduce compatibility
; true or false - Default (auto) is false
+22
View File
@@ -134,6 +134,13 @@ bool Config::Reload(std::filesystem::path iniPath)
FGResourceBlocking.set_from_config(readBool("OptiFG", "ResourceBlocking"));
FGMakeDepthCopy.set_from_config(readBool("OptiFG", "MakeDepthCopy"));
FGMakeMVCopy.set_from_config(readBool("OptiFG", "MakeMVCopy"));
FGHudfixDisableRTV.set_from_config(readBool("OptiFG", "HudfixDisableRTV"));
FGHudfixDisableSRV.set_from_config(readBool("OptiFG", "HudfixDisableSRV"));
FGHudfixDisableUAV.set_from_config(readBool("OptiFG", "HudfixDisableUAV"));
FGHudfixDisableOM.set_from_config(readBool("OptiFG", "HudfixDisableOM"));
FGHudfixDisableDispatch.set_from_config(readBool("OptiFG", "HudfixDisableDispatch"));
FGHudfixDisableDI.set_from_config(readBool("OptiFG", "HudfixDisableDI"));
FGHudfixDisableDII.set_from_config(readBool("OptiFG", "HudfixDisableDII"));
FGEnableDepthScale.set_from_config(readBool("OptiFG", "EnableDepthScale"));
FGDepthScaleMax.set_from_config(readFloat("OptiFG", "DepthScaleMax"));
@@ -731,6 +738,21 @@ bool Config::SaveIni()
ini.SetValue("OptiFG", "MakeDepthCopy", GetBoolValue(Instance()->FGMakeDepthCopy.value_for_config()).c_str());
ini.SetValue("OptiFG", "MakeMVCopy", GetBoolValue(Instance()->FGMakeMVCopy.value_for_config()).c_str());
ini.SetValue("OptiFG", "HudfixDisableRTV",
GetBoolValue(Instance()->FGHudfixDisableRTV.value_for_config()).c_str());
ini.SetValue("OptiFG", "HudfixDisableSRV",
GetBoolValue(Instance()->FGHudfixDisableSRV.value_for_config()).c_str());
ini.SetValue("OptiFG", "HudfixDisableUAV",
GetBoolValue(Instance()->FGHudfixDisableUAV.value_for_config()).c_str());
ini.SetValue("OptiFG", "HudfixDisableOM",
GetBoolValue(Instance()->FGHudfixDisableOM.value_for_config()).c_str());
ini.SetValue("OptiFG", "HudfixDisableDispatch",
GetBoolValue(Instance()->FGHudfixDisableDispatch.value_for_config()).c_str());
ini.SetValue("OptiFG", "HudfixDisableDI",
GetBoolValue(Instance()->FGHudfixDisableDI.value_for_config()).c_str());
ini.SetValue("OptiFG", "HudfixDisableDII",
GetBoolValue(Instance()->FGHudfixDisableDII.value_for_config()).c_str());
ini.SetValue("OptiFG", "EnableDepthScale",
GetBoolValue(Instance()->FGEnableDepthScale.value_for_config()).c_str());
ini.SetValue("OptiFG", "DepthScaleMax", GetFloatValue(Instance()->FGDepthScaleMax.value_for_config()).c_str());
+7
View File
@@ -417,6 +417,13 @@ class Config
CustomOptional<bool> FGImmediateCapture { false };
CustomOptional<bool> FGDontUseSwapchainBuffers { false };
CustomOptional<bool> FGRelaxedResolutionCheck { false };
CustomOptional<bool> FGHudfixDisableRTV { false };
CustomOptional<bool> FGHudfixDisableSRV { false };
CustomOptional<bool> FGHudfixDisableUAV { false };
CustomOptional<bool> FGHudfixDisableOM { false };
CustomOptional<bool> FGHudfixDisableDispatch { false };
CustomOptional<bool> FGHudfixDisableDI { false };
CustomOptional<bool> FGHudfixDisableDII { false };
// OptiFG - Resource Tracking
CustomOptional<bool> FGAlwaysTrackHeaps { false };
+1
View File
@@ -50,6 +50,7 @@ enum class FGOutput : uint32_t
typedef struct CapturedHudlessInfo
{
UINT64 usageCount = 1;
UINT captureInfo = 0;
bool enabled = true;
} captured_hudless_info;
+25 -3
View File
@@ -217,7 +217,15 @@ bool Hudfix_Dx12::CheckCapture()
return true;
}
bool Hudfix_Dx12::CheckResource(std::string caller, ResourceInfo* resource)
static std::string captureInfoSrcNames[] = {
"None", "RTV", "SRV", "", "UAV", "", "", "", "OM", "", "", "", "", "", "", "Ups",
};
static std::string captureInfoDspNames[] = {
"None", "Dispatch", "DrawInstanced", "", "DrawIndexedInstanced",
};
bool Hudfix_Dx12::CheckResource(ResourceInfo* resource)
{
if (resource == nullptr || resource->buffer == nullptr || State::Instance().isShuttingDown)
return false;
@@ -266,6 +274,15 @@ bool Hudfix_Dx12::CheckResource(std::string caller, ResourceInfo* resource)
return false;
}
std::string caller;
auto source = resource->captureInfo & 0xFF;
auto dispatcher = resource->captureInfo & 0xFF00;
if (dispatcher == 0)
caller = captureInfoSrcNames[source];
else
caller = std::format("{}->{}", captureInfoSrcNames[source], captureInfoDspNames[dispatcher >> 8]);
// format match
if (resDesc.Format == s.currentSwapchainDesc.BufferDesc.Format)
{
@@ -458,7 +475,7 @@ bool Hudfix_Dx12::IsResourceCheckActive()
bool Hudfix_Dx12::SkipHudlessChecks() { return _skipHudlessChecks; }
bool Hudfix_Dx12::CheckForHudless(std::string callerName, ID3D12GraphicsCommandList* cmdList, ResourceInfo* resource,
bool Hudfix_Dx12::CheckForHudless(ID3D12GraphicsCommandList* cmdList, ResourceInfo* resource,
D3D12_RESOURCE_STATES state, bool ignoreBlocked)
{
auto& s = State::Instance();
@@ -471,7 +488,7 @@ bool Hudfix_Dx12::CheckForHudless(std::string callerName, ID3D12GraphicsCommandL
do
{
if (!CheckResource(callerName, resource))
if (!CheckResource(resource))
break;
CapturedHudlessInfo* capturedHudlessInfo = &s.CapturedHudlesses[resource->buffer];
@@ -806,7 +823,12 @@ bool Hudfix_Dx12::CheckForHudless(std::string callerName, ID3D12GraphicsCommandL
if (capturedHudlessInfo != nullptr)
capturedHudlessInfo->usageCount++;
else
{
s.CapturedHudlesses[resource->buffer] = {};
capturedHudlessInfo = &s.CapturedHudlesses[resource->buffer];
}
capturedHudlessInfo->captureInfo = resource->captureInfo;
return true;
+18 -3
View File
@@ -17,6 +17,19 @@ enum ResourceType
UAV
};
enum CaptureInfo
{
None = 0,
CreateRTV = 1,
CreateSRV = 2,
CreateUAV = 4,
OMSetRTV = 8,
Upscaler = 16,
Dispatch = 256,
DrawInstanced = 512,
DrawIndexedInstanced = 1024,
};
typedef struct ResourceInfo
{
ID3D12Resource* buffer = nullptr;
@@ -28,6 +41,7 @@ typedef struct ResourceInfo
ResourceType type = SRV;
double lastUsedFrame = 0;
bool extended = false;
UINT captureInfo = 0;
} resource_info;
typedef struct HudlessInfo
@@ -121,9 +135,10 @@ class Hudfix_Dx12
static bool SkipHudlessChecks();
// Check resource for hudless
static bool CheckForHudless(std::string callerName, ID3D12GraphicsCommandList* cmdList, ResourceInfo* resource,
D3D12_RESOURCE_STATES state, bool ignoreBlocked = false);
static bool CheckResource(std::string caller, ResourceInfo* resource);
static bool CheckForHudless(ID3D12GraphicsCommandList* cmdList, ResourceInfo* resource, D3D12_RESOURCE_STATES state,
bool ignoreBlocked = false);
static bool CheckResource(ResourceInfo* resource);
// Reset frame counters
static void ResetCounters();
@@ -262,8 +262,9 @@ void UpscalerInputsDx12::UpscaleEnd(ID3D12GraphicsCommandList* InCmdList, NVSDK_
info.format = desc.Format;
info.flags = desc.Flags;
info.type = UAV;
info.captureInfo = CaptureInfo::Upscaler;
Hudfix_Dx12::CheckForHudless(__FUNCTION__, InCmdList, &info,
Hudfix_Dx12::CheckForHudless(InCmdList, &info,
(D3D12_RESOURCE_STATES) Config::Instance()->OutputResourceBarrier.value_or(
D3D12_RESOURCE_STATE_UNORDERED_ACCESS),
true);
File diff suppressed because it is too large Load Diff
+35 -8
View File
@@ -581,6 +581,9 @@ void ResTrack_Dx12::hkCreateRenderTargetView(ID3D12Device* This, ID3D12Resource*
o_CreateRenderTargetView(This, pResource, pDesc, DestDescriptor);
if (Config::Instance()->FGHudfixDisableRTV.value_or_default())
return;
if (pResource == nullptr)
{
auto heap = GetHeapByCpuHandleRTV(DestDescriptor.ptr);
@@ -600,6 +603,7 @@ void ResTrack_Dx12::hkCreateRenderTargetView(ID3D12Device* This, ID3D12Resource*
ResourceInfo resInfo {};
FillResourceInfo(pResource, &resInfo);
resInfo.type = RTV;
resInfo.captureInfo = CaptureInfo::CreateRTV;
heap->SetByCpuHandle(DestDescriptor.ptr, resInfo);
}
// else
@@ -631,6 +635,9 @@ void ResTrack_Dx12::hkCreateShaderResourceView(ID3D12Device* This, ID3D12Resourc
o_CreateShaderResourceView(This, pResource, pDesc, DestDescriptor);
if (Config::Instance()->FGHudfixDisableSRV.value_or_default())
return;
if (pResource == nullptr)
{
auto heap = GetHeapByCpuHandleSRV(DestDescriptor.ptr);
@@ -650,6 +657,7 @@ void ResTrack_Dx12::hkCreateShaderResourceView(ID3D12Device* This, ID3D12Resourc
ResourceInfo resInfo {};
FillResourceInfo(pResource, &resInfo);
resInfo.type = SRV;
resInfo.captureInfo = CaptureInfo::CreateSRV;
heap->SetByCpuHandle(DestDescriptor.ptr, resInfo);
}
// else
@@ -681,6 +689,9 @@ void ResTrack_Dx12::hkCreateUnorderedAccessView(ID3D12Device* This, ID3D12Resour
o_CreateUnorderedAccessView(This, pResource, pCounterResource, pDesc, DestDescriptor);
if (Config::Instance()->FGHudfixDisableUAV.value_or_default())
return;
if (pResource == nullptr)
{
auto heap = GetHeapByCpuHandleUAV(DestDescriptor.ptr);
@@ -700,6 +711,7 @@ void ResTrack_Dx12::hkCreateUnorderedAccessView(ID3D12Device* This, ID3D12Resour
ResourceInfo resInfo {};
FillResourceInfo(pResource, &resInfo);
resInfo.type = UAV;
resInfo.captureInfo = CaptureInfo::CreateUAV;
heap->SetByCpuHandle(DestDescriptor.ptr, resInfo);
}
// else
@@ -1138,7 +1150,7 @@ void ResTrack_Dx12::hkSetGraphicsRootDescriptorTable(ID3D12GraphicsCommandList*
{
if (Config::Instance()->FGImmediateCapture.value_or_default())
{
if (Hudfix_Dx12::CheckForHudless(__FUNCTION__, This, capturedBuffer, capturedBuffer->state))
if (Hudfix_Dx12::CheckForHudless(This, capturedBuffer, capturedBuffer->state))
{
break;
}
@@ -1174,8 +1186,8 @@ void ResTrack_Dx12::hkOMSetRenderTargets(ID3D12GraphicsCommandList* This, UINT N
BOOL RTsSingleHandleToDescriptorRange,
D3D12_CPU_DESCRIPTOR_HANDLE* pDepthStencilDescriptor)
{
if (NumRenderTargetDescriptors == 0 || pRenderTargetDescriptors == nullptr || !IsHudFixActive() ||
Hudfix_Dx12::SkipHudlessChecks())
if (Config::Instance()->FGHudfixDisableOM.value_or_default() || NumRenderTargetDescriptors == 0 ||
pRenderTargetDescriptors == nullptr || !IsHudFixActive() || Hudfix_Dx12::SkipHudlessChecks())
{
o_OMSetRenderTargets(This, NumRenderTargetDescriptors, pRenderTargetDescriptors,
RTsSingleHandleToDescriptorRange, pDepthStencilDescriptor);
@@ -1231,10 +1243,11 @@ void ResTrack_Dx12::hkOMSetRenderTargets(ID3D12GraphicsCommandList* This, UINT N
}
capturedBuffer->state = D3D12_RESOURCE_STATE_RENDER_TARGET;
capturedBuffer->captureInfo = CaptureInfo::OMSetRTV;
if (Config::Instance()->FGImmediateCapture.value_or_default())
{
if (Hudfix_Dx12::CheckForHudless(__FUNCTION__, This, capturedBuffer, capturedBuffer->state))
if (Hudfix_Dx12::CheckForHudless(This, capturedBuffer, capturedBuffer->state))
{
LOG_TRACK("CmdList: {:X}, Hudless Resource: {:X}, Format: {} Desc: {:X}", (size_t) This,
(size_t) capturedBuffer->buffer, (UINT) capturedBuffer->format, handle.ptr);
@@ -1317,7 +1330,7 @@ void ResTrack_Dx12::hkSetComputeRootDescriptorTable(ID3D12GraphicsCommandList* T
{
if (Config::Instance()->FGImmediateCapture.value_or_default())
{
if (Hudfix_Dx12::CheckForHudless(__FUNCTION__, This, capturedBuffer, capturedBuffer->state))
if (Hudfix_Dx12::CheckForHudless(This, capturedBuffer, capturedBuffer->state))
{
break;
}
@@ -1390,11 +1403,16 @@ void ResTrack_Dx12::hkDrawInstanced(ID3D12GraphicsCommandList* This, UINT Vertex
if (val0.size() == 0)
break;
if (Config::Instance()->FGHudfixDisableDI.value_or_default())
break;
for (auto& [key, val] : val0)
{
std::lock_guard<std::mutex> lock(_drawMutex);
if (Hudfix_Dx12::CheckForHudless(__FUNCTION__, This, &val, val.state))
val.captureInfo |= CaptureInfo::DrawInstanced;
if (Hudfix_Dx12::CheckForHudless(This, &val, val.state))
{
break;
}
@@ -1452,12 +1470,17 @@ void ResTrack_Dx12::hkDrawIndexedInstanced(ID3D12GraphicsCommandList* This, UINT
if (val0.size() == 0)
break;
if (Config::Instance()->FGHudfixDisableDII.value_or_default())
break;
for (auto& [key, val] : val0)
{
// LOG_DEBUG("Waiting _drawMutex {:X}", (size_t)val.buffer);
std::lock_guard<std::mutex> lock(_drawMutex);
if (Hudfix_Dx12::CheckForHudless(__FUNCTION__, This, &val, val.state))
val.captureInfo |= CaptureInfo::DrawIndexedInstanced;
if (Hudfix_Dx12::CheckForHudless(This, &val, val.state))
{
break;
}
@@ -1592,12 +1615,16 @@ void ResTrack_Dx12::hkDispatch(ID3D12GraphicsCommandList* This, UINT ThreadGroup
if (val0.size() == 0)
break;
if (Config::Instance()->FGHudfixDisableDispatch.value_or_default())
break;
for (auto& [key, val] : val0)
{
// LOG_DEBUG("Waiting _drawMutex {:X}", (size_t)val.buffer);
std::lock_guard<std::mutex> lock(_drawMutex);
if (Hudfix_Dx12::CheckForHudless(__FUNCTION__, This, &val, val.state))
val.captureInfo |= CaptureInfo::Dispatch;
if (Hudfix_Dx12::CheckForHudless(This, &val, val.state))
{
break;
}