Repository navigation
Description
Scope and status - 28 October 2026
This issue tracks the original sampled 2D MSAA descriptor-shape failure:
DescriptorBindingBuilder::Populate multisampled image resources have no descriptor image shape
The historical PPSA99902 report used a read-only Sampled/Float Dim2DMsaa resource, RGBA16_FLOAT,3840x2160,eight fragments,R_X. The closure criterion is correct descriptor-shape handling for the reported case while preserving its samples. Overall Sonic startup, loading and playability are tracked in #4443.
What has already landed
- feat(agc): sample a multisampled color target through its 2D MSAA texture #4820 is merged: sampled views of matching host-rendered 2D MSAA color targets. The source checked at
f21ef7c99c5ahas explicit MSAA descriptor shapes. - fix(agc): size sampled MSAA surface footprints #6444 and fix(agc): complete sampled MSAA geometry after fragment sizing #6445 are merged: fragment-aware sampled-MSAA footprints and geometry corrections.
Those contributions cover defined subsets. The old title and its later loading failures should not imply that no descriptor-shape implementation exists.
What remains to verify before closing this issue
A fresh, focused check of the original PPSA99902 resource case on pinned main is still needed. The existing composed-fork runs and synthetic subsets do not identify every prerequisite of that original case. Record the conversion/runtime pins, reached stage and actual error.
- If the reported sampled resource binds correctly and the original descriptor-shape failure is resolved, close this issue and continue with the appropriate later blocker.
- If it still fails, narrow this report to the exact remaining resource/ownership case, with a focused reproducer and the relevant implementation PR.
- If an earlier unrelated failure prevents reaching it, record the result as inconclusive and identify the prerequisite. A run on main plus prerequisites must retain that composition label.
There is no requirement for Sonic to reach gameplay before this particular defect can be closed. Conversely, the absence of the old error alone does not prove that its affected path executed.
Follow-ups kept outside this scope
| Behavior | Existing report or work |
|---|---|
| Resident DCC rendering/coherence | #5336 |
| Remaining compressed FMASK/CMASK reads | #3219 |
| Mipmapped 3D color targets | #7260 / #7310 |
| Native-MSAA logical buffer aliases | #6480 / #6498 |
| Native-color initialization,readback and publication | Narrow initializer/depth-owner corrections are merged; #6987→#6989→#6995→#7002 are refreshed on tested main 47aba8ea111f (component evidence). #7002 remains draft for the AMD move assertion reproduced again on its refreshed head and the foreign-depth port. Test-only capability correction #17152 was reviewed/validated on supported Windows AMD/NVIDIA, with missing-feature data reported by its author. This does not close the original descriptor-shape case or establish a new Sonic run. |
| Later invalid-descriptor,watchdog or loading observations whose cause is not isolated | #4443 until there is enough evidence for a distinct focused report |
These later symptoms are not assumed to share the original descriptor-shape cause. The native-color stack is related implementation work, not a blanket closing PR for every Sonic failure.
Preserved evidence
The latest composed run status and historical gameplay checkpoints remain in the bring-up discussion. The two mainb99 integration runs reached rendered3D cinematics without verified interactive gameplay; those are separately pinned observations, not unchanged-main closure evidence for this issue.
Previous issue summary before this scope clarification, including PR coverage and exact run references. Original detailed report and older evidence. Existing comments retain their historical source pins.
This tracker edit records component work only. No new game run or issue-resolution claim. AI-assisted: yes (Codex).
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
Historical Sonic run — 24 October 2026 UTC
Current title status is maintained in the bring-up report; the dated evidence below retains its original source and scope.
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.
[-]AGC: sampled 2D MSAA image has no descriptor shape (PPSA99902 conditional startup)[/-][+]AGC: sampled 2D MSAA descriptor-shape failure (PPSA99902; verification pending)[/+]