aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* Merge upstream Djihads80/Eglantine nx2 into nx2HEADnx2cirakg2 hours51-194/+2631
|\ | | | | | | | | # Conflicts: # .github/workflows/release-binaries.yml
| * ci(release): add build number to appimagePastaLaPate2 hours1-0/+2
| |
| * Merge pull request #434 from Duck912/streamline-dlssDuck2 hours24-24/+1932
| |\ | | | | | | video_core: NVIDIA DLSS through NVIDIA Streamline in place of a game's DLSS
| | * video_core: accept an empty Streamline device-extension listDuck9125 hours1-5/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Streamline may report that DLSS needs no extra device extensions. The check required a non-empty list, so that result counted as "extensions unavailable": Streamline was stopped and FSR 3.1 used. Only require that every listed extension is supported. Found by CodeRabbit review. Assisted-by: Claude Opus 5.5 (implementation) Signed-off-by: Duck912 <350528965+Duck912@users.noreply.github.com>
| | * yuzu: bound the zip directory reads in the DLSS downloadDuck9125 hours1-2/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The central-directory parser trusted each entry's name, extra and comment lengths and the Zip64 extra field's length, so a malformed directory could make it read past the downloaded buffer. The data comes from NVIDIA's GitHub release over TLS and the saved files are signature-checked, so the risk is low. Stop with an error when an entry runs past the directory, and read Zip64 fields only inside their record. Found by CodeRabbit review. Assisted-by: Claude Opus 5.5 (implementation) Signed-off-by: Duck912 <350528965+Duck912@users.noreply.github.com>
| | * video_core, yuzu: write NVIDIA DLSS file paths to logs as UTF-8Duck9125 hours2-13/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The Streamline start-up and DLSS download code formatted paths with std::filesystem::path::string(), which on MSVC converts to the active code page and throws when a character has no mapping there, for example a user name in another script under %APPDATA%. The start-up log runs inside the renderer's constructor, which only catches vk::Exception, so such a user would crash at game start with the setting on. Use Common::FS::PathToUTF8String for every path in these logs and messages. Found by CodeRabbit review. Assisted-by: Claude Opus 5.5 (implementation) Signed-off-by: Duck912 <350528965+Duck912@users.noreply.github.com>
| | * video_core: clear the DLSS output when Streamline writes nothing to itDuck9125 hours1-0/+39
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The upscaler records its work on the worker thread and reports success once it is queued. When Streamline then rejects the DLSS options, gives no frame token or fails the evaluation, nothing is written to the output image, but the caller still draws it into the game's image that frame: undefined contents after a resize, the previous frame otherwise. FSR 3.1 takes over from the next frame. Clear the output on those paths, with barriers around the clear, so that frame is black instead. Found by CodeRabbit review. Assisted-by: Claude Opus 5.5 (implementation) Signed-off-by: Duck912 <350528965+Duck912@users.noreply.github.com>
| | * yuzu: show NVIDIA's DLSS files in the Graphics tab and fetch them from NVIDIADuck9126 hours5-2/+604
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Under the NVIDIA DLSS checkbox, a panel says whether the Streamline loader and DLSS were found and which versions, with "Open Folder" and a link to NVIDIA's Streamline releases. When files are missing, "Download from NVIDIA" takes only those files out of NVIDIA's Streamline 2.14.16 release zip on GitHub with HTTP range requests (about 1 MB for the loader, 32 MB with DLSS, of the 276 MB zip), after showing the Streamline and DLSS licence texts from the release for acceptance. Each file's CRC and signature are checked before it is saved to the user folder's "streamline" folder. Assisted-by: Claude Opus 5.5 (implementation) Signed-off-by: Duck912 <350528965+Duck912@users.noreply.github.com>
| | * video_core: NVIDIA DLSS through NVIDIA Streamline in place of a game's DLSSDuck9126 hours20-17/+1271
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Adds a Graphics setting, "Use NVIDIA DLSS in place of a game's DLSS" (nvidia_dlss, off by default). When it is on, in Windows builds configured with EGLANTINE_STREAMLINE_SDK, the evaluation Eglantine already replaces with FSR 3.1 goes to NVIDIA DLSS on GeForce RTX cards, with the same inputs (colour, depth, motion vectors, jitter). When DLSS can't run, FSR 3.1 runs as before. Only Streamline's MIT-licensed headers are compiled in; nothing of NVIDIA's is linked or shipped. At run time Eglantine looks for sl.interposer.dll in the user folder's "streamline" folder (or EDEN_STREAMLINE_DIR, or "streamline" next to the executable), checks its Streamline signature and starts Streamline with manual hooking. Streamline's plugins come from that folder or the NVIDIA app's downloads. DLSS itself is nvngx_dlss.dll in the same folder, else the newest DLSS 310 or later that the NVIDIA app has downloaded, checked for NVIDIA's Authenticode signature and copied as streamline/nvidia-app/nvngx_dlss.dll. Like other tools that call DLSS outside a game, it uses its own fixed project id with the custom engine type. - Preset K for all modes (EDEN_NX2_DLSS_PRESET overrides it): the default Performance model (M) and L draw thin dark horizontal lines in some frames at 2x resolution scale; K doesn't. - HDR input with auto exposure; the mode follows the render/output ratio. - Buffer device address stays enabled when DLSS needs it, for DLSS only. - The upscaler waits for the device instead of submitting when it is destroyed: by then the game's channels are released, and a submit read the state tracker's stale flags (a crash when stopping a game). With the setting off, or in builds without the SDK path (the setting is hidden there), nothing changes. Testing: Windows 11, RTX 5080, Fire Emblem: Fortune's Weave docked at 1x (720p -> 1440p) and 2x (1440p -> 2880p), CLI runs and GUI play, stopping and restarting games with DLSS on. Not tested on other GPUs or games. Assisted-by: Claude Opus 5.5 (implementation, debugging) Signed-off-by: Duck912 <350528965+Duck912@users.noreply.github.com>
| | * video_core: read the framebuffer before recording the upscaled-output blitDuck9126 hours1-7/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | BlitColor(VkImageView, VkImage, ...), which draws FSR 3.1's output into the game's DLSS output, captured the Framebuffer pointer and read its render pass, handle and size on the worker thread. The pointer points into the texture cache's framebuffer slots, which can be reallocated before the worker records the command, so the render pass could begin with a stale or null render pass and framebuffer. FSR 3.1 records quickly enough that this rarely shows; with a slower first evaluation (NVIDIA DLSS creating its feature) it crashed in vkCmdBeginRenderPass at the first evaluation in every run. Read the three values on the calling thread and capture those instead. Nothing else changes. Assisted-by: Claude Opus 5.5 (debugging, implementation) Signed-off-by: Duck912 <350528965+Duck912@users.noreply.github.com>
| * | Merge pull request #447 from Mcm190/fix/appimage-waylandJonas2 hours1-0/+3
| |\ \ | | | | | | | | ci: bundle Wayland plugins in Linux AppImages
| | * | ci: bundle Wayland plugins in Linux AppImagesMcm1904 hours1-0/+3
| |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | Request the Wayland platform plugins and their client graphics and shell integrations from linuxdeploy's Qt plugin. The existing Qt installation already contains them, so no extra Qt downloads are needed. Addresses #298. Assisted-by: Codex (diagnosis, packaging fix, validation, and draft text)
| * | Merge pull request #433 from Djihads80/new_issues_templatePastaLaPate4 hours8-82/+472
| |\ \ | | |/ | |/|
| | * made changes suggested by coderabbitPastaLaPate5 hours2-3/+0
| | |
| | * fixes and added workflowPastaLaPate5 hours3-2/+88
| | |
| | * feat: added other report typesPastaLaPate6 hours6-1/+311
| | |
| | * feat: added new crash issue_templatePastaLaPate6 hours4-102/+99
| |/
| * tests: fix the tests target build on nx2kraibse7 hours2-1/+11
| |\ | | | | | | Merge pull request #398 from Djihads80/fix/tests-build
| | * tests: compare the socket receive count without a sign mismatchkraibse9 hours1-1/+1
| | | | | | | | | | | | | | | | | | | | | Recv reports a signed int count and payload.size() is size_t, which trips -Werror=sign-compare and stops the tests target from building. Assisted-by: DeepSeek V4.1 Flash (diagnosis and patch)
| | * tests: give the descriptor table mocks a GetPointer hookkraibse9 hours1-0/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | DescriptorTable::Read calls MemoryManager::GetPointer for entries that fall inside a single page, which neither mock in this test implemented, so the template failed to instantiate and the tests target stopped building. Return nullptr from both mocks so the tests keep exercising the generic ReadBlockUnsafe path they are written for. Assisted-by: DeepSeek V4.1 Flash (diagnosis and patch)
| * | ci: skip the release binaries for test-only pusheskraibse7 hours1-0/+3
| |\ \ | | |/ | |/| Merge pull request #401 from Djihads80/ci/skip-tests-release-binaries
| | * ci: skip the release binaries for test-only pusheskraibse9 hours1-0/+3
| |/ | | | | | | | | | | | | | | | | The release build configures with BUILD_TESTING=OFF and YUZU_TESTS=OFF, so a push that only touches src/tests produces the same binaries on all seven platforms. Exclude that directory from the path filter so it does not queue a rebuild; a push that also touches a build input still runs. Assisted-by: DeepSeek V4.1 Flash (diagnosis and patch)
| * Add Arch Linux eglantine-git Package (#323)FranzQDH15 hours2-0/+104
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This PR introduces an Arch Linux development package called eglantine-git, addressing Issue #167. The package allows Arch Linux users to build and install Eglantine directly from its source code and keep it up to date through AUR helpers such as yay or paru. Changes Add a PKGBUILD for building Eglantine from the nx2 branch. Build both the graphical application (eglantine) and the CLI tool (eden-cli). Use system-provided dependencies for Qt, SDL3 and FFmpeg. Integrate the project's installation rules. Add the expected desktop icon name so the application icon is displayed correctly. Disable the application's built-in updater, as updates are handled through the package manager. Add Qt Wayland as an optional dependency. Validation bash -n PKGBUILD passes. git diff --check passes. A full package build and runtime test have not yet been performed in an Arch Linux environment. namcap validation is also pending. Further testing on Arch Linux is required to verify the complete build and installation process. Assisted by: Claude Opus 5.5
| * Signed-off-by: Mcm190 <maxcartermarshall@gmail.com> (#382)mcm15 hours2-50/+20
| | | | | | Old contrib guide links to Eden and account registration instructions. Updated to nx2 branch and policy links, easier for new contributors to follow correct steps.
| * video_core: cut per-draw work on the GPU back thread in crowded scenes (#374)Duck15 hours2-3/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * video_core: demote the texture cache's per-draw debug logs to trace The invalid sampler and image view index messages fire for unused binding slots on every draw. Filtered LOG_DEBUG messages still cost a call and argument packing: in a Fire Emblem: Fortune's Weave city scene (about 2,100 draws per frame) they were 3.1% of the GPUBack thread's samples. LOG_TRACE compiles them out of release builds. Assisted-by: Claude Opus 5.5 (profiling, porting and drafting) Signed-off-by: Duck912 <350528965+Duck912@users.noreply.github.com> * texture_cache: read a descriptor with one page lookup DescriptorTable::Read runs for every texture and sampler of every draw, and it read each 32-byte TIC/TSC entry through the generic ReadBlockUnsafe page walk. In a Fire Emblem: Fortune's Weave city scene (about 2,100 draws per frame) that was 5.0% of the GPUBack thread's samples. An entry within one page is contiguous in host memory, so it is now a single page lookup and memcpy. Entries that cross a page and pages without host memory still take the block read, so unmapped and unbacked entries still read as zero. The same change in another Eden-based build cut these reads from 6.4% to 0.4% of its GPU thread. Assisted-by: Claude Opus 5.5 (profiling, porting and drafting) Signed-off-by: Duck912 <350528965+Duck912@users.noreply.github.com> --------- Signed-off-by: Duck912 <350528965+Duck912@users.noreply.github.com>
| * Merge pull request #384 from jojo-chaechae/ci/revert-android-releaseJonas15 hours2-83/+2
| |\ | | | | | | ci: revert Android release builds
| | * ci: revert Android release buildsJonas15 hours2-83/+2
| |/ | | | | | | | | | | | | | | Revert the Android APK build and release publication introduced by #360, and restore the default Android application ID. Automated Android releases are paused while support issues are addressed. AI disclosure: This commit message was written by AI and does not comply with the repository AI policy requirement that commit messages be human-written. Assisted-by: GPT-6 (prepared the revert and wrote this commit message)
| * nx2: fewer render pass splits on tiled GPUs, log failed GPU waits (Pokopia) ↵Alex17 hours2-2/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | (#361) * buffer_cache: don't end the render pass after mapped buffer uploads Every upload set any_buffer_uploaded, and the next draw or dispatch then recorded a transfer-to-shader barrier outside the render pass. On Vulkan the uploads are mapped: each copy either records its own barriers (CopyBuffer with barrier set) or goes to the upload command buffer, which ends with a barrier before the frame's commands run. The extra barrier only ended the render pass. On tiled GPUs every such split writes the attachments out and reads them back. Pokopia's first gameplay scene had ~50 of these splits a frame. Without them, an M3 MacBook Air (MoltenVK, 1x docked) goes from ~35 to ~29.5 ms of GPU time a frame and from 28.5 to 32 fps. OpenGL uploads immediately and keeps the barrier. Assisted-by: Claude Opus 5.5 (profiling, implementation and commit message) * vulkan: log a failed GPU wait before it ends the process When the device is lost, vkWaitSemaphores in MasterSemaphore::Wait returns VK_ERROR_DEVICE_LOST and the exception goes uncaught on the fence thread or the GPU thread, so the process aborts without a line in the log: ReportLoss is only reached from submit and present. A Pokopia crash on macOS left the log ending a second before the abort, with no hint that the GPU was lost. Log the wait's result before rethrowing. On macOS, MoltenVK prints the Metal reason (a GPU hang or page fault) to stderr only. Assisted-by: Claude Opus 5.5 (diagnosis, implementation and commit message)
| * common: measure the TSC only on CPUs without CPUID leaf 0x15 (#373)Duck17 hours1-2/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The fallback that measures the TSC rate when the CPU reports none was meant for AMD, which has no leaf 0x15 at all. It also caught Intel CPUs that have the leaf but report a crystal frequency of 0 (Coffee Lake, e.g. the i5-9400F) and moved them from the OS clock to the measured RDTSC clock. With the same fallback in another Eden-based build, an i5-9400F crashed about 3.5 s after launch; limiting the fallback to CPUs without the leaf fixed it for that tester. Those Intel CPUs now keep the OS clock, as before the fallback. AMD CPUs still get the measured RDTSC clock (a Ryzen 7 9800X3D reports max leaf 0xd, so nothing changes there). Assisted-by: Claude Opus 5.5 (debugging, porting and drafting) Signed-off-by: Duck912 <350528965+Duck912@users.noreply.github.com>
| * core: detect Switch 2 programs in NSP containers (#349)cira010017 hours1-3/+22
| | | | | | Read the selected program metadata before kernel initialization so NSP launches receive the Switch 2 memory layout and clock. This fixes Mario Kart World 1.8.0 crashing during startup while its loose 1.0 dump already boots.
| * ci: build Android arm64 APKs in release-binaries (#360)Jonas17 hours2-2/+83
| | | | | | | | | | Adds an android-arm64 job that builds the mainline release APK twice: as dev.eglantine.eglantine and as com.antutu.ABenchMark. The package name comes from a new appId Gradle property. Both APKs are published with the release.
| * Merge pull request #377 from Djihads80/eglantine/cli-help-version-exitReyani17 hours1-0/+6
| |\ | | | | | | cli: exit successfully for --help and --version
| | * cli: exit successfully for --help and --versionShahadatTest18 hours1-0/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ApplyLaunchParams already prints the help or version text, but SDL_AppInit then fell through to the "No ROM specified" check and returned SDL_APP_FAILURE, so `eglantine-cli --help` and `--version` logged a critical error and exited with a failure code. Return SDL_APP_SUCCESS for those two options before the ROM check. Tested: Windows and Linux CI builds; on Windows, --help and --version exit with 0 and running without a ROM still exits with a failure. AI disclosure: implemented with Claude and reviewed with Codex (AI coding assistants). (cherry picked from commit 6debe97d22)
| * | Merge pull request #378 from Djihads80/eglantine/remove-duplicate-icnsReyani17 hours1-0/+0
| |\ \ | | |/ | |/| Remove dist/Eglantine.icns, which collides with dist/eglantine.icns
| | * Remove dist/Eglantine.icns, which collides with dist/eglantine.icnsnagisa-kamishiro18 hours1-0/+0
| |/ | | | | | | | | | | | | | | | | | | The two names differ only in case, so on case-insensitive filesystems (Windows, default macOS) only one of them can be checked out and git status always shows the other as modified. src/yuzu/CMakeLists.txt and src/yuzu/Info.plist only reference the lowercase dist/eglantine.icns; nothing references the uppercase file. AI disclosure: found and prepared with Claude (an AI coding assistant).
| * Merge pull request #155 from Djihads80/neo.ai/vibration-fixJonas21 hours2-6/+26
| |\ | | | | | | Diagnoses to fix vibration support
| | * Vibration support for ns2 gamesnéo Luigi22 hours2-36/+25
| | | | | | | | | | | | | | | | | | | | | | | | | | | This branch supports vibration by achieving proper rumble reading from games and uses regular eglantine/eden logic from ns1 to send them over. Tested on windows 10 on Mario Kart World Assisted-by: Claude Opus 5.5 (code cleanup)
| | * Merge remote-tracking branch 'origin/nx2' into neo.ai/vibration-fixnéo Luigi23 hours276-2562/+17945
| | |\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # src/core/hle/service/hid/hid_server.cpp # src/core/hle/service/hid/hid_server.h
| | * | Vibration fix for ns2 games | Assisted by claude (code)néo Luigi3 days2-5/+36
| | | |
| * | | Merge pull request #364 from Djihads80/fix/fsr3-mingw-shadowJonas22 hours1-3/+3
| |\ \ \ | | | | | | | | | | video_core: fix the -Wshadow error in the FSR 3.1 upscaler
| | * | | video_core: fix the -Wshadow error in the FSR 3.1 upscalerJonas22 hours1-3/+3
| |/ / / | | | | | | | | | | | | | | | | | | | | Fsr3Upscaler::Pass::Dispatch took a scheduler parameter that shadows Fsr3Upscaler::scheduler, which fails the Windows MinGW PGO build under -Werror=shadow.
| * | | Merge pull request #313 from cira0100/ldn/room-handshakeMako22 hours17-286/+1047
| |\ \ \
| | * | | tests: cover room packet matching and size-checked ZSTD decompressioncirakg22 hours3-3/+94
| | | | | | | | | | | | | | | | | | | | Assisted-by: Claude Opus 5.5 (investigation and implementation)
| | * | | network: close each bsd fd once and drop unwanted or malformed room packetscirakg22 hours8-32/+91
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Two threads closing the same fd both copied the descriptor and both called Close(), so a host socket could be closed twice, and the second closesocket could hit an unrelated socket that had reused the host fd. CloseImpl now frees the slot under file_descriptors_mutex first and only that thread closes the socket; the other gets EBADF. OnProxyPacketReceived decompressed every room packet when any fd had a socket, including native sockets and proxy sockets on other ports. Sockets now report through AcceptsProxyPacket whether they want a packet, and only those are collected, so an unwanted packet is not decompressed. DecompressDataZSTD passed the frame's declared size straight to the vector constructor, so a malformed or unsized frame from a room member threw on the room thread. The new TryDecompressDataZSTD rejects invalid, unsized and oversized frames, and bsd drops such packets with a warning. DecompressDataZSTD now returns an empty vector for them instead of throwing. Assisted-by: Claude Opus 5.5 (investigation and implementation)
| | * | | Merge upstream Djihads80/Eglantine nx2 into ldn/room-handshakecirakg23 hours63-221/+17100
| | |\ \ \
| * | | | | fix: update BUILD_ID definition and improve path handling in GameListWorkerkraibse23 hours2-1/+3
| | | | | |
| * | | | | nx2: improve save data handling for titles with missing NACP sizes to ↵kraibse23 hours1-20/+16
| | |/ / / | |/| | | | | | | | | | | | | redirect the user to the correct save location
* | | | | tests: cover room packet matching and size-checked ZSTD decompressioncirakg22 hours3-3/+94
| | | | | | | | | | | | | | | | | | | | Assisted-by: Claude Opus 5.5 (investigation and implementation)
* | | | | network: close each bsd fd once and drop unwanted or malformed room packetscirakg22 hours8-32/+91
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Two threads closing the same fd both copied the descriptor and both called Close(), so a host socket could be closed twice, and the second closesocket could hit an unrelated socket that had reused the host fd. CloseImpl now frees the slot under file_descriptors_mutex first and only that thread closes the socket; the other gets EBADF. OnProxyPacketReceived decompressed every room packet when any fd had a socket, including native sockets and proxy sockets on other ports. Sockets now report through AcceptsProxyPacket whether they want a packet, and only those are collected, so an unwanted packet is not decompressed. DecompressDataZSTD passed the frame's declared size straight to the vector constructor, so a malformed or unsized frame from a room member threw on the room thread. The new TryDecompressDataZSTD rejects invalid, unsized and oversized frames, and bsd drops such packets with a warning. DecompressDataZSTD now returns an empty vector for them instead of throwing. Assisted-by: Claude Opus 5.5 (investigation and implementation)
* | | | | Merge upstream Djihads80/Eglantine nx2 into nx2cirakg23 hours63-221/+17100
|\| | | |