[GPU] Improved fake ZPD for QueryBatch titles

This commit is contained in:
bomabomabomaboma
2026-05-01 21:09:16 +00:00
committed by Radosław Gliński
parent 6e1bd0a9a6
commit 08c0cf5ad0
3 changed files with 16 additions and 9 deletions

View File

@@ -59,11 +59,11 @@ DEFINE_bool(
"when MSAA is used with fullscreen passes.", "when MSAA is used with fullscreen passes.",
"GPU"); "GPU");
DEFINE_bool(query_occlusion_batched, false, DEFINE_int32(query_occlusion_querybatch_range, 0,
"Increment the sample count total by a fixed amount on every " "Range of fake ZPD sample count values to cycle for titles that "
"EVENT_WRITE_ZPD. This provides an approximate batched occlusion " "use D3D QueryBatch. 0 disables this behavior entirely. Any non-"
"query implementation for many titles.", "zero values should only be used if required for specific titles.",
"GPU"); "GPU");
DEFINE_int32(query_occlusion_sample_lower_threshold, 80, DEFINE_int32(query_occlusion_sample_lower_threshold, 80,
"If set to -1 no sample counts are written, games may hang. Else, " "If set to -1 no sample counts are written, games may hang. Else, "
"the sample count of every tile will be incremented on every " "the sample count of every tile will be incremented on every "

View File

@@ -26,7 +26,7 @@ DECLARE_bool(non_seamless_cube_map);
DECLARE_bool(half_pixel_offset); DECLARE_bool(half_pixel_offset);
DECLARE_bool(query_occlusion_batched); DECLARE_int32(query_occlusion_querybatch_range);
DECLARE_int32(query_occlusion_sample_lower_threshold); DECLARE_int32(query_occlusion_sample_lower_threshold);

View File

@@ -988,11 +988,18 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_EVENT_WRITE_ZPD(
// every query. Each ISSUE snapshots the sample count into a new slot and // every query. Each ISSUE snapshots the sample count into a new slot and
// recovers the total by looking at differences between slots. // recovers the total by looking at differences between slots.
// END detection isn't sufficient here. // END detection isn't sufficient here.
if (cvars::query_occlusion_batched) { if (cvars::query_occlusion_querybatch_range > 0) {
// Mimic batched behavior by reporting a running count and writing it on // Mimic batched behavior by reporting a running count and writing it on
// every event. // every event.
const uint32_t step = std::max(uint32_t(1), samples); const uint32_t base =
batched_samples = std::min(batched_samples, UINT32_MAX - step) + step; static_cast<uint32_t>(cvars::query_occlusion_sample_lower_threshold);
const uint32_t range =
static_cast<uint32_t>(cvars::query_occlusion_querybatch_range);
if (batched_samples < base || batched_samples - base + 1 >= range) {
batched_samples = base;
} else {
++batched_samples;
}
pSampleCounts->ZPass_A = batched_samples; pSampleCounts->ZPass_A = batched_samples;
pSampleCounts->Total_A = batched_samples; pSampleCounts->Total_A = batched_samples;
} else if (is_end_via_z_pass || is_end_via_z_fail) { } else if (is_end_via_z_pass || is_end_via_z_fail) {