aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
| | * | | | | | | | | | | file_sys: decompress large NUP zstd members onceSssnowyyy30 hours4-21/+205
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 31b901b93b only cached a zstd member while it fit the 512 MiB cache. Anything larger was never cached, so every Read() allocated the full uncompressed size and decompressed the whole extent again, which makes a multi-GB RomFS read in small chunks unusably slow. Members between 256 and 512 MiB evicted each other on alternate reads, and Insert copied the vector so memory briefly doubled. Two threads decompressing the same member also left a duplicate LRU entry and a wrong byte count. The writer emits one zstd frame per member, so there are no frame boundaries to seek by. Members larger than half the cache are now streamed once into a temporary file under the cache directory and read from there, using bounded memory. The file is removed when the container is released. Smaller members stay in the LRU, which now moves the vector in and ignores a duplicate insert. Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
| | * | | | | | | | | | | frontend: bound the wait for the emulation thread at shutdownSssnowyyy30 hours2-4/+30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 426f120ee8 dropped the 10 s wait and terminate() fallback when stopping emulation, and ShutdownGame and closeEvent now wait for the emulation thread with no limit. If the thread hangs (for example a GPU or present deadlock), stopping a game, switching games or quitting never completes. Keep the asynchronous teardown, but once the thread has been asked to stop, give it 10 s and then terminate it and finish cleanup, as before. ShutdownGame's nested event loop gets the same bound. A terminated thread is logged as an error. Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
| | * | | | | | | | | | | shader: tell handle-program textures apart when adding descriptorsSssnowyyy30 hours1-1/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Every texture whose handle is computed per draw gets the same placeholder constant buffer address (index 0, offset 0), and Descriptors::Add did not compare handle_program. Two such textures of the same type and depth in one shader therefore shared a descriptor, so the second sampled the first, and one could also merge with a real texture bound at constant buffer 0 offset 0. Compare handle_program too. The pixel-format-integer lookup cached its last answer by (index, offset), which has the same problem for handle programs; skip that cache for them. Follow-up to 561f87abec. Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
| * | | | | | | | | | | | Merge pull request #113 from ymatrix1/fix/storage-buffers-32Jonas28 hours1-1/+2
| |\ \ \ \ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | buffer_cache: allow 32 storage buffers per stage
| | * | | | | | | | | | | | buffer_cache: allow 32 storage buffers per stageYuri Olive35 hours1-1/+2
| | | |_|_|/ / / / / / / / | | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Native Switch 2 compute shaders (such as Donkey Kong Bananza) bind up to 18 global memory ranges, causing out-of-bounds binding errors: HW.GPU <Error> buffer_cache.h:BindComputeStorageBuffer: Storage buffer index 16 exceeds maximum storage buffer count HW.GPU <Error> buffer_cache.h:BindComputeStorageBuffer: Storage buffer index 17 exceeds maximum storage buffer count followed by GPU driver access violations (0xc0000005). The enabled and written storage buffer bitmasks (enabled_compute_storage_buffers and written_compute_storage_buffers) are already u32, so widening NUM_STORAGE_BUFFERS from 16 to 32 fits naturally within the existing 32-bit masks.
| * | | | | | | | | | | | Merge pull request #284 from Djihads80/fix/nx2-upscale-fallback-srgbJonas28 hours6-2/+54
| |\ \ \ \ \ \ \ \ \ \ \ \ | | |_|_|_|/ / / / / / / / | |/| | | | | | | | | | | nx2: decode sRGB in the upscale fallback when the program does (washed-out Splatoon Raiders)
| | * | | | | | | | | | | nx2: decode sRGB in the upscale fallback when the program doesTakoroka42 hours6-2/+54
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Splatoon Raiders' upscaler program ends by decoding its result from sRGB to linear (HSETP2 against 0.04045, HMUL2 by 2.4 between MUFU.LG2 and MUFU.EX2) before its surface store. The bilinear copy that stands in for it while HMMA isn't emulated wrote the sRGB input as-is, so the later passes encoded it a second time: outdoor scenes were washed out, with a pale sky and a white haze. When the program carries those two immediates, the copy now decodes like it, through a new copy operation of the blit helper (a fragment shader with the piecewise sRGB decode). Programs without them, such as Kirby Air Riders' upscaler, keep the plain copy. The OpenGL backend ignores the operation.
| | | | | | | | | * | | | network: fix room host LAN Play and room socket review issuescirakg27 hours2-38/+65
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The room host and room moderators are in the Moderator state, not Joined, so the airplane mode override for joined rooms did not apply to them and LAN Play still returned them to the menu. Accept both states. Share the room address override between the NIFM profile and IP config calls so they cannot drift apart. recv() on a room TCP socket now waited for the receive timeout, because Recv goes through RecvFrom. Room TCP sockets have no peer, so keep the previous immediate end-of-stream result when nothing is queued. Close() now drops queued packets and wakes a blocked recv, which then fails with EBADF. The socket state that the room thread reads when it queues a packet is now guarded by the packet mutex. Assisted-by: Claude Opus 5.5 (investigation and implementation)
| | | | | | | | | * | | | Merge branch 'nx2' into fix/room-proxy-recvcirakg28 hours0-0/+0
| | | | | | | | | |\ \ \ \ | |_|_|_|_|_|_|_|_|/ / / / |/| | | | | | | | | | | |
* | | | | | | | | | | | | Merge upstream Djihads80/Eglantine nx2 into nx2cirakg28 hours3-3/+3
|\| | | | | | | | | | | |
| | | | | | | | | * | | | Merge branch 'ldn/room-handshake' into fix/room-proxy-recvcirakg28 hours3-3/+3
| | | | | | | | | |\| | |
| | | | | | | | | | * | | nifm: treat a joined room as the LAN for local network gamescirakg28 hours1-3/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | LAN Play through public lobby rooms failed in two ways. With airplane mode on (the default), IRequest::GetResult rejected the game's network request. Mario Kart World then opened the net-connect applet and returned to the main menu instead of the LAN browser. A joined room is the emulated network: its sockets only reach room members. Count it as an available network for GetResult and IsAnyInternetRequestAccepted. With airplane mode off, players could open the browser but never saw each other. Room fake IPs are spread over 192.168.0.0/16, and some room servers give members different /24s. NIFM reported the host adapter's /24 mask with the fake IP, so the games treated each other as off-subnet. Report 255.255.0.0 in a room instead. Assisted-by: Claude Opus 5.5 (investigation and implementation)
| | | | | | | | | | * | | network: fix ProxySocket receive edge casescirakg28 hours2-51/+36
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Routing recv() through RecvFrom made several old RecvFrom problems reachable from the normal read path: - A partial TCP read kept zero bytes in front of the unread data. - A blocking read busy-waited with yield() and reported ETIMEDOUT. - MSG_PEEK hit the flags == 0 assert. - A UDP datagram larger than the buffer was dropped with EMSGSIZE. Wait on a condition variable signalled when a packet arrives, and report an expired wait as EAGAIN like an SO_RCVTIMEO timeout. Keep the existing 5s cap for sockets without a receive timeout. Allow MSG_PEEK. Truncate oversized datagrams as BSD recv() does, and keep the unread tail of a TCP packet for the next read. Assisted-by: Claude Opus 5.5 (investigation and implementation)
| | | | | | | | | | * | | network: deliver room datagrams through ProxySocket::Recvcirakg28 hours1-5/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When connected to an emulator room every guest socket is a ProxySocket. Its Recv was a stub that always returned zero bytes, so games that read UDP replies with recv() never received them. Mario Kart World LAN Play reads its discovery replies this way, so guests never saw the host's room in the LAN browser. Delegate Recv to RecvFrom without an address, so queued room packets, non-blocking, timeout, peek and truncation behaviour match recvfrom(). Assisted-by: Claude Opus 5.5 (investigation and implementation)
| | | | | | | | | | * | | Merge branch 'nx2' into ldn/room-handshakecirakg28 hours27-1403/+2796
| | | | | | | | | | |\ \ \ | | |_|_|_|_|_|_|_|_|/ / / | |/| | | | | | | | | | |
| * | | | | | | | | | | | Merge pull request #309 from lunar-me/docs/fix-information-articlekraibse29 hours1-1/+1
| |\ \ \ \ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | docs: drop indefinite article before uncountable "information"
| | * | | | | | | | | | | | docs: drop indefinite article before uncountable "information"lunar-me35 hours1-1/+1
| | | |_|_|_|/ / / / / / / | | |/| | | | | | | | | |
| * | | | | | | | | | | | Merge pull request #307 from lunar-me/docs/fix-quickstart-get-startedkraibse30 hours1-1/+1
| |\ \ \ \ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | docs: fix "get starting" to "get started" in Quick Start
| | * | | | | | | | | | | | docs: fix "get starting" to "get started" in Quick Startlunar-me35 hours1-1/+1
| | |/ / / / / / / / / / /
| * | | | | | | | | | | | Merge pull request #308 from lunar-me/docs/fix-vice-versa-spellingkraibse30 hours1-1/+1
| |\ \ \ \ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | docs: spell "vice versa" as two words in troubleshooting guide
| | * | | | | | | | | | | | docs: spell "vice versa" as two words in troubleshooting guidelunar-me35 hours1-1/+1
| | |/ / / / / / / / / / /
| | | | | | | | | | * | | ldn: wait for the host's reply when joining a networkcirakg34 hours3-15/+89
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Connect slept for a second while holding packet_mutex, so the host's SyncNetwork reply could not be handled until Connect had already returned success in StationOpened. Players could see each other's group and enter it, but never actually met. Wait on a condition variable instead, accept the reply only from the selected host and session, and fail after five seconds. Check packet sizes and senders, stop duplicate joins from taking another station, and seed session IDs so separate networks don't share one. The SDL frontend never called Network::Init, so its multiplayer option could not join a room. Initialize and shut down networking around the core. Assisted-by: Sol (implementation) Assisted-by: Claude Opus 5.5 (code review)
| | | | | | | | | * | | | nifm: treat a joined room as the LAN for local network gamescirakg28 hours1-3/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | LAN Play through public lobby rooms failed in two ways. With airplane mode on (the default), IRequest::GetResult rejected the game's network request. Mario Kart World then opened the net-connect applet and returned to the main menu instead of the LAN browser. A joined room is the emulated network: its sockets only reach room members. Count it as an available network for GetResult and IsAnyInternetRequestAccepted. With airplane mode off, players could open the browser but never saw each other. Room fake IPs are spread over 192.168.0.0/16, and some room servers give members different /24s. NIFM reported the host adapter's /24 mask with the fake IP, so the games treated each other as off-subnet. Report 255.255.0.0 in a room instead. Assisted-by: Claude Opus 5.5 (investigation and implementation)
| | | | | | | | | * | | | network: fix ProxySocket receive edge casescirakg29 hours2-51/+36
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Routing recv() through RecvFrom made several old RecvFrom problems reachable from the normal read path: - A partial TCP read kept zero bytes in front of the unread data. - A blocking read busy-waited with yield() and reported ETIMEDOUT. - MSG_PEEK hit the flags == 0 assert. - A UDP datagram larger than the buffer was dropped with EMSGSIZE. Wait on a condition variable signalled when a packet arrives, and report an expired wait as EAGAIN like an SO_RCVTIMEO timeout. Keep the existing 5s cap for sockets without a receive timeout. Allow MSG_PEEK. Truncate oversized datagrams as BSD recv() does, and keep the unread tail of a TCP packet for the next read. Assisted-by: Claude Opus 5.5 (investigation and implementation)
| | | | | | | | | * | | | network: deliver room datagrams through ProxySocket::Recvcirakg30 hours1-5/+1
| |_|_|_|_|_|_|_|/ / / / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When connected to an emulator room every guest socket is a ProxySocket. Its Recv was a stub that always returned zero bytes, so games that read UDP replies with recv() never received them. Mario Kart World LAN Play reads its discovery replies this way, so guests never saw the host's room in the LAN browser. Delegate Recv to RecvFrom without an address, so queued room packets, non-blocking, timeout, peek and truncation behaviour match recvfrom(). Assisted-by: Claude Opus 5.5 (investigation and implementation)
* | | | | | | | | | | | Merge upstream Djihads80/Eglantine nx2 into nx2cirakg30 hours1-1312/+1443
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | # Conflicts: # .github/workflows/release-binaries.yml
| * | | | | | | | | | | Revert "Merge pull request #285 from jojo-chaechae/ci/qt-6.12.0"PastaLaPate30 hours1-3/+3
| | |_|_|/ / / / / / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This reverts commit c5fb2d2a1dd3b47e6d7b4f6acf2bdfae325e2918, reversing changes made to 046646e3514ca4950622d75609e68498f889989e.
| * | | | | | | | | | Merge pull request #285 from jojo-chaechae/ci/qt-6.12.0PastaLaPate30 hours1-3/+3
| |\ \ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | ci: build the Linux and MSVC Windows packages with Qt 6.12.0
| | * \ \ \ \ \ \ \ \ \ Merge branch 'nx2' into ci/qt-6.12.0PastaLaPate30 hours178-2467/+8851
| | |\ \ \ \ \ \ \ \ \ \ | | |/ / / / / / / / / / | |/| | | | | | | | | |
| * | | | | | | | | | | Merge pull request #286 from EmilyTsum/update-ja-jp-translationkraibse30 hours1-1312/+1443
| |\ \ \ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | dist/languages: refine and complete Japanese (ja_JP) translation
| | * | | | | | | | | | | dist/languages: refine and complete Japanese (ja_JP) translationEmilyTsum40 hours1-1312/+1443
| | | |_|_|/ / / / / / / | | |/| | | | | | | | |
| * | | | | | | | | | | Merge pull request #223 from PastaLaPate/nx2PastaLaPate30 hours1-17/+51
| |\ \ \ \ \ \ \ \ \ \ \ | | |_|_|_|_|/ / / / / / | |/| | | | | | | | | | [CI] Use table layout for releases
| | * | | | | | | | | | Merge remote-tracking branch 'upstream/nx2' into nx2PastaLaPate30 hours231-1124/+14170
| | |\ \ \ \ \ \ \ \ \ \ | | |/ / / / / / / / / / | |/| | | | | | | | | |
| | * | | | | | | | | | ci(release-binaries): use a table to download binaries instead of long filesPastaLaPate2 days1-12/+47
| | | | | | | | | | | |
| | | | * | | | | | | | ci: build the Linux and MSVC Windows packages with Qt 6.12.0Jonas42 hours1-3/+3
| | | |/ / / / / / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The aqt-installed Qt was pinned to 6.8.3 while the MinGW, macOS and local builds already use current Qt. 6.12.0 matches the Qt local test builds run on.
* | | | | | | | | | | Merge upstream Djihads80/Eglantine nx2 into nx2cirakg32 hours12-6/+478
|\| | | | | | | | | |
| * | | | | | | | | | Merge pull request #322 from Djihads80/fix/nx2-cmdlist-copiesnowhere0232 hours12-6/+478
| |\ \ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | nx2: read GPU-written command lists from copies instead of draining
| | * | | | | | | | | | nx2: read GPU-written command lists from copies instead of drainingTakoroka34 hours12-6/+478
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The trees fix (#52) drains the split and flushes for every command list on a GPU-written page: in a Mario Kart World race ~13,500 lists and ~400 GPU round trips a second, during which the back has nothing to do. The replay ran at ~40 fps instead of ~45. The front now marks the pages those lists are on. The buffer cache notes writes to them; after a compute dispatch or DMA copy that writes one it copies the page into host memory and submits. The front waits for the back only up to the last compute or copy work it sent (not everything queued), then reads the copy once the GPU is done with it. Pages the GPU wrote once, long before, and the CPU now writes lists to have no copy: their first list drains and flushes the whole page, which is then read from guest memory until GPU work writes it again. CPU writes and inline uploads reach guest memory, so they keep such a page synced but make a copy stale. A page a draw writes always drains. Mario Kart World time-trial replay, Radeon 780M: ~40 -> ~45 fps, trees drawn, no list drains left.
* | | | | | | | | | | | Merge upstream Djihads80/Eglantine nx2 into nx2cirakg33 hours10-65/+821
|\| | | | | | | | | | |
| * | | | | | | | | | | Merge pull request #318 from Djihads80/feat/nup-packer-uikraibse33 hours9-64/+820
| |\ \ \ \ \ \ \ \ \ \ \ | | |/ / / / / / / / / / | |/| | | | | | | | | | [emu-ui] Add a metadata mask to the NUP-packer
| | * | | | | | | | | | qt: add a metadata dialog and a progress window to Convert to NUPkraibse34 hours5-44/+624
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Convert to NUP now opens a dialog with the icon (preview, drop zone, file picker, and a Use Detected button only when the dump has an icon), the name, and the version (auto-detected or manual), next to the paths, space estimate and low-storage option. The conversion runs in a window with a full-width progress bar, percentage, speed and time remaining, and a cancel that also covers closing the window. Assisted-by: Claude Sonnet 5.5 (wrote the metadata dialog, icon drop zone and progress window)
| | * | | | | | | | | | loader: read the display version from GameDataList.Product.NNN tookraibse34 hours2-17/+52
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Donkey Kong Bananza names its resource size table without a version, so no version was found for a loose dump. Its GameData/GameDataList.Product .320.* files carry it (3.2.0), so read them as well and use the newest tag from either source. Assisted-by: Claude Sonnet 5.5 (wrote the GameDataList version lookup and its test)
| | * | | | | | | | | | file_sys: let the NUP packer override and probe the name, icon and versionkraibse34 hours3-3/+144
| | | |_|_|_|_|_|/ / / | | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | PackOptions::metadata overrides the title name, icon and display version found in the dump. A version override is written to the base and to the newest update, since the NUP loader reads the version from the newest update first. ProbeMetadata reads what a dump would be packed with, the version coming from the newest update that reports one, else the base. Assisted-by: Claude Sonnet 5.5 (wrote the metadata overrides, ProbeMetadata and their test)
| * | | | | | | | | | Merge pull request #315 from snowstormxd/fix/msvc-unused-path-capturekraibse34 hours1-1/+1
| |\ \ \ \ \ \ \ \ \ \ | | |/ / / / / / / / / | |/| | | | | | | | | Fix MSVC build: remove unused path capture
| | * | | | | | | | | qt_common: remove unused path capture to fix MSVC buildsnowstormxd34 hours1-1/+1
| |/ / / / / / / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | LooseDumpSize was removed, leaving path unused in addEntry. MSVC treats this as error C5233 through /we5233. Assisted-by: Codex (diagnosis and one-line fix)
* | | | | | | | | | ci: build and publish only the Linux x86_64 PGO AppImagecirakg34 hours1-430/+46
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This fork only ships the Linux PGO build, so drop the other platforms, the tar.gz and the Discord ping, which needs a webhook secret this repository doesn't have. Publish a checksum alongside the AppImage. Assisted-by: Claude Opus 5.5 (workflow edit)
* | | | | | | | | | Merge branch 'Djihads80:nx2' into nx2cira010034 hours13-131/+403
|\| | | | | | | | |
| * | | | | | | | | Merge branch 'codex/upstream-loading-hotkeys' into nx2kraibse35 hours13-131/+403
| |\ \ \ \ \ \ \ \ \ | | |_|_|/ / / / / / | |/| | | | | | | |
| | * | | | | | | | refactor: remove redundant EnsureRomFS call in ↵kraibse35 hours1-2/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | AppLoader_DeconstructedRomDirectory
| | * | | | | | | | Merge remote-tracking branch 'origin/nx2' into codex/upstream-loading-hotkeyskraibse35 hours208-969/+11108
| | |\ \ \ \ \ \ \ \ | | |/ / / / / / / / | |/| | | | | | | |