mirror of
https://github.com/ARMSX2/ARMSX3.git
synced 2026-08-24 16:58:52 -07:00
The cache was written with one flag set and read with another. BuildShaderCache asked for allow_fp16 = true while LsfgShaders, the only consumer, asks for (false, false), and the header stores those flags and is rejected when they differ -- so the cache written at import could never satisfy the read after it. On a desktop that is invisible: the source DLL is still there, LoadShaderModules falls through to re-parsing the executable, and the cache is dead weight rewritten every launch. Android has nothing to fall through to, because the picked file is a copy in app cache that the system may clear, so it surfaced as "no shaders" with a valid cache sitting next to it. Worth telling Camille: Eden and ARMSX2 are both re-parsing Lossless.dll every launch rather than using their cache. The cache also survives a missing source now. It is validated against the source's size and mtime, which is right where an install stays put and wrong here; passing 0 skips those checks, matching what source_hash and variant already do. A replaced Lossless Scaling is no longer noticed automatically, which is the trade -- against losing the cache to a routine cache sweep, and re-importing is explicit. Performance: the fence wait moved from after the submit to before the next one. Waiting at the end put the whole interpolation on the critical path -- the thread sat idle until the GPU finished, every frame -- when nothing required it: frame generation and the present blits share one queue, so submission order already orders them. Waiting at the START only blocks when the previous frame's passes have not finished in time. The queue is now taken from the device rather than a second vkGetDeviceQueue, so that sharing is explicit rather than incidental. Settings: motion detail is a slider rather than three stops, and performance shaders is a switch rather than a pair of buttons.