| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| | | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | | |
stream is H.264 (Yoshi demo)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
| | | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | | |
- Complete pending fences immediately on release once the stream ends and no
frames remain to be processed, preventing infinite waits in movie teardown.
- Stop re-arming m_ready->room when an end-of-stream packet arrives or the final
frame is output, avoiding spurious wakeups and subsequent empty queue queries.
- Reset m_stream_ended when new input is submitted or on Flush/Stop.
Fixes an abort (2111-3604 / 0x1c286f) in Donkey Kong Bananza during the tutorial
transition scene when the video decoder stream ends.
Assisted-by: Gemini (vdecsvc end-of-stream fence completion and timer de-arming)
(cherry picked from commit b180df1ed77568da7c3e78dd97c0c46d84e54494)
|
| | |/ / / / /
|/| | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | | |
- [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions).
- [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability.
-------------------
https://git.eden-emu.dev/eden-emu/eden/pulls/4542
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4590
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: John <john@eden-emu.dev>
(cherry picked from commit 0731f40f4d86227f05da3fffbc44831065b53a8a)
Co-Authored-By: Claude Code <noreply@anthropic.com>
(cherry picked from commit 7c3821da0e678978d55df14d65e047539eafba4c)
|
| |\ \ \ \ \ \
| |_|_|_|/ /
|/| | | | | |
shader: lower F2I.F16, TLD/TLD4.F16 and partial-mask TXD (Hyrule Warriors black gameplay)
|
| | |\ \ \ \ \
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | | |
nx2-experimental lowers partial-mask TXD as well (Splatoon Raiders).
Keep its RZ second destination and this branch's odd register for a
lone third channel; take its wider F2I mode check with the .H1 source.
Assisted-by: Claude Opus 5.5 (conflict resolution)
|
| | | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | | |
TXD was only lowered with all four channels (and rejected any
instruction without a second destination, as RZ & 1 is set).
Hyrule Warriors: Age of Imprisonment's gradient-sampling programs
fetch one channel into Rd, or three channels with the third in the
second destination, and were rejected ("native gradient texture
mode"), so their draws were skipped.
Pass the channel mask on to Maxwell TXD. The first two enabled
channels go to Rd, Rd+1 and the others to the second destination;
when those aren't consecutive, write to scratch and move them as the
four-channel case already did.
Assisted-by: Claude Opus 5.5 (diagnosis, fix and testing)
|
| | | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | | |
TLD.SCR and TLD4 with .F16 (bit 79) return their components packed in
pairs: components 0 and 1 in Rd, 2 and 3 in the second destination.
The lowering rejected them ("native texel fetch mode", "native texture
gather mode"), so the compute programs using them never ran.
In Hyrule Warriors: Age of Imprisonment these are compute programs
that run once gameplay starts, and gameplay stayed black (the pause
menu, drawn another way, showed the scene).
Lower the F32 form into R248/R249 and R246/R247, then pack each pair
the way F2FP.PACK_AB is lowered.
Assisted-by: Claude Opus 5.5 (diagnosis, fix and testing)
|
| | | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | | |
F2I from an F16 source was only lowered unsigned and from the low
half. F2I.F16 (signed, bit 72) and F2I.U32.F16 Rd, Rs.H1 (bits 60-61)
were rejected ("native float-to-integer conversion mode"); Hyrule
Warriors: Age of Imprisonment has 24 such programs.
Accept bit 72 as the other F2I forms do, and pick the high half for
.H1.
Assisted-by: Claude Opus 5.5 (diagnosis, fix and testing)
|
| | | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | | |
The prompt showed at every startup whatever game was launched, and Yes
overwrote the global settings for every title. Ask on the first MKW boot
of a session instead and apply the preset to that session only.
|
| |\ \ \ \ \ \ \
| | | | | | | |
| | | | | | | | |
core: do not index registered_processes with an unregistered ASID
|
| | | | | | | | | |
|
| |\ \ \ \ \ \ \ \
| | | | | | | | |
| | | | | | | | | |
texture_cache: look up X8Z24 with UNORM, UINT, UNORM, UNORM components
|
| | | |/ / / / / /
| |/| | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
X8Z24 was only known with UINT in the last three components. Mario
Tennis Fever samples its depth buffer as X8Z24 with components
UNORM, UINT, UNORM, UNORM (as S8Z24 already is in the table), which
hit the "texture format=42" fallback to A8B8G8R8. The depth image was
then copied into a colour image of the wrong format every frame (with
"Unimplemented" layer-count asserts) and read as colour, and distant
scenery around the court (the arch and the castle stadium) wasn't
drawn.
Map it to X8_D24_UNORM like the other X8Z24 entry.
Assisted-by: Claude Opus 5.5 (diagnosis, fix and testing)
|
| |\ \ \ \ \ \ \ \
| | | | | | | | |
| | | | | | | | | |
Prevents crashes when creating game shortcuts by validating the loade…
|
| | | |_|/ / / / /
| |/| | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
before accessing game titles or icons. Adds safe fallbacks for missing titles and icons, allowing shortcuts to be created even when the game loader or icon is unavailable.
Fixes a potential crash when creating game shortcuts, as reported in Issue #274.
Previously, the shortcut creation process attempted to retrieve the game title and icon even when GetLoader() returned an invalid loader. This could cause a crash when the selected game file could not be loaded correctly.
Changes
Validate the loader: Check whether the loader is valid before accessing game title or icon data.
Preserve title fallback: Continue using the title from game metadata whenever available. If no valid loader is available, fall back to the program ID.
Handle missing icons: Only attempt to retrieve the game icon when a valid loader exists. Log a warning if the icon cannot be retrieved.
Validate image data: Add a validity check in SaveIconToFile() to prevent empty or invalid images from being processed.
Expected Behavior
Game shortcuts can now be created even when no valid loader or game icon is available. In such cases, the program ID is used as the display name, and the shortcut is created without a custom game icon.
|
| |\ \ \ \ \ \ \ \
| | | | | | | | |
| | | | | | | | | |
input_common/sdl: only log motion capabilities when they change
|
| | | |_|_|/ / / /
| |/| | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
On the Steam Deck the log was flooded with the same gyro message, over
3000 times in a single session.
Motion capabilities are now only logged when they change, and the sensor
restart interval grows exponentially (up to 64x) while the sensor keeps
returning zeroed data.
Tested with Pokemon Pokopia on the Steam Deck: from ~42 messages in 33s
down to 1 for the whole session, controls working normally.
Assisted-by: Claude Opus 5.5 (debugging, code, and drafting this message)
|
| |\ \ \ \ \ \ \ \
| | | | | | | | |
| | | | | | | | | |
video_core: bump the shader cache versions for the FSEL lowering fix
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
The disk shader cache keeps the lowered native code. "shader: apply
FSEL's floating operand modifiers" (ef3ae4ae23) changed that code
without a version bump, so caches built before it keep programs that
drop FSEL's negate until the user deletes them by hand.
In Splatoon Raiders those stale programs leave the tutorial island and
the dock with no shadows (the depth linearization ends with
FSEL R0, -R0, 1.0, P and comes out negated), no aiming reticle and no
steam (particle quads pick their corners with FSEL +0.5 / -0.5 and
collapse to a point).
|
| |\ \ \ \ \ \ \ \ \
| |_|_|_|_|_|_|/ /
|/| | | | | | | | |
tests when building on Windows: compare FindBestUpdatePackage with a size_t
|
| | | |/ / / / / /
| |/| | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
FindBestUpdatePackage returns std::optional<std::size_t>, and comparing
it with an int makes MSVC emit C4388 inside <optional>, which WERROR
turns into an error, so the tests target does not build on Windows.
Part of #326.
Assisted-by: Claude Opus 5.5 (diagnosis, fix and commit message draft)
|
| |\ \ \ \ \ \ \ \
| | | | | | | | |
| | | | | | | | | |
MKW performance improvements
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Include both filters in the accepted MKW preset and verify defaults and saved-preference overrides.
Assisted by Codex.
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
The game aborted during early thread synchronization with cross-module kernel TLS lookups. Compiling the kernel TLS implementation without LTO restores successful game startup while the other targets retain their build options.
Assisted by Codex.
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Port the coherency changes from alarok/Eglantine 77fc365f2 without its diagnostic framework or shutdown changes. Only GPU-dirty CPU reads become permanently preflushable, clean areas can be trapped on the next write, non-core readers avoid indexing core arrays, and collected CPU writes precede readback.
Assisted-by: Codex (source review, selective integration and verification)
(cherry picked from commit b64e211957180aa218ec6d9a3bcb020332279c3f)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Apply accepted settings visibly and save them, then reapply after per-game configuration. Include handheld mode.
Assisted by Codex.
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Linux missed base version metadata for Base/RomFS while Windows included it. Use a case-insensitive fallback for the loose directory and check the version and resulting archive checksum.
Assisted by Codex.
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
The detached worker could use complete_event after its owner was destroyed. Retain and join it after signaling stop. Bind the test server to loopback on Windows and verify capture release across 32 cancellations.
Assisted-by: Codex (implementation, review and automated validation)
(cherry picked from commit 0eb7b4855f499838d056a0d5d678109318517e9d)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Apply batch updates in the rasterizer mock, check cached writes do not untrack twice, and reset callback state between timer cases.
Assisted-by: Codex (implementation, review and automated validation)
(cherry picked from commit 225ad4e5d1da4ec9883b17aea7273b6c8f76fe17)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Give the implementation-local TLS object one definition so ThinLTO retains its dynamic initializer. The state and its lifetime are unchanged.
Assisted by Codex.
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Assisted by Codex.
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Adapted bitmap scans from sylvieistaken/selevet-eglantine performance build 4. Keep the wide-priority fallback and fix the first live slot after empty bitmap words. Include randomized lifecycle and ordering checks.
Assisted by Codex.
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Adapted from sylvieistaken/selevet-eglantine performance builds, including 8b076b167ffc5ca1ba8ffedcd00e255accbe018c and d8c95fef. Preserve upstream command-list coherency and submission ordering.
Assisted by Codex.
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Avoid zeroing unused preallocation during invalidation and pool refresh. Clear newly exposed words whenever limits grow, bound clearing to allocated storage, and test word/allocation boundaries, shrink/regrowth and malformed large limits.
Assisted-by: Codex (implementation, review, commit text and automated validation)
(cherry picked from commit 4bc1ae01f79cef43be016504c850ca8a6998457a)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Exercise 40,000 mutations and table switches plus repeated deletion across five channels. Make the existing descriptor read work with a memory reader fixture and add an explicit CPU benchmark with opaque invalidation calls.
Assisted-by: Codex (implementation, review, commit text and automated validation)
(cherry picked from commit 3b62a551da8ec0b4edf19a1c4e14fa2519dd20e2)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Keep the linear path for sixteen or fewer removals. For larger batches, sort the auxiliary pointer list and binary-search it while preserving storage order and the same invalidation decisions. Existing real-cache differential tests cover both paths.
Assisted-by: Codex (implementation, review, commit text and automated validation)
(cherry picked from commit 7e2c8a535230d9810db07706d79130ce0f1b88f1)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Adapt the batching from ymatrix1/Eglantine PR #237, retaining all CPU invalidations. Acquire the lock once and remove pending shaders once per write batch. Compare real cache contents with sequential invalidation across randomized overlapping writes and pending removals.
Assisted-by: Codex (implementation, review, commit text and automated validation)
(cherry picked from commit b65f818d7789ffadfb58fe4543b18060fd88ce53)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
command buffer
(cherry picked from commit 4aa5cd89fd1862751b3297036f2d21a0dc924b23)
(cherry picked from commit f1bdd5b13a1bdca81243b4aa1d8529f0485d3671)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Keep error reporting and debug-build history. EDEN_NX2_3D_HISTORY enables the full ring in release builds without recording every method during normal play.
Assisted by Codex.
(cherry picked from commit cac6081916e8e5461e2754308cd8986deaec774b)
|
| | |/ / / / / / /
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
Use the owned parameter vector for DMA FIFO appends. Add a native JIT regression covering reallocation and repeated invocations against the copied-input path.
Assisted by Codex.
(cherry picked from commit 5b6803aaab18e332493903ee49cab026c041d5dc)
|
| |\ \ \ \ \ \ \ \
| | | | | | | | |
| | | | | | | | | |
nx2: fix pokopia regressions, textures that handle shader computes, and more
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
837133792d queues the GMMU maps on the GPU thread (GPU::RunInOrder) so the
service thread never waits for the texture cache. With the GPU split
(Low GPU accuracy) the GPU thread defers queued functions to its back, but
its front reads the command lists: it read the lists submitted after a map
through GPU addresses that weren't mapped yet. Pokopia stopped after its
first frame.
Add GPU::MapInOrder for the GMMU maps and the sparse tile remaps. It runs
in order like RunInOrder, and with the split it runs on the front after
draining the back, before the front reads further command lists. The
service thread still never takes the texture cache lock, and the back is
idle while the map changes the caches. Unmaps and the other queued work
still run on the back.
Assisted-by: Claude Opus 5.5 (bisect, fix, testing and commit message)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
e38b738b84 repacks the 69-byte vertex stride to 72 only with dynamic
vertex input, unless EGLANTINE_EXPERIMENTAL_STATIC_VERTEX_REPACK=1.
MoltenVK has no VK_EXT_vertex_input_dynamic_state and Metal needs strides
that are a multiple of 4, so the stride was never fixed on Macs.
Enable the static path automatically when the device's minimum vertex
binding stride alignment does not divide 69. The device reports 4 for
MoltenVK, matching its portability subset limit. The environment variable
still overrides it: 1 forces the repack on, 0 forces it off.
Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
5de94bdd1d cut the boot preload to the last two sessions and 2f94fb9680
evicts pipelines unused for 9000 frames, both because rebuilding one
costs 2-3 ms through the driver's pipeline cache and each holds ~0.45 MB
of driver memory. On MoltenVK a pipeline built while playing is
translated from SPIR-V to MSL and compiled by Metal, which takes far
longer even with a VkPipelineCache and shows as a stutter.
On MoltenVK, keep the previous eight sessions' pipelines in
vulkan_used.bin (be76402ab5's window) so they are built at boot, and
do not evict. The memory is bounded by what a title builds; the stutter
is not. Other drivers are unchanged and
EDEN_NX2_PRELOAD_ALL_PIPELINES=1 still builds every cached pipeline.
Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
In the aliased mode (AMD) a SparseTiles image is created unbound, and only
InitSparseTiles binds every block to the shared zeroed one. When it fails
(an unusual block shape, no memory for the zeroed block or the mip tail, a
failed bind), the constructor went on to the next branch and flagged the
image UnwrittenSparse with nothing bound. AMD's drivers can't sample such
an image, and it is sampled before its first write replaces it, which is
the hang a855e8373f avoided for large sparse images.
Create the image again as an ordinary backed image in that case, as before
sparse tiles, and drop the Unbacked flag. The other modes keep falling
back to UnwrittenSparse, since their drivers sample unbound memory.
Follow-up to 130c255ed9 (with a855e8373f and 1c794af564).
Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
Writing any register outside the instance loop's own methods now draws the
waiting instances first, so the batch sees the base instance it was begun
with. When a title writes another register in the middle of a loop, such
as a per-instance constant buffer, the loop is drawn in several batches,
and each later batch started again at global_base_instance_index with one
extra instance, so it used the instance IDs of the first records.
Count the instances already drawn for the current loop and start the next
batch after them, without the extra first-instance draw. A loop that is
not split is drawn exactly as before.
Follow-up to 2ad0830d2f and eb99da6072.
Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
DisableGraphicsUniformBuffer tested !current.buffer_id to detect a
binding that is already NULL_BINDING. SlotId converts to true unless it
is the invalid id, and NULL_BUFFER_ID is BufferId{0}, so the check was
false for NULL_BINDING and the early return never triggered. Compare
against NULL_BUFFER_ID instead.
Follow-up to 46b2577bf7.
Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
SetVertexRepackLayout returned old_mask | new_mask, which stays non-zero
on every draw that uses a 69-byte binding. PrepareDraw then re-dirtied the
vertex buffers and vertex input each time, so the repack compute pass ran
and the render pass ended once per draw, which is costly on tiled GPUs.
Return old_mask ^ new_mask so only a layout change re-dirties the
bindings. The repacked copy only stays valid while the source data is
unchanged, so the buffer cache now flags the vertex buffers overlapping a
CPU write, inline or DMA write, or GPU write, and re-dirties the repacked
ones before binding. Command buffer submission already invalidates all
vertex buffer state, which keeps the staging copy within its tick.
Also pass the source buffer size to the repack pass and clamp the
word-rounded storage descriptor range to it; it could run up to three
bytes past the end of the buffer. A binding that does not fit is skipped
like one over the device limits.
Follow-up to e38b738b84.
Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
cce6d44af2 executes each command list entry from a copy of its words taken
at submit. Games submit command lists before writing them: the lists wait
behind a semaphore acquire, and the game writes their commands just before
it releases the acquire (Mario Kart World after present). The copies of
those lists were stale. Pokopia stopped after its first frame on macOS: its
GPU never reached the fence the game spun on (EDEN_NX2_PB_SNAPSHOT=0 made it
run again).
Count each channel's suspensions on an acquire and the resumes after them,
and record the count with each copy. A list copied while its channel was
suspended, or whose channel suspended since, reads guest memory instead.
Lists submitted and run without a wait in between keep the copy.
EDEN_NX2_PB_SNAPSHOT=0 still disables it altogether.
Assisted-by: Claude Sonnet 5.5 (first version); Claude Opus 5.5 (bisect, suspension count, testing and commit message)
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
0f14696044 made PresentClientBuffer also wait for the current frame's
fence whenever the previous frame's wasn't reached. Mario Kart World's
GPU waits on semaphores its CPU releases only after the present returns,
so in that state the current fence can't be reached until the present
returns, and each such present stalled up to the 4 s deadline.
Wait for the current frame by default, but give up after a few ms once a
GPU channel was seen suspended on a semaphore acquire and wait for the
previous frame instead. EDEN_NX2_FRAMES_AHEAD=1 always waits for the
previous frame (with 0f14696044's current-frame wait when the GPU is
behind), =0 always for the current one. The scheduler gains a lock-free
flag so the present thread can see suspended channels.
Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
|