FEX 2601 Tagged

As the developers awaken from their holiday induced hiberation, another release is upon us in the new year! Let’s see what we managed to implement before hibernation snuck up on us.

Update thunks for Vulkan 1.4.337

This update is fairly important as Proton and Mesa have started using some new extensions that we didn’t previously support. So if your system had a new driver with these extensions then dxvk/vkd3d-proton would assert out. With these updated it is no longer a problem and thunking is working again as normal!

Fix a couple rare hangs on Wine mutex handling

FEX has a custom mutex implementation that has “writer” priority that was implemented a few months ago. We needed to implement this to help reduce stuttering in our code cache implementation. When implementing it we actually had two bugs in the implementation for Wine that went unnoticed until now. Our implementation is fairly smart and will spin on the mutex using ARM’s highly efficient “Wait-For-Event” instruction for 1/10th of a millisecond before deferring to the kernel mutex implementation. Because we block the mutex for such a small amount of time, it was /highly/ unlikely to hit the kernel implementation. When we did defer to the kernel (Or Wine’s implementation anyway) we had a bug in our anti-stampeding behaviour which would cause reader threads to never wake up. Then additionally we had a bug in the calling API for the “RtlWaitOnAddress” function declaration where it was only waiting on a 32-bit address. Causing the process to never wake up and usually crash.

A very long winded way to say we had two simple bugs that were rare and infuriating to debug because of a race.

JIT fixes

This month there weren’t actually that many JIT fixes. We found a bug that was breaking Ubisoft’s UPlay program which is now fixed. Additionally we resolved some handling of self-modifying code on our Wine implementation that could fix some spurious hangs or incorrect invalidations.

Minor Linux syscall fix

This month we noticed that Steam was using some new fcntl syscall operations that we didn’t handle. This caused Steam to crash in some rare edge cases when it actually called this syscall. We have now resolved this, and future proofed any new commands getting emulated by passing directly to the kernel.

More code caching implementation work

This is definitely the task that has the most code land for it. There was code caching support wired up for both Linux side and Wine side. While still a heavy Work-In-Progress, we have code caches getting generated and loaded at runtime to reduce the amount of time spent running in the JIT. In particular, this can be thought of as trading CPU time for disk space, theoretically reducing JIT stutter if the code already existed in the cache. Still lots of work to go to make this viable for the user, but we’ll be trucking along as usual!

39C3 talk from @neobrain

This last month, neobrain had a talk going through some of the architecture of FEX-Emu. It’s very informative and definitely worth the watch!


See the 2601 Release Notes or the detailed change log in Github.

Written on January 7, 2026