5.1 KiB
STEP20C GPU DCC recovery — EXPERIMENTAL, offline only
This versioned validator copies the executed historical validate.py,
analysis.py and test_fixture.py; exact parent paths/hashes are recorded in
provenance.json, and parent-delta.patch records their complete source delta.
The historical runner remains byte-identical and is deliberately not copied:
this scope has no admissible runtime acquisition gate or launcher. The two
runner-dependent controller tests are omitted from the copied test module;
31 inherited validator/model tests and five actual-G1 test methods run offline.
Generated reports, logs and payload remain in the new private LAB.
Exact bounded contract
The local authority is /usr/include/libdrm/drm_fourcc.h, SHA256
992f33804acda60b0b46f1a272942c3592484ea3217d469239f1cb12249de2eb.
Its AMD section assigns the main image to plane 0 and DCC to plane 1 when
DCC is enabled without RETILE. The same meaning was independently checked
against the primary Linux UAPI header.
That moving upstream reference corroborates the semantics; the local SHA pins
this fixture's actual source authority. The exact allowlisted modifier
020000001046bb04 has vendor AMD=2, tile-version GFX11=4, tile=27,
DCC=1, RETILE=0 and PIPE_ALIGN=1. Other nonzero modifiers are rejected.
For the four known packed 32-bit RGB formats, the image plane must have a
stride of at least width*4, divisible by four. The auxiliary DCC pitch is
nonzero uint32; it is not an image stride. Offsets and arithmetic are bounded
and the fixture restricts the metadata to image-before-auxiliary offsets.
This latter restriction is a bounded sanity filter, not a universal modifier
layout rule. Exported FD identities and allocation lengths are not observed.
No DCC alignment, tiled physical size, auxiliary extent or allocation bounds
are proved. An accepted plane record returns those explicit limitations.
The linear one-plane case is a synthetic regression control only; no new
non-DCC GPU run or qualification is claimed.
Actual G1 replay and second blocker
The replay reads only immutable epoch1 metadata/arm/payload and verifies their
fixed hashes. Nine native reads, offsets/ROIs, hashes, attachment channels,
context and all nine saved/restored GL/PACK state fields validate. The added
G1 envelope checks all 11 native writes and two copies, source/destination,
texture unit, sampler/matrix types, composition domains and native order.
A successful envelope is only structural evidence: it never replaces the
strict validate_epoch() result.
After the plane repair, the real epoch still rejects effective halfpixel.
For stages 0–2, glGetUniformfv published bits [983818240,987398144], while
float32 source expressions predict [983815946,987395086]. For stages 3–5,
observed bits are [967041024,970620928] versus [967038730,970617870].
Both shaders declare precision mediump float; the private hook queries
active uniforms with glGetUniformfv then preserves their bits. Quantization
is a possible explanation, not a proven diagnosis of these readings. No
post-observation tolerance or shader change is introduced, and the float64
ideal model is not upgraded into a GPU arithmetic model.
The hook itself explicitly says its alpha sentinel is not proof of GL read
success or restoration of the GL error queue. GL_ERROR_QUEUE=UNOBSERVED and
read_success=NOT_PROVEN remain immutable. Fixing those acquisition limits
would require a separately authorized diagnostic contract/build; this ticket
allows zero new compositor/GPU builds. Hence GPU_DCC_RUNTIME=NOT_RUN, no
runtime reservation and no new GPU runner. GPU_MODIFIER_AWARE_OFFLINE is
INCONCLUSIVE for the complete gate even though the isolated plane correction
and adversarial tests pass. Independent review remains pending.
Only A exists: no B or A-return is acquired. The sampled 16×16 U0/cache RGBA
bytes are exact; cache/presubmit differ. Neither observation establishes the
cause of a whole-output inequality, physical DCC correctness, precision loss,
or an A/B/A difference. GPU_WHOLE_FIELD_CAUSALITY=INCONCLUSIVE.
The original G1 outcome, exit1, cleanup limits and INCONCLUSIVE remain unchanged.
Reproduce without starting anything
From repository root (historical private evidence must still exist):
PYTHONDONTWRITEBYTECODE=1 python -m unittest discover \
-s tooling/probes/step20c-core-recovery/gpu-field -p 'test_*.py' -v
PYTHONDONTWRITEBYTECODE=1 python tooling/probes/step20c-core-recovery/gpu-field/replay.py
Mutation tests cover unknown formats/modifiers, wrong plane count, image/aux pitches, duplicated/overflowing offsets, missing fields, truncated/corrupt samples, read validity/sentinel, GL restoration/context/attachments, ROI/hash, missing copies/writes, source aliases, samplers and duplicate uniforms. The unchanged inherited suite additionally covers all nine restoration fields, clear/external write/lifetime events, blur order, region holes, ping-pong continuity, reconstruction and ideal-model negative predictions.