Repository navigation
Upstream Work
For fork changes worth offering upstream, use the dedicated contribution shortlist: PR, summary, improvement metrics/correctness outcome, upstream overlap and remaining work. This hub tracks existing upstream PRs and overlap. On November 1 the 26-page September review set contains 23 open PRs, two closed without merge, and one merged PR. That count describes this review set, not all upstream work.
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.
Current feature register · Actionable research · Research and retired work
All 26 current metadata records were retrieved from GitHub. The dedicated pages record full current/original heads and metadata timestamps. Of 24 pages with recorded original heads, 21 heads are identical and three differ (#2965, #3014, #3058). #2977/#3028 omitted original heads, so their source-change status cannot be reconstructed from the old pages alone. A newer metadata timestamp does not prove changed code.
| Upstream page | GitHub state / draft | Current head | Change since original review | Current action |
|---|---|---|---|---|
| #819 | Open; not draft | 3e633bbbc049 |
Same head; metadata refreshed | Open proposal; refresh integration and focused tests before handoff. |
| #2929 | Open; not draft | 4316955c55ad |
Same head; metadata refreshed | Open proposal; refresh integration and focused tests before handoff. |
| #2930 | Open; not draft | e53fd6f4857d |
Same head; metadata refreshed | Open proposal; refresh integration and focused tests before handoff. |
| #2956 | Closed, unmerged; draft | 966416c9931d |
Same head; metadata refreshed | Retired parallel candidate; follow #2988. |
| #2965 | Open; not draft | f0db53c49360 |
Changed head; review update required | Review current timestamp order and retained hardware gap. |
| #2977 | Open; not draft | cc9546771924 |
Original head omitted | Open proposal; refresh integration and focused tests before handoff. |
| #2984 | Open; not draft | cc576956ee5b |
Same head; metadata refreshed | Open proposal; refresh integration and focused tests before handoff. |
| #2988 | Open; not draft | 8a6a4b87001a |
Same head; metadata refreshed | Active upstream guard-set proposal; #2956 retired. |
| #2993 | Open; not draft | 98ab977bb75b |
Same head; metadata refreshed | Open proposal; refresh integration and focused tests before handoff. |
| #2994 | Open; not draft | 781f5a560933 |
Same head; metadata refreshed | Open proposal; refresh integration and focused tests before handoff. |
| #2995 | Open; not draft | 42cf316e59b0 |
Original head omitted | Preserve opportunity; reopen only for an affected workload. |
| #2996 | Open; not draft | 4ab056ef5bfa |
Same head; metadata refreshed | Open proposal; refresh integration and focused tests before handoff. |
| #2997 | Open; not draft | 9e9773a53e31 |
Same head; metadata refreshed | Contribute missing conversion/lifetime tests; avoid duplicate packing. |
| #2998 | Open; not draft | 651079ce4de1 |
Same head; metadata refreshed | Open proposal; refresh integration and focused tests before handoff. |
| #2999 | Open; not draft | bf3f610d0518 |
Same head; metadata refreshed | Review feature query/enablement separately from #3000. |
| #3000 | Merged; not draft | c53e813ec7a2 |
Same head; metadata refreshed | Upstream history; fork equivalent present in stable and main. |
| #3001 | Open; not draft | 5b42f9c466a8 |
Same head; metadata refreshed | Open proposal; refresh integration and focused tests before handoff. |
| #3002 | Open; not draft | 873181abd5db |
Same head; metadata refreshed | Open proposal; refresh integration and focused tests before handoff. |
| #3004 | Open; not draft | d9dc31924b55 |
Same head; metadata refreshed | Open proposal; refresh integration and focused tests before handoff. |
| #3006 | Open; draft | a0e2d3e7ee0e |
Same head; metadata refreshed | Open proposal; refresh integration and focused tests before handoff. |
| #3010 | Open; draft | 2e39fed36955 |
Same head; metadata refreshed | Follow #319 current-head border repair and stale B3/B4 diagnosis. |
| #3014 | Closed, unmerged; draft | d07fd5f8d75b |
Changed head; review update required | Closed research; no verified rationale or replacement. |
| #3028 | Open; not draft | 792e00bd42bd |
Original head omitted | Recover original self-page/SmartXX reproducer before qualification. |
| #3047 | Open; draft | 5b1c1404c55a |
Same head; metadata refreshed | Open proposal; refresh integration and focused tests before handoff. |
| #3051 | Open; not draft | 3b4c7f97f0f3 |
Same head; metadata refreshed | Open proposal; refresh integration and focused tests before handoff. |
| #3058 | Open; not draft | 885319c94a4a |
Changed head; review update required | Re-review new locking, callback context and unload sequence. |
- #2956 closed for #2988: use the author’s closure explanation, not two active parallel vertex-guard candidates. #2988 remains open; unchanged-byte comparison is only a possible follow-up.
- #3000 merged; #2999 still open: supported SPIR-V target selection and required Vulkan feature enablement are different contracts. Independently checked fork target selection exists in both main and September 30 stable; the upstream merge commit itself is not a fork ancestor. See #3000’s source checks.
- #2965 / #3058 changed source: re-review texture timestamps after submit-count advancement, and plugin locking/unload/asynchronous callback lifetime. The September reviews do not cover those later changes. #2965 retains the hardware no-semaphore agreement limitation.
- #3014 closed without merge: no verified closing reason or replacement is asserted. Preserve the input-provider lifetime and freshness questions as research.
- Fork source is independent: #317/#319/#320/#321/#351 remain open/HOLD or SKIPPED; #318 is closed/SKIPPED. None is a delivered main/stable feature. Their bounded next actions supersede the old port queue.
- Retired product work: Shader Browser was removed by #268 before the checked stable release. Workbench #241/#259/#260 closed unmerged; #242 was superseded by #259. They are preserved branch research rather than current UI or upstream port promises. Neural, depth/color consumers, linear resampling and GP/HLE work also remain separately held.
No upstream comments, code submissions or native campaigns were made by this documentation refresh. Existing fork correctness fixes may still provide useful tests; each port needs an exact current upstream base, focused review and its own applicable qualification.
The complete earlier review follows for provenance. Its old open-PR counts, source identities, active-candidate labels and Shader Browser port advice are historical, not today’s recommendation. Use the current table and delivery boundaries above.
This hub tracks open xemu-project/xemu pull requests that overlap or interact with work already implemented or tested in this fork. It exists to turn downstream experience into accurate, bounded upstream contributions.
Audit snapshot: 2026-09-21. Upstream had 104 open pull requests. Fork
mainwas82d04d84bdb3de956f20c3537e1da2cece0e8da2; reviewed upstream base wasf9b14039e5bb56ae2d8f028e31e7cc19f13f7e12. This is source review and test-planning material, not proof that any branch merges cleanly or passes native qualification. Check each linked PR before posting.
Code-priority refresh: 2026-09-26. Fork
mainis9a58e261; upstreammasteris stillf9b14039. The upstream open-PR listing returned 112 PRs. The overlapping PRs named in the first-submission list below were rechecked as open. The older index and dedicated comparison pages retain their September 21 review scope; this refresh is a prioritized port plan, not a new full source audit or a claim that patches apply cleanly.
Start with correctness repairs that can be reviewed as small changes and have a focused regression. Rank below weighs user-visible failure, applicability to upstream, and how much of the fork's implementation can be separated from fork-specific infrastructure. A merged fork PR is a source candidate, not an upstream-qualified patch. Where an upstream PR already exists, contribute a focused patch or test to that work after coordinating with its author; do not open a competing copy of the feature.
| Order | Fork code | Why it matters | First upstream action and acceptance gate |
|---|---|---|---|
| 1 — prepare first | #10 + #123: atomic PGRAPH array-packet preflight | An oversized packet must not partially mutate draw state, including when bulk processing is off or tracing chooses the scalar path. Narrow correctness rule with a production-linked test. | Coordinate a focused validation patch with upstream #2930's author, keeping upstream's bulk implementation. Test INLINE_ARRAY, ARRAY_ELEMENT16/32, exact capacity and one word over capacity in bulk, scalar and traced modes. |
| 2 — prepare first | #125: OpenGL GPU-surface reconciliation before vertex fetch | A draw can consume stale vertex bytes when a GPU-authored surface overlaps the actual fetch range and the quick-upload path skips the changed data. | Offer the checked fetch-span/readback and mirror-invalidation repair to upstream #2984. Test zero stride, element size versus stride, exact overlap and the production-linked surface-to-vertex case. Upstream's native-scale policy remains separate. |
| 3 — high-impact correctness | #119 + #158: Vulkan surface authority | A stale cached-surface readback can overwrite newer guest writes and corrupt PGR2's menu texture. This is a user-visible data-authority failure. | Extract the smallest guest-write notification and stale-readback veto series with an overlap/replacement regression. Compare with upstream #2965, which protects a different reuse boundary; do not call it a duplicate. |
| 4 — reliability, split by subsystem | #50: paused NV2A snapshot cleanup; #53: DSP quiescence before load | Failed or already-paused snapshot operations must release ownership correctly; restored DSP state must not race the running audio thread. | Compare the actual save/load hook ordering with upstream #819. Prepare separate graphics and audio patches, with paused save/failure cleanup and active-DSP load tests respectively. Do not treat #819 as equivalent without hook-level review. |
| 5 — small correctness patch | #138: initialize unused bump-uniform entries | Reflected bytes that both renderers compare or copy must be deterministic even when the guest leaves stage zero unused. | Check current upstream source, then submit only the shared-producer initialization and sentinel regression. This complements upstream #2998; its uniform-copy change did not create the pre-existing producer defect. |
| 6 — focused Vulkan validation | #104: transfer-source usage and BC staging alignment | The depth scratch buffer lacked transfer-source usage, and a compressed-texture upload could start between BC blocks. The fork's validation removed those specific copy errors but did not resolve the investigated device loss. | Upstream #2999 already addresses the transfer-source usage. Check current upstream source, then offer the distinct BC block-alignment fix and its focused copy test if still missing; run Vulkan validation on the upstream-based head. |
| Fork work | Recommended route |
|---|---|
| #70, #139, #147: persistent SPIR-V and pipeline caches | High-value loading work, but upstream #2993 already proposes the feature. Lead with cache-key, bounded-load, worker-quiescence and Vulkan-recreation tests; port only a missing lifecycle repair after reviewing upstream ownership. No broad FPS claim follows from cache hits alone. |
| #228: learned Vulkan fallback readiness | Important shader-stall work now merged in the fork. Separate the missing-stage request/retention and publication rules before proposing upstream patches. Its reported synchronous-work reduction had mixed frame tails, so qualify an upstream-based head before claiming game-performance benefit. |
| #75 + #76: GPU identity and cross-adapter presentation | Potentially valuable multi-GPU compatibility work. First diff upstream's current device selection and presenter contracts, then test requested versus initialized GPU and incompatible-adapter host-copy fallback on suitable hosts. |
| Shader Browser #237, #238, #239 | Merged opt-in debugging features, but the UI, persistence, recipe and override contracts form a larger series. Seek upstream design interest and propose stages before porting. Preview #241 and profiling #242 remain open drafts, so exclude them from a main-based port. |
An exact-match overlap such as upstream #2994 should receive tests or review evidence instead of a duplicate fork patch. Keep unmerged APU experiments in the dated development snapshot until their own merge and qualification decisions are made.
Each upstream PR has a dedicated page containing:
- the refreshed upstream state and exact reviewed head;
- the corresponding fork work;
- which mechanism is equivalent, partial, alternative, or merely adjacent;
- transferable tests and implementation lessons;
- evidence limits and claims to avoid;
- a suggested handoff that can be adapted into an upstream review comment.
No comment should be copied blindly. Refresh the upstream head, read new discussion, verify the referenced fork code still exists, and post only evidence that can be shared publicly.
| Label | Meaning |
|---|---|
| Exact mechanism | The same core mechanism exists downstream; offer validation and edge cases rather than duplicate code. |
| Substantial overlap | Most responsibilities exist downstream, but lifecycle, API, or ownership differs. |
| Partial overlap | The fork covers only part of the upstream PR. State the uncovered portion explicitly. |
| Alternative strategy | Both changes address the same hazard with different ownership or data structures; tests transfer more safely than code. |
| Adjacent hazard | The changes concern the same subsystem but protect different directions or lifetimes. |
| Complementary | Downstream work supplies integration tests or constraints but not the proposed feature. |
| Upstream PR | State at audit | Fork relationship | Fork references | Priority |
|---|---|---|---|---|
| #2993 — Persist pipeline and SPIR-V caches to disk | Open | Substantial downstream implementation overlap | #70, #139, #147 | Highest |
| #2998 — Derive uniform dirtiness during copying | Open | Core mechanism already present downstream; companion fixes available | #138, #148 and current vk/glsl.h
|
Highest |
| #2994 — Visit active LRU nodes without scanning every bin | Open | Exact mechanism already present downstream | Current include/qemu/lru.h; #47 is separate |
High |
| #2930 — Consume INLINE_ARRAY vertex data in bulk | Open | Bulk path present downstream with stronger packet validation | #10, #123 | Highest |
| #2988 — Guard vertex RAM writes on what draws read | Open | Same lifetime problem; alternative downstream strategy | #85, #89 | Highest |
| #2956 — Finish only when vertex RAM updates affect pending draws | Open | Same lifetime problem; more precise upstream range strategy | #85, #89 | High |
| #2984 — OpenGL render-to-vertex-buffer support | Open | Partial overlap | #125 | Highest |
| #2999 — Enable required Vulkan features and buffer usage | Open | One direct overlap plus separate feature-negotiation work | #104 | High |
| #3000 — Compile SPIR-V for the supported device version | Open | Related target-selection and persistent-identity work | #70, #75 | High |
| #2965 — Flush when reusing Vulkan surface memory | Open | Adjacent coherence hazard, not duplicate | #119, #158 | High |
| #3010 — Native S3TC uploads and GL texture recycling | Open draft | Complementary compressed-layout tests | #127 and existing OpenGL texture work | Medium |
| #2997 — Speed up remapped vertex copies | Open | Complementary to bounded vertex lifetime work | #85, #89 | Medium |
| #3002 — Convert vertex attributes the device cannot consume | Open | Complementary feature; no equivalent downstream conversion claimed | Vertex lifetime work and prewarm format admission | Medium |
| #3006 — Convert unsupported inline vertex formats | Open draft | Third step in upstream vertex-conversion series | #10, #123 plus vertex-range work | Medium |
| #2996 — Size Vulkan storage buffers from device limits | Open | Complementary allocation work | Related transient-buffer growth/failure-handling work | Medium |
| #3004 — Retry a smaller Vulkan buffer after allocation failure | Open | Complementary allocation fallback | Related transient-buffer growth/failure-handling work | Medium |
| #3001 — Prefer standard Vulkan border colors | Open | Focused complementary sampler optimization | No direct downstream equivalent claimed | Medium |
| #3014 — Cached host input outside the BQL | Open draft | Complementary to virtual-controller presence repair | #160 | Medium |
| #2929 — Defer PGRAPH IRQ delivery from PFIFO | Open | Related lock-order work, distinct path | #132 | Medium |
| #3047 — DSP core and DMA performance/accuracy overhaul | Open draft | Complementary snapshot lifecycle requirement | #53 | Medium |
| #3058 — TCG plugin and monitor interaction | Open | Supports downstream profiling workflow | Diagnostic counters and bounded performance protocol | Medium |
| #3051 — Guest-visible xemu identification and version | Open | Useful for test identity; not a replacement for artifact hashes | Release/version identity workflow | Medium |
| #819 — Move snapshot surface download into savevm hook | Open | Older lifecycle overlap requiring hook-level comparison | #50, #53, #119, #158 | High |
- #2993: cache lifecycle, identity, bounded loading, worker quiescence, and renderer-recreation coverage from #70/#139/#147.
- #2998: deterministic fragment-uniform construction from #138, while acknowledging upstream binding-switch handling; #148 remains a separate dirty-row optimization.
- #2984: exact vertex fetch spans, quick-upload invalidation after surface download, and the #125 production-linked test.
- #2930: whole-packet validation before bulk/scalar/traced path selection from #10/#123.
- #2988/#2956: three-generation vertex lifetime and rollover coverage from #85/#89.
These are focused review and test handoffs for existing PRs. The ranked code-submission plan above identifies what to extract from the fork first. Exact matches such as #2994 should receive downstream validation rather than duplicate code. Partial overlaps such as #2984 and #2965 must name what the fork does not cover.
These are the merged fork PR identities observed during this audit. Refresh them if a PR is reverted or superseded.
| Fork PR | Merged commit | Responsibility used by this audit |
|---|---|---|
| #10 | c5a598a0ea42 |
Atomic oversized inline-packet rejection |
| #47 | bac2cae991a2 |
Separate full-cache free-node scan optimization |
| #50 | 5151c3887a3f |
Paused snapshot save/failure cleanup |
| #53 | bd1fecb93353 |
DSP quiescence before snapshot load |
| #70 | fc8c5dec9c1a |
Persistent exact-source SPIR-V identity/reuse |
| #75 | 7c6a1a51fe84 |
Explicit selected-GPU identity/reporting |
| #85 | ade1c546e338 |
Surface/vertex source freshness |
| #89 | 003b88475584 |
Bounded immutable vertex versions |
| #104 | ef09f061d766 |
Transfer usage and depth/BC copy repair |
| #119 | a179d9842046 |
Preserve guest writes over cached surfaces |
| #123 | 1fcf4434e933 |
Validate packets before bulk/scalar selection |
| #125 | dcd0fa349b95 |
OpenGL surface reconciliation before vertex fetch |
| #127 | 08844c897bca |
Checked compressed cubemap face stride |
| #132 | 3cb55dffdd46 |
Renderer-switch lock/progress phase repair |
| #138 | 43f84505c295 |
Deterministic unused bump uniforms |
| #139 | f929fe5a8bb1 |
Persistent SPIR-V in fallback preparation |
| #147 | 1b582a35b04e |
Persistent Vulkan driver pipeline cache |
| #148 | ef1a7fc4b62b |
Aggregate VSH dirty-row state |
| #158 | 9c529ab612dd |
Stale surface-readback veto |
| #160 | 9f756c9ba036 |
Virtual controller without host provider |
- Refresh identity. Record upstream PR state/head, upstream base, fork main, and referenced fork PR merge commits.
- Recheck discussion. A new comment may already address the concern or invalidate the suggested path.
- Inspect the exact boundary. Compare ownership, lifecycle, cache key, state transition, or packet admission—not just similar filenames.
- Run the smallest transferable regression. Prefer production-linked unit/guest tests over unrelated gameplay volume.
- Separate claims. Label source review, controlled reproduction, native result, and unmeasured risk distinctly.
- Prepare a concise comment. Lead with the exact condition and test; link the fork PR or commit; state what the evidence does not prove.
- Do not post without maintainer authorization. This wiki prepares collaboration material; it does not authorize contacting upstream.
- Record the result. Update the dedicated page with posted-comment URL, upstream response, revised head, and disposition.
I compared this head with downstream work at <fork commit>.
Relevant overlap:
- <exact mechanism or boundary>
Focused condition worth testing:
- <minimal sequence>
- expected: <invariant>
Downstream reference:
- <PR/test/commit link>
Scope limit:
- This establishes <specific result>.
- It does not establish <uncovered behavior or performance claim>.
- Never call a partial overlap “already implemented.”
- Do not present one fork’s hardware result as a prediction for upstream users.
- A source-level concern is not a reproduced native failure.
- Keep historical performance results attached to the exact head they tested.
- Alternative implementations transfer regression cases more reliably than patches.
- Persistent cache identity must describe the complete compilation/driver compatibility request.
- “Uploaded this batch” and “referenced by this batch” are different vertex-memory facts.
- Surface coherence is directional: protecting pending GPU consumers differs from preventing stale GPU data from overwriting newer guest writes.
- Guest-visible version strings supplement rather than replace host-side executable hashes.
Update this hub when an upstream PR changes state, is rebased materially, splits, merges, or closes. On each dedicated page, update:
last checked date
upstream state and exact head
fork main and referenced merge commits
posted-comment/review URL, if any
upstream response and required follow-up
native or focused validation status
final disposition
- Development
- Upstream Work In Need — candidate mechanisms that need a fork-specific rework before implementation
- Pull Request Lessons
- Performance Methodology
- Debugging Tools and Commands
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