mirror of
https://github.com/optiscaler/OptiScaler.git
synced 2026-05-04 08:41:43 +00:00
Added ResourceTracking fine tuning options
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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 };
|
||||
|
||||
@@ -50,6 +50,7 @@ enum class FGOutput : uint32_t
|
||||
typedef struct CapturedHudlessInfo
|
||||
{
|
||||
UINT64 usageCount = 1;
|
||||
UINT captureInfo = 0;
|
||||
bool enabled = true;
|
||||
} captured_hudless_info;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
+633
-611
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user