| Commit message (Collapse) | Author | Age | Files | Lines |
| |\
| |
| |
| |
| | |
# Conflicts:
# .github/workflows/release-binaries.yml
|
| | | |
|
| | |\
| | |
| | | |
video_core: NVIDIA DLSS through NVIDIA Streamline in place of a game's DLSS
|
| | | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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>
|
| | | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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>
|
| | | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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>
|
| | | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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>
|
| | | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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>
|
| | | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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>
|
| | | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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>
|
| | |\ \
| | | |
| | | | |
ci: bundle Wayland plugins in Linux AppImages
|
| | |/ /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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 #398 from Djihads80/fix/tests-build
|
| | | |
| | |
| | |
| | |
| | |
| | |
| | | |
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)
|
| | | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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)
|
| | |\ \
| | |/
| |/| |
Merge pull request #401 from Djihads80/ci/skip-tests-release-binaries
|
| | |/
| |
| |
| |
| |
| |
| |
| |
| | |
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)
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
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
|
| | |
| |
| | |
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: 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>
|
| | |\
| | |
| | | |
ci: revert Android release builds
|
| | |/
| |
| |
| |
| |
| |
| |
| | |
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)
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
(#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)
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
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>
|
| | |
| |
| | |
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.
|
| | |
| |
| |
| |
| | |
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.
|
| | |\
| | |
| | | |
cli: exit successfully for --help and --version
|
| | | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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)
|
| | |\ \
| | |/
| |/| |
Remove dist/Eglantine.icns, which collides with dist/eglantine.icns
|
| | |/
| |
| |
| |
| |
| |
| |
| |
| |
| | |
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).
|
| | |\
| | |
| | | |
Diagnoses to fix vibration support
|
| | | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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)
|
| | | |\
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
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
|
| | | | | |
|
| | |\ \ \
| | | | |
| | | | | |
video_core: fix the -Wshadow error in the FSR 3.1 upscaler
|
| | |/ / /
| | | |
| | | |
| | | |
| | | |
| | | | |
Fsr3Upscaler::Pass::Dispatch took a scheduler parameter that shadows
Fsr3Upscaler::scheduler, which fails the Windows MinGW PGO build under
-Werror=shadow.
|
| | |\ \ \ |
|
| | | | | |
| | | | |
| | | | |
| | | | | |
Assisted-by: Claude Opus 5.5 (investigation and implementation)
|
| | | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
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)
|
| | | |\ \ \ |
|
| | | | | | | |
|
| | | |/ / /
| |/| | |
| | | | |
| | | | | |
redirect the user to the correct save location
|
| | | | | |
| | | | |
| | | | |
| | | | | |
Assisted-by: Claude Opus 5.5 (investigation and implementation)
|
| | | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
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)
|
| |\| | | | |
|