Skip to content

Commit 24db8c9

Browse files
committed
Merge branch 'pkristof/nrcFixOptionPresets' into 'main'
Fixed activation of QualityPresets in NRC. This recently regressed where a previously set NRC quality preset would activate on a preset switch change instead of the newly selected one. See merge request lightspeedrtx/dxvk-remix-nv!1610
2 parents 8c7b09b + 965484a commit 24db8c9

File tree

3 files changed

+39
-40
lines changed

3 files changed

+39
-40
lines changed

src/dxvk/imgui/dxvk_imgui.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1442,7 +1442,6 @@ namespace dxvk {
14421442
ImGui::BeginDisabled(!enableNeuralRadianceCache);
14431443

14441444
if (neuralRadianceCacheQualityPresetCombo.getKey(&NeuralRadianceCache::NrcOptions::qualityPresetObject())) {
1445-
nrc.applyQualityPreset();
14461445
m_userGraphicsSettingChanged = true;
14471446
}
14481447

src/dxvk/rtx_render/rtx_neural_radiance_cache.cpp

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src/dxvk/rtx_render/rtx_neural_radiance_cache.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,14 +119,18 @@ namespace dxvk {
119119
RTX_OPTION("rtx.neuralRadianceCache", float, selfTrainingAttenuation, 1.f, "");
120120
RTX_OPTION("rtx.neuralRadianceCache", bool, enableCalculateTrainingLoss, false, "Enables calculation of a training loss. Imposes a performance penalty.");
121121
RTX_OPTION("rtx.neuralRadianceCache", bool, enableAdaptiveTrainingDimensions, true, "Enables adaptive training dimensions that scale based off pathtracer's execution behavior on a given scene.");
122-
RTX_OPTION_ENV("rtx.neuralRadianceCache", QualityPreset, qualityPreset, QualityPreset::Ultra, "RTX_NRC_QUALITY_PRESET",
123-
"Quality Preset: Medium (0), High (1), Ultra (2).\n"
124-
"Adjusts quality of Neural Radiance Cache (NRC):\n"
125-
" - How quickly path-tracer terminates paths into NRC cache. It terminates quicker on lower presets.\n"
126-
" - Granularity of the cache - i.e. the smallest resolvable feature size. The cache is less precise on lower presets.\n"
127-
" - Responsiveness of the cache. The cache is more responsive to dynamic lighting changes on higher presets.\n"
128-
"Lower quality presets result in faster path-tracing with fewer bounces that may result in lower quality indirect lighting.\n"
129-
"Higher quality presets result in more responsive and detailed indirect lighting.");
122+
123+
static void onQualityPresetChanged();
124+
RTX_OPTION_ARGS("rtx.neuralRadianceCache", QualityPreset, qualityPreset, QualityPreset::Ultra,
125+
"Quality Preset: Medium (0), High (1), Ultra (2).\n"
126+
"Adjusts quality of Neural Radiance Cache (NRC):\n"
127+
" - How quickly path-tracer terminates paths into NRC cache. It terminates quicker on lower presets.\n"
128+
" - Granularity of the cache - i.e. the smallest resolvable feature size. The cache is less precise on lower presets.\n"
129+
" - Responsiveness of the cache. The cache is more responsive to dynamic lighting changes on higher presets.\n"
130+
"Lower quality presets result in faster path-tracing with fewer bounces that may result in lower quality indirect lighting.\n"
131+
"Higher quality presets result in more responsive and detailed indirect lighting.",
132+
args.environment = "RTX_NRC_QUALITY_PRESET",
133+
args.onChangeCallback = &onQualityPresetChanged);
130134

131135
RTX_OPTION("rtx.neuralRadianceCache", float, luminanceClampMultiplier, 0.f,
132136
"Luminance based clamp multiplier to use for clamping radiance passed to NRC during training.\n"
@@ -179,7 +183,6 @@ namespace dxvk {
179183
bool isUpdateResolveModeActive() const;
180184

181185
void setQualityPreset(QualityPreset nrcQualityPreset);
182-
void applyQualityPreset();
183186

184187
bool isResettingHistory();
185188

@@ -199,6 +202,7 @@ namespace dxvk {
199202
void readAndResetNumberOfTrainingRecords();
200203
void calculateActiveTrainingDimensions(float frameTimeMilliseconds, bool forceReset);
201204
uint32_t calculateNumTrainingIterations();
205+
uint8_t calculateTrainingMaxPathBounces() const;
202206

203207
uint32_t calculateTargetNumTrainingRecords() const;
204208

0 commit comments

Comments
 (0)