@@ -32,13 +32,18 @@ namespace vrperfkit {
3232 case UpscaleMethod::CAS:
3333 return " CAS" ;
3434 }
35+
36+ return " Unknown" ;
3537 }
3638
3739 FixedFoveatedMethod FFRMethodFromString (std::string s) {
3840 std::transform (s.begin (), s.end (), s.begin (), [](unsigned char c) { return std::tolower (c); });
3941 if (s == " vrs" ) {
4042 return FixedFoveatedMethod::VRS;
4143 }
44+ if (s == " rdm" ) {
45+ return FixedFoveatedMethod::RDM;
46+ }
4247 LOG_INFO << " Unknown fixed foveated method " << s << " , defaulting to VRS" ;
4348 return FixedFoveatedMethod::VRS;
4449 }
@@ -47,7 +52,11 @@ namespace vrperfkit {
4752 switch (method) {
4853 case FixedFoveatedMethod::VRS:
4954 return " VRS" ;
55+ case FixedFoveatedMethod::RDM:
56+ return " RDM" ;
5057 }
58+
59+ return " Unknown" ;
5160 }
5261
5362 GameMode GameModeFromString (std::string s) {
@@ -79,6 +88,8 @@ namespace vrperfkit {
7988 case GameMode::RIGHT_EYE_FIRST:
8089 return " right" ;
8190 }
91+
92+ return " Unknown" ;
8293 }
8394
8495 std::string PrintToggle (bool toggle) {
@@ -122,15 +133,22 @@ namespace vrperfkit {
122133 FixedFoveatedConfig &ffr = g_config.ffr ;
123134 ffr.enabled = ffrCfg[" enabled" ].as <bool >(ffr.enabled );
124135 ffr.apply = ffr.enabled ;
136+ ffr.method = FFRMethodFromString (ffrCfg[" method" ].as <std::string>(FFRMethodToString (ffr.method )));
125137 ffr.favorHorizontal = ffrCfg[" favorHorizontal" ].as <bool >(ffr.favorHorizontal );
126138 ffr.innerRadius = ffrCfg[" innerRadius" ].as <float >(ffr.innerRadius );
127139 ffr.midRadius = ffrCfg[" midRadius" ].as <float >(ffr.midRadius );
128140 ffr.outerRadius = ffrCfg[" outerRadius" ].as <float >(ffr.outerRadius );
141+ ffr.edgeRadius = ffrCfg[" edgeRadius" ].as <float >(ffr.edgeRadius );
129142 ffr.preciseResolution = ffrCfg[" preciseResolution" ].as <bool >(ffr.preciseResolution );
130143 ffr.ignoreFirstTargetRenders = ffrCfg[" ignoreFirstTargetRenders" ].as <int >(ffr.ignoreFirstTargetRenders );
144+ ffr.ignoreLastTargetRenders = ffrCfg[" ignoreLastTargetRenders" ].as <int >(ffr.ignoreLastTargetRenders );
131145 ffr.maxRadius = ffr.innerRadius ;
132146 ffr.overrideSingleEyeOrder = ffrCfg[" overrideSingleEyeOrder" ].as <std::string>(ffr.overrideSingleEyeOrder );
133147 ffr.fastMode = ffrCfg[" fastMode" ].as <bool >(ffr.fastMode );
148+ g_config.ffrFastModeUsesHRMCount = ffrCfg[" fastModeUsesHRMCount" ].as <bool >(g_config.ffrFastModeUsesHRMCount );
149+ if (!ffr.fastMode ) {
150+ g_config.ffrFastModeUsesHRMCount = false ;
151+ }
134152 ffr.dynamic = ffrCfg[" dynamic" ].as <bool >(ffr.dynamic );
135153 ffr.targetFrameTime = 1 .f / ffrCfg[" targetFPS" ].as <float >(ffr.targetFrameTime );
136154 ffr.marginFrameTime = 1 .f / ffrCfg[" marginFPS" ].as <float >(ffr.marginFrameTime );
@@ -142,10 +160,11 @@ namespace vrperfkit {
142160 YAML::Node hiddenMaskCfg = cfg[" hiddenMask" ];
143161 HiddenRadialMask &hiddenMask= g_config.hiddenMask ;
144162 hiddenMask.enabled = hiddenMaskCfg[" enabled" ].as <bool >(hiddenMask.enabled );
145- hiddenMask.radius = std::max (0 .f , hiddenMaskCfg[" radius " ].as <float >(hiddenMask.radius ));
146- hiddenMask.maxRadius = hiddenMask.radius ;
163+ hiddenMask.edgeRadius = std::max (0 .f , hiddenMaskCfg[" edgeRadius " ].as <float >(hiddenMask.edgeRadius ));
164+ hiddenMask.maxRadius = hiddenMask.edgeRadius ;
147165 hiddenMask.preciseResolution = hiddenMaskCfg[" preciseResolution" ].as <bool >(hiddenMask.preciseResolution );
148166 hiddenMask.ignoreFirstTargetRenders = hiddenMaskCfg[" ignoreFirstTargetRenders" ].as <int >(hiddenMask.ignoreFirstTargetRenders );
167+ hiddenMask.ignoreLastTargetRenders = hiddenMaskCfg[" ignoreLastTargetRenders" ].as <int >(hiddenMask.ignoreLastTargetRenders );
149168 hiddenMask.dynamic = hiddenMaskCfg[" dynamic" ].as <bool >(hiddenMask.dynamic );
150169 hiddenMask.targetFrameTime = 1 .f / hiddenMaskCfg[" targetFPS" ].as <float >(hiddenMask.targetFrameTime );
151170 hiddenMask.marginFrameTime = 1 .f / hiddenMaskCfg[" marginFPS" ].as <float >(hiddenMask.marginFrameTime );
@@ -163,6 +182,31 @@ namespace vrperfkit {
163182 if (g_config.dynamicFramesCheck < 1 ) {
164183 g_config.dynamicFramesCheck = 1 ;
165184 }
185+
186+ if (g_config.ffr .enabled ) {
187+ if (g_config.ffr .method == FixedFoveatedMethod::RDM) {
188+ g_config.ffr .fastMode = false ;
189+ g_config.ffrFastModeUsesHRMCount = false ;
190+ g_config.hiddenMask .enabled = false ;
191+
192+ if (!g_config.upscaling .enabled ) {
193+ g_config.upscaling .enabled = true ;
194+ g_config.upscaling .radius = g_config.ffr .edgeRadius ;
195+ g_config.upscaling .method = UpscaleMethod::CAS;
196+ g_config.upscaling .renderScale = 1 .0f ;
197+ g_config.upscaling .sharpness = 0 .7f ;
198+ g_config.upscaling .applyMipBias = false ;
199+ }
200+
201+ } else if (g_config.ffr .method == FixedFoveatedMethod::VRS && !g_config.hiddenMask .enabled && g_config.ffrFastModeUsesHRMCount ) {
202+ g_config.hiddenMask .enabled = true ;
203+ g_config.hiddenMask .dynamic = false ;
204+ g_config.hiddenMask .edgeRadius = 1 .15f ;
205+ g_config.hiddenMask .ignoreFirstTargetRenders = 0 ;
206+ g_config.hiddenMask .ignoreLastTargetRenders = 0 ;
207+ g_config.hiddenMask .preciseResolution = true ;
208+ }
209+ }
166210 }
167211 catch (const YAML::Exception &e) {
168212 LOG_ERROR << " Failed to load configuration file: " << e.msg ;
@@ -190,12 +234,18 @@ namespace vrperfkit {
190234 LOG_INFO << " * Inner radius: " << std::setprecision (6 ) << g_config.ffr .innerRadius ;
191235 LOG_INFO << " * Mid radius: " << std::setprecision (6 ) << g_config.ffr .midRadius ;
192236 LOG_INFO << " * Outer radius: " << std::setprecision (6 ) << g_config.ffr .outerRadius ;
237+ if (g_config.ffr .method == FixedFoveatedMethod::RDM) {
238+ LOG_INFO << " * Edge radius: " << std::setprecision (6 ) << g_config.ffr .edgeRadius ;
239+ }
193240 LOG_INFO << " * Precise res: " << PrintToggle (g_config.ffr .preciseResolution );
194- LOG_INFO << " * No renders: " << std::setprecision (6 ) << g_config.ffr .ignoreFirstTargetRenders ;
195- if (!g_config.ffr .overrideSingleEyeOrder .empty ()) {
241+ LOG_INFO << " * No first rend: " << std::setprecision (6 ) << g_config.ffr .ignoreFirstTargetRenders ;
242+ LOG_INFO << " * No last rend: " << std::setprecision (6 ) << g_config.ffr .ignoreLastTargetRenders ;
243+ LOG_INFO << " * Fast mode: " << PrintToggle (g_config.ffr .fastMode );
244+ if (g_config.ffr .fastMode ) {
245+ LOG_INFO << " * HRM counter: " << PrintToggle (g_config.ffrFastModeUsesHRMCount );
246+ } else if (!g_config.ffr .overrideSingleEyeOrder .empty ()) {
196247 LOG_INFO << " * Eye order: " << g_config.ffr .overrideSingleEyeOrder ;
197248 }
198- LOG_INFO << " * Fast mode: " << PrintToggle (g_config.ffr .fastMode );
199249 LOG_INFO << " * Dynamic: " << PrintToggle (g_config.ffr .dynamic );
200250 if (g_config.ffr .dynamic ) {
201251 LOG_INFO << " * Target FPS: " << std::setprecision (6 ) << (1 .f / g_config.ffr .targetFrameTime );
@@ -211,12 +261,15 @@ namespace vrperfkit {
211261 }
212262 } else {
213263 g_config.ffr .dynamic = false ;
264+ g_config.ffr .fastMode = false ;
214265 }
266+
215267 LOG_INFO << " Hidden radial mask is " << PrintToggle (g_config.hiddenMask .enabled );
216268 if (g_config.hiddenMask .enabled ) {
217- LOG_INFO << " * Radius : " << std::setprecision (6 ) << g_config.hiddenMask .radius ;
269+ LOG_INFO << " * Edge radius : " << std::setprecision (6 ) << g_config.hiddenMask .edgeRadius ;
218270 LOG_INFO << " * Precise res: " << PrintToggle (g_config.hiddenMask .preciseResolution );
219- LOG_INFO << " * No renders: " << std::setprecision (6 ) << g_config.hiddenMask .ignoreFirstTargetRenders ;
271+ LOG_INFO << " * No first rend: " << std::setprecision (6 ) << g_config.hiddenMask .ignoreFirstTargetRenders ;
272+ LOG_INFO << " * No last rend: " << std::setprecision (6 ) << g_config.hiddenMask .ignoreLastTargetRenders ;
220273 LOG_INFO << " * Dynamic: " << PrintToggle (g_config.hiddenMask .dynamic );
221274 if (g_config.hiddenMask .dynamic ) {
222275 LOG_INFO << " * Target FPS: " << std::setprecision (6 ) << (1 .f / g_config.hiddenMask .targetFrameTime );
0 commit comments