Repository navigation
Upstream Work In Need
Development · Upstream work · Research and retired work
This is the current bounded research queue. GitHub state and the maintainer’s HOLD/SKIPPED recommendation are recorded separately. These six fork candidates are unmerged and absent from pinned main and the checked stable release; an available branch is not product availability.
Reviewed: November 1, 2026. Fork source:
b7140848(full SHAb71408480a3a979a9c584663e1d1f400904c8bb7). Latest stable checked: v0.8.136-0-g458730bf5373, September 30, source458730bf5373f1f0d027450fef7443e3af7a3ae1. GitHub state, branch recommendation, source presence and release availability are separate facts. See current status and release versus main.
| Fork PR | GitHub state / draft | Disposition | Current head | Evidence and limitation | Next action |
|---|---|---|---|---|---|
| #317 | Open; not draft | SKIPPED / HOLD | 5fc1d045a1c4 |
Original own-current-TB/self-page source/XBE and #42/SmartXX loader recipe unavailable; current PGR2/Conker scenes have zero eligible events. | Recover the original reproducer or equivalent bounded guest coverage; qualify real page lists, aliasing and lifecycle. Do not repeat unchanged zero-exposure games. |
| #318 | Closed, unmerged; draft | Closed / SKIPPED; HOLD evidence | a26a4ae76f0e |
One fresh Deck pair: +2.305% guest cadence, essentially unchanged CPU, mixed p95/p99 and worse isolated maximum; native query semantics remain unqualified. | Preserve branch/evidence for hardware and workloads with demonstrated pass-split cost. Reopen only with bounded native query/lifecycle and timing qualification. |
| #319 | Open; not draft | HOLD | f975d668002b |
All eight original GL game attempts collected. B3/B4 frame traces stale; all Vulkan controls retain the same parent LRU assertion. New border-color rendering repair passes 18 local real-GL cases but lacks physical-GL confirmation. | Verify the border repair on physical GL and capture an attributable B3/B4 progress/trace failure before reconsidering qualification; campaign is stopped. |
| #320 | Open; not draft | HOLD; ARM qualification missing | 29baa4fc30d3 |
Admission policy repaired: explicit true plus detected LRCPC, latched before translation; false/invalid/unknown stay on original ordering. Adapted backend cross-compilation is not ARM execution proof. | Native capable and pre-LRCPC ARM builds/generated code; mixed fast/helper/unaligned/cross-page/wide/atomic ordering, XISO timings and game/resource checks. |
| #321 | Open; not draft | HOLD; concrete defects remain | 6a7cb8cab8ef |
Conversion loses subnormals and NaNs; comparison, rounding/exception and default-on ARM-without-GUI-rollback defects remain. | Retain soft dispatch, design correct bounded admission and softfloat fallbacks, then exact value/status/precision and native ARM qualification. Default-off alone is insufficient. |
| #351 | Open; not draft | QUALIFY title; HOLD recommendation | 36af5d2672d2 |
Current-main integration builds; actual-emulator default-OFF/explicit-ON qtests pass normally and under Python -O. Original X3 launch inputs and exact probe artifact/source binding remain missing. | Recover original utility/configuration/private settings and public probe identity; matched native/resource and GL/Vulkan XISO correctness/timing checks. Optional device is absent by default. |
The #318 cadence measurement is guest cadence, not host-presented FPS. Its single B→A opportunity pair is not balanced qualification and cannot establish repeatability; preserve both the positive signal and adverse tail observation. #319’s component gains, completed XISO cohort and failed/ineligible controls do not repair stale game traces. #351 models optional identification only; it does not deliver X3 flash, LCD, switches or complete physical settings-device behavior.
| Proposal | Current disposition | Bounded next action |
|---|---|---|
| #2995 occlusion queries | Open upstream; fork #318 closed/SKIPPED | Reopen for a demonstrated affected workload, preserving current Deck findings. |
| #3010 GL recycling | Open draft upstream; fork #319 HOLD | Native S3TC already exists; diagnose the collected campaign and current border repair. |
| #3014 host input | Closed unmerged; no verified closing rationale | Retain provider lifetime/freshness design; no current upstream landing is implied. |
| #3004 allocation recovery | Open; requirement-aware fallback remains a proposal | Fixed address-space and paired-buffer capacity must remain valid under failure injection. |
| #2929 deferred IRQ | Open; distinct from renderer-switch lock repair | Specify interrupt publication/acknowledgement, reset and teardown synchronization. |
| #2984 GL render-to-vertex | Open; fork #125 supplies only part | Retain exact fetch/readback correctness; qualify native-scale history and address reuse separately. |
| #2977 workgroups | Open; original reviewed head not recorded | Refresh device-limit/divisibility source and focused compatibility proof. |
| #2965 texture reuse | Open; October 17 source exceeds old review | Review timestamp ordering and no-semaphore hardware gap. |
| #3058 plugin monitor | Open; October 20 source exceeds old review | Review locking, queued callback/unload lifetime and measurement acknowledgement. |
The upstream hub records all 26 current heads and relationships, including #2956’s closure for still-open #2988 and merged #3000’s distinction from #2999. The research register covers retired UI, held audio and depth consumers, and the GP trace/replay/HLE stack.
This refresh used the current PR bodies and source identities; it ran no native or XISO campaign. Detailed artifacts cited by those PRs may require operator workspace access. Missing artifact publication does not turn historical failure evidence into a passing result.
The original shortlist below is preserved for its mechanisms and test design. Its active priorities and “still awaiting” wording apply to that snapshot; the current actions above supersede them.
This is the fork's shortlist of upstream ideas worth reworking, rather than importing verbatim. Every item has a bounded missing mechanism, an identified integration risk, and a focused proof plan.
Audit snapshot: 2026-09-21. The comparison used fork
mainat82d04d84bdb3de956f20c3537e1da2cece0e8da2. It is source review and experiment planning, not a native reproduction, a mergeability result, or a performance claim. Refresh upstream heads and discussion before work.
| Priority | Upstream proposal | Rework target | Why it belongs here |
|---|---|---|---|
| 1 | #2995 — pass-preserving occlusion queries | Keep query reset out of render passes while preserving report semantics | The inspected fork still breaks passes to reset queries. |
| 2 | #3010 — OpenGL texture recycling | Replacement-aware GL texture recycler | Native S3TC already exists; recycling is the missing, separable mechanism. |
| 3 | #3014 — cached host input | Provider-safe sampling outside the BQL | Fits the virtual-controller work but needs explicit lifetime and freshness rules. |
| 4 | #3004 — allocation recovery | Requirement-aware Vulkan buffer fallback | The useful recovery idea is unsafe when generic shrinking changes a fixed buffer's address-space contract. |
| 5 | #2929 — deferred PGRAPH IRQ | Fully synchronized deferred IRQ delivery | It addresses a real lock cycle, but publication and teardown need a defined contract. |
| 6 | #2984 — OpenGL render-to-vertex | Per-surface native scale for data surfaces | It complements existing checked readback work and has a correctable history-policy defect. |
Two smaller candidates remain useful after the first six: [[#3028 — precise same-page TB invalidation|Upstream-PR-3028-Precise-TB-Invalidation]] and #2977 — compute workgroup selection.
The useful idea is to reset query pools during command-buffer preparation when possible, so query begin/end commands can stay inside an active render pass. The author reported substantially fewer render passes and GPU time in a query-heavy scene on a Raspberry Pi 5. Those numbers motivate the experiment; they do not predict the result on another GPU.
The rework must integrate with the fork's report lifecycle:
- A query segment ends in the scope where it began.
- A guest-visible report split across passes accumulates the same final value.
- Capacity exhaustion uses controlled retirement or another bounded policy; it must not abort merely because the pool is full.
- Every pass-ending path is covered: clears, target changes, vertex staging rollover, and buffer growth.
Measure render-pass breaks, resets, query segments, submissions, GPU duration, and guest-progress intervals. Accept only identical reports and output with fewer avoidable pass breaks and no repeatable tail regression.
The fork already has native S3TC upload support. The independent candidate is recycling compatible GL texture objects instead of deleting each object at the last reference.
The upstream fixed pool is not sufficient as written: once full of layouts from an earlier scene, newly useful layouts cannot displace them. Rework it as a bounded replacement policy with both object-count and estimated retained storage limits. A retiring object should be owned by the renderer and drained through renderer-switch cleanup.
Reused objects must receive all required image and sampler state explicitly; new-object defaults are not a contract for an object with prior contents.
Compare recycling Off and On with native S3TC enabled in both roles. Record pool hits, misses, replacements, retained storage, texture creates/deletes, and streaming-frame tails. Include a transition that fills the pool with one layout set and then switches to another. Do not attribute an upstream combined S3TC-plus-recycling result to recycling alone.
The target design has three explicit stages:
host provider → timestamped sampled state → guest controller report
Sampling SDL devices outside the BQL may remove input-related lock contention, but it needs provider lifetime protection during the unlocked interval. A commit-time identity check is useful but does not itself prove that a sampled handle stayed valid. Provider detach or reassignment must invalidate stale samples while retaining a connected virtual Xbox controller that produces a neutral report when no host provider exists.
Use reusable batch storage rather than allocate an empty or short-lived batch at every poll. Measure BQL hold time and sample age when the guest consumes a report, including slow rendering, minimization, focus loss, hotplug, reassignment, keyboard mapping, no-provider operation, and snapshot restore. The success condition is lower contention without older guest-visible input.
Retrying a smaller allocation is useful only when the resulting buffer still satisfies its operation's capacity contract. A full guest-VRAM vertex mirror, for example, cannot silently become a smaller mirror while guest offsets are unchanged. Likewise, independently shrinking staging/device pairs can leave different usable capacities behind a shared requested-size assumption.
Model each allocation request as:
required capacity + preferred capacity + supported recovery action
Fixed address-space mirrors must fail cleanly below required capacity. A transient ring may choose a smaller preferred size only when reservation, rollover, and transfer bounds remain valid. Paired buffers need a common usable capacity or each operation must be bounded against both successful allocations.
Use failure injection for first-request failure, one-side pair failure, growth failure, and failure at minimum required capacity. The result must be correct operation or controlled failure with intact ownership.
The upstream direction removes a PFIFO-to-main-lock dependency that can form a deadlock during graphics progress. The fork's renderer-switch repair addresses a different lock path, so it does not make this work redundant.
The rework needs one synchronization policy for publishing, consuming, acknowledging, resetting, enabling, and disabling pending interrupt state. Scheduling a bottom half orders that callback; it is not automatically a complete race policy for all readers and writers. The callback must also have explicit reset and teardown cancellation/drain behavior.
Build a deterministic fixture for the reported lock dependency, then test acknowledgement before callback execution, enable/disable transitions, repeated notifications, and reset with pending work. Count a hang prevention as reliability evidence; measure any pacing benefit separately.
The worthwhile addition is per-surface native scale when a render target is later consumed as data, while ordinary scene rendering stays at the selected scale. This is complementary to the fork's checked fetch-range and surface readback work.
The proposed fixed address history requires a real replacement cursor. A
scheme that writes count % 16 while capping count at 16 replaces only slot
zero after it fills. More fundamentally, the policy must account for a guest
address being reused for a different resource or binding lifetime.
Retain the current exact fetch/readback checks. Add explicit invalidation for binding replacement and memory repurposing, then test more than sixteen alternating data surfaces, first-use detection, same-address reuse, depth-only targets, mixed color/depth scaling, and scale transitions. Validate vertex bytes consumed by the draw as well as final pixels.
The fork still takes the whole-page invalidation path. Upstream's fallback to precise overlap checks when the executing translation block occupies the written page is a bounded CPU experiment. Test unrelated same-page stores, actual self-modifying code, two-page blocks, and no-current-CPU writes. Count invalidations, retranslations, and guest progress before deciding whether it needs rework.
The inspected selection loop can bypass its only decrement when an initial workgroup exceeds a device dimension limit. This is a compact compatibility repair: add table-driven limits/divisibility tests and renderer-init coverage for dimension and total-invocation constraints. It does not need a broad performance campaign.
For a performance-focused cycle, start with #2995 and then texture recycling. Treat #3004 and #2977 as independent robustness work. Input and deferred IRQ changes belong on separate branches because their acceptance depends on latency and progress tests, not the renderer benchmark.
- Keep native S3TC separate from recycling attribution.
- Keep existing
pack_remapped_attributes()work out of a #2997 plan; it is already present in the fork. - Do not claim a source-level concern is a reproduced game failure.
- Tie every benchmark to an exact head and environment.
- Add one focused regression before expanding to retail gameplay.
- Refresh each upstream PR before creating a fork branch or posting upstream.
DSP tooling guide and navigation updated November 2, 2026 for experimental PR #384, source 8f51d237. Capture/replay usage and limits.
The earlier wiki-wide review was published November 1, 2026. Emulator source: b7140848. Reviewed wiki content: 1d2b671. Current status · Release availability · Publication process.
- Home
- Current status
- Stable versus main
- Implemented mechanisms
- Controls and defaults
- Measured results and limits
- Complete change register
- System
- CPU and vCPU
- Memory and DMA
- Graphics / NV2A
- APU and audio
- Timing and timers
- Platform and I/O
- Hardware observations
- Fidelity boundaries
- Methodology
- PGR2 routes
- Debugging lag / hot paths
- Tools and commands
- DSP capture, replay and fuzzing
- HLE readiness and public XISO proof
- Concurrent DSP shadow and OpenAL proof
- DSP HLE operation inventory
- DSP HLE fix examples and testing
- Development
- Upstream shortlist
- Wiki maintenance
- Research / retired work
- Optimization catalog
- Hot-path shortcuts
- Researched experiments
- Unproven proposal directory
- PR lessons
- September26 snapshot
Repository · PRs · Issues