v0.10.0
Presentation without the drawable wait
A frame's render work now commits without waiting for a drawable. A native presenter thread per device acquires the drawable and presents from a command buffer of its own, and a read-back of the frame in progress waits only for committed render work and the GPU, never for the display. World of Warcraft 1.12's hitch on every new unit selection, a back-buffer LockRect that stalled 33 to 71 ms behind the display, is down to the 7 to 9 ms the GPU copy takes, with the steady-state frame unchanged. The PERF grid gains Present wait, Drawable wait, Snapshots and Slot waits rows. (#682, #683)
Faster startup
Cached shader libraries and render pipelines are compiled in parallel at startup, in device-local batches capped at eight workers, instead of serially behind the encoder's startup barrier. A prewarm thread that fails to start no longer leaves the encoder waiting forever. (#675, #676)
Window and cursor continuity
A window's Metal view and layer survive device recreation and the replacement of the device's window, so the Metal HUD's GPU time keeps reporting across WoW's mode switches. The software cursor no longer blinks while dragging a spell and no longer shows the macOS arrow while turning the camera, and its sprite caches are bounded. (#654, #677, #681)
Rendering fixes
- MetalFX upscaling works again on drawables that cannot be Private, through a Private intermediate copied into the drawable in the same command buffer; WoW Epoch had fallen back to shader stretching. (#680)
- Sampler filter and address states are narrowed before they form the sampler cache key, so two states that differ above the low bits no longer share one MTLSamplerState. (#651)
- A Reset that changes PresentationInterval applies the new pacing on the next Present, and a Reset that keeps it no longer re-sends it. (#642, #650)
- The back buffer's sRGB twin is destroyed after the frame flush, and the multisampled twin on device release, ending a fault in the replay of in-flight frames and a texture leak per release. (#668, #671)
- Out-of-range render and sampler state values are read through their value space instead of aborting the frame, which clears Thief Gold's black window at startup. (#644)
- Shader-constant setters accept an unaligned source pointer, which clears an abort in League of Legends; a fault outside mtld3d.so is attributed by the image's file name rather than its path. (#635, #636)
Behaviour changes
- An EVENT query reports completion only once the submission it ended has retired on the GPU. An application recycling dynamic vertex storage behind the answer no longer overwrites vertices the GPU still reads. (#637)
- A Metal view parked for its window's next device drops its drawable pool while it waits, which returns about 475 MB on a 3456x2234 RGBA16Float window nothing draws into. (#664)
Internals
- Replayed frames borrow their buffers, textures, samplers, pipelines and index buffers instead of taking a temporary retain per binding. (#646, #661)
- The layer validates every entry of Wine's macdrv function table and pins the layouts of the records it reads out of the fork; the per-symbol fallback with its wrong win_data read is gone. (#662, #667, #670)
- The query.flushImmediate rationale now describes the dynamic-buffer hazard the immediate answer trades against. (#674)
Installing is unchanged, see INSTALL.md in the bundle.
Full changelog: v0.9.0...v0.10.0