Releases: elseform/dxmt
Release list
anomaly-2026.09.30
Changed
- Release name. Releases are now tagged
anomaly-YYYY.MM.DDinstead ofgamma-YYYY.MM.DD, following the rebrand of GAMMA's supporting tools to Anomaly. The Metal HUD version line shows the new tag.
Fixed
- Startup crash. The game could abort during startup, while it created its first Direct3D 11 device, with
unrecognized selector sent to instance ...innewComputePipelineStateWithDescriptor; the receiver was0xf,0x6dor a fragment of asset-path text. The command queue builds its clear pipelines through a Metal device handle, but the member holding that handle was declared after the objects that use it and so was still uninitialized when they ran. Depending on what the new memory held, the pipelines were silently missing or the call went to a garbage handle. The handle is now initialized first. This is the actual cause of the crash listed undergamma-2026.09.27; the change listed there did not fix it. (35c6ed4) - Possible hang when a device is released. The pipeline compile worker threads could miss their shutdown signal and leave the device release waiting for them forever. (
4660ac1)
Build
Tag anomaly-2026.09.30 on branch release. Upstream base unchanged: 3Shain/dxmt 7c8dee1. Built with Homebrew GCC 16.2.0 (mingw-w64), meson install --strip, MACOSX_DEPLOYMENT_TARGET=26.0 (Apple Silicon, macOS 26 or later).
SHA256 (tar.gz): a134b68691473db82f693d2186c0973273d0a50bdc747e01fed9de8d9f0045be
Contents: x86_64-unix/winemetal.so, x86_64-windows/{d3d10core,d3d11,d3d12,dxgi,nvapi64,nvngx,winemetal}.dll
gamma-2026.09.27.1
Everything in gamma-2026.09.27, plus:
Added
- Frame limiter, opt-in with
DXMT_FRAME_LIMITER=1. Paces the game's own thread, not only the display, tod3d11.preferredMaxFrameRate, or to half the display refresh rate when that is not set (30 on a 60 Hz display). Game timing, input and presentation follow one steady rhythm, and frames no longer run ahead of what the display can show.d3d11.frameLimitoverrides the target;DXMT_DISPLAY_SYNC_OFF=1presents without display sync. (c41cb78) - Per-frame stats log with
DXMT_STATS_LOG=<dir>: one CSV row per frame with the frame interval, waits, encode times, GPU time and pass counts. (c41cb78)
Changed
- Built for macOS 26 (
MACOSX_DEPLOYMENT_TARGET=26.0) instead of 15: G.A.M.M.A.'s minimum is now macOS 26 on Apple Silicon.winemetal.sodeclares macOS 26 and the Metal command shaders targetmacosx26.0. - Shorter Metal HUD line: just the feature level and the release tag, e.g.
FL_11_1 gamma-2026.09.27.1. TheDXMT D3D11prefix made it long enough for the macOS 26+ HUD to cut off the end of the tag. (1820ffc)
Build
Tag gamma-2026.09.27.1 on branch release. Upstream base unchanged: 3Shain/dxmt 7c8dee1. Built with Homebrew GCC 16.2.0 (mingw-w64), meson install --strip, MACOSX_DEPLOYMENT_TARGET=26.0 (Apple Silicon, macOS 26 or later).
SHA256 (tar.gz): a890ea124090836d0809b9a124d98afea69acf82c873423b5273e70ebea9a28a
Contents: x86_64-unix/winemetal.so, x86_64-windows/{d3d10core,d3d11,d3d12,dxgi,nvapi64,nvngx,winemetal}.dll
gamma-2026.09.27
Fixed
-
Startup crash. The game could crash during startup with
unrecognized selector sent to instance 0xfinnewComputePipelineStateWithDescriptorwhen it released its first Direct3D 11 device; clicking the splash screen repeatedly sometimes got past it. The shader compile worker threads were still running when the tasks they worked on were freed. They are now stopped first. (c3a5d2c) -
In-game v-sync setting was ignored. Display sync was hardcoded off. It now follows the game's present sync interval (override:
d3d11.displaySync), and no longer clashes with a pending resolution change. (9f8b1aa,b7f6717) -
Rendering froze mid-game (GPU page fault) while audio continued. Draws whose pipeline failed to compile are now skipped instead of using the previous pipeline (
5d274b4); renamed copies of frequently updated buffers come from one shared page instead of separate Metal buffers (3004e88); Metal resources stay alive until their command buffer completes (059cd88). -
Pipeline failures were anonymous. The log now names the failing shaders by digest. (
d13d7ed) -
Memory growth and GPU timeout while loading textures created with their data. Textures created with initial data (in GAMMA, with
r__no_ram_textures on) were staged for upload all at once: the staging area grew by the size of the whole level load, stayed allocated for the rest of the session, and the first in-game frame timed out on the GPU. Uploads now go out in batches of at most 64 MB. (c73e813) -
DLSS showed garbage or a black image. Every DLSS evaluate call failed on a parameter type mismatch, so the upscale never ran. Parameters are now passed with the right type, oversized depth is cropped and a missing pre-exposure gets a default. (
b4f5afc,0861c6a) -
DLSS overhead. The depth crop now runs inside the existing upscaler pass, the evaluate call is logged once instead of every frame, and a parameter leak is fixed. (
7026b8e,4f4c6a2) -
Shader IR release (
d3d11.releaseShaderIR, default on). After a shader's pipelines are built, its parsed intermediate representation is freed and rebuilt from the kept DXBC only if a new pipeline variant needs it, instead of staying in memory for the whole session. Also fixes a leak of each shader's argument-info buffer. Ported from NerRobDog/dxmt. (2d18458) -
Blit encoder merging with
DXMT_REORDER_BLITS=1. Moves independent copy and upload work together so fewer encoders and render passes are split per frame. Off by default. (05ba201)
Diagnostics
- Memory accounting log at
DXMT_LOG_LEVEL=debug: every 5 s, the Metal device's allocated size next to DXMT's buffer allocations, parked rename copies and staging blocks. (05cfcf7)
Build
Tag gamma-2026.09.27 on branch release. Built with Homebrew GCC 16.2.0 (mingw-w64), meson install --strip, MACOSX_DEPLOYMENT_TARGET=15.0 (Apple Silicon, macOS 15 or later).
SHA256 (tar.gz): 76cb36f1b6c9e9ba1ade596acd99ba19d3d808c276ad0011e9290dd516d20884
Contents: x86_64-unix/winemetal.so, x86_64-windows/{d3d10core,d3d11,d3d12,dxgi,nvapi64,nvngx,winemetal}.dll
0.80-gamma
Fixes on top of upstream
- Winemetal resource lifetime/argument-buffer hardening (
059cd88). Takes each binding's GPU resource ID, exact native Metal resource and owning allocation from one snapshot, retains every native resource a command buffer uses until that command buffer completes, and moves the argument-buffer allocator frommalloc'd memory to Metal-owned storage, closing a use-after-free/aliasing window implicated in a mid-gameplay GPU page fault. Hazard tracking stays untracked. One of several changes aimed at that fault; see "DynamicBuffer suballocation" and "PSO-failure skip-draw guard" below. - DynamicBuffer suballocation from one page regardless of Usage (
3004e88).Map/Discardrenames of aD3D11_USAGE_DYNAMICbuffer now suballocate from a single page unconditionally, instead of only for some usage patterns, removing another source of the same fault class. - PSO-failure skip-draw guard, with named shaders in the failure log (
5d274b4,d13d7ed). A draw whose pipeline state object failed to compile is now skipped instead of proceeding with an invalid PSO, and the failure log names the shader (by digest) instead of only the Metal error — seegamma-project's PSO failure register for the digests this triage produced. - DLSS/NGX fixes (
b4f5afc,0861c6a,7026b8e,4f4c6a2). Fixes a DXMT-side NGX parameter-store type mismatch that made everyNVSDK_NGX_D3D11_EvaluateFeaturecall fail silently, so DLSS upscaling never actually ran despite being reported available; bridgesvoid*resource parameters through NGX to the right D3D11/D3D12 resource type; crops an oversized depth input and defaults a missing pre-exposure value; folds the DLSS depth-crop copy into the existing scaler blit encoder instead of an extra pass; and stops aGetParametersleak while loggingEvaluateFeatureonly once instead of every frame. Confirmed working in-game. d3d11.displaySyncv-sync control (9f8b1aa,b7f6717). MakesCAMetalLayer.displaySyncEnabledfollow the D3D11Presentsync interval (d3d11.displaySyncconfig key:auto/true/false) instead of being hardcoded off, and stopschangeDisplaySync()from pushing layer properties to the Metal layer while a pixel-format/size/sample-count/color-space change fromchangeLayerProperties()is still deferred. Runtime-verified: toggling v-sync in game and changing resolution both behave correctly.
Build
Branch: release (default). Built with Homebrew GCC 16.2.0, meson install --strip, MACOSX_DEPLOYMENT_TARGET=15.0.
SHA256: d383a2e04d9be6c56abf0538f98eb6e4bbab81444ea5ad889a0df3e789d49385
Contents: x86_64-unix/winemetal.so, x86_64-windows/{d3d10core,d3d11,d3d12,dxgi,nvapi64,nvngx,winemetal}.dll