Preserve native Windows paths for filesystem operations, command-line options,
and game icons. Complete Unicode handling in recursive file listings and file
logging, restore unmounting by host directory, and extend regression coverage.
Original implementation by Augusto Domingos (@AghastyGD); retain all five of
his PR commits and include the reviewed follow-up fixes.
Closes#714
Co-authored-by: Augusto Domingos <augustodomingosvasco@gmail.com>
* Persist save-data memory across restarts
* Fix SetSaveDataMemory2 data loss, split saves per user, add atomic writes everywhere
- SaveDataSetSaveDataMemory2 treated data_num=0 as "no entries" even when
a valid data pointer was supplied. Astro Bot calls this with data_num=0
meaning "one entry, at data[0]" (an implicit-count convention), so every
real save write from it was silently dropped as a no-op. Default
data_num to 1 when data is non-null, matching that convention.
- SaveDataSetupSaveDataMemory2/Get/SetSaveDataMemory2 rejected any call
that included a non-null icon pointer. Icon persistence isn't
implemented, but titles are allowed to pass one anyway; rejecting the
whole call over it made every title that does so fail outright. Ignore
icon instead of rejecting.
- SaveDataMount3/SaveDataTransferringMount/SaveDataDelete built their
save-data path from title+dir_name only, dropping the user_id PS5
local users are keyed by (unlike the newer SetSaveDataMemory2 layout,
which already nests by user_id). Nest these under user_id too so saves
from different local users can no longer collide. No migration for the
old flat layout - the project is still pre-release/experimental.
- Classic SaveDataMount3-mounted titles (Blasphemous, Dead Cells, ...)
write their save files directly through the guest's normal file I/O
once mounted, bypassing SaveData's own write path entirely, so they
had none of the crash-safety SetSaveDataMemory2 already had. Added the
same protection at the file-system layer: a guest file opened under a
/savedataN mount that recreates the file from scratch (O_CREAT and/or
O_TRUNC) is now written to a .tmp shadow file and atomically replaces
the real one on close, instead of being truncated in place.
- Both write paths now back up the file they're about to replace into a
sibling "backups" folder (same filename, no added suffix) before the
atomic replace, so a manual recovery copy of the previous save always
survives a write - even one that "succeeds" but wasn't wanted.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* Fix save-memory compatibility and preserve existing saves
---------
Co-authored-by: nmzik <Nmzik@mail.ru>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
PatchesDialog::Save silently ignored QSaveFile failures, leaving the
status label showing the old "Loaded N cheat(s)" text so the user could
not tell that their selection was not saved. Report the failure in the
status label and the log instead.
uic from Qt 6.12.0 crashes (0xC0000005) on any non-empty <connections>
block in .ui files. Move the cancel_button -> reject connection from
configuration_edit_dialog.ui into configurationEditDialog.cpp, matching
how the other buttons are already connected there.
Also document the glslang (glslangValidator) requirement for Windows
builds; CMake requires it via find_program(... REQUIRED).
* vscode: point IntelliSense at clang instead of MSVC
KYTY_SYSV_ABI expands to __attribute__((sysv_abi)) with no MSVC fallback,
which is correct for a project that rejects cl.exe at configure time. Nothing
told the C/C++ extension that, so it fell back to windows-msvc-x64 and
flagged every guest-facing function in the tree with "__attribute__ is not a
type name".
Set the IntelliSense mode, compiler path and C++ standard to match the
compiler the build actually uses, and export a compile database for it to
read.
* vscode: resolve the clang toolchain through the VS developer environment
The IntelliSense settings named a specific Visual Studio install, so the
compiler and Ninja only resolved on machines with VS 18 Community under
Program Files. Let CMake Tools source the developer environment instead,
which locates the toolchain through vswhere, and drop the explicit
compilerPath so cpptools takes the compiler from compile_commands.json.
Also point C_Cpp.default.compileCommands at the build directory this
workspace actually configures, and drop CMAKE_EXPORT_COMPILE_COMMANDS
because CMake Tools already exports the database by default.
* loader: emulate immediate SSE4a instructions on macOS
* tests: simplify macOS SSE4a test integration
Keep the Darwin target, CTest registration, and aggregate dependency in
one conditional block without a separate target list. Preserve the
standalone target when BUILD_TESTING is disabled.
Lowercase the test filename and diagnostic prefix, and drop unrelated
formatting changes from the instruction emulator.
Credit Brandon Strong's related SSE4a work in
https://github.com/KytyPS5/KytyPS5/pull/467.
Co-authored-by: Brandon Strong <brandostrong@gmail.com>
---------
Co-authored-by: nmzik <Nmzik@mail.ru>
Co-authored-by: Brandon Strong <brandostrong@gmail.com>
* shader: implement S_ASHR_I64 with compute coverage
* tests: use existing compute suite for S_ASHR_I64
---------
Co-authored-by: nmzik <Nmzik@mail.ru>
* Fix launcher build on Qt versions below 6.6
QVulkanInstance::NoPortabilityDrivers is only available since Qt 6.6, so
guard its use the same way as the Apple-specific case.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Stop logging every reference-clock copy
CopyData of the clock counter runs on every GPU wait, so the handler wrote
one line per wait: a single SpongeBob boot that never reaches a frame logs
1312 of them, and the count grows with run time. Keep the first 64 lines
for diagnostics; the copy itself is unchanged.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Remove reference-clock logging comment
---------
Co-authored-by: YuhiAida <21134775+YuhiAida@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: nmzik <Nmzik@mail.ru>