Skip to content

Upstream Work In Need

OpenAI Codex edited this page Nov 1, 2026 · 2 revisions

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 SHA b71408480a3a979a9c584663e1d1f400904c8bb7). Latest stable checked: v0.8.136-0-g458730bf5373, September 30, source 458730bf5373f1f0d027450fef7443e3af7a3ae1. GitHub state, branch recommendation, source presence and release availability are separate facts. See current status and release versus main.

Current fork research actions

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.

Other upstream candidates

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.

Historical shortlist — September 21, 2026

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.

← Development · Upstream Work

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 main at 82d04d84bdb3de956f20c3537e1da2cece0e8da2. 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.

Priorities

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.

1. #2995 — retain render passes around occlusion queries

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.

2. #3010 — make GL texture recycling adapt to scene changes

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.

3. #3014 — sample host input without holding the BQL

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.

4. #3004 — recover allocations without shrinking required address spaces

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.

5. #2929 — defer PGRAPH IRQ delivery with a complete state contract

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.

6. #2984 — preserve native resolution for surfaces used as vertex data

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.

Smaller, focused candidates

#3028 — precise same-page translation-block invalidation

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.

#2977 — valid compute workgroup selection

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.

Sequencing and evidence rules

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.

Related pages

Clone this wiki locally