[GPU] EVENT_WRITE_ZPD batched sample accumulation cvar

This commit is contained in:
goldislead
2026-04-03 22:17:43 -07:00
committed by Radosław Gliński
parent 7e39a7018f
commit 9c00ce9366
3 changed files with 21 additions and 1 deletions

View File

@@ -955,6 +955,7 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_EVENT_WRITE_EXT(
}
static uint32_t samples = cvars::query_occlusion_sample_upper_threshold;
static uint32_t batched_samples = 0;
XE_NOINLINE
bool COMMAND_PROCESSOR::ExecutePacketType3_EVENT_WRITE_ZPD(
@@ -982,7 +983,19 @@ bool COMMAND_PROCESSOR::ExecutePacketType3_EVENT_WRITE_ZPD(
bool is_end_via_z_fail = pSampleCounts->ZFail_A == kQueryFinished &&
pSampleCounts->ZFail_B == kQueryFinished;
std::memset(pSampleCounts, 0, sizeof(xe_gpu_depth_sample_counts));
if (is_end_via_z_pass || is_end_via_z_fail) {
// Titles that use QueryBatch (4D5309B1, 4E4D0801) don't use an END result for
// every query. Each ISSUE snapshots the sample count into a new slot and
// recovers the total by looking at differences between slots.
// END detection isn't sufficient here.
if (cvars::query_occlusion_batched) {
// Mimic batched behavior by reporting a running count and writing it on
// every event.
const uint32_t step = std::max(uint32_t(1), samples);
batched_samples = std::min(batched_samples, UINT32_MAX - step) + step;
pSampleCounts->ZPass_A = batched_samples;
pSampleCounts->Total_A = batched_samples;
} else if (is_end_via_z_pass || is_end_via_z_fail) {
pSampleCounts->ZPass_A = samples;
pSampleCounts->Total_A = samples;
}