DSperate v1.9.0
DSperate v1.9.0
The "how it looks on the panel" release.
Full changelog: v1.8.0...v1.9.0
Requires a BIOS/firmware set dumped from your own DS; none is included.
Highlights
- Nearest-neighbour scaling on the display-engine tier (A30). The A33's scaler is a polyphase FIR whose coefficient RAM the disp driver refills with its own smoothing table inside every layer set, and the ioctls offer no filter choice, so the panel was always softened. Nearest — the default on every other tier — is now a table with the whole weight on one tap, written through
/dev/memright after each layer set behind the driver's own access handshake. Tap positions were probed on the A30 with the emulator frozen.--linearleaves the RAM to the driver. - Chunky cells drawn by the scaler. On the display-engine tier chunky no longer flattens cells at DS resolution (which cost +13 ms of cell kernel). When every shown view and the canvas divide by the cell — 2 DS pixels in the single layout, 4 in vertical — DispOut presents the canvas at cell resolution, each view box-downscaled by the cell (NEON for power-of-two factors) and the nearest table enlarges the cells whole. Present is 1.0 ms single / 1.6 ms vertical on the A30. Mean is the only mode there; other modes warn and use mean. Views that do not divide (the PiP inset, the pair setting) keep the at-source path.
- The LCD grid on the display engine, for free. A second DE layer: a panel-sized ARGB image, transparent but for one black pixel leading each DS pixel's (or cell's) run, composited above the scaler layer. Drawn once and redrawn on layout changes — no per-frame cost.
--linearis real bilinear on the scanline path, not a renderer switch. Two NEON passes per source line: a gather-lerp widening the line to panel width once, then every panel row between two source lines as a constant-weight lerp of the widened pair. Sample points are pixel centres, clamped at the edges, and the row map is proven to claim every row once by the test suite. It now works on the dmabuf, KMS and fbdev tiers instead of forcing the SDL renderer. RG DS, dmabuf tier: etody 6.01 -> 6.22 ms mean, p99 14.2 -> 14.6.- Translucent PiP inset.
video.pip_alpha(0..1, default 1) draws the inset see-through over the large screen on every tier. While the bottom screen is in use — a touch, or the pad-driven pen showing — the inset ramps to opaque and holdsvideo.pip_touch_holdframes (default 60) before fading back, but only when the inset is the bottom screen. At alpha 1 every tier keeps its memcpy, so the exact paths cost nothing. - The dmabuf source is probed, not hardcoded. Both scanout tiers opened
/dev/dma_heap/linux,cmaby name, so vendor BSP kernels that name their heaps differently — and older BSPs with only/dev/ion— silently fell back to the window-surface path. Allocation now walks the candidates (DS_DMA_HEAP, then every dma-heap ranked contiguous-first, then ION), offering each to the tier's real import and pinning the first the display accepts. Verified on the RG DS under Wayland and KMSDRM, and on the ION path on the A30 (kernel 3.4) and the RG35XX SP (4.9).
Fixes
- The stylus tap button and d-pad chord claimed every edge on their button before hotkeys were considered, so
mod+tap button could never be a hotkey. They now take a press only while the pad modifier is up. Input setup also warns about bindings that can never fire: duplicate DS buttons, hotkeys shadowing DS buttons, hotkeys on the stylus/modifier buttons. The defaults produce no warning. --chunky-cell Nwith a size that did not divide both screen dimensions fell back to 2x2 pairs; it now steps down to the nearest size that fits (5 on a 640x480 panel -> 4) and says so once. A danglingelsein the panel-tier chooser is fixed too: auto never ran and always gave pairs, and a failed explicit size ran the auto loop.- The nearest table now puts every phase on the centre sample, so cell edges line up with the grid seams instead of sitting two panel pixels past them.
--accel/video.accelare gone. The SDL renderer is only reached where no optimized tier applies, and there it now tries accelerated first and falls back to software on its own.paths.screenshotsredirects the F9 screenshot (the autosave's PNG stays beside its state).
Docs
- The README carries current flag synopses, the presentation tiers in the order they are tried, and the scaling filters with their cost.
- Every key in the written default config now says what it does;
[emu]notes thattiming_oc,cpu_ocandfast_loadexist to squeeze a slow device and are the first things to turn off when a game misbehaves.