Repository navigation
AGC: sampled 2D MSAA image has no descriptor shape (PPSA99902 conditional startup) #3036
Description
Current frontier — 24 October2026 UTC
Completed latest Sonic run,26 October UTC: integration 2a9abe0f1e2e, frozen main504ea3b53b23, original #8223 revision331399 viae0908b02f3ad. Retained conversion and preserved fixes; composed-fork evidence.
This run reached menus, a loading screen and the Sonic transformation cinematic. Final complete image093 remains cinematic: no gameplay/control response was verified in this run. Planned1800s controlled stop (1801.153s), not a natural crash;94 sparse normal screenshots,4 controller pulses with8 native acknowledgements.0 logged driver refusals/watchdogs/fence-query failures/VUIDs/validation errors,18 known warnings.368 native files and9 retained executable/module/compiler paths match after stop. RTX5080/610.62, Windows11 Enterprise26200, loaded Khronos1.4.363.
The active ordinary user configuration changed only ShadowResolution8192→2048, retaining8xMSAA. Source and accepted cache namespace also changed; this is not an isolated setting-performance comparison and establishes no FPS benefit. No guard was relaxed.
Best recent interactive result remains the earlier a5ec/main1c90 run: normal input followed by visible movement and RING ENERGY000→001; sustained gameplay untested. Historical32rings remains separately pinned. This later cinematic-only cap neither replaces those results nor establishes a regression. #3036's conditional descriptor refusal remains unresolved. Completed new-run evidence; previous movement, cold/warm and timing evidence retain their own pins in the same Gist. AI-assisted:yes(Codex).
Earlier pinned frontier — main6887
Fork 4be86c9874, incorporating frozen main 68871895d477159d12e6fc1f0bd01efa3f4e936c, reached Continue and the opening cinematic, then tutorial NOW LOADING after an ordinary Options skip; no gameplay observed. Final capture140 still shows that loading screen, rather than the preceding run's black final capture. Natural SIGABRT/0xc0000409 after 426.199 seconds, before the2700-second cap. Existing #3036 descriptor-refusal family: type14/format71, non-R128, fragmentsLog2=3, maxMip=4; current shader address 0x20bcb6e00 differs from the prior run, so identical shader bytes are not established. Zero Vulkan validation errors/VUIDs;18 warnings (10 fragment-output mismatch,8 layer-count compatibility).13 guest watchdogs,7 failed-fence calls,3 not-ready queries;0 snapshot/live-memory mismatch messages. All368 libraries and retained application hashes rechecked. Composed-fork evidence, not unchanged-main playability; historical32-ring gameplay remains preserved. Exact run,error and limits.
Narrow reference update: the separate NBC MAX_MIP override already noted below requires a block-compressed parent image and non-compressed view. At public PS5_Mesa revision 0b2d6d1a61d9bbf89cf8beb88a696144f67c61f8 (matching the recorded ELF revision string), ordinary RADV advertises only one sample for that compressed parent. Thus that exception does not explain the observed unequal MSAA fields through ordinary legal image/view creation. Pinned source chain and Vulkan requirement. The marker does not prove binary function identity, descriptor provenance/access eligibility or a root cause; no guard change is justified.
Diagnostic finding: word3 is flattened slot11 / memory3 / byte offset12; word5 is slot13 / memory5 / byte offset20. Both are ScalarAddress reads at PC8 from the same printed address-resource expression, using user-data register2. This is the expected eight-byte spacing between descriptor words3 and5; it does not show a duplicated-word load or establish descriptor provenance, capture-time correctness, console validity or a root cause. Focused diagnostic-only fork diff. No extra guest read/evaluation or descriptor-guard change.
Earlier title observations
2026-10-23 title run: integration3bb9bcd237, on main 7b32a842f879f32a39f0412161ddb8e9ba3e3a9a, reaches 32 rings, tutorial dismissal, raised platforms and interaction with the pots. Full functional report, input log, telemetry and capture hashes. The retained008e application/guest-libc conversion and367 rebuilt native libraries are hash-verified; resources/save directories are independent copies. Older b9b8/main834 and137 gameplay runtimes remain preserved.
The title ran on RTX5080/NVIDIA610.62, Windows11 Enterprise26200, with Khronos1.4.363 loaded and SRT verification/draw profiling unset. It stopped at the planned1500s cap (1502.466s including shutdown), not a natural crash. Same14 known warnings (10fragment-output mismatch,4layer-count);0 validation errors/VUIDs, no failed-request file. Nonfatal guest-wait qualification: two10-second RADV/PS5 submission-watchdog messages, one fence error (0xFFFFFFFC) and one query-not-ready result (0x1) occur during gameplay; rendering continues afterward through32rings. Full context and pinned public-source explanation, tracked in existing #7260. The delay's cause remains unresolved; this does not establish native NVIDIA device loss or a regression caused by the cache correction. Zero validation errors does not mean all API calls succeeded. Before the run, the full native build and7 selected component processes pass:1CPU plus6 actual-GPU checks across NVIDIA/AMD. The AMD results are component checks, not a second title run.
Final VideoOut estimate:9.63FPS;600 presentations over62.914s give9.537presentations/s near the end. Validation, captures and telemetry were enabled, and background CPU build/analysis occurred during part of the run. This is an initial controlled gameplay observation, with no paired speed, unchanged-main playability or completion claim.
Source refresh after the run: integrationa7accec052, on main 9a030c2d504965cc646091030eaade1fd4a8b8d0, passes the full native build and4 fresh CPU checks for queued code writes, getrlimit, setrlimit and internal module info. Exact source-equality proof and full CPU logs. Actual integration AGC/shader/libc/dependency source is unchanged, so the7 earlier component results retain their3bb9 pins and are reused. No title run or FPS claim on a7ac.
Earlier detailed gameplay baseline:
Integration 13763c60975bfc447cf07e0c994cc01ff72d4c1e incorporates main 24c6cc33f090296ab90dc154abdfb9ef548fc923, our preserved bring-up fixes, exact #8223 head 263ec0a2ba and the provisional publication-retirement adaptation below. It retains the008e application/guest-libc conversion and deploys367 newly rebuilt, hash-verified native libraries. Import audit:602 classified implemented/9 stubs/0 absent, no missing native dependencies; classification is not proof of complete API behavior.
Resources/config/data/save are independent copies of the frozen7de runtime's post-run state, the same source used to initialize the previous593 run. AnyPS5 shader_cache initially absent; guest RADV caches retained with app0, default new journal, host-driver cache uncontrolled. Actual RTX5080/NVIDIA610.62, Windows11 Enterprise26200, WinLibs GCC15.2r7/UCRT Release; physical device and inserted Khronos1.4.363 layer verified. Both SRT verification and draw profiling are unset, with zero verifier log lines. Vulkan validation, sparse captures and presentation telemetry remain enabled. This differs from the earlier593 verification-enabled diagnostic run.
Observed route: PRESS START → autosave/CONTINUE → opening cinematic → Options skip → tutorial loading → rendered Werehog/Chip scene → daytime gameplay. Short and2-second Options attempts did not visibly skip the rendered story scene; it subsequently completed. That is an input observation, not a diagnosed API bug.
| Retained capture | Observed result |
|---|---|
| frame161,717.9s capture clock | Sonic and gameplay HUD,0 rings, before stick input |
| frame166,772.8s | Forward movement visible,2 rings and Chip tutorial dialogue |
| frame169,799.7s | 12 rings and tutorial dismissed after Cross |
| frames174/179,841.2s/885.2s | Further forward movement along the path,12 rings retained |
Input uses documented tools/pad_input.py through an isolated command file: left stick128/0 for5s and Cross. An initial8s request was rejected by the helper before writing input, then corrected to its5s limit; it is excluded from delivered-input evidence. The runner stopped at its 900-second cap (902.103s including shutdown), not a natural crash. No earlier descriptor refusal, guest submission-wait warning, failed fence/query call, driver failure or failed shader-request file occurred within this observation.
**Remaining diagnostics/performance:**10 fragment-output mismatch +4 layer-count compatibility warnings;0 VUIDs/validation errors. The last VideoOut window-title estimate is 7.33 FPS;390 presentations over the final56.353s give6.92 presentations/s during daytime gameplay. These are presentation measurements with validation/captures/telemetry enabled, not a paired speed comparison or claim of smooth/sustained play. Main, dependencies, saves and caches are explicit confounders; this result does not identify which change advanced the frontier or prove the old descriptor shape valid. Its strict guard remains unchanged.
Warm-restart performance probe completed: at the same137 executable path/source, the initial daytime area (0 rings/no input during the window) records60 presents over6.119s, frame p50 100.518ms, p90 109.631ms, p99/max118.091ms; queue worker0x0 98.744% busy, GPU46.012ms/present. Inclusive full-window counters include Graphics.Draw64.174ms/present and Driver.Draw.shader_compile_and_link37.696ms/present; these overlap other scopes and must not be added. This identifies substantial host-side work without identifying a single cause.
Public official summary/digest and qualified prefix analysis. Protocol: exact137 warm restart, no redirected log (stdout/stderr verified console character handles), only APS5_TRACE_FRAMES=10020:60, no profiling/SRT verification; Vulkan validation layer unset for this timing probe. Sparse readbacks occur outside the window; before/after captures show the same gameplay area. Driver caches retained as found; no paired speed claim. Limit: the queue event buffer fills at4.628s,84,926 slices lost; totals tables remain complete. The derived first30-present interval is3.061s and precedes event loss, but excludes folded sub20us durations and is not an independent capture or replacement summary. The full original trace is now public in that gist as exact uncompressed JSON (42,827,872bytes), with compressed/payload hashes in trace-manifest.json; a fresh remote clone matches the payload hash. Follow the README clone instructions for the full file because large web/API previews truncate it. The original gzip remains preserved locally; the dropped-event limits above remain unchanged. No validation-clean claim comes from this layer-disabled probe.
Retained raw-snapshot reuse: tracked separately in #9998, with the reproduction, focused fork fix97b5025488, full synthetic logs and paired traces. The fix is refreshed to main 01f99305be; unchanged AGC/shader/dependency source permits reuse of the explicitly pinned main7b32/change21-process matrices, and the refreshed full native build/queued-write smoke check pass. The two test-only GPU controls fail at the intended eviction assertion; changed main/tail code and queued writes still invalidate retained decodes. Both older composed runtimes reach movement,12 rings and tutorial interaction. The single matched30-present main834 composition pair is an observation with documented confounders, not unchanged-main or general speed evidence; no title eviction-frequency counter was captured. #9899-first coordination remains pending. Cache capacity/guards are unchanged.
General owner-retirement correction prepared
The maintainer-requested #6973 adaptation and complete controls are now prepared on our fork, building on @savvaniss's #8223. Candidate e23d5c5d9a retires an owner proved claimed or written since last use before publishing stale host samples. It also claims an overlapping replacement owner before our initialization reads. Snapshot-race refusals remain strict; this does not implement general live-alias coherence.
On the test-only composed baseline,8 reused-owner executions fail for the intended overwrite/refusal reasons and4 live controls pass. With the fix, 44/44 GPU processes pass across actual NVIDIA RTX5080/610.62 and AMD Radeon(TM) Graphics/32.0.21036.18: live/claimed/written × explicit/CPU publication,3 repetitions per GPU, plus native-FMASK, broader target-retirement and existing publication controls. Zero validation warnings/errors/VUIDs, skips or timeouts; every process under2.01s. This is a composed-fork regression comparison, not literal unchanged-main or a standalone-PR title control. Source pins, analysis advisories and the additional merge-order control are in the linked reply.
The published five-PR stack remains unchanged and awaits #8223 first, as requested. Afterwards it will be refreshed parent-first and qualified for the final gate. The provisional fix is retained in the title integration; it is not claimed to be present in upstream main or the current published PR heads.
At137/main24c6, explicit native-library/affected-fixture builds, conventions and 4/4 focused CPU processes pass: screenshot paths, instrumentation/query sizes, LibreSSL digests and POSIX filesystem wrappers. These follow the latest upstream changes. Retirement code/fixture are unchanged from the qualifiede23/593 composition, so its44-GPU matrix and593's11-component integration checks retain their actual pins; they are not relabeled as new137 tests. The previous717/main853 component-only refresh and593/main8aa600-second story-scene diagnostic remain preserved, superseded as title evidence by the ordinary-SRT gameplay run above.
Post-gameplay refresh: pushed integration2f68230324, incorporating main fcd455870cb9610d929f744719a4d20ffd544499. Native-library/affected-fixture builds, conventions and4 focused processes pass: graphics/descriptor and diagnostic-API CPU groups, plus native-FMASK on actual NVIDIA and AMD GPUs. Zero validation warnings/errors/VUIDs/skips/timeouts. Component-only refresh: the gameplay runtime remains137/main24c6; no title run on2f is claimed.
Earlier descriptor stop and source-provenance findings — retained at their actual pins
At 7de82e73ca/main1a745ae38e, the same retained conversion naturally exits0xC0000409 at283.129s during loading. A failure-only, unsynchronized comparison establishes that the complete64-byte captured table at0x20bd850b0 equals mapped raw memory immediately after failure; the132-byte header matches too. That weakens stale captured bytes as the explanation for this observation, but does not prove the earlier writer, binding lifetime or correct guest construction. The private3884-byte request independently reproduces the refusal with agc_shader_replay --materialize in0.298s without game/Vulkan execution. No game code/assets/request is public.
shader0x20bcb6d00, stage5 Fragment: runtime image descriptor is invalid
image1/source1, type14/format71, R128=0, read1/write0/atomic0
baseLevel0, fragmentsLog2=3, maxMip4, 3840x2160
levelUses2, fmaskCompatible1, samplerFree1, firstUsePc72
plannedDimension6, activeSource1, activeImage1
controlFlowBlocks0, compactValues101, tapeReady1, tapeCompiled1
405fc0c0 c4700000 821bc3bf e1b30fac
09596314 001c0040 00083c76 11014fac
That older run has2 RADV completion-wait warnings, one failed fence wait, one failed query-result call and the same10+4 validation-warning families. The pinned Mesa completion wait / sync error mapping explains the guest diagnostic without proving host-driver device loss. Those errors did not recur within the newer bounded run.
Synthetic test988aecbcc9, on main9e568a389b, preserves all eight image words through a16-dword SRT load. Valid2x/4x/8x controls materialize, buffer-shaped trailing words retain the existing refusal, then restored valid words succeed. Focused mode and3/3 full shader-memory groups pass with both verifiers. This contains no game code and is not a capability fix. Earlier713 request mapping identifies the table's first eight words as the rejected descriptor; levelUses2 is a plain texel load, not query-only use. Neither #8518 nor #8077 is a confirmed direct fix.
Provenance clarified: rechecking the original104,214,776-byte ELF (SHA256 c34f5b0848ef49e96a855076d8254254047e966e4fe56589d0e504fe13828479) confirms embedded Mesa revision 0b2d6d1a61d9bbf89cf8beb88a696144f67c61f8, file offset0x390ebb7, matching our earlier marker report. The game's own source revision remains unconfirmed; a version marker alone does not prove function-for-function binary identity.
The pinned Prospero one-mip view creation routes through Plume setTexture/setDescriptor to descriptor updates. Mesa's writer copies32/64bytes; its descriptor lowering uses8 image dwords and a32-byte FMASK offset. These inspected reference paths do not justify discarding the trailing four words or relaxing the non-R128 MSAA field guard. No failing-function identity or specific producer bug is established.
Next: collect focused native worker/committer stack evidence in gameplay, then test the corresponding source-level bottleneck with a synthetic control and existing overlapping work before proposing a correction. Keep extending bounded gameplay to identify the next actual stop; no new hard blocker occurred within this run. Central bring-up record #4443 tracks the maintained fixes/merge order. This issue remains open; unchanged-main playability is not established. AI-assisted:yes (Codex); author responsible.
Previous frontier and descriptor/reference investigation (2026-10-21; original pins retained)
Prior validation - 2026-10-21 UTC
The original missing-descriptor-shape reproduction is historical. Merged #4820 supports its narrow matching host-rendered 2D MSAA color-target case; the broader sampled-resource paths below retain separate limits. This issue remains open as that investigation's tracker, not a claim that #4820 failed to implement its documented scope.
Latest source: experimental integration 2e844131db, main 7d7b097407. Matching fresh application/guest-libc conversion and 354 patched runtime libraries. These are composed-fork title results, not unchanged-main controls.
| Ordinary RTX 5080 replay | Last observed scene / stop | Retained diagnostics |
|---|---|---|
| Default diagnostics | Level-loading tutorial; natural 0xC0000409 at 243.192 s. guest memory is not readable at 0x2017c0000 (range 0x2017c0000+0x4) |
Three guest submission watchdogs, two failed fence waits, one query-result failure. The generic message does not identify the read's owner/stage. |
Same source/runtime bytes; existing APS5_TRACE_UNREADABLE=1 logger |
Loading, then final black screen; natural 0xC0000409 at 338.106 s. Fragment capture (verified stage 5) rejects the descriptor below. |
Twelve guest watchdogs, six failed waits, two query failures. No unreadable-read diagnostic; the first error did not repeat. |
Second stop, shader 0x20be36f00:
runtime image descriptor is invalid (image 1, type 14, format 71, r128 0, read 1, written 0, atomic 0, baseLevel 0, fragmentsLog2 3, maxMip 4)
[source 1, firstUsePc 72, plannedDimension 6, activeSource 1, activeImage 1, controlFlowBlocks 0]
validImageDescriptor explicitly requires MAX_MIP==fragmentsLog2 for non-R128 MSAA descriptors. That explains this rejection; it does not establish that the descriptor should be accessed, its console semantics, or a justified relaxation. Public reference check: AMD RDNA2 ISA 70648, section 8.2.6/Table45 documents the MSAA field roles. More explicitly, AMD PAL c5e800072a, CreateImageViewSrds sets both LAST_LEVEL and MAX_MIP to Log2(imageCreateInfo.fragments) for a multisampled image and distinguishes this from the documentation's sample-count wording. The ordinary Mesa GFX10 path at 418c4cfa67 likewise derives both from one count, with a separate NBC-view override. These references give no justification for relaxing this guard merely by interpreting the unequal fields as coverage versus fragment counts; they do not establish PS5 behavior for every custom descriptor or prove the title's descriptor should be accessed.
Existing resource-branch planning #8518 and descriptor-web work #8077 are overlaps to inspect, not confirmed Sonic fixes. No new issue or competing PR is proposed from this observation alone.
Identity/limits: PPSA99902 version 01.003.000, Windows 11 Enterprise 26200, RTX 5080 / NVIDIA 610.62, Ryzen 9950X3D, 31 GiB RAM. Menu/autosave/CONTINUE and opening cinematic observed in both runs; Options skips the cinematic. Initially empty app cache/default journal; driver cache uncontrolled. Both runs verify restoration of all 154 prior runtime/data files and unchanged original inputs/configs; the second restoration was independently rehashed afterwards. Zero logged VUIDs/validation errors/warnings; the guest watchdog/wait failures still make both unclean runs. No gameplay observed in these runs and no FPS/speed comparison. Maintained discussion #4443 records log hashes, component qualification and the source/runtime distinctions.
Preserved historical milestone: fork 0e7fba38b5 on main 5057673804 reached initial interactive daytime gameplay, movement, tutorial dismissal and seven rings (HUD 00:18:37). That source/capture evidence remains preserved; it is not relabeled as a current-main or current-head result. Other precise gaps retain their own reports, including depth #3262, compressed metadata #3219, buffer aliases #6480/#6625 and extra mips #7066.
The older progress chronology was condensed here; the original resource reproduction and controls remain below, and source-specific reports/fork history remain linked. Next: compare authoritative descriptor semantics and the branch-planning overlap, then select a focused synthetic control before changing production behavior. AI-assisted: yes (Codex); author responsible.
Original sampled-resource evidence and earlier controls (historical source pins)
Retained sampled-resource evidence
Current status — sampled MSAA color resources
The originally reported runtime could not materialize a sampled 2D MSAA image: DescriptorBindingBuilder::Populate multisampled image resources have no descriptor image shape. The fork implementation preserves samples and passes that boundary in conditional PPSA99902 startup. Latest local title-screen evidence is below; this update does not revalidate unchanged current main.
Color-path checkpoint: c0113cde2, based on upstream a11c8f7f70a0ed4e71504a89de69e8cdae687817 (2026-10-11). It carries math/kernel/D64 prerequisites, uncompressed MSAA reads and uniform DCC snapshots. Historical depth/render/FMASK/BDA overlays are not carried. No new PR was created.
Latest fork integration08891d938 retains the validated native depth support and adds immutable native GPU color snapshots plus recognition of the captured11-word constant metadata-fill kernel. The first snapshot-only profile reproduced a dirty-target metadata refusal; two private captures and pinned Mesa source identify full DCC=00/CMASK=CC fills. Known full clears now apply to the retained native image only after completion/coverage/CPU/pending/sample/write-serial checks. Uncertain transitions still fail explicitly; actual CPU reads retain sample-preserving publication.
Full build/libs/registration/conventions pass; 16 relevant groups ×5/full recorder ×5,96 snapshot configurations,72 recompiler GPU constant-fill configurations,14 faults ×5. Full872 suite:867pass/0fail/5 explicit skips, maximum15.4859s. Frozen before/restored profiles fail29.130/30.682s; changed normal runs reach60s without fatal output. A separate180s observer captures PRESS START,1895 snapshot lookups/947 clear imports and zero dirty guest publications. These counts are not FPS; interactive gameplay, audio, rendering accuracy, console/AMD equivalence and Linux/lavapipe remain unverified. Pinned a672 integration, not unchanged upstream main.
Canonical current evidence, source provenance, controls and limitations. Controlled input verifies the autosave notice and NEW GAME menu; the later480.719s/43-frame observation shows several later opening-cinematic scenes after four verified input pulses, with no fatal diagnostic. Interactive gameplay remains unverified. A separate frozen pre-snapshotcfc9b0411 parent control (481.207s/43 frames) also shows a fully visible Next dialog with no visible body text: this observation predates134/088; cause untraced, no new defect claimed. Observer/reverted sources restored byte-for-byte; full build/libs and four relevant groups ×5 pass. Original/module/converted libc/exact123-file baseline and empty working saves/config/marker restored. Captures/generated saves stay private; no production change in the observation; validated integration now pushed to the fork, no new PR. The longer run now reaches post-movie NOW LOADING, then fails at dithered/rounded alpha-to-coverage0x18701: new issue4285,764.735s/C0000409/not a timeout,71 private captures, exact mode refusal5/5. No interactive gameplay; same guard checked in current main source, not whole-main startup. Original/runtime/working state restored. Measured presentation-counter FPS by phase and limits are in the canonical report; next requested validation is discussion2242 on Windows/RTX5080.
Proposed implementation: native GPU snapshots plus completed constant metadata clears/allocation accounting; depends on earlier MSAA foundation, not standalone current-main patches. Exact088 full build/libs/registration/conventions, seven groups ×5 and fresh full872 suite867pass/0fail/5skip (max15.5141s) verified before fork push. The fixture correction is now merged upstream via #4159; no extra fixture PR proposed.
Reproduction and resource evidence
Sonic Unleashed Recompiled, PPSA99902, 01.003.000. Windows 11 Enterprise 26200, Ryzen 9950X3D, RTX 5080 / driver 32.0.16.1062; WinLibs GCC 15.2r7, Release / BUILD_TESTING=ON.
Fresh capture on the earlier main0f863-based stack identified Pixel, physical binding68/logical kind5, read-only Sampled/Float, Dim2DMsaa, first-use PC 0x48; selected and physical modes agree, and all ten candidate modes retain MSAA. Descriptor:
405fc080 c4700000 821bc3bf e1b30fac 00000000 00400030 406b0000 0040819f
Type14, format71/RGBA16_FLOAT, 3840×2160, 8 fragments, R_X. The earlier shader capture uses ordinary IMAGE_LOAD opcode0/dimension6, not #790's IMAGE_MSAA_LOAD opcode0x80. LAST_LEVEL=3 encodes eight fragments and one mip under pinned PAL descriptor semantics.
A game-independent CPU reproduction creates a read-only Sampled/Float ImageResource with Dim2DMsaa, calls ResourceMaterializer::PrepareImageModes, supplies these eight words in a ResourceSnapshot, selects RuntimeImageMode, and calls DescriptorBindingBuilder::Prepare with the resulting binding layout. Current-main0f863 MS2D/MS-array cases refuse 5/5 each; derived single-sample 2D/array controls prepare 5/5 each. Single-sample controls were never injected into the title. The historical physical binding5 report predates stage partitioning; binding68 is expected from63+5, not a binding bug.
Proposed solution and reusable tests
- Uncompressed MSAA upload/runtime: preserve fragment planes, numeric format and array views. Unsupported capabilities throw.
- Real recompiled RDNA IMAGE_LOAD regression, extended by c0113cde2 to verify DCC state changes through production lookup.
- Uniform DCC subset: full metadata range must be uniform;
00/40/80/C0clear states orFFraw/uncompressed. Fresh synchronized snapshots preserve samples. Mixed metadata, register/single-pixel clears, general compressed blocks, other models and depth remain refused. These commits depend on the fork's MSAA foundation, not standalone unchanged-main patches.
Source model: PAL c5e80007, PS5 Mesa winsys and clear codes. Declared GFX10 non-RB+ configuration 0x00100044, revision0x82,16 pipes/256B interleave/two compressed fragments. This is source consistency, not console measurement; assumptions remain in TechnicalDebt. No new runtime reference dependency.
Latest validation
- Exact production layout versus unchanged PAL:216 geometries /3,527,968 byte addresses per run, five runs under each of two synthetic GFX10 configurations; zero differences. DCC geometry:900 cases×5, including boundaries through16384² and layers1/3/17/8192. Above4GiB, compare PAL per-slice size×layers in64-bit; its total field is32-bit. Wrong8-pipe configuration was detected.
agc_driver_image_multisample: R32_UINT and finite RGBA16_FLOAT,2/4/8 fragments,2D and array/base-array views.18 uncompressed cases plus18 DCC configurations×8 successive states =162 cases/run, all×5 pass. Reused addresses, changed raw texels underFF, both alpha encodings, cross-block coordinates and all four components are checked. Forced sample-zero and wrong0001→0000mutants were caught; production source restored/rebuilt/retested.- Full build/all122 patched libraries, conventions and registration pass.56 relevant groups×5 =280 passes/no skips. Full842 tests:835 pass/5 skip/2 fail: Windows exception frames, unsupported sRGB sampling. The separately reproduced intermittent heap failure is unresolved. These are integration results, not unchanged-main controls.
| Conditional title control | First fatal guard | Seconds |
|---|---|---|
| Before uniform DCC | compressed multisampled snapshot | 28.477 /28.985 |
| After | descriptor word6 bit10 / MSAA depth | 29.826 /29.523 |
| Restored-source control | same depth guard | 29.282 |
Same guarded f609 executable/converted guest libc; not a fresh a11 relink or unchanged-main startup. Full122-library profiles differ in8 relinked modules,114 byte-identical; no AGC-only attribution. All enter guest code, exit0xC0000409, no60s timeout. Vulkan required, shader cache disabled, other recorded bypass flags absent. Original game ELFs, exact123-library baseline and saved guest module restored/hash-verified. Temporary diagnostic source removed byte-for-byte; three rebuilt DLLs differ only in PE timestamps/checksums.
Remaining scope
The bounded numeric depth/HTILE path is now refreshed in fork7b70443c0. It passes the depth guard in two controlled runs and reaches the raster-MSAA refusal; current depth tests, full-suite results and remaining limits are maintained in #3262. Color-specific validation above remains attributed to parentc0113cde2; CMASK/FMASK semantics in #3219; render/resolve findings in our #419 report. #419 deliberately refuses sampled host-only MSAA storage. No sample collapse, descriptor-bit bypass or guest metadata rewrite is a substitute for implementation.
This body is the maintained current report; earlier comments retain only distinct historical evidence/corrections. AI-assisted code, investigation and reporting: Codex. No proprietary shader/dump attached; no Linux/lavapipe or PS5/AMD hardware validation claim.
Activity
Amoenus commentedon Oct 10, 2026
Historical shader classification (main262c0316)
Distinct evidence retained here; the maintained implementation/validation report is now the issue body.
At local aggregate61e16ab7, a guard-preserving capture identified eight ordinary
IMAGE_LOADinstructions (opcode0,2DMSAA, dmaskF), PCs48/98/A4/B0/BC/C8/D4/E0. A preceding2D load atPC24 reads a separate FMASK descriptor, format166/S8_F8. This differs from #790's opcode80IMAGE_MSAA_LOAD. Full captured-requestRecompilerefused5/5;PrepareShaderalone succeeded and was insufficient validation.Historical native storage-write/sample-fetch feasibility probe: six small2/4/8-sample/array cases×5 pass, forced-sample-zero control fails. This established transport feasibility, not guest tiling/coherence. Later production RDNA tests supersede this probe; see the issue body. This evidence remains attributed to the historical stack, not current capture. AI-assisted; diagnostic removed, baseline restored, no gameplay/console-equivalence claim.
Amoenus commentedon Oct 10, 2026
Historical layout and metadata observation (maindc105f8a)
Current code links, independent layout tests and title controls are maintained in the issue body.
Historical layout-only aggregate1cfd724c still stopped at the descriptor-shape guard in5/5 runs; adding a helper without runtime integration did not advance startup. Two synchronized captures covered33,423,360 FMASK bytes, all
0x76543210. This is a raw byte pattern, not proof of effective identity sampling: later CMASK captures containedCC, which changes interpretation. That distinct correctness gap belongs to #3219.Earlier console-configuration uncertainty is superseded by the source/binary-correlated driver model in the DCC correction comment, still not a console hardware measurement. AI-assisted; original/baseline restored, no rendering claim.
Amoenus commentedon Oct 10, 2026
Historical runtime milestone and corrected DCC estimate (main379d8b4e)
The first uncompressed-MSAA integration passed the descriptor-shape refusal and reached
compressed multisampled texture snapshot is not implementedin three conditional title runs:28.811/29.256/29.187s. This was AGC-only with119 other libraries identical, not completed startup. Current implementation, tests and limits are maintained in the issue body.Correction: the original2,088,960-byte DCC estimate assumed a maximum of eight compressed fragments. Texture fragments alone do not establish this. The source/binary-correlated two-compressed-fragment model yields552,960 bytes; evidence and limits. Do not use the old estimate as the title's metadata extent. AI-assisted; no gameplay or console-equivalence claim.
Amoenus commentedon Oct 10, 2026
Retained correction: DCC size and CMASK interpretation
The maintained current solution, tests and startup comparison are in the issue body. This comment preserves the correction to earlier estimates and the distinct source/binary evidence.
Unchanged PAL GetMetaBlkSize limits metadata sample bits by the compressed-fragment limit. For3840×2160/64-bit/8-fragment R_X, the tested limits1/2/4/8 produce294,912 /552,960 /1,044,480 /2,088,960 DCC bytes. The old largest estimate was not justified by the texture's eight fragments.
The original ELF contains Mesa revision
0b2d6d1a61d9bbf89cf8beb88a696144f67c61f8, matching the public PS5-port build script; exact title-source revision is unconfirmed. Static inspection confirmed the0x00100044setter and dataflow into the driver's GB configuration, matching pinned winsys. Its compressed-fragment limit is two. PAL with this config/revision82 gives552,960 bytes,5/5 checks; wrong-limit control caught. This is compiled-driver/source correlation, not measured console layout.Two earlier oversized captures hit an unreadable page557,056 bytes from the base. That readable tail is4,096 bytes beyond calculated DCC; its purpose is unknown. Mapping size alone never proved the configuration. Complete historical color captures were zero and could not distinguish fragment permutations. PAL's public multisampled DCC address API remains unsupported; no single-fragment substitute was used.
Two later complete CMASK captures:81,920 bytes all
CC; raw FMASK remained the expanded identity pattern. PAL definesCC as DCC fast-clear/FMASK pointers zero. Raw FMASK identity is not logical identity. Separate emitter/model finding: #3219.Validation correction retained: presence-tested flags remain enabled when set to empty. One supplementary capture/restored control was excluded and repeated with flags genuinely absent; readable-color/metadata observations and refusal reproduced. The external harness now rejects empty controls (13 negative preflights). Historical logs remain archived.
Subsequent uniform-DCC snapshots passed the color guard; current evidence is in the issue body, fresh depth gap in #3262. Temporary diagnostics removed and original/baseline restored/hash-verified. AI-assisted; no console/gameplay claim. Earlier local-only status was historical; reviewed experimental work is now preserved in the fork without new PRs.
reyani-dev commentedon Oct 12, 2026
Another title that reaches this: ProsperoPuzzles (PPSA99006), an open-source catalog title on blackbearreloaded/ps5-opengl. On
mainit stops one draw earlier, on its single-sample scan into a 4x color target (CB_COLOR0_ATTRIB0x00012000,PA_SC_AA_CONFIG0,MSAA_ENABLEoff). #4414 handles that, and the title then stops here when it samples that 4x image:Windows 11, RTX 4070,
main9bc3623 + #4414. It's free to download, so it may be an easier check than PPSA99902 for whatever lands for this.nicolasabosch commentedon Oct 12, 2026
I have a branch for the narrow case ProsperoPuzzles (PPSA99006) reaches here, and I'd like to check it does not collide with @Amoenus's work before opening a pull request.
Scope. Only this: a shader loads from a 2D multisampled image whose T# (type 14) names a color target that draws on the host rendered with the same size, format and sample count.
DescriptorBindingBuildergives a 2D multisampled image its own descriptor shape instead of throwing. Multisampled arrays still throw.DecodeTextureResourcedecodes type 14, with the sample count fromLAST_LEVEL(andMAX_MIPrequired to hold the same value), asac_build_gfx10_texture_descriptorwrites them in Mesasrc/amd/common/ac_descriptors.c(1e2c42b6).Not in it. Everything the PPSA99902 work in this issue covers stays as it is and keeps throwing: multisampled textures that are not a host-rendered target (CPU-written samples, snapshots), FMASK, CMASK/DCC-compressed samples (a pending CMASK fast clear throws), EQAA, multisampled depth, multisampled arrays, storage access, and sampling the target a draw is rendering to.
Tested. Windows 11, RTX 4070 Laptop, WinLibs GCC 15.2.0 r7, Release, on
mainee4962190(fullctest: 1019 passed, 8 skipped, 0 failed):image_load; each of the 1017 samples clear of the triangle's edges matches the triangle's coverage at that sample's location.multisampled image resources have no descriptor image shape. It does not present yet: its next stop is the multisample guard range covering a neighbouring surface (a CPU read of 0x21f400000+0x90000 overlaps multisampled color target 0x21f200000+0x240000), which fix(agc): size multisample guest guards by fragment blocks #4199 addresses. I did not test with fix(agc): size multisample guest guards by fragment blocks #4199.@Amoenus, does this overlap with what you plan to submit, and would you rather it went in first, after yours, or not at all?
AI-assisted: yes (Claude Code).
Amoenus commentedon Oct 13, 2026
@nicolasabosch Sorry for the delayed reply. I see this is now #4820; please proceed independently. I would prefer that narrow, current-main contribution to land first, then adapt our remaining work around it.
There is shared implementation territory—MSAA descriptor shape/type-14 decoding and the sampled-resource lookup—but our broader fork is not an upstream PR that your change needs to wait for. Your direct view of an existing host-rendered target differs from our sample-preserving guest uploads and immutable native snapshots, including the additional metadata-clear/coherence paths described in this issue. I will avoid submitting a duplicate of your supported subset.
I checked the current #4820 diff (
cc63a8c81). Its explicit refusals and exclusion of multisample-source resources from template reuse preserve a useful boundary for later work. Shared lookup/target code will need reconciliation when carrying the broader paths; that is integration work, not a dependency on our fork.For PPSA99902, our captured resource is RGBA16F, 3840×2160, eight fragments, with CMASK/DCC transitions. The recent conditional run also exposed target-address reuse; that investigation and #4474 validation are maintained in the bring-up report. Your 4x target test and PPSA99006 result do not establish those additional cases, and I have not independently built/tested #4820 or combined it with #4199 yet. No request to expand your PR to cover them.
AI-assisted investigation/reporting: Codex.
Amoenus commentedon Oct 23, 2026
Latest completed Sonic run — 24 October2026 UTC
Integration5fd69399558c, based on mainc8d34aa8f4: PRESS START → cinematic → tutorial NOW LOADING; no visible gameplay. With aggregate waits/driver logs and summary-only profiling, natural SIGABRT/0xc0000409 after336.222s at the known
runtime image descriptor is invalidrefusal: type14/format71,r128=0,fragmentsLog2=3,maxMip=4. Final sparse frame011 shows the tutorial loading screen.All374deployment pins match; RTX5080/610.62 with loaded Khronos1.4.363:0VUID/errors,18warnings,14guest watchdogs,8failed fence waits,3query failures. Four controller pulses acknowledged. The preceding plain run on the same source stalled after the skip and hit its1800-second cap; that stall did not recur with these different diagnostics/cadence. No isolated-cause, speedup or unchanged-main claim. Bring-up report. Historical gameplay remains preserved. Separate capture overflow: #10753.
The descriptor guard remains intact; no corrective semantics are established. Full new error/logs are retained locally. Detailed attachment publication was rejected by automatic approval review; no new attachment is claimed. Existing earlier reference/provenance analysis below remains applicable. AI-assisted: yes(Codex).
Historical source comparison, 24 October: the entire
validImageDescriptorfunction is byte-for-byte identical at the 32-ring gameplay checkpoint3bb9bcd237, gameplay checkpointdc6cd3a2b9, latest tested integration5fd6939955, and mainf26434afa3. Its non-R128 MSAAMAX_MIP == fragmentsLog2requirement was already present in those gameplay checkpoints. The later refusal is therefore not explained by a change inside that predicate. This does not establish equal callers, evaluated descriptors, runtime state or a regression cause; no guard relaxation or new title result follows from this source-only check.Previous mainb0f57 descriptor observation
Latest completed Sonic replay - 24 October2026 UTC
Integrationb687088933, frozen mainb0f57be3c7, retained008e conversion and368 rebuilt/hash-verified native libraries: menus, opening cinematic and tutorial NOW LOADING observed through ordinary controller inputs; final inspected frame102 is black, no gameplay observed. Recorder off. Natural0xc0000409 after354.156s at the existing type14/format71,non-R128 descriptor refusal (
fragmentsLog2=3,maxMip=4), shader0x20bcb6d00 stage5. RTX5080/610.62,Windows11 Enterprise26200,loaded Khronos1.4.363;0 validation errors/VUIDs,18 warnings,12 guest watchdogs,7 failed fences,3 not-ready queries. Initial ordinary profile restored/hash-checked; app cache/journal initially absent,host-driver cache uncontrolled. Composed-fork evidence,not unchanged-main playability or a speed comparison. The previous unreadable4-byte read did not recur; it remains unresolved. Exact run,inputs,hashes and limits.Exact driver failure:
Failure-only diagnostic:
This is the last attempted read before an invalid-descriptor exception, not proof that this address is unreadable or the cause. The focused fork diagnostic exposes already-collected metadata and rethrows the original exception; no extra guest read,retry or guard relaxation. Its test-only control fails on unchanged main at the intended missing-context assertion;16 fresh passes(8CPU,8 actualGPU) cover the focused branch and integration,with5 exact-main comparisons reused. Cached/uncached cases verify one reader invocation and unchanged exception type/message;zero GPU validation diagnostics,skips/timeouts,max2.449s. Qualification, complete synthetic logs. Advisory analysis117.183s:9 reviewed notices,no new confirmed defect,no automatic edits/suppressions. This is a diagnostic,not a functional title fix or a new upstream PR. Historical32-ring gameplay and previous run pins remain preserved. AI-assisted:yes(Codex).
Previous main09f62 recorder comparison and related checks
Latest Sonic reproduction — 24 October2026 UTC
Fork
6e21bf05a6, incorporating frozen main09f62b94c95ad2bc2fe858382ca5a7103193042a, reached menus,the opening cinematic and tutorial NOW LOADING in both ordinary-input runs; no gameplay observed. Retained008e application/guest-libc and368 matching native libraries are hash-verified before/after. Same RTX5080/NVIDIA610.62,Windows11 Enterprise26200,loaded Khronos1.4.363; each run has0 Vulkan errors/VUIDs and10 warnings. The original writable profile was restored/hash-checked for the control; app cache/journal initially absent,host driver cache uncontrolled.0xc00004090xc0000409Recorder-off exact error:
Recorder-on exact error:
Both runs log3 guest watchdogs,2 failed-fence calls and1 not-ready query. Recorder-on leaves0-byte calls.bin and218822761-byte partial memory.bin,without capture.json; no replay attempted. The recorder walks readable allocation ranges through
ReadCommitted/GPU publication. This is a capture limitation in the composed native-color stack,not an unchanged-main regression. Recorder-off does not reach the prior3/4 descriptor refusal,so no fix for that failure is established. The read refusal is another observation in the existing Sonic investigation; its shader/pointer identity and underlying cause are not equated to prior runs. The post-refusal mapping diagnostic is unsynchronized and proves no read-time race. Different input timing and driver-cache history preclude speed comparisons.Exact run pins,inputs,hashes,scope and limits; 31-process source qualification includes30 focused component processes(20 actualGPU) plus one39-case NID-tool run. Zero component validation diagnostics,test exclusions/skips/timeouts; max6.650s. Advisory analysis43.304s reported3 unchanged-header findings; no new defect established,no automatic fixes/suppressions. Binaries,assets,failed requests and captured memory stay local. Historical32-ring gameplay remains preserved at60c0cc/main0db4; these results do not establish unchanged-main playability or a minimal patch set.
Read path narrowed: the preserved self-built HLE library maps the logged caller to
ShaderMemory::read,then guardedGuestMemory::Read/CheckRange. Draw capture names and rethrows that exception before completing its captured regions. At pinned #7446 headcc60990a43,checks compare already-captured regions later before recording/queuing; it adds no initial-read handler here. No direct title fix or PR execution is claimed. The later unsynchronized page query reports0x2000(Windows MEM_RESERVE); it is not proof of read-time state or a race. Caller/source pins and limits. No game binary/request was analyzed or replayed for this check.Earlier controlled transport and candidate checks
Candidate checked: #9567's optimizer metadata repair independently validates on main6c52, including a failing fixture-only control. The source-order check shows capture using a cloned/compacted resource plan before the later interface optimizer; no fix for Sonic's current refusal is established, and no equivalent title rerun was made for this check. That independent PR validation retains its disclosed main6c52 pins; the paired title runs above are separate.
Controlled scalar-word check,24 October: test-only fork fixture8b10dfa014, on literal main6c52b649e7, preserves all eight descriptor words across owned/serialized compact and serialized IR plans, interpreter/tape execution,1x1/3840x2160 extents and a32-bit address carry. It explicitly checks word3=slot11/offset12 and word5=slot13/offset20. Matching2/4/8-sample fields materialize; unequal3/4 fields remain unchanged and are rejected. Six CPU processes pass (five96-case matrix executions,480 cases total, plus the SRT patching group; the full shader-memory suite is included). Maximum2.183s,no test exclusions/timeouts. A test-only reader mutant deliberately substitutes word5 for word3: the complete-word assertion fails; restoration passes.
This narrows the controlled transport paths only. It does not identify the title's producer, reproduce its capture/timing, prove guest descriptor semantics, or fix the current stop. Production code/guards are unchanged; no new GPU/title run or upstream PR for this discovery fixture. Advisory Cppcheck/clang-tidy took93.75s and reported seven findings in unchanged source contexts; no new fixture defect established,no automatic fixes/suppressions. Exact pins,commands,scope and analysis, complete synthetic logs.
Historical daytime gameplay beyond the pots with32rings remains pinned to60c0cc1845/main0db4, then the separate mesh TYPE refusal(#5879); it is not a current-main result. Maintained frontier/history. No game remains running. The earlier NBC/reference analysis remains in this issue; this rerun supplies no basis for relaxing descriptor validation. AI-assisted:yes(Codex); author responsible.