Commit Graph
32237 Commits
Author SHA1 Message Date
652ebe56d5 chore(audit): remove unhooked src/yuzu and src/yuzu_cmd (#23)
Delete the unused Qt/CLI trees (live frontends are src/suyu and
src/suyu_cmd). Retarget FindLLVM's Windows dummy source, Qt tooling
paths, CODEOWNERS, and REUSE UI globs onto the live suyu files.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-17 09:47:19 -05:00
1b98e84b9a chore(dedicated_room): delete unused suyu_room orphans (#27)
Remove suyu_room.cpp/.rc (unreferenced after Eden restored yuzu-room),
the unused dedicated_room PCH header, and yuzu_room_standalone/main.cpp
(Qt Creator Hello World, not a CMake source). Live room remains yuzu_room
linked by yuzu_room_standalone as suyu-room.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-17 05:05:44 -05:00
7abfb935d7 test(recompiler): instruction correctness vs Dynarmic + x86-64 sanitizers (#22)
* test(recompiler): pin instruction correctness vs Dynarmic + x86-64 sanitizers

Expand backlog #4 coverage: hosted Translate C vs independent ARM arithmetic
(edge cases and randomized inputs) in homebrew_harness, and Translate AOT vs
in-tree Dynarmic on the same encodings in recomp_stack_harness.

ANDS/BICS/TST now update N/Z only (C/V unchanged when the shifter is idle),
matching Dynarmic and the ARM ARM.

Wire ASan+UBSan via -DSUYU_ENABLE_SANITIZERS / -DYUZU_ENABLE_SANITIZERS and a
Linux x86-64 tests.yml job. Nested probe/AOT compiles inherit the flags.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* test(recompiler): compare ANDS NZCV vs Dynarmic on N/Z only

AOT preserves incoming C/V when ANDS shift amount is 0 (ARM ARM). Dynarmic
reports C=V=0 on the same block, so the stack pin matches N/Z (and GPRs)
rather than treating Dynarmic C/V as the architectural reference.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* fix(recompiler): ANDS AOT writes C=V=0 to match A64/Dynarmic

Restore recomp_set_flags(add, result, 0, result) for ANDS/BICS/TST so
generated code clears C and V instead of leaving them stale. Drop the
N/Z-only Dynarmic mask; homebrew pins ands.c_cleared/v_cleared against a
C=V=1 preset so a stale emit fails.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-17 02:45:43 -05:00
Dallin Bland 85a1bf785e test(recompiler): JIT vs hybrid AOT performance benchmarks 2026-09-17 00:11:29 -05:00
Dallin Bland 980814122f chore(release): publish GitHub artifacts as drippu-* 2026-09-16 20:53:11 -05:00
Dallin Bland f1db986aa2 feat(recompiler): AOT/JIT execution measurements as JSON 2026-09-16 19:02:45 -05:00
Dallin Bland 7135e648bf Fix Windows recompiler exports and standalone relaunch 2026-09-16 17:38:52 -05:00
Dallin Bland 5f78ea8f23 test(recompiler): prove ArmRecomp AOT live + Invalidate AllowsAot 2026-09-16 16:12:00 -05:00
2ced07049a test(recompiler): real ArmRecomp + Dynarmic + kernel stack harness (#16)
* test(recompiler): real ArmRecomp+Dynarmic+kernel stack harness

Add recomp_stack_harness that boots a minimal System, creates an
application KProcess with in-tree fixture bytes, and drives ArmRecomp
RunThread/StepThread against real ApplicationMemory and Dynarmic JIT
fallback. Proves SVC parking, TLS/TPIDRRO, cross-page stores, AOT miss
and unhandled->Dynarmic transitions, icache invalidation, restart, and
StepThread fallback.

Keep homebrew_harness as the no-deps stub smoke; fix Windows helpers
under #ifdef so full-tree -Werror builds. Wire the new target into Linux
tests CI.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* fix(recompiler): wire SetRecompLookup AOT + real icache asserts

Path-1 Hashbrown HOLD: process ArmInterface is ArmRecomp via SetRecompLookup
before init; Translate'd AOT + matching guest RX; LoadContext alone publishes
TPIDRRO; registered-PC force-miss; ClearInstructionCache refuses AOT.

Also: InvalidateCacheRange no longer permanently kills AOT (loader RX protect
was rejecting every block before first insn); Dynarmic Clear/Invalidate resets
MemoryReadCode page cache so rewritten guest RX is visible after Clear.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-15 21:26:49 -05:00
54a43b59e9 Align verify-suyu skill with drippu rebrand and MCP harness (#15)
Update feature map and SKILL strings for post-#14 UI (Welcome/Setup
Profile drippu titles, mixed window chrome, menu labels, config title
still suyu). Fix control-suyu MCP socket handling so slow tools like
get_lobby_row_counts return instead of half-close dropping the reply.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-15 17:19:36 -05:00
Dallin Bland ca01d4937e Merge pull request #14 from SourCreamCulture/cursor/drippu-user-facing-rebrand-296e
User-facing drippu rebrand (README, UI strings, original icon)
2026-09-15 13:53:47 -07:00
Cursor AgentandDallin Bland 9e1a0c8bde User-facing drippu rebrand (strings, README, original icon)
Present the product as drippu without mass path/target renames.
Add an original drippu.svg mark, retitle README as an active fork
continuation, and update About/window titles, desktop/metainfo,
installer display name, and Android app strings. Keep QSettings and
binary names (suyu) stable for config and build compatibility.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-15 20:26:58 +00:00
Dallin Bland f4024d98b3 Merge pull request #12 from SourCreamCulture/cursor/module-identity-d6e7
fix(recompiler): bind modules by identity and invalidate stale AOT caches
2026-09-15 11:31:43 -07:00
Dallin Bland 7eca0f46e0 Merge pull request #13 from SourCreamCulture/cursor/homebrew-harness-a1e6
test(recompiler): headless homebrew harness + StepThread fallback fix
2026-09-15 11:07:35 -07:00
Dallin Bland 2c1c471b73 Merge branch 'main' into cursor/module-identity-d6e7 2026-09-15 11:06:59 -07:00
Dallin Bland 56fbd1e3a5 Merge pull request #11 from SourCreamCulture/cursor/sdiv-overflow-8d00
fix(recompiler): define SDIV INT_MIN / -1 before C division
2026-09-15 11:06:00 -07:00
Cursor AgentandDallin Bland 6fe012affe test(core): reset CoreTiming callback globals per TEST_CASE
Catch2 shuffle can run BasicOrderNoPausing before BasicOrder, leaving
callbacks_ran_flags set so BasicOrder's paused ScheduleEvent none()
assert flakes. Clear the shared bitset/delays/expected_callback at the
start of each case that uses them.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-15 17:43:22 +00:00
Cursor AgentandDallin Bland 1dfbbf645e ci: retrigger Linux tests after CoreTiming flake
The failed Linux job was CoreTiming[BasicOrder] (callbacks_ran_flags.none
while paused) — the same flake previously seen on main at 1ab59b1541 —
not related to the SDIV change. Empty commit to re-run required checks.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-15 17:40:29 +00:00
Dallin Bland cc1041461a Merge branch 'main' into cursor/homebrew-harness-a1e6 2026-09-15 10:15:58 -07:00
Cursor AgentandDallin Bland f1fcb3339b fix(recompiler): define SDIV INT_MIN / -1 before C division
Guest SDIV of the minimum signed value by -1 is defined as the minimum
itself. Emitting plain C signed `/` for that case is undefined behavior;
UBSan reports it even when a given host happens to return the expected
bits.

Guard both 32- and 64-bit forms before dividing, and extend the exporter
smoke suite with zero-divisor, overflow, ordinary negative, register-
aliasing, and XZR probes built under UBSan when the toolchain supports it.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-15 17:15:58 +00:00
2ad6bae5ce fix(recompiler): reject cross-page fast-path host pointers (#10)
recomp_host_ptr only resolved the starting guest page, so 2/4/8-byte
loads and stores at a page edge walked that host pointer into the next
page's address range. Adjacent pages need not share contiguous host
backing (and the next page may be tracked or unmapped), so the access
must take the emulator memory callback unless the full width fits in one
valid page.

Pass the access size into the resolver and fall back when the range
crosses a page or the address-space end. Add a generated-runtime probe
covering same-page fast path, discontiguous/tracked/unmapped second
pages, and SIMD-composed 128-bit loads built from load64.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-15 10:14:24 -07:00
Cursor AgentandDallin Bland f8659e603d test(recompiler): add headless homebrew runtime harness
Add a CI-runnable harness that executes translated AArch64 blocks and
checks register/memory outcomes for SVC, TLS, multi-core context
switch, forced AOT miss, unsupported insn fallback, icache invalidate,
stop/relaunch, and StepThread policy.

Fix ArmRecomp::StepThread so AOT misses and unhandled encodings enter
the same Dynarmic fallback path as RunThread instead of PrefetchAbort.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-15 17:13:11 +00:00
Cursor AgentandDallin Bland 426eb298e5 fix(recompiler): bind modules by identity and invalidate stale AOT caches
Dense runtime load-order indices were treated as canonical ABI slots, so a
sparse rtld/main/subsdk1/sdk layout wrote the SDK base onto subsdk1.
ApplyModuleBase now matches by name/build-id first.

Export reuse also keyed only on full_scan/backend and could keep stale game
code or an old emitter. Reuse now requires live ExeFS module identities,
emitter/ABI revision, and manifest v3; loaders expect build IDs from NSO
content rather than an adjacent JSON manifest alone.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-15 17:03:29 +00:00
1ab59b1541 fix(ci): gate release publish on required results (#8)
* test(ci): add release publication gate regression

Drive the Publish Release job the way GitHub Actions would. The check
evaluates job `if`/`needs` from `.github/workflows/release.yml` and runs
the job's shell against a stub `gh`. Required platform failures still
publish. The rolling `v0.04-latest` tag is deleted before the empty
artifact check. The release notes have no commit, toolchain, or checksum
metadata.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* fix(ci): gate release publish on required results

Replace if: always() with !cancelled() plus required job results so a
Windows, Linux, macOS, Android, or libretro failure cannot replace a
release. Keep FreeBSD and libretro-android optional. Stop deleting
v0.04-latest. Publish v0.04-<date>-<sha> with commit, toolchain, and
SHA-256 metadata. Call exporter smoke and the Catch2 tests from both
pull-request CI and the release needs list.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* chore(ci): drop leftover always() lecture from the gate check

Delete the module docstring that still taught if: always() after
release.yml stopped using it. GitHub's default success() wrap lives in
apply_github_default_success. Publish is forbidden from deleting a tag
at all, not only from deleting before the empty check.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* test(ci): reject gh prerelease as latest

GitHub returns HTTP 422 Latest release cannot be draft or prerelease
when gh release create passes --prerelease with --latest, then runs
cleanupDraftRelease. The gate stub now fails the same way.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* fix(ci): stop marking prereleases as latest

Remove --latest from publish_release.sh. GitHub forbids a prerelease
from being the latest release and gh then deletes the draft.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-15 07:39:43 +00:00
87625ecdb4 test(video_core): apply MemoryTracker batch updates in Catch2 stub (#9)
WordManager notifies through UpdatePagesCachedBatch only. The Catch2
rasterizer left that method empty, so Count() stayed 0 after Unmark.

Forward each batch range to UpdatePagesCachedCount. Rewrite the
FlushCachedWrites case to the measured contract: Unmark is one coalesced
+1, CachedCpuWrite sends -1 immediately, Flush does not add rasterizer
calls.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-15 07:19:43 +00:00