diff options
| author | Takoroka <137927095+Takoroka@users.noreply.github.com> | 2026-10-31 04:41:01 -0400 |
|---|---|---|
| committer | Takoroka <137927095+Takoroka@users.noreply.github.com> | 2026-10-31 04:41:01 -0400 |
| commit | 837133792d5651a896bc018f13acd8eaabcd8e81 (patch) | |
| tree | 8c4b55bd0e81fdf3465d809175974d41d2932a92 /src/common/sparse_large_vector.cpp | |
| parent | b40ad217ab829226841cb71f6e4c5cb05977a225 (diff) | |
nx2: map GPU memory on the GPU thread
Switch 2 games could freeze for good (Mario Kart World: twice in five
runs, at 48 s and 123 s). A GMMU map takes the texture cache
lock (ModifyGPUMemory), and Nx2Map and sparse region creation ran it on
the service thread while holding nx2:gpu's region lock, the memory
registry lock and the address space lock. The GPU thread takes those
locks under the texture cache lock: a GPU write into a sparse or GPU-only
region gets its block memory there (BackSparseWrite), e.g. when the
texture cache writes back an image it evicts in TickFrame. Each thread
waited for the other.
Queue the GMMU maps on the GPU thread (GPU::RunInOrder), as the unmaps
already are, so the service thread never waits for the texture cache.
Command lists submitted after a map still see it; no service code reads
through the GMMU.
Diffstat (limited to 'src/common/sparse_large_vector.cpp')
0 files changed, 0 insertions, 0 deletions
