[MG_Impl, MG_IntegrationTest, ci] (P7): the first perturbation block's falsifier is the DirectVulkan entry

- measured with one block removed at a time: without the re-applied block both server halves drop to 1 (DirectGLES 1 / DirectVulkan 1, both entries red); without the first block DirectVulkan drops to 1 (red) while DirectGLES stays at 2 (green), because the GLES backend reads the pack field twice after the neutral pack is installed (3 = the saved-pack read + 2 post-install) and DirectVulkan once (2 = 1 + 1)
- so the >= 2 requirement falsifies the re-applied block on both backends and the first block on DirectVulkan; the CI step runs both backends and needs both, which it already does
- the scenario, hook and CI comments now say exactly that, instead of "removing either block drops it to 1"
This commit is contained in:
2026-09-22 23:02:08 -04:00
parent 403b566949
commit ffc4fb7d77
3 changed files with 15 additions and 5 deletions
+5 -2
View File
@@ -1099,8 +1099,11 @@ jobs:
# installs the neutral one, the backend's ReadPixels reads it after - and the hook perturbs
# its oracle once per read, because the ID-49 overwrite inside the window wipes the first
# perturbation before the second read's compare. A step satisfied by ONE line was satisfied
# by either perturbation alone and falsified neither; two is one per read, each falsified on
# its own. Measured at landing: 3 (DirectGLES) / 2 (DirectVulkan).
# by either perturbation alone and falsified neither. Measured at landing: 3 (DirectGLES,
# whose backend reads the field twice after the install) / 2 (DirectVulkan); without the
# re-applied perturbation both drop to 1, without the first one DirectVulkan drops to 1
# while DirectGLES stays at 2 - so BOTH backends are required, and the first perturbation's
# falsifier is the DirectVulkan entry.
#
# THE GREEN HALF is the lane run above: the same hook, the same window, with no corruption
# armed, across 1070 entries at zero divergences.
+5 -2
View File
@@ -779,8 +779,11 @@ namespace MobileGL::MG_Pipe {
// GetPixelStoreParameters cannot turn red - and a control that accepted ONE report
// would never notice, because the saved-pack read still reports through the block
// above. The VerifySplitReadCorrupted. entries and the CI step therefore require at
// least TWO `where=read` reports in the server half: one per block, each falsified
// alone (V1 fix round 2).
// least TWO `where=read` reports in the server half (V1 fix round 2). Measured: 3 on
// DirectGLES (its backend reads the field twice after the install) / 2 on
// DirectVulkan; without this block both drop to 1, without the block above
// DirectVulkan drops to 1 while DirectGLES's two post-install reports keep it at 2 -
// so this block is falsified on both backends and the one above on DirectVulkan.
if (g_verify.Corrupt && *g_verify.Corrupt == field) {
MGPipeApplyVerifyCorruption(g_readScratch, field);
}
@@ -380,7 +380,11 @@ void main() { o_color = vec4(0.25, 0.5, 0.75, 1.0); }
// after the window's overwrite can turn the post-install read red, because there the
// stored value IS the neutral pack. A control satisfied by ONE line is satisfied by
// either block alone and so falsified neither. Measured at landing the server half
// carries 3 (DirectGLES) / 2 (DirectVulkan); removing either block drops it to 1.
// carries 3 (DirectGLES: the saved-pack read and TWO post-install reads) / 2
// (DirectVulkan: one of each). Removing the re-applied block drops both backends to
// 1; removing the first block drops DirectVulkan to 1 and leaves DirectGLES at 2, so
// the first block's falsifier is the DirectVulkan entry - which is why the CI step
// runs both backends and needs both.
const std::size_t reads = CountReadReports(server, expected);
EXPECT_GE(reads, std::size_t{2})
<< "the server half carries " << reads << " `where=read` report(s) for " << expected