diff --git a/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp b/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp index f61ceb5a..9fbd98dd 100644 --- a/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp +++ b/OptiScaler/framegen/ffx/FSRFG_Dx12.cpp @@ -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; diff --git a/OptiScaler/framegen/ffx/FSRFG_Dx12.h b/OptiScaler/framegen/ffx/FSRFG_Dx12.h index d20e8a61..a952f311 100644 --- a/OptiScaler/framegen/ffx/FSRFG_Dx12.h +++ b/OptiScaler/framegen/ffx/FSRFG_Dx12.h @@ -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;