Better version management for active FSR-FG feature

This commit is contained in:
cdozdil
2025-12-11 00:13:31 +03:00
parent 72b4edfd17
commit ee8b7953ab
2 changed files with 28 additions and 4 deletions
+8 -4
View File
@@ -193,16 +193,17 @@ void FSRFG_Dx12::ConfigureFramePaceTuning()
feature_version FSRFG_Dx12::Version()
{
if (_fgContext == nullptr && _version.major == 0)
{
if (!FfxApiProxy::IsFGReady())
FfxApiProxy::InitFfxDx12();
if (FfxApiProxy::IsFGReady())
{
auto ver = FfxApiProxy::VersionDx12_FG();
return ver;
_version = FfxApiProxy::VersionDx12_FG();
}
return { 0, 0, 0 };
return _version;
}
HWND FSRFG_Dx12::Hwnd() { return _hwnd; }
@@ -551,6 +552,7 @@ void FSRFG_Dx12::DestroyFGContext()
{
_frameCount = 1;
_lastDispatchedFrame = 0;
_version = {};
LOG_DEBUG("");
@@ -825,6 +827,8 @@ void FSRFG_Dx12::CreateContext(ID3D12Device* device, FG_Constants& fgConstants)
override.versionId = State::Instance().ffxFGVersionIds[Config::Instance()->FfxFGIndex.value_or_default()];
backendDesc.header.pNext = &override.header;
ParseVersion(State::Instance().ffxFGVersionNames[Config::Instance()->FfxFGIndex.value_or_default()], &_version);
ffxReturnCode_t retCode = FfxApiProxy::D3D12_CreateContext(&_fgContext, &createFg.header, nullptr);
State::Instance().skipHeapCapture = false;
+20
View File
@@ -16,6 +16,7 @@ class FSRFG_Dx12 : public virtual IFGFeature_Dx12
ffxContext _fgContext = nullptr;
FfxApiSurfaceFormat _lastHudlessFormat = FFX_API_SURFACE_FORMAT_UNKNOWN;
FfxApiSurfaceFormat _usingHudlessFormat = FFX_API_SURFACE_FORMAT_UNKNOWN;
feature_version _version { 0, 0, 0 };
uint32_t _maxRenderWidth = 0;
uint32_t _maxRenderHeight = 0;
@@ -62,6 +63,25 @@ class FSRFG_Dx12 : public virtual IFGFeature_Dx12
bool UIFormatTransfer(int index, ID3D12Device* device, ID3D12GraphicsCommandList* cmdList, DXGI_FORMAT targetFormat,
Dx12Resource* resource);
void ParseVersion(const char* version_str, feature_version* _version)
{
const char* p = version_str;
// Skip non-digits at front
while (*p)
{
if (isdigit((unsigned char) p[0]))
{
if (sscanf(p, "%u.%u.%u", &_version->major, &_version->minor, &_version->patch) == 3)
return;
}
++p;
}
LOG_WARN("can't parse {0}", version_str);
}
protected:
void ReleaseObjects() override final;
void CreateObjects(ID3D12Device* InDevice) override final;