Commit Graph

51587 Commits

Author SHA1 Message Date
Douglas Teles 7a1042e620 Update commander to ROCKNIX modern fork (dark-theme + paths + build-fix baked in)
The ROCKNIX fork includes all 3 patches we maintained separately:
- 000-dark-theme.patch
- 001-default-paths.patch
- 002-build-fix.patch

Switching to the fork removes the maintenance burden of patch rebasing.

Adapted from ROCKNIX dd10d27a84 to projects/ArchR/ path.
2026-04-27 19:25:20 -03:00
spycat88 a81015aa3e portmaster: bump package 2026-04-27 19:19:52 -03:00
Philippe Simons bcc7698953 duckstation: bump to 0.1-10998 2026-04-27 19:19:52 -03:00
spycat88 29394245fb libxkbcommon: fix deps 2026-04-27 19:19:52 -03:00
Douglas Teles afd7ce30ee Restore DEBUG_FS=y for development/bench phase
DEBUG_FS provides instrumentation needed by TODO items 1 and 6:
- /sys/kernel/debug/dri/*/name — GPU performance counters
- /sys/kernel/debug/cma/* — per-region CMA page accounting
- /sys/kernel/debug/block/* — I/O scheduler stats (BLK_DEBUG_FS)
- Detailed thermal zone introspection

Trade-off acknowledged: small runtime overhead from debugfs mount,
but the instrumentation granularity is essential while we're actively
benchmarking and tuning. Switch to DEBUG_FS=n or DISALLOW_MOUNT
for release-final builds once FASE 1-2 benchmarks are complete.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:33:55 -03:00
Douglas Teles a631e9b3c5 Fix audit-build.sh: use /boot/config-* as primary kernel config source
With CONFIG_IKCONFIG=n (correct for production), /proc/config.gz is not
available. The script now reads /boot/config-$(uname -r) as primary
source and falls back to /proc/config.gz only if IKCONFIG is enabled.

Also removed FRAME_POINTER check (ARM64 forces it via Kconfig select,
checking if it's disabled always fails) — now shown as informational.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:32:41 -03:00
Douglas Teles ca8c91f589 Fix Flycast and sysctl after deep research validation
Flycast-SA:
- Restore -Ofast sed (was incorrectly replaced with CMAKE_BUILD_TYPE=Release)
- -Ofast = -O3 + -ffast-math is INTENTIONAL for Flycast: the Dreamcast SH4
  FPU doesn't use strict IEEE 754, and the hardware itself flushes denormals
- Validated by JELOS/AmberELEC/ROCKNIX upstream for years without issues
- On weak Cortex-A35, the extra optimization from -ffast-math is meaningful

Sysctl:
- vm.dirty_writeback_centisecs: 500→1500 (match ROCKNIX, reduce I/O wakeups
  during gaming — read-heavy workload needs fewer writeback checks)
- vm.vfs_cache_pressure: 50→100 (restore kernel default — during gameplay
  the same few files are reread (ROM, save, shader cache), so a large
  inode/dentry cache provides no benefit on 1GB RAM. 50 is a desktop tuning
  that favors metadata cache for build/compile workloads, not gaming.
  Note: 200+ is what aggressively reclaims metadata; 100 is the neutral
  kernel default, not an override.)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:32:03 -03:00
Douglas Teles b0d73b4c1e Revert FRAME_POINTER and ZRAM zstd after deep research
FRAME_POINTER:
- ARM64 Kconfig unconditionally selects FRAME_POINTER (arch/arm64/Kconfig:136)
- Cannot be disabled regardless of defconfig value
- Overhead <1-2% on ARM64 (x29 designated as FP by ABI, STP saves FP+LR
  in single store queue slot)
- Restored to y to match kernel reality

ZRAM compression lzo-rle (reverted from zstd):
- zstd is 3-4x slower than lzo-rle on in-order Cortex-A35
- Estimated: lzo-rle ~350 MB/s vs zstd ~100 MB/s compress on A35
- Each 4KB page swap: 11us (lzo-rle) vs 40us (zstd)
- Under memory pressure during gaming, zstd causes frame stutters
- ROCKNIX deliberately uses lzo-rle on ALL in-order cores (A35/A53/A55)
  and only enables zstd on out-of-order big cores (A73/A76)
- The extra ~500MB virtual capacity from zstd's ratio is not worth the
  latency penalty for latency-sensitive gaming workloads

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:19:36 -03:00
Douglas Teles a7334ee3fb Double-check fixes: BRIDGE_NETFILTER, BLK_DEBUG_FS, Flycast build type
Kernel:
- BRIDGE_NETFILTER=n (was still =m after BRIDGE was disabled)
- BLK_DEBUG_FS=n (depends on DEBUG_FS which is off, explicit disable)

Flycast:
- Replace sed -Ofast hack with proper CMAKE_BUILD_TYPE=Release
  (CMake Release mode applies -O3 with proper LTO support)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 15:13:18 -03:00
Douglas Teles ac66befbf9 Mark completed TODO items (FASE 0-3 investigation and implementation)
Completed items:
- 0. Sanity check: kernel debug flags, Mesa, RetroArch, emulator audits
- 1. Benchmark infrastructure: audit-build.sh + bench.sh scripts
- 2. ZRAM: switched to zstd, disabled zswap
- 3. DMC: 924MHz with upthreshold=40, already optimal
- 4. Mesa: shader cache, PAN_MESA_DEBUG=forcepack confirmed
- 6. CMA: 7 areas, kernel defaults, no excessive reservation
- 7. CFLAGS: -mtune=cortex-a35, RetroArch LTO confirmed
- 8. DT: CPU 408-1512MHz, GPU 200-600MHz, DMC 924MHz audited
- 9. I/O: BFQ + low_latency + read_ahead 2048KB
- 12. Systemd: volatile journal, 5s timeout, nowatchdog, threadirqs
- 13. Governor: performance during gameplay, ondemand tuned
- 15. Input: HZ=300, frame_delay_auto, run_ahead available

Remaining (need device testing or architectural decisions):
- 5. Panfrost kernel patch (needs runtime validation)
- 10. RetroArch KMS/DRM (needs compositor changes)
- 11. Render resolution per core (needs per-game testing)
- 14. Vulkan decision (PanVK not ready for G31)
- 16-20. QoL items

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 14:36:01 -03:00
Douglas Teles ff1d3962ec FASE 1: Switch ZRAM to zstd, disable zswap
- ZRAM compression: lzo-rle → zstd (better 1:3 ratio vs 1:2.5, saves
  ~50MB more RAM on 512MB ZRAM at cost of slightly more CPU)
- Add zswap.enabled=0 to kernel cmdline (zswap intercepts before ZRAM,
  preventing efficient compressed swap)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 14:34:00 -03:00
Douglas Teles 85325f88a3 FASE 0+1+2: Production build audit fixes and infrastructure
Kernel config hardening:
- FRAME_POINTER=n: Saves 3-5% CPU overhead on ARM64 (wastes registers)
- DEBUG_FS=n: Remove debugfs mount (memory + attack surface)
- IKCONFIG=n: Save 100-300KB (kernel config in /proc not needed in production)

Mesa/Panfrost:
- Add persistent shader cache (MESA_SHADER_CACHE_DIR + 128MB max)
  Avoids shader recompilation on every emulator launch

I/O scheduler:
- Enhanced BFQ udev rule: low_latency=1, read_ahead=2048KB, nr_requests=128
  Reduces ROM loading stutter on microSD

Sysctl:
- Add vm.dirty_expire_centisecs=3000 (dirty pages expire after 30s)
- Add vm.page-cluster=0 (single-page swap for ZRAM, instant swap-in)

Infrastructure:
- Create tools/audit-build.sh: comprehensive production build audit script
  Checks kernel debug flags, Mesa env vars, binary stripping, emulator
  build types, system state, active services

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 14:29:06 -03:00
Douglas Teles 70f42b992c Optimize ALL emulators: align with dArkOS performance settings
Flycast (Dreamcast):
- AutoSkipFrame: 1→2 (skip up to 2 frames when behind, matches dArkOS)
- Audio backend: pulse→auto (better compatibility)

Mupen64Plus (N64):
- Resolution: 427x320→480x320 (better aspect ratio for 640x480 screens)
- PRIMARY_BUFFER_SIZE: 8192→16384 (more stable audio, matches dArkOS)
- SECONDARY_BUFFER_SIZE: 2048→1024 (lower SDL latency, matches dArkOS)

PPSSPP (PSP):
- ForceMaxEmulatedFPS: 30→0 (remove artificial cap that limited 60fps games)

GZDoom:
- Add +gl_es 1 +vid_preferbackend 3 +cl_capfps 0 flags (matches dArkOS)
  Forces OpenGL ES mode with preferred backend, uncapped FPS

RetroArch core options:
- mame2003-plus skip_warnings: disabled→enabled (faster arcade startup)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 13:35:14 -03:00
Douglas Teles 7ff8f5bbd7 Optimize DraStic for RK3326: match dArkOS performance settings
- frameskip_value: 3→1 (skip fewer frames = smoother, dArkOS uses 1)
  Higher skip values cause visual stuttering without improving actual FPS
  because DraStic already renders efficiently
- screen_orientation: 1→2 (match dArkOS layout, optimized rendering path)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 13:28:48 -03:00
Douglas Teles 25abe265b8 Maximize melonDS performance on RK3326
Config:
- ShowOSD=0: Disable on-screen display (saves rendering cycles)
- MouseHide=1: Hide cursor immediately

Launch script:
- Force JIT, software 3D, ScreenUseGL=0 at every launch (prevent
  user/ES settings from accidentally enabling heavy GPU features)
- Set CPU governor to performance before launch
- QT_QPA_NO_SIGNAL_SPY=1: Disable Qt signal debugging
- QSG_RENDER_LOOP=basic: Simpler Qt render loop (less overhead)
- QT_ENABLE_HIGHDPI_SCALING=0: Skip HiDPI calculations
- AudioInterp=0, AudioBitrate=0: No audio interpolation overhead

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 13:20:10 -03:00
Douglas Teles b0c5eb982e Optimize melonDS config for RK3326 performance
- ScreenUseGL=0: Skip GPU-accelerated display compositing. On Mali-G31
  with Panfrost, the overhead of uploading software-rendered frames to
  GPU for display is slower than direct software blit.
- ScreenFilter=0: Disable bilinear filtering (saves GPU cycles)
- JIT remains enabled (critical for Cortex-A35 performance)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 13:08:32 -03:00
Douglas Teles 510bfd69b1 Fix melonDS crash: use QT_QPA_PLATFORM=wayland on Wayland compositors
melonDS was crashing with "could not connect to display :0.0" because
QT_QPA_PLATFORM was hardcoded to xcb. On RK3326 with Sway (Wayland),
XWayland may not expose :0.0 for all apps.

Fix: detect WAYLAND_DISPLAY and use wayland platform automatically.
Also set UTF-8 locale (Qt6 requires it, system defaults to "C").

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 10:50:35 -03:00
Douglas Teles 33ecd7ebaa Revert partition label to STORAGE (roms/ is now directly accessible)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 01:44:28 -03:00
Douglas Teles 6bb971606b Move ROMs to /storage/roms/ directly for easy PC access
Previously ROMs lived in /storage/games-internal/roms/ and were
bind-mounted to /storage/roms/ at runtime. When users mounted the
ROMS partition on PC, they had to navigate through games-internal/
to find their ROM folders.

Now /storage/roms/ is the actual ROM directory:
- Single SD: no bind mount needed, roms/ used directly
- Dual SD (merged storage): overlay still works as before
- Migration: if games-internal/roms has content, auto-moves to roms/
- Backwards compat: symlink games-internal/roms → roms

Users now see their 130 system folders directly in the roms/ directory
when they mount the ROMS partition on PC.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 01:33:53 -03:00
Douglas Teles 325114b508 Fix GPU black screen: restore low-frequency OPPs in GPU OPP table
ROOT CAUSE: The DTS patch removed ALL GPU OPPs (200/300/400/480 MHz)
and only kept 560/600 MHz. The GPU devfreq governor starts at the
LOWEST available OPP. Without 200 MHz, the GPU couldn't initialize
its clock, causing a black screen on boot.

Fix: Keep original 200/300/400 MHz OPPs, only replace 480 MHz with
560 MHz (overclock) and add 600 MHz. GPU can now initialize at 200 MHz
and scale up to 600 MHz.
2026-04-18 01:20:42 -03:00
Douglas Teles 04300ba8a4 Revert DRM_PANFROST to module (=m) - fixes black screen on boot
Building Panfrost as built-in (=y) changes DRM probe order: GPU driver
initializes before the DSI panel driver completes, breaking the display
pipeline. As module (=m), panfrost loads after the display is already up.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-17 23:00:41 -03:00
Douglas Teles 11e3bab620 Add support for Odroid Go 3 in DTBO generation and enable framebuffer emulation 2026-04-17 22:31:28 -03:00
Douglas Teles b04cdd590b Fix verification false positive, restore fbdev emulation, fix overlays
Flasher verification:
- Move read-back SHA256 verification BEFORE boot partition modifications
  (DTBO copy, variant write, extlinux switch). Previously verified AFTER
  modifications, causing guaranteed hash mismatch (false positive).
- Remove duplicate verification block at end of script.

Kernel:
- Restore DRM_FBDEV_EMULATION=y (disabling it broke display on some setups
  that depend on /dev/fb0 for initialization)

Panel overlays:
- Restore early return for odroidgo3-compatible devices in archr-dtbo.py.
  R36S base DTS already has reset-gpios/power-supply/backlight - adding
  them again in the overlay caused conflicts. Overlay only needs
  panel-init-sequence and display timings.
- Regenerate all 32 DTBOs with correct behavior.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-17 22:30:02 -03:00
Douglas Teles 04adf2c027 Add Elektronika BK system configuration
Missing bk.conf caused emulators meta-package build failure
(xmlstarlet could not find system definition).
2026-04-17 22:05:23 -03:00
Douglas Teles eb7ad55001 Add melonDS standalone config for RK3326
Based on RK3399 config, optimized for 640x480:
- Window 640x480 (native R36S resolution)
- JIT enabled (performance critical on Cortex-A35)
- Software 3D renderer (Mali-G31 too weak for GL renderer)
- Threaded 3D enabled

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-17 21:29:36 -03:00