@@ -140,8 +140,6 @@ namespace dxvk {
140140 m_nrcCtxSettings = std::make_unique<nrc::ContextSettings>();
141141 m_delayedEnableDebugBuffers = NrcCtxOptions::enableDebugBuffers ();
142142 m_delayedEnableCustomNetworkConfig = NrcCtxOptions::enableCustomNetworkConfig ();
143-
144- applyQualityPreset ();
145143 }
146144
147145 NeuralRadianceCache::~NeuralRadianceCache () { }
@@ -218,9 +216,7 @@ namespace dxvk {
218216
219217 ImGui::Text (" Video Memory Usage: %u MiB" , m_nrcCtx->getCurrentMemoryConsumption () >> 20 );
220218
221- if (nrcQualityPresetCombo.getKey (&NrcOptions::qualityPresetObject ())) {
222- applyQualityPreset ();
223- }
219+ nrcQualityPresetCombo.getKey (&NrcOptions::qualityPresetObject ());
224220
225221 ImGui::Checkbox (" Reset History" , &NrcOptions::resetHistoryObject ());
226222 ImGui::Checkbox (" Train Cache" , &NrcOptions::trainCacheObject ());
@@ -320,43 +316,42 @@ namespace dxvk {
320316 return NrcContext::checkIsSupported (device);
321317 }
322318
323- void NeuralRadianceCache::applyQualityPreset () {
324- uint8_t trainingMaxPathBounces = NrcOptions::trainingMaxPathBounces ();
319+ void NeuralRadianceCache::NrcOptions::onQualityPresetChanged () {
320+ // Note: This function is called during onChange handler for quality preset option and
321+ // all the NRC calls have been issued, so it's safe to set the new settings using immediately.
322+ // In addition, this ensures the settings being applied immediately on start, rather than being delayed to the next frame
323+
325324 if (NrcOptions::qualityPreset () == QualityPreset::Ultra) {
326325 Logger::info (" [RTX Neural Radiance Cache] Selected Ultra preset mode." );
327- NrcOptions::terminationHeuristicThreshold.setDeferred (0 .1f );
328- NrcOptions::smallestResolvableFeatureSizeMeters.setDeferred (0 .01f );
329- NrcOptions::targetNumTrainingIterations.setDeferred (4 );
326+ NrcOptions::terminationHeuristicThreshold.setImmediately (0 .1f );
327+ NrcOptions::smallestResolvableFeatureSizeMeters.setImmediately (0 .01f );
328+ NrcOptions::targetNumTrainingIterations.setImmediately (4 );
330329 // 9 and higher resulted in no scene illumination loss in Portal RTX
331- trainingMaxPathBounces = 9 ;
330+ trainingMaxPathBounces. setImmediately ( 9 ) ;
332331
333332 } else if (NrcOptions::qualityPreset () == QualityPreset::High) {
334333 Logger::info (" [RTX Neural Radiance Cache] Selected High preset mode." );
335- NrcOptions::terminationHeuristicThreshold.setDeferred (0 .03f );
336- NrcOptions::smallestResolvableFeatureSizeMeters.setDeferred (0 .04f );
337- NrcOptions::targetNumTrainingIterations.setDeferred (3 );
334+ NrcOptions::terminationHeuristicThreshold.setImmediately (0 .03f );
335+ NrcOptions::smallestResolvableFeatureSizeMeters.setImmediately (0 .04f );
336+ NrcOptions::targetNumTrainingIterations.setImmediately (3 );
338337 // 7 results in tiny scene illumination decrease in comparison to 9
339- trainingMaxPathBounces = 7 ;
338+ trainingMaxPathBounces. setImmediately ( 7 ) ;
340339
341340 } else if (NrcOptions::qualityPreset () == QualityPreset::Medium) {
342341 Logger::info (" [RTX Neural Radiance Cache] Selected Medium preset mode." );
343- NrcOptions::terminationHeuristicThreshold.setDeferred (0 .001f );
342+ NrcOptions::terminationHeuristicThreshold.setImmediately (0 .001f );
344343
345344 // Using a higher cache resolution to speed up NRC's Query and Train pass at a cost of some IQ fidelity.
346345 // 0.01 -> 0.06 resolution results in in 0.2ms cost reduction
347346 // Values above 6cm start to produce considerably more pronounced IQ differences in specular reflections in Portal.
348- NrcOptions::smallestResolvableFeatureSizeMeters.setDeferred (0 .06f );
347+ NrcOptions::smallestResolvableFeatureSizeMeters.setImmediately (0 .06f );
349348
350349 // Using only 2 iterations vs default 4 can result in reduced responsiveness, but it saves 0.4ms from NRC and PT passes
351- NrcOptions::targetNumTrainingIterations.setDeferred (2 );
350+ NrcOptions::targetNumTrainingIterations.setImmediately (2 );
352351
353352 // Longer training paths require more memory (~5-8+ MB per bounce) and have a slight performance impact (particularly when SER is disabled).
354- trainingMaxPathBounces = 6 ;
353+ trainingMaxPathBounces. setImmediately ( 6 ) ;
355354 }
356-
357- NrcOptions::trainingMaxPathBounces.setDeferred (std::max<uint8_t >(
358- trainingMaxPathBounces + NrcOptions::trainingMaxPathBouncesBiasInQualityPresets (),
359- 0 ));
360355 }
361356
362357 uint32_t NeuralRadianceCache::calculateTargetNumTrainingRecords () const {
@@ -371,7 +366,7 @@ namespace dxvk {
371366 NrcArgs& nrcArgs = constants.nrcArgs ;
372367 m_nrcCtx->populateShaderConstants (nrcArgs.nrcConstants );
373368
374- nrcArgs.updatePathMaxBounces = NrcOptions::trainingMaxPathBounces ();
369+ nrcArgs.updatePathMaxBounces = calculateTrainingMaxPathBounces ();
375370
376371 // Russian roulette is disabled due to bias in NRC SDK when it is enabled
377372 nrcArgs.updateAllowRussianRoulette = false ;
@@ -930,13 +925,14 @@ namespace dxvk {
930925 return std::min (numTrainingIterations, NrcOptions::maxNumTrainingIterations ());
931926 }
932927
928+ uint8_t NeuralRadianceCache::calculateTrainingMaxPathBounces () const {
929+ return static_cast <uint8_t >(
930+ std::clamp (NrcOptions::trainingMaxPathBounces () + NrcOptions::trainingMaxPathBouncesBiasInQualityPresets (),
931+ 1 , 15 ));
932+ }
933+
933934 void NeuralRadianceCache::setQualityPreset (QualityPreset nrcQualityPreset) {
934- if (nrcQualityPreset != NrcOptions::qualityPreset ()) {
935- // TODO[REMIX-4105]: this is read immediately after being set, so it needs to be setImmediately.
936- // This should be addressed by REMIX-4109 if that is done before REMIX-4105 is fully cleaned up.
937- NrcOptions::qualityPreset.setImmediately (nrcQualityPreset);
938- applyQualityPreset ();
939- }
935+ NrcOptions::qualityPreset.setDeferred (nrcQualityPreset);
940936 }
941937
942938 // Resolves radiance for the queried paths during path tracing
0 commit comments