DM_NVN_RC_LANDED switch `0` keeps drawing every draw under a render condition on a samples-passed report, as before; by default the condition is evaluated from the report's result once it has landed ([Occlusion conditions read once landed](reference/rendering.md#occlusion-conditions-read-once-landed)) name class meaning DM_AB diagnostic `=` splits the run into phases of that many frames and alternates every switch set to `ab` (on in the odd phases); logs an `[ab]` line per phase with GPU and frame time and attachment traffic DM_ALIAS_SIZE diagnostic `=` gives the guest an alias region of that size instead of the profile's (at least 256 MB, whole host pages; the heap and stacks stay as they are): `0x1000000000`, the Switch's 64 GB, holds what a game reserves unchanged; the NSP script's address region check sets it (Mac only: an iPhone has no room) DM_ALIAS_WINDOWS diagnostic `=` logs every 30 s how much of each window of that size in the alias region is mapped (windows aligned to their size in absolute addresses) DM_ALLOW_OTHER_METAL switch `1` lets `own_compilers.py` build the shader libraries with a Metal compiler other than the one in `dmsh_chain.lock` (it stops otherwise, GitHub issue #242); the NSP script sets it for `--allow-other-metal` DM_AOC_DIR path Folder of add-on content: one numbered subfolder per DLC index holding that DLC's RomFS, reported by `aoc` and mounted read-only; the app, the Mac launcher and the NSP script set it when the build has DLC DM_AOC_OWNED switch `0` reports no add-on content even when `DM_AOC_DIR` has some, for runs without the DLC DM_APP_DM path Set by the iOS app of a game of several programs: the running program's `dm/p` folder, where the settings screen finds its `launcher.json` DM_APP_VERSION switch Overrides the IPA's version in `build_ipa.sh`; by default it is the packed game's display version from its control data (the update's when one is packed) DM_AUDIO switch `1` plays audio through Core Audio, `0` uses the silent sink; real output is the default on iOS, the silent sink on the Mac (the Mac launcher sets `1`) DM_AUDIO_DUMP diagnostic `=` writes every PCM block the game appends as is (16-bit, 48 kHz, channel count as in the OpenAudioOut log), to judge whether a sound played DM_AUDIO_MUTE switch `=1` runs the real Core Audio output path (callback pacing, background take-over) with the output silenced, for lifecycle tests on the Mac without noise DM_AUDREN_TRACE diagnostic When set, the CPU audio renderer logs every update with the number of frames rendered since the previous one, each stretch of digital silence of 200 ms or more (`silent from t=… for …`), with a dump of every guest thread once one passes 2 s (at most 4), and once a second the packets, samples and failures of the hardware Opus C interface (`DecodeOpusInterleavedWithHardware`) DM_AV1_DAV1D switch `=1` decodes AV1 movies with dav1d even where VideoToolbox decodes AV1 (Apple M3 and A17 Pro on), to compare the two or to check the path older chips take (`hle_movie_av1.c`) DM_BOOTPROF diagnostic When set, logs boot timing: the loader's breakdown (mapping, relocation, probes), Metal library loading, pipeline creation, texture uploads and the first present DM_BUNDLE_ID switch Overrides the iOS app's bundle ID in `build_ipa.sh` (default `org.nxnative.`) DM_CHEATS path Folder of Atmosphère cheat files: `<folder>/<build ID>.txt` or an SD-card layout (`atmosphere/contents/<title ID>/cheats/`) under it (default `<DM_ROOT>/cheats`); the Mac menu lists and toggles them DM_CHEATS_ANY_BUILD switch `1` loads a cheat file written for another build of the game when it is the only one (its addresses may not fit: for `cheat_anchor.py` checks) DM_CHEATS_DEBUG diagnostic Logs every memory write a cheat makes and the cheat file context the menu's "another version" rows come from DM_CHEATS_ON switch Comma-separated cheat names turned on at launch, besides the saved per-build enabled states DM_CHEATS_WINDOW switch `1` opens the Mac Cheats panel beside the game from the start DM_COPY_GAME_RESOURCES switch `NO` skips the Xcode build phase that copies the game's resources into the app (`stage_resources.sh`, on by default); `build_ipa.sh` sets it for its unsigned build, which packs them itself DM_COPY_ROMFS switch `NO` keeps the game files out of the app, in the Xcode build phase (`stage_resources.sh`) and in the unsigned IPA of `build_ipa.sh` (on by default): `main.m` takes the validated `Documents/romfs.img` copied by `scripts/push_romfs.sh`, then a `Documents/romfs` folder; the build writes the image's identity as `romfs.id` into the app, and `main.m` uses only a matching image (`--romfs separate` of the NSP script sets this) DM_CTL diagnostic `=<file>` (Mac): the host polls the file every 100 ms and runs each appended line: button presses, `shot`, `passdump`, `texdump`, `env KEY=VALUE`, `peek`, `memdump`, `drag` and more DM_DBG diagnostic When set, prints the guest's `svcOutputDebugString` text to stderr as `[guest]` lines DM_DBG_AU_FRAMES diagnostic `=<frames>` asks the Mac's Core Audio output for that many frames per callback instead of about 5 ms (1024 reproduces the iOS default that caused crackling) DM_DETCLOCK switch `=<step ns>`: from the first present on, the guest clock advances a fixed step per present instead of following the wall clock, and the random source becomes a fixed-seed stream (replay and test runs) DM_DETCLOCK_PACE switch `=1` with `DM_DETCLOCK`: each frame takes at least one clock step of wall time, so background loading keeps up with the fixed clock (used by the screenshot gate) DM_DISPLAY_NAME switch Overrides the iOS app's name in `build_ipa.sh` (default the game name in the base NSP's control data) DM_DYNAMIC_RESOLUTION player `1` lets NieR:Automata 1.0.3's own dynamic resolution scale between 70 and 100 %, `0` (default) keeps full resolution; only on the builds whose patches.py names the DYNAMIC_RESOLUTION capability (`hle_fpslock.c` `k_nier_dr`). The launcher's Dynamic resolution DM_EMBED_TAG path Set by the iOS app of a game of several programs: the tag of the running program's embedded sections (`p<N>`, `gen_embed.py --tag`) DM_ENTITLEMENTS path `=<plist>` gives a prepared Xcode project another entitlements file instead of the Increased Memory Limit one, and the ad-hoc signature of the unsigned IPA's executable carries them; empty means no entitlements DM_ENV_FILE path `=<file>` makes `build_ipa.sh` bake its `KEY=VALUE` lines into the app as `dm/env.txt`, applied at boot; `Documents/env.txt` overrides them DM_ENV_FILE_KEYS switch Set by the iOS app and the Mac launcher at launch to the space-separated names an env file set; the settings screen keeps those values and shows them greyed out DM_ENV_LAUNCH_KEYS switch Set at launch by the Mac launcher (the launcher settings already in the environment) and the iOS app (every DM_* variable already in it) to the space-separated names; the settings screen keeps those values and shows them greyed out DM_EXEC_OUT path File `oe::ExecuteProgram` records the next program and its parameters in, then the app ends (the iOS app of a game of several programs sets it to `Documents/program.bin`) DM_FD_LOG diagnostic `=<seconds>` logs, every that many seconds, the number and kinds of file descriptors the process has open DM_FIXED_TIME switch `=<seconds>`: the user clock always returns that time and the host time zone is pinned to UTC, for deterministic comparison DM_FOCUS_KEEP switch `1` keeps the game in focus while its Mac window is up, whichever app is active (minimizing still counts); `scripts/regress.py` sets it, so another app taking the key window during a run does not pause a game that stops out of focus DM_FONT_DIR path Folder of the shared-font stand-ins (`standard.ttf`, `nintendo_ext.ttf` with the button icons); the app, the Mac launcher and the NSP script set it DM_FORCE_STRICT diagnostic `=1` makes the loader fail on forced-hook entries no module references, instead of only noting them (for checking a mistyped list) DM_FPS switch `30` or `60` pins the frame rate the display link and frame pacing aim for; otherwise it follows the game's present interval (60, or 30 when the game asks for 30) DM_FPS_CAP_FORCE diagnostic DM_FPS_HOLD player `on` / `off` overrides the profile's `fps_hold`: whether late frames may raise the hold above the frame cap's vsyncs (on by default) DM_FPS_PAYBACK player `on` / `off` overrides the profile's `fps_payback`: whether real time a late frame lost is paid back with a step one vsync longer than the hold (on by default; off lets it go and the game slows by it) DM_FPS_TARGET player Frame-rate cap: `30` or `60`, or `0` for the game's own limit; overrides the profile's `fps_target` DM_FRAMEGEN player `1` (launcher: Frame generation, offered with the 30 fps frame rate): MetalFX's frame interpolator makes a frame between each two presents and the display link shows it between them, so a game held at 30 fps is shown at 60; turns present snapshots on with a ring of at least 3. Display link only, for presents held 1.5 ticks or more; `0` off (default) ([Frame generation between held presents](reference/frame-rate.md#frame-generation-between-held-presents)) DM_FRAMEGEN_MV switch `0` gives frame generation's interpolator no motion, as X6-X9 did (its own flow finds motion up to about 64 px a frame); by default (`1`) the motion is found from the two presented pictures (`dm/gfx/msl/fgmv.metal`: 64 px tiles searched within 192 px at 1/8 size) and still HUD pixels are taken from the present after the interpolation ([Frame generation](reference/frame-rate.md)) DM_FRAMEGEN_SCALE player `=<0.5-1>` (launcher: Frame generation size, Full = 1 or Lighter = 0.75): with frame generation, the snapshots and the generated frames at that fraction of the size shown, brought back by the present's MetalFX spatial scaler (turned on for it); default 1 ([Frame generation between held presents](reference/frame-rate.md#frame-generation-between-held-presents)) DM_FRAME_WG player `1` (launcher: Deadline boost): the threads that make a frame join an os_workgroup interval whose deadline is the present period, so the performance controller keeps them fast; off by default DM_FS diagnostic When set, logs file opens, paths not found or not mounted, and a read summary every 64 MiB or 1000 reads DM_FSLOG diagnostic `=<file>` writes one TSV line per ReadFile: seconds since boot, guest path, offset, length and guest buffer address DM_FSLOG_HASH diagnostic With `DM_FSLOG`, adds a column with the FNV-1a 64 hash of the bytes read DM_FSTEP_PROBE_RAMP switch `0` ends a frame-step probe's grace after its 30 frames as before; by default the grace is renewed while the probe's frames keep getting cheaper (macOS raises the GPU clock for the shorter deadline over seconds); `ab` alternates with `DM_AB` DM_FULLSCREEN player `1` (any value but `0`) starts the Mac window in fullscreen; `0` or unset, a window. The Mac settings window's Display mode DM_GAME switch Selects the game profile (a title ID under `dm/games` or `DM_GAMES_DIR`) for the Python tools and the rewriter; there is no default DM_GAMES_DIR path Profile folders outside the repository, separated by `:`, searched after `dm/games`; the NSP script points it at a provisional or derived profile DM_GAMES_FIRST switch `=1` searches `DM_GAMES_DIR` before `dm/games`, so a provisional or derived profile wins over the game's own (the NSP script's `--provisional`) DM_GAME_ENV switch `KEY=VALUE` pairs, separated by spaces, that the game's own `getenv` returns, in place of the profile's `game_env` (`hle_os.c`); any other name goes to the SDK's empty environment DM_GFX_FIXTURE_OUT test `=<dir>`: graphics tests write their raw result textures and buffers there DM_GLSLC_CAPTURE path `=<dir>` saves every GLSLC output the game compiles at run time; `shader_split.py` reads it (default `<version dir>/glslc_capture`) DM_GL_CAPTURE path `=<dir>`: the GL layer writes every shader source the game compiles (`<key>.vert` / `<key>.frag`) for `gl_shaders.py`; the NSP script uses it to capture run-time shaders DM_GL_DRAWLOG diagnostic `=<n>[:<seconds>]` logs the first `<n>` GL draws after `<seconds>`, each with its framebuffer, viewport, scissor box, program, uniforms, samplers and its vertex attributes' first vertices; `=1` or more also names samplers that have no texture DM_GL_FBLOG diagnostic `=1` logs every framebuffer bind with its size and the draws so far DM_GL_LOG diagnostic `=1` makes the GL layer log object creation DM_GL_MISSES diagnostic `=1` reports each `eglGetProcAddress` name the layer lacks when the game first asks for it DM_GL_STUBS diagnostic `=1` gives every GL function the layer lacks a stub that reports its first call and returns 0, instead of a null pointer (bring-up) DM_GPU_CAPTURE diagnostic `=<frame>[:<frames>]` or `gpu:<ms>[:<after frame>]` writes a Metal GPU trace of those frames for Xcode's Metal debugger; can be set while running through `DM_CTL` DM_GPU_CAPTURE_DIR path Folder for `DM_GPU_CAPTURE`'s traces (default `gpu_captures/` in the working directory) DM_GPU_CAPTURE_KEEP diagnostic Before each GPU capture, prunes the capture folder's `dm_*.gputrace` entries so that the newest `KEEP - 1` stay (default 2) DM_GUEST_FILE switch `1` puts the guest's memory in sparse, unlinked files mapped shared over the guest block, `0` keeps it anonymous (`hle_svc.c`): file pages are out of `phys_footprint`, the figure iOS ends an app at, and the kernel can write them out when it needs the room. Unset: on iOS when the game's memory pool is larger than the room to the memory limit at start (the log's `[mem] guest memory` line says which), off on the Mac. The guest stays anonymous, with a `[RED]` line, when the files cannot be made, or the disk has less than `DM_GUEST_FILE_MIN_FREE` free (on the Mac that plus 8 GB) DM_GUEST_FILE_CHUNK switch `=<size>` (whole MB, K / M / G; default 1G, at least 64M, at most 1024 files): the size of each guest file; one file when it is not under the block's size. The stall at the system's periodic flush grows with the file (on a 16 GB M5 Mac up to 148 ms with one 20 GB file, 4 ms with 20 files of 1 GB) DM_GUEST_FILE_DIR path Folder for `DM_GUEST_FILE`'s files (default the user's temporary folder; the iOS app sets it to `NSTemporaryDirectory()`) DM_GUEST_FILE_MIN_FREE switch `=<size>` (whole MB, K / M / G; default 5G, `0` never): with `DM_GUEST_FILE=1`, the game is stopped (exit code 87) when the guest files' disk has less free space than that DM_GUEST_SPAWN_TEST diagnostic `=1` runs a self-test before `nnMain`: a host-started guest thread does SDK malloc / free and locks an `nn::os` mutex, and the result is logged; `=2` also keeps a resident thread DM_HID_LOG diagnostic `1` logs the HID button usage number of each button pressed on a raw HID gamepad (`pad_hid_mac.h`), to write a `DM_HID_MAP` DM_HID_MAP switch `=<map>` such as `A=1,B=2,X=4,Y=5`: which HID button usage presses each Switch button on a raw HID gamepad (names A B X Y LS RS L R ZL ZR PLUS MINUS LEFT UP RIGHT DOWN; default 8BitDo's D-input numbering by position, `pad_hid.h`); Mac only DM_HID_PADS switch `0` stops reading raw HID gamepads that GameController does not list, such as an 8BitDo in its own mode (`pad_hid_mac.h`); Mac only DM_HITCH_DUMP diagnostic `=<ms>[:<s>]`: when no frame has been presented for that long (from s seconds on), logs every guest thread once per stall: wait, last SVC, pc, lr, frames and registers DM_HLECOUNT diagnostic `=<file>` (`%d` = process ID) writes at exit a TSV of how many times the guest called each HLE function, zero counts included DM_HOME_QUIT player `0` turns off quitting with the controller's Home button (Mac, on by default): held for 2 s it opens a quit prompt over the game, A quits as ⌘Q does, B or Home closes it (`home_quit.h`) DM_HOME_QUIT_CAPTURE test `=<folder>`: `tests/t_home_quit_mac.m` also draws the Home button's quit prompt and hold indicator into PNG files there DM_HOME_QUIT_TEXT switch The texts of the Home button's quit prompt in the player's language, one per line: the hold indicator, the title, the note, the quit and the cancel button; a front end such as NX2Apple sets it ([Starting a game](frontends.md#starting-a-game)), an empty or missing line keeps the English text DM_HTML path Folder of the offline HTML pages (default: `html` beside the RomFS) DM_ICON path `=<image>` gives `build_ipa.sh` another app icon (default the `icon.jpg` beside the RomFS) DM_IMPORTS diagnostic When set, logs each import the loader binds to a host function and each forced takeover DM_JIT_CAPTURE path Folder the Mac host writes what a game's `nn::jit` plugin makes to, one `<key>.jit` per request, for `dm/tools/jit_capture.py`; the NSP script sets it DM_JIT_LOG diagnostic `1` logs every `nn::jit` `GenerateCode` request DM_JIT_MISS_DUMP diagnostic Folder for the input of each `nn::jit` request a served image lacks DM_JIT_SERVE path Folder of a `nn::jit` image (`jit.img`, `jit.tsv`, `jit.out`): the Mac serves requests from it as the iOS app does, and the plugin does not run DM_KBD switch `=<text>`: the system keyboard returns that text as OK without showing an input box; unset with no window, it returns cancel DM_KBD_PLAYER switch `own` makes the Mac keyboard player 1 on its own, with controllers from player 2 on (by default the first controller shares player 1 with the keyboard) DM_KEYS switch Scripted input: `<seconds or f<frame>>:<key>[+key][~hold or ~f<frames>][*count/interval],…` presses buttons, sticks, touches and `Shake` at those times; `=@<file>` reads the steps from the file DM_LANG player Game language as a language code (default `en-US`; the iOS app sets the one the IPA was packed with) DM_LAUNCHER switch `0` skips the iOS settings screen or the Mac settings window and starts the game at once, with the saved choices (on the Mac also `--no-launcher`) DM_LAUNCH_PARAM path File whose bytes `oe::TryPopLaunchParameter` returns once; `oe::ExecuteProgram` sets it for the program it starts DM_LINK_VTICK switch `0` keeps the system's display-link rate on 144 or 165 Hz Mac screens; by default the link counts only the refreshes nearest a steady 1/60 s clock DM_LOADHASH diagnostic `=1` logs an address-independent SHA-256 per module after loading DM_LONGFRAME diagnostic `0` turns off the long-frame log (on by default), a line for a frame over 20 ms or with GPU time over 16.7 ms that is clearly above recent frames DM_MEASURE_LOCK path `=<file>`: `scripts/regress.py`'s default `--lock`, the measuring lock `scripts/bench.py --lock` shares: held only while a game runs, and the harness's shader builds pause while another process holds it DM_MEMSTAT diagnostic `=<tsv>` writes one line per second of memory accounting: footprint, Metal allocation and resident and charged memory by region class (guest, code, malloc, gpu, …) DM_MEMSTAT_DUMP diagnostic `=<seconds>`: with `DM_MEMSTAT`, at that second writes every VM region of 1 MiB or more to `<tsv>.regions` DM_MEM_CAP_GB switch `=<GB>`: the memory watchdog exits when resident memory exceeds that many GB (default 24 on the Mac, none on iOS; `0` turns it off) DM_METAL_CAPTURE diagnostic `=1` makes `build_ipa.sh` produce a build that can write GPU frame captures (`MetalCaptureEnabled` in `Info.plist`), for `DM_GPU_CAPTURE` DM_METAL_HUD player `1` shows Apple's Metal performance HUD over the game (frame rate, frame and GPU time, memory) DM_MOTION switch `0` ignores live motion: every six-axis sensor lies flat as before (a shake still plays), and neither controllers' motion sensors nor the phone's device motion are switched on (`hle_hid.c`, `motion_apple.h`, `DmGamepad.m`); the NSP script's `--no-motion` (`MOTION = False`) builds it in DM_MOTION_ACC_SIGN switch `-1` flips only GameController's acceleration, for a source that reports the specific force (+1 G up at rest) instead of the gravity direction (`motion_fusion.h`); phone and raw HID samples are already in the Switch frame DM_MOTION_AXES switch `=<map>` such as `x,-z,y`: maps Apple's controller axes to the Switch's, a signed permutation applied to acceleration and rotation alike, for a controller whose axes differ (default `x,y,z`; phone and raw HID samples are already in the Switch frame) DM_MOTION_GAIN switch `=<gain>`: how fast the orientation is pulled toward the measured gravity, in rad/s per unit error (default 0.5; `0` integrates the gyro alone) DM_MOTION_HID switch On the Mac, `0` disables the passive Switch Pro Controller HID motion fallback (`motion_pro_mac.h`); enabled by default when exactly one physical Pro and one GameController Pro can use the same player slot; usable GameController motion takes priority DM_MOTION_LOG diagnostic `=1` logs player 1's mapped motion sample once a second per source (phone / GameController / controller HID; acceleration in G, gyro in revolutions/s), for checking the axes: flat and still reads acc 0 0 -1 DM_MOVIE_TRACE diagnostic When set, the movie decoder logs every call with its thread and decoder (by default the first 12 calls, then every 2^k-th), and each nn::codec video decoder logs once a second the packets taken and refused, the pictures decoded, the buffers released and the pictures held DM_MSL_DIR path Parent folder of the shader libraries: NVN loads from `b-<chain version>/` or the one file `b-<chain version>.img` beneath it, Vulkan from `vk/`, GL from `gl/`; the app and the Mac launcher set it DM_NICK switch The account nickname the game sees (default `Player`) DM_NRO switch `0` turns off loading of the NRO modules the game's NRR files register (on by default): every `nn::ro::LoadModule` then fails DM_NRO_CAPTURE diagnostic folder: a `nn::ro::LoadModule` with no rewritten copy writes the image to `<folder>/<SHA-256>.nro` and ends the run (the NSP script's capture of an NRO the game decodes at run time) DM_NRO_DIR path folder of NROs the shader split reads like `main`, and in which it finds a CRA archive's file table (the NSP script sets it for a captured NRO) DM_NVN_ALIAS_RETIRE switch `0` keeps shared textures until their storage is taken over or their pool goes, as before; by default, while the residency set holds more than 85 % of the working set, shared textures no live texture object has resolved to in 64 submissions are retired, the longest idle first, down to 75 % (`alias_retire_idle`) DM_NVN_ALIAS_SWEEP switch `=<fences>` (off by default; the Potato mode sets 600): at the memory readout, shared textures no texture object holds and nothing has looked up for that many fences are let go DM_NVN_ALLOCPROF diagnostic `=1` charges Metal allocation growth to each replayed op type and function, and logs command allocator sizes and each new texture (serial, size, format, storage) DM_NVN_ALLOC_CAP switch command allocators and visibility buffers the main submission may have in flight, 3-32 (default 16; 8 was the fixed cap before X1): at 8, Ocarina of Time's Hyrule Field blocked the submit thread DM_NVN_API switch `=<major>.<minor>` overrides the NVN API version `nvnDeviceGetInteger` reports (by default decided by the SDK version or the profile's `device_api`: 55.15 for SDK 11 and later, 53.313 before) DM_NVN_BARRIER switch How draw passes are ordered: `full` (default) waits for all earlier GPU work, `game` only for the previous pass's fragment stage unless the game set a barrier, `ab` alternates with the `DM_AB` phases DM_NVN_BF_WANT path `=<file>`: appends the key of each fragment shader whose passes could not be merged for lack of a readable-tile version to that file, once per key DM_NVN_BLIT_ORDER diagnostic `0` drops the barriers between dependent operations in the copy encoder, which reproduces the fountain's vertical stripes in Mario Wonder DM_NVN_CAPTURE diagnostic `=<frame>:1:<path>` writes that frame (from its first submit to its present) to one file: pool bytes, registries, program keys, the textures whose content lives only in Metal, each submission's records with pointers relocatable, and the presented frame's SHA-256 and pixels; `dm/gfx/tests/nvn_replay` replays it ([development.md](development.md#frame-capture-and-replay)) DM_NVN_CBDUMP diagnostic `=<dir>`: saves each draw's whole uniform blocks as `F<frame>_p<pass>_st<stage>_cb<slot>_<address>.bin`, and the source bytes of buffer-to-3D-texture copies, with `DM_NVN_PASSDUMP` DM_NVN_CBDUMP_KEY diagnostic `=<shader key>`: limits `DM_NVN_CBDUMP` to draws using that shader; for a vertex shader key also saves the draw's vertex streams and index buffer DM_NVN_CBLOG diagnostic `=1` logs the command memory the game adds to command buffers (`AddCommandMemory`: the first 60, then every 500th) and the out-of-memory callbacks DM_NVN_CB_CHECK test `1` writes each uniform-only argument table in full as well and logs any difference between the two DM_NVN_CB_FAST diagnostic `0` writes every argument table in full; by default a shader whose stage only had uniform buffers rebound since its table was written in the pass copies that table and remakes the uniform buffer slots DM_NVN_CLEARLOG diagnostic `=1` logs the first 40 colour clears drawn as a triangle (inside a pass, with a partial channel mask or a partial scissor) DM_NVN_CMDSTAT diagnostic `=1` logs every 300 frames the command recording usage: bytes and records per frame, command memory segment sizes, out-of-memory callbacks, host segments, count and bytes per command type DM_NVN_COUNT diagnostic `1` counts every NVN call (the counting trampolines) and writes the per-frame call lines; off by default (on with a `DM_NVN_TSV` table that has call rows), the count is an atomic add all recording threads share DM_NVN_CPUPROF diagnostic 1 records CPU wall/time/instruction totals by renderer operation; off by default. DM_NVN_CSH_PRESCAN diagnostic `0` runs the compute-hoist scan at every pass's first draw even when no dispatch follows (as before; for timing) DM_NVN_CS_HOIST switch `0` makes a compute dispatch between the draws of a pass end it (on by default: the dispatch runs ahead of the pass when that changes nothing the draws before it read) DM_NVN_CUT switch `=<draws>`: the replay commits its command buffer every that many draws, between passes (default 64; `0` one command buffer per submission, except the cut after a buffer-to-texture copy) DM_NVN_DEFER switch `0` turns off the deferred pass merging of the TBDR optimizations (which run only with `DM_NVN_TBDR=1`) DM_NVN_DEFER_AB diagnostic `=1` keeps the deferred pass merging (with `DM_NVN_TBDR=1`) off until the second screenshot has been written, then turns it on, to compare the pictures with and without it DM_NVN_DEPTHOVR diagnostic `=<fragment shader key prefix>,…`: those draws compare depth with `ALWAYS`; with `DM_NVN_HILITE`, tells "the depth test rejects every fragment" from "nothing rasterizes" DM_NVN_DIRECT_UPLOAD switch 0 disables bounded direct RGBA16F array uploads and keeps staged copies; on by default for supported non-sparse textures. DM_NVN_DIRTYCHECK diagnostic `=1` fully hashes pool content on every use to find changes the dirty-page tracking missed DM_NVN_DISPATCH_OVERLAP switch `1` runs the game's compute dispatches with no barrier of its and nothing else between them side by side in the copy encoder, as NVN allows; `0` orders each after the one before (the default unless the profile sets dispatch_overlap: Ocarina of Time does) DM_NVN_DISPATCH_OWN switch `=1` gives every compute dispatch a compute encoder of its own with full barriers, as before (by default dispatches share the copy encoder); `DM_NVN_PASSGPU` does the same DM_NVN_DUAL_WANT path `=<file>`: appends the key of each pixel shader a pipeline blends with its output 1 as the second source, while it has no dual-source entry point, to that file, once per key (the profile's `dual_want.tsv`) DM_NVN_ENC_LABEL diagnostic `=1` labels every render encoder `p<pass in frame> <width>x<height> <first 8 digits of the first draw's fragment key> d<draws>` for Instruments traces DM_NVN_ENC_THREAD player `1` runs the replay's Metal encoding on a thread of its own while the submit thread goes on translating; on by default on iOS (`0` turns it off), off on macOS DM_NVN_FAMILY_NOCOMPRESS switch `0` lets textures of a resolution family (one storage, several sizes) use lossless compression again; on by default they are written uncompressed, as a size reading another's compressed blocks decodes garbage (ASTRAL CHAIN's glow after the pause menu) DM_NVN_FAST_WAKE switch `0` makes the game's `SyncWait`s wake on the commit feedback handler instead of the GPU's own signal of the fence (on by default) DM_NVN_FB_DSELF switch `0` takes a pool or dynamic-handle draw that writes depth itself as a depth reader, as before, so the next draw writing depth ends the pass; `ab` alternates with `DM_AB` DM_NVN_FB_SNAP switch Draws that sample a colour attachment of their own render pass: unset, those that write it (or follow a write in the pass) read a snapshot, reused until the game's next barrier; `0` none; `all` a fresh snapshot for every draw that samples one (slow, diagnostic, no tile reads) DM_NVN_FB_TILE switch `0` makes such draws that sample the attachment at their own pixel (a projective sample at the vertex shader's screen varying) read a snapshot too, instead of the tile DM_NVN_FLUSH_FILL switch `0` starts a new GPU texture in a CPU-writable pool as zeros; by default one whose storage the game flushed before its first use is filled from that storage once DM_NVN_FRAMES diagnostic `=<N>` prints the NVN call table frame by frame for the first N frames (default 3) DM_NVN_FUSE_CHECK diagnostic `=1` checks pass merging in the same frame: renders the merged passes again apart and logs the comparison of the attachments every time DM_NVN_GEOMETRY_COLOR switch full retains inactive geometry color attachments; default omits them only when attachment bounds and state prove equivalence. DM_NVN_GEOMETRY_COMPUTE diagnostic split ends the geometry compute encoder after each stage for comparison; default combines compatible stages. DM_NVN_GEOMETRY_CUT switch 0 disables extra segment-cut checks at geometry encoder boundaries; default obeys the existing draw threshold and safety gates there. DM_NVN_GEOMETRY_INDEX_CACHE switch 0 disables exact-byte CPU primitive-map caching; default bounds it to 32 MiB and 4096 entries. DM_NVN_GEOMETRY_PACK diagnostic legacy uses the serial block-prefix scan for comparison; default fuses small draws and scans large block totals in parallel. DM_NVN_GEOMETRY_QUERY_RUN switch 0 prevents geometry runs across samples-passed query reports/resets; default retains independent captures while queries replay at their raster positions. DM_NVN_GEOMETRY_WAIT diagnostic always drains before indexed geometry preparation for comparison; default waits only for possible writes to CPU assembly inputs. DM_NVN_GEO_HOIST switch `0` draws each geometry draw's capture and kernel at its own place, ending the render pass; by default a run of lean geometry draws is prepared before the pass opens and only their rasters are drawn in it (`geo_run_walk`) DM_NVN_GEO_LEAN switch `0` draws passthrough geometry shaders through their full kernel and reader, as before; by default a lean kernel culls and the program's own vertex shader draws (`nvn_geometry.inc`) DM_NVN_GEO_MESH switch `0` draws passthrough geometry pairs that have a mesh library (`geo_mesh.tsv`) through the compute path; by default they are mesh draws in the render pass (`geo_mesh_draw`) DM_NVN_GEO_MESH_RUN switch `0` dispatches every mesh geometry draw on its own; by default consecutive mesh draws of one pair whose result does not depend on their order are drawn as one dispatch (`geo_mesh_take`) DM_NVN_GMEM_ALL diagnostic `=1` lists every memory pool in raw global memory's pool table, and so in the residency set, as before; by default a pool the game took no buffer address in (`nvnMemoryPoolGetBufferAddress`, `nvnBufferInitialize`, `nvnTextureGetTextureAddress`) is left out DM_NVN_GMEM_LAZY diagnostic DM_NVN_GMEM_NOBIG diagnostic DM_NVN_GMEM_SKIP diagnostic DM_NVN_GPUPROF diagnostic `=<f>`, `<f1>-<f2>` or `every:<n>`: logs the GPU start and duration of every encoder of those frames (`[gpuprof]` lines from Metal 4 counter heap timestamps) DM_NVN_GPUPROF_CS diagnostic DM_NVN_GPUW_RANGE switch `0` goes back to counting a whole pool as GPU-written at its first GPU write, so its uncompressed textures stop being taken from storage; by default only the storage ranges the GPU renders, copies, clears, downsamples or image-stores into count ([nvn-objects](reference/nvn-objects.md#uncompressed-storage-the-cpu-wrote-next-to-storage-the-gpu-writes)) DM_NVN_GPU_TS switch `segment` or `submission`: what timestamp reports record (GPU start / end of the segment holding each report, or one time for the whole submission), instead of the profile's `gpu_timestamps` DM_NVN_HILITE diagnostic `=<fragment shader key>,…`: those draws use a solid colour instead (magenta, green, cyan, yellow, blue, white in order), to tell wrong geometry from wrong shading DM_NVN_INDLOG diagnostic `=<n>`: the first n indirect draws (and those of pass-dumped frames) log their arguments at encode and as the GPU left them once the submission completed, with the first indices DM_NVN_IXCLOG diagnostic `=<n>` logs the first n indirect draw and dispatch conversions (record to arguments) once the GPU has run them DM_NVN_IXC_PRE switch `0` converts each indirect draw Metal cannot take (quads, fans, 8-bit indices, task / mesh records) at its own place, ending its render pass when one is open, as before; by default a pass a split has met converts them before it opens (ixc_prepass) DM_NVN_KEYDUMP diagnostic `=<fs key>[:n[:every]]`: for up to n draws of that fragment shader (default 6), logs the pass dump binding lines plus vertex formats, vertex streams and uniform values; meant for devices DM_NVN_LAZY_CLEAR switch `0` makes clears with no draw after them open a pass of their own, as before; by default they wait to become the load action of the next pass on that target DM_NVN_LOADPROBE diagnostic `=1`, `2` or `3`: attachments whose load is skipped are cleared to a sentinel colour (`3` NaN; `1` NaN for float formats) and the sentinel pixels left at pass end are counted (should be 0) DM_NVN_LOG diagnostic `=1` logs the creation of NVN objects DM_NVN_MAGSCAN diagnostic `=<fs key>[:every[:phase]]`: device self-check that reads each pass's colour attachments every `every` frames (default 30) and logs `[mag]` lines for solid magenta 16×16 blocks or non-finite pixels DM_NVN_MEMKIND diagnostic DM_NVN_PASSDUMP diagnostic `=<f>`, `<f1>-<f2>` or `every:<n>`: logs every render pass of those frames (attachments, clears, shader keys, bindings, draw state, presents) for the `tbdr_*.py` tools DM_NVN_PASSDUMP_ALL diagnostic `=1` makes `DM_NVN_PASSDUMP` record every draw and binding change, not only the first per pass and stage, including copies and inline uniform updates DM_NVN_PASSGPU diagnostic `=<file>` writes the GPU time of each render and compute pass from stage-boundary timestamp counters (off under Metal 4); also gives each dispatch its own encoder DM_NVN_PASSGPU_SERIAL diagnostic `=1` makes each encoder on the main command buffer wait until all earlier work has finished, so `DM_NVN_PASSGPU` times read each pass's exclusive time (totals read high) DM_NVN_POOLFLAGS diagnostic DM_NVN_POOL_CHUNKS switch `0` wraps a memory pool of 512 MB or more whole in one buffer, as before; by default it is wrapped in overlapping 16 MB chunks made as draws reach them, so only the parts in use are wired DM_NVN_POOL_SKIP_RETIRED switch `=1` / `=0` overrides the profile's `pool_skip_retired`: a pool table (handles traced to no slot) gives a retired texture ID that holds no view the dummy texture instead of a Metal texture made again from its storage DM_NVN_PREDICT switch `0` turns off the parallel precompile look-ahead: a pipeline miss compiles only the pipeline it needs DM_NVN_PREFETCH switch `0` turns off loading a program's shader libraries in the background when the game makes it (`nvnProgramSetShaders`); they load at its first draw instead DM_NVN_PREFETCH_CPS diagnostic DM_NVN_PROF diagnostic `=1` wraps the implemented NVN functions in a timing wrapper and collects the time each takes during recording DM_NVN_PROGTRACE diagnostic `=<vertex keys,...>` logs matching ProgramSetShaders calls and their guest backtraces DM_NVN_RC_STALE player `1` (launcher: Skip hidden objects, experimental): a render condition whose samples-passed result has not landed is decided by the result that landed before it at that address (the same query a frame earlier) instead of drawing; objects coming into view can be drawn a frame late; off by default ([Occlusion conditions decided by the frame before's result](reference/rendering.md#occlusion-conditions-decided-by-the-frame-befores-result-experimental)) DM_NVN_REGLUM diagnostic `=x0,y0,x1,y1:<file>` (normalized coordinates): on every present records the present number, time, mean luminance and a grayscale thumbnail of that region, to check animation speed against frame rate DM_NVN_RES_EVICT_MB switch `=<MB>`: turns the GPU memory guard on and makes it let go of what it can (idle sharing entries, spare textures, staging blocks) from that size; it never stops the game by itself. The launcher's Potato mode sets 4400 DM_NVN_RES_LIMIT_MB switch `=<MB>` makes the GPU memory guard stop the game at that size instead of about 95% of Metal's working set, with the report of what the residency set holds (a low one tests the stop), and lets go of what it can from 84% of it; `0` turns the guard off. The guard runs only when this or `DM_NVN_RES_EVICT_MB` is set (kid-with-sword-remake V18) DM_NVN_RP_AREA switch `0` makes passes on targets of 16 M pixels or more cover the whole target, as before; by default a draw pass that loads what it keeps stops at the far corner of its scissor when that is at most half the target DM_NVN_RT_ALIAS diagnostic DM_NVN_RT_RECYCLE switch `0` makes each render target in a GPU-only pool its own Metal allocation, as before; by default it is placed in a heap of its own, and a freed one's heap is reused by the next target it fits (`ab` alternates it with the `DM_AB` phases) DM_NVN_RT_CONTINUE switch `0` ends the pass whenever the game sets render targets, as before; by default SetRenderTargets naming the open pass's targets continues the pass DM_NVN_RT_DROP diagnostic DM_NVN_RT_DROP_IDLE diagnostic DM_NVN_RT_LOSSY diagnostic DM_NVN_RT_RANGE switch `=1` (experimental, off by default; with `DM_NVN_TBDR=1`) keeps the pass open when the game sets the same colour and depth target again with a view that differs only in its level count DM_NVN_RT_RANGE_CHECK diagnostic With `DM_NVN_RT_RANGE=1` and `DM_NVN_PASSDUMP`, renders a candidate pass both ways in the same frame and logs and writes the comparison (`CHECK_RESULTS.tsv`, `[RED]` on a difference) DM_NVN_SHDUMP diagnostic `=<dir>` saves programs missing from the shader map as `<key>.ctl` (control section) and `<key>.code`, to find the files that hold them DM_NVN_SHMAP path The shader map (`shader_map.tsv`); `c1_full.tsv` and `pso_manifest.tsv` are taken from the same folder. Default: the game profile's folder on the Mac; the iOS app sets it DM_NVN_SHOT diagnostic `=<frame>[,<frame>…]:<path>` saves the swapchain texture as an image at those frames (`%d` in the path = frame number) DM_NVN_SHOT_OUT diagnostic `=<W>x<H>` makes `DM_NVN_SHOT` capture the picture as the present pass upscales it to that size, the crop included, instead of the raw swapchain texture DM_NVN_SIZE_TRACE diagnostic DM_NVN_SKIP_CS diagnostic DM_NVN_SKIP_FS diagnostic `=<fragment key>[,…]` (up to 16) drops all draws of those fragment shaders, to measure their GPU cost or bisect a wrong draw; the picture is wrong DM_NVN_SKIP_SMALL diagnostic `=<width>` drops all draws whose target width is at most that, to measure the cost of tiny render passes; the picture is wrong DM_NVN_SLICE_MERGE switch `0` keeps passes into other layers of one array or cube texture level apart (on by default: they run as one layered pass) DM_NVN_SNAPRAW diagnostic `=1` makes `DM_NVN_TEXDUMP` also save each target's raw bytes, with a text header line, since converting an HDR target to an 8-bit image truncates DM_NVN_SPARSE_TILES switch `0` makes a sparse texture of 64 MB or more whole, as before; by default it is a Metal placement sparse texture with only the mapped tiles backed DM_NVN_STORAGE_FIRST_USE switch `0` keeps a sampled block-compressed texture in a CPU-writable pool to the one-time fill instead of making it CPU-written when its storage holds data at first use (on by default; `tex_cpu_content`), to measure it DM_NVN_T2T_FROM diagnostic `=<frame>`: `DM_NVN_T2T_TRACE` records copies only from that frame on (default 0) DM_NVN_T2T_TRACE diagnostic `=<W>x<H>:<file>`: after each copy into an RGBA16F texture of that size, copies the result into a trace buffer on the GPU timeline; 240 entries are written to the file DM_NVN_TBDR switch `=1` turns on the replay's TBDR pass optimizations (store / load elision, pass merging, same-target continuation); off by default since bindless textures defeat their read inference DM_NVN_TEXCPU diagnostic `=1` logs non-packaged (non-swizzled) textures in CPU-visible pools DM_NVN_TEXDUMP diagnostic `=<frame>:<path>`, `size=<W>x<H>:<path>` or `layers=<n>:<path>`: saves every colour render target of that frame as PNG (`%d` = serial × 100 + layer × 10 + level) DM_NVN_TEXINFO diagnostic `=<W>x<H>` logs storage and description of every texture of that size on first use, registration and initialization (pool, flags, packaged, non-zero bytes, swizzles) DM_NVN_TEXRAW diagnostic `=<serial>,…` or `info` (the textures `DM_NVN_TEXINFO` picked out): saves those textures' raw bytes at the `DM_NVN_TEXDUMP` frame, with a text header line DM_NVN_TEXSNAP diagnostic `=<in-frame pass index>,…`: with `DM_NVN_TEXDUMP`, copies those passes' colour attachments as they end and saves them with the end-of-frame dump DM_NVN_TEX_RECYCLE switch `1` puts a released texture of the fallback path into a bin, still resident, where the next texture of the same Metal description takes it; off by default (the launcher's Potato mode turns it on through `DM_NVN_TEX_RECYCLE_MB`), `0` keeps it off DM_NVN_TEX_RECYCLE_MB switch `=<MB>` (default 256): the most the bin of recycled textures (`DM_NVN_TEX_RECYCLE`) keeps, and setting it turns the bin on; it also keeps none older than 2 s, and none while the residency set is past 70 % of Metal's working set. The Potato mode sets 64 DM_NVN_TEX_SOFT diagnostic DM_NVN_TEX_SOFT_ARRAYS diagnostic DM_NVN_TEX_SOFT_LEVELS diagnostic DM_NVN_TREG_ID diagnostic `=<n>` logs every registration of texture ID n: what it holds from then on, and the frame being recorded DM_NVN_TSV diagnostic `=<path>` writes the per-frame NVN call table and timing rows (frame, metric, value) to a TSV, read by `scripts/bench.py` DM_NVN_TSV_CALLS diagnostic `0` makes `DM_NVN_TSV` write only the timing rows, without the call counts (about two thirds of the file) DM_NVN_UB diagnostic `="name=item,…;…"`: alternating measurement in one run; odd phases of `DM_NVN_UB_N` frames (default 180) take one category in turn (`@set:<global>=<value>` or dropped shader keys) and log present times DM_NVN_UBDC switch `0` turns off the remembered uniform conflict answers: ubd_conflict_sh walks every binding at every draw, as before (for an A/B in one build) DM_NVN_UBDC_CHECK diagnostic `=1` walks every uniform conflict check that a remembered clear answer would skip and logs a red line when the remembered answer was wrong DM_NVN_UBD_MEMO diagnostic `0` scans the deferred uniform update list for every lookup instead of remembering answers per range until the list changes (for timing) DM_NVN_UBP_CHECK diagnostic `=1` checks every uniform shadow made from memory: the pass ends, the updates land, the replay waits for the GPU and compares (a difference is a red line; slow) DM_NVN_UBP_RUNNING switch `0` refuses a uniform shadow partly covered by inline updates of a running submission, as before; by default those updates are remembered by byte, each with its fence, and laid over memory in the shadow DM_NVN_UB_COPY_THREAD switch `0` copies uniform shadows of 512 bytes or more on the submit thread, as before (by default a worker copies them) DM_NVN_UB_DEFER switch `0` ends the render pass at every inline uniform update, as before; by default an update inside an open pass is deferred to the pass end and later draws read a shadow (off in TBDR mode) DM_NVN_UB_LAZY switch `=<n>`: the most deferred inline uniform updates kept across a render pass end (default 160); they land before the next copy, a conflicting draw or dispatch, or the submission end; `0` lands them at every pass end DM_NVN_UB_N diagnostic `=<frames>`: the length of each phase of the same-process alternating measurement `DM_NVN_UB` (default 180, minimum 60) DM_NVN_UB_PARTIAL switch `0`: a uniform block the deferred updates cover only in part ends the pass, as before; by default its shadow starts from memory and takes the submission's queued updates (on by default) DM_NVN_UDC_AB diagnostic `=1` starts with the DontCare store for unwritten attachments off and turns it on after the second screenshot, for an on/off picture comparison in one run DM_NVN_UNWRITTEN_DC switch `0` disables optional stores elided for loaded, unchanged attachments (on by default, independent of TBDR lookahead), for equivalence comparisons; mandatory image-write preservation stays active DM_NVN_UPDUMP diagnostic DM_NVN_UPLOAD_REUSE switch 0 keeps the original one-block upload-slot policy; default retains bounded demand-sized primary and overflow buffers after completion. DM_NVN_VBUF_CACHE switch `0` turns off the cache of resolved vertex stream addresses and vertex argument table writes across draws (on by default), for A/B runs DM_NVN_VCONV_CHECK diagnostic `=1` scans the indices again at every reuse of a cached vertex conversion range (`vconv_range`) and reports differences DM_NVN_VCONV_CPU switch `=1` converts integer vertex inputs fed formats of another class on the CPU, as before, instead of through the shader's shadow inputs (`<key>_bv`) DM_NVN_VCONV_RANGE switch `0` / `1` overrides the profile's `vconv_range`: CPU vertex conversion only over the vertices each draw reads instead of the whole bound range DM_NVN_VLOG diagnostic Set: logs each NVN memory pool as it is created (address, memory, size, flags) with a backtrace DM_NVN_VSDUMP path Output file for post-vertex captures; used with DM_NVN_VSDUMP_KEY and the frame/count bounds DM_NVN_VSDUMP_FROM diagnostic First presented frame eligible for a post-vertex capture (default 0) DM_NVN_VSDUMP_KEY diagnostic Vertex key to capture, or `*` for all eligible vertex shaders; storage-writing shaders are excluded DM_NVN_VSDUMP_MAX diagnostic Maximum post-vertex captures (default 1, or 256 for the wildcard key) DM_NVN_WAITS diagnostic `=1` turns on the wait ledger: every place a host or game thread waits on the CPU for the GPU or the encode thread, counted per frame DM_NVN_WS_MB diagnostic `=<MB>` replaces Metal's recommended working set in the host's memory budget (shared texture retirement, `restop`): a smaller Mac's budget tried on a larger one (a 16 GB Mac recommends about 10,700 MB) DM_NVN_XV switch `0` turns off the cross-submission attachment validity ledger, which skips write-backs of colour attachments cleared before their next use (on by default, only with `DM_NVN_TBDR` on) DM_NVN_ZBLOCK diagnostic `=1` logs (`[zb]`) the all-zero blocks per level of each ASTC texture uploaded on the CPU (magenta when drawn); `=<folder>` also writes the raw storage of the first one per format and size DM_NVN_ZSKIP switch `0` turns off the zero-source skip, which drops a draw whose fragment shader is proven to write 0 over targets already 0 (on by default, only with `DM_NVN_TBDR` on) DM_OE_SCRIPT diagnostic Scripted applet state changes at given seconds, `key=value@seconds,…` with keys `focus`, `opmode` and `bg` (`bg=1` / `bg=0` run the whole background round trip), e.g. `bg=1@20,bg=0@25` DM_OODLE_HOST path The Mac host binary that `shader_split.py` runs in its Oodle tool mode to decode Trinity packs (`ONEPACK` files); set by the NSP script DM_OODLE_JOB path `=<job file>`: the host runs the game's own Oodle decoder on every record of the job file right before `nnMain`, writes `<job file>.out` and exits (Unreal shader archives) DM_OODLE_MODULES path The rewritten modules the Mac host's Oodle tool mode loads when `shader_split.py` decodes Trinity packs; set by the NSP script DM_OODLE_SERVE switch `=1`: the host answers decode requests on stdin / stdout with the game's own Oodle (or LZ5) decoder from the guest main thread before the SDK starts, until stdin ends DM_OPMODE player The operation mode the game sees: `0` handheld, `1` console (default: the profile's `op_mode`, console unless set); read once at startup DM_PAD_MERGE switch `=1` merges every controller into player 1, as before, instead of giving each controller a player of its own (Mac and iOS) DM_PAD_THEME player The touch controls' colours: `0` Classic (translucent white), `1` Forest (blue A, green B, yellow X / Y, red +, deep green shoulders, bronze D-pad, gold rims, all translucent); default the profile's `pad_theme`; launcher setting DM_PATCH_FRONT switch `=<bytes>`: the size of the patch area right before the module base for a long text (`BIG_TEXT`); set only by the rewriter's own rerun with the size it needs DM_PHONE_MOTION switch On iOS, whether the phone's own device motion drives player 1's six-axis sensor: `auto` (default) while no controller supplies fresh motion, `1` phone only, `0` never; each source keeps its own orientation DM_PICTURE_FIT player `fill` scales the 16:9 picture on the iPhone and iPad until it covers the screen in landscape and crops the edges (a portrait or tabletop split and a TV stay fitted); `fit` or unset, the largest 16:9 rectangle with black bars. Launcher and in-game menu setting DM_POOL_ANON diagnostic DM_POOL_ANON_MAX_MB switch `=<MB>` (off by default; the Potato mode sets 512): with the guest in files, a memory pool larger than that stays in the files instead of moving into anonymous memory DM_PREEMPT switch `0` / `1` overrides the profile's `core_preempt`: also check already-runnable higher-priority peers on the caller's core after every thread SVC DM_PRELOAD diagnostic Set: on the Mac, runs the host's early background loading (`dm_host_preload_start`) as the iOS app does, to exercise that path DM_PRESENT_FIFO switch `0` makes the display link take the newest queued frame each tick, as before; by default it shows frames in order, at most one tick behind DM_PRESENT_HZ switch `=<N>`: the frequency of presentation pacing (default 60); `0` means no frame limit and is for performance profiling only DM_PRESENT_INTERVAL switch `display` presents one frame per display-link tick whatever interval the game sets; `game` follows the game's present interval (default: the profile's `present_interval`) DM_PRESENT_LATENCY switch `=1` or `2`: overrides the display link's preferred frame latency for every screen and window mode; larger positive values use 2 (default 2 in variable-refresh fullscreen, 1 otherwise) DM_PRESENT_LINK switch Present pacing: `0` acquires the drawable itself, `1` (the default) presents on a 60 Hz display link, `2` uses a 120 Hz display link with a frame every other tick DM_PRESENT_SNAP player `=<n>`: present snapshots, a ring of n host textures (2 to 4; `1` = 2) the presents are copied to so the game's swapchain texture is free at once; `0` off (default: the profile's `present_snap`) DM_PRESENT_UPSCALE player `metalfx` scales a picture smaller than its rectangle on the screen through MetalFX's spatial scaler; `off` (the default) scales it bilinearly DM_PREV_PROGRAM switch What `oe::GetPreviousProgramIndex` answers (default -1, started from HOME); `oe::ExecuteProgram` sets it for the program it starts DM_PROBE diagnostic `=module:offset,…` (Mac only): puts a `brk` at each guest address and on every hit prints the thread, registers, strings they point to and a backtrace, then runs the original instruction DM_PROBE_ALL diagnostic Set: probe hits (`DM_PROBE`) also print x8–x18 DM_PROBE_DUMP diagnostic `=module:offset:length[:file]`: on the first hit of any probe, writes that range of guest memory to a file (default `run/<platform>/probe_dump.bin`) DM_PROBE_EVERY diagnostic `=N`: every guest probe hit inside `DM_PROBE_FRAMES` counts, every N-th prints (its `#` is then the true hit count, for rates); `DM_PROBE_LIMIT` caps the printed ones DM_PROBE_FRAMES diagnostic Presented frame or inclusive `start-end` range in which guest probes print observations DM_PROBE_HEAP diagnostic `=<name>,<start>,<size>,<free list>,<used list>`: hex offsets of the sead heap layout the probes' `!xN` heap walk uses (default Mario's `0,28,30,b0,c8`) DM_PROBE_HEAPFRAME diagnostic `=<vtable offset in main>` (hex): the probes' heap walk treats heaps of that class as frame heaps (head +0xe0, tail +0xe8) DM_PROBE_HEAPNAME diagnostic `=<text>`: the probes' `!xN` heap walk reports only hits on heaps whose name contains the text DM_PROBE_HEAPRAW diagnostic Set: the probes' heap walk also prints the heap object's first 0x130 bytes DM_PROBE_HEAPWORDS diagnostic Set: the probes' heap walk also prints each used block's first two words DM_PROBE_LIMIT diagnostic Maximum printed hits per guest probe; 0 or absent leaves the count unlimited DM_PROBE_POLL diagnostic `=<address>[+<length>]` (hex, 4 bytes by default, up to 8): a host thread spins on the bytes and on each change snapshots every thread's pc, lr and frames, for writes the watch misses DM_PROBE_WATCH diagnostic `=<address>[+<length>]` (hex, 8 bytes by default): write-protects that host page and reports who writes these bytes, without a debugger DM_PROBE_X2 diagnostic `=<bytes>` (hex): probe hits also dump that many bytes of the memory x2 points to DM_PROGRAM switch `=<index>`: the program of a game of several programs that a host over their profiles runs (default 0; `main.c` `dm_game_cur`) DM_PROGRAMS path Table of a game's programs on the Mac (`programs.tsv`: index, host, modules, run folder, environment): `oe::ExecuteProgram` starts the named one in this process's place; the NSP script's run command and the Mac app set it DM_PROGRAM_ID switch `=<hex>`: the program ID the host reports from `svcGetInfo(ProgramId)` (default: the profile's `program_id`) DM_PSO_ARCHIVE path The folder of the per-game Metal 4 pipeline archive of pipeline bases (default `pso_archive/` beside `pso_user.tsv`); `off` keeps no archive DM_PSO_BUNDLE path The pipeline archive made offline (`<GPU architecture>.mtl4a`, `prebuilt.tsv`), read only; the iOS app and Mac launcher set it to their `pso/` folder; `off` ignores it DM_PSO_CAPTURE diagnostic `1` (one run): the pipeline archive's serializer also captures each base's descriptor, and each flush writes them as a Metal 4 pipelines script to `pso_capture/<file>.mtl4-json` beside `pso_archive/`, for compiling the bases with a vertex layout offline; bases with a layout from the device's own archive are captured again, so their binaries are written a second time DM_PSO_GPUS switch `build_ipa.sh`: the GPU architectures, comma-separated, to build the offline pipeline archive for (`none` builds none); unset, a profile with `pso_mtl4 on` gets its `pso_gpu` list or `g18p` when absent; profiles with `pso_mtl4 off` get none DM_PSO_HYBRID switch `0`: a draw whose pipeline is not built yet waits for it instead of drawing with its shader pair's pulling pipeline meanwhile (on by default with the Metal 4 path) DM_PSO_IOS_MIN switch `build_ipa.sh`: the minimum iOS version of the offline pipeline archives (default the SDK's major version); a device of another major version cannot open them and builds the bases itself DM_PSO_MANIFEST path The prewarm manifest to use instead of the profile's `pso_manifest.tsv`; `off` turns the prewarm off DM_PSO_MTL4 player `0` builds render pipelines through the `MTLDevice` with no bases and no archive; `1` uses MTL4Compiler with the archive, hybrid pipelines and prebuild (default on on the Mac, the profile's `pso_mtl4` on iOS) DM_PSO_PAIRS path The prebuild's second shader pair table (default: `pso_pairs.tsv` beside the shader map) DM_PSO_PREBUILD player `0` turns off the prebuild of every known shader pair's pulling base into the pipeline archive (on by default); `tool` runs the prebuild alone on the Mac and exits DM_PSO_PREBUILD_DEPTH switch `zero`: the prebuild tool (`DM_PSO_PREBUILD=tool`) builds bases for the near = 0 depth mode; the NSP script sets it from the profile's `depth_mode` DM_PSO_PREBUILD_THREADS switch `=<n>`: the workers of the prebuild tool (`DM_PSO_PREBUILD=tool`; default: Metal's concurrent compiles, `maximumConcurrentCompilationTaskCount`) DM_PSO_PREPARE switch `0` runs the prewarm in the background while the game starts, as without a window; `1` makes the first submission wait for the prewarm lists also without a window DM_PSO_PREPARE_THREADS switch `=<n>`: the workers of the prepare step that builds the prewarm lists before the first frame (default: the device's active cores) DM_PSO_PULL_ALL diagnostic `=1`: every draw that has a pulling pipeline draws with it, never with the pipeline for its vertex layout DM_PSO_RECORD path `=<file>`: appends the shaders and pipelines used in the run to that file, for re-recording the prewarm manifest DM_PSO_USER path The per-device list of shaders and pipelines built on the spot (default: `pso_user.tsv` in the parent of `DM_SAVE`) DM_PSO_WAITLOG diagnostic `=1` logs each draw that waited more than 20 ms for its pipeline, with its shader pair and why no stand-in served it DM_PSO_WARM_ONLY player `1`: the pipeline prewarm builds its lists in the background on one utility-QoS thread and keeps nothing, only filling the system's Metal shader cache, so a pipeline the game asks for later is made from it in well under a millisecond; never before the first frame (overrides the prepare step) DM_QOS_EDGES switch `=e1,e2`: the Switch priority edges of `DM_QOS_MAP` (default `44,59`) DM_QOS_MAP switch `=1` maps guest thread priority to QoS class: ≤ 44 user-interactive, 45–59 user-initiated, the rest utility (off by default: every guest thread runs user-interactive) DM_REC diagnostic `=<file>`: writes player 1's physical input (keyboard, mouse touches, controllers; never `DM_KEYS` / `DM_CTL`) to the file as `DM_KEYS` steps in presented frames, for replaying a run (`DM_KEYS=@<file>`) DM_REGIONS diagnostic `=<file>` writes the table of the SDK's address regions every 2 s (alias offset, size, where the request returns to in the game, bytes mapped, the part opened, the SDK offset the request came through; `hle_svc.c` "Address regions"); the NSP script's address region check sets it DM_RENDER_SCALE player `0.5` to `1.0`: fixes the game's 3D views at that fraction of their size and turns its dynamic resolution off, for builds with a render scale stub; `1.0` (the default) keeps it DM_RESOURCE_AOC path The add-on content folder the iOS build copies into the app's `aoc/` (empty for none); written by `gen_resources.py`, read by `stage_resources.sh` DM_RESOURCE_BUILD switch Package version (for example `v327680`), written to `Gen/resources.env` by `gen_resources.py`; with `DM_COPY_ROMFS=NO` the copy phase puts it in the `build=` field of the app's `romfs.id` DM_RESOURCE_CHAIN_H path Path of `dm/gfx/nvn/dmsh_chain.h`, written to `Gen/resources.env` by `build_ipa.sh`; the Xcode copy phase (`stage_resources.sh`) stops when the prepared shaders are not of its chain version DM_RESOURCE_MARKER path A file under the RomFS, written to `Gen/resources.env` by `build_ipa.sh`, that the Xcode copy phase (`stage_resources.sh`) checks for before copying the game files DM_RESOURCE_MSLDIR path Name of the shader library folder (`b-<chain>`), written to `Gen/resources.env` by `build_ipa.sh`; the Xcode copy phase copies the shaders to `msl/<name>` in the app, or `msl/<name>.img` for an NVN game's one file DM_RESOURCE_PROGRAMS path The table of a game's programs' files for the Xcode build phase (`stage_resources.sh`; `build_ipa.sh` writes it) DM_RESOURCE_PSO path Folder of the offline Metal pipeline archive (empty for none), written to `Gen/resources.env` by `build_ipa.sh`; the Xcode copy phase copies it to `<App>/pso` DM_RESOURCE_ROMFS path RomFS folder, written to `Gen/resources.env` by `build_ipa.sh`; the Xcode copy phase (`stage_resources.sh`) copies it into the app's `romfs` DM_RESOURCE_SHADERS path iOS shader library folder or one file, written to `Gen/resources.env` by `build_ipa.sh`; the Xcode copy phase (`stage_resources.sh`) copies it into the app's `msl/b-<chain>` or `msl/b-<chain>.img` DM_RESOURCE_TITLE switch Game profile title ID, written to `Gen/resources.env` by `gen_resources.py`; with `DM_COPY_ROMFS=NO` the copy phase puts it in the `title=` field of the app's `romfs.id` DM_RESOURCE_VERSION switch Display version, written to `Gen/resources.env` by `gen_resources.py`; with `DM_COPY_ROMFS=NO` the copy phase puts it in the `version=` field of the app's `romfs.id` DM_RES_CHECK diagnostic `=1` prints the first 40 textures or buffers a shader reaches through its argument block that are not in the residency set (textures attributed to their parent allocation) DM_RES_PRESET player The resolution preset of a game whose profile sets `res_presets on`: `0` Normal (the overlay's `<mode>/` folder: Ocarina of Time 1280×720 handheld, 1951×1098 docked), `1` Potato (its `potato-<mode>/` folder where it has one: 0.6 of the base, 1152×648 handheld, 1536×864 docked); taken when the RomFS mounts ([hle_fs.c rom_overlay_set](../dm/host/hle_fs.c)); launcher: Game → Resolution DM_REWRITE_J switch `=<positive integer>`: worker processes per module for `patch_nso.py`'s x18 scan and spin wait search; `=1` runs serially. Default: one per core directly, an automatic per-module budget in the NSP script. An explicit value overrides that budget DM_ROMFS path The game's RomFS folder, mounted read-only as `rom` (default `$DM_ROOT/romfs`); the Mac launcher, the iOS app and the NSP script set it DM_ROMFS_OVERLAY path `=<dir>[:<dir>…]`: RomFS reads look in these folders first, in order, and fall back to `DM_ROMFS` (for a modified copy of some files) DM_ROMFS_SUBST switch `=<path>=<substitute path> …` (RomFS paths without a leading `/`, space-separated pairs) replaces the profile's `romfs_substitute`: damaged `*.zs` files (not a zstd stream) served as other image files DM_ROMFS_ZSTD_CHECK switch `0` serves a RomFS image file named `*.zs` that does not begin with a zstd frame as stored; by default such a damaged file is served as its `romfs_substitute` (profile key, or `DM_ROMFS_SUBST`) or else answered "not found" (open and entry type), with one `[RED]` line (`hle_fs.c` `img_serve`) DM_ROOT path Workspace root (default `~/dm-work`): the host's and tools' default paths (RomFS, temporary storage, shader libraries under `build/cache/metal_shader_cache`, probe dumps) are under it DM_RT diagnostic `0` leaves the thread that acquires the window on its QoS only, with no Mach time-constraint policy declaring the frame deadline (on by default; for power A/B) DM_RT_COMP switch `=<ms>` fixes the computation the present thread's time-constraint policy declares; default `auto` re-declares it every 120 frames from that thread's per-frame CPU time (p90 and peak) DM_RUMBLE player `0` turns game rumble off (on by default); launcher setting DM_RUMBLE_GAIN player `=0..3` scales the rumble strength (default 1, `0` is silent); launcher setting DM_RUMBLE_LOG diagnostic `=1` logs the game's vibration handle requests and, once a second, the values it sent, how many had no routed output and the peak amplitude DM_RUMBLE_MIN player `=0..0.9`: controller rumble levels below it stay silent and the rest is stretched over the full range (default 0; the phone is unaffected); for games whose quiet HD rumble texture keeps rotating motors running (Mario Kart 8 Deluxe: 0.45); launcher setting DM_SAVE path This run's save folder (must be set); the device save is `<DM_SAVE>_device`, and `pso_user.tsv` goes in its parent folder; the Mac launcher, the iOS app and the NSP script set it DM_SAVED_CHOICES switch `0` ignores the player's saved choices (launcher.<VAR> in the app's preferences) and leaves them saved; the Mac launcher and the iOS settings screen DM_SAVE_SYNC player Cloud saves: the folder whose `<title ID>/save.dmsync` the save is synced through, `icloud` for iCloud Drive/nxnative Saves (the Mac); `0` or unset, off. The Mac launcher sets the folder chosen in its settings window's Cloud saves, the iPhone app the one picked in its launcher (dm/host/save_sync.h) DM_SCHEME_NAME switch Set by `build_ipa.sh` itself for xcodegen's `project.yml`: the Xcode scheme name, `DmIOS`, or `<display name> (<title ID>)` for a project prepared with `--prepare-xcode` DM_SCREEN_ASPECT player `=<width/height>` (1.3 to 1.77, e.g. `1.43` for the iPhone Duo) renders a game whose profile has `screen_aspect on` in that shape: output 1920 wide, 1280-wide layout space, the HUD at the taller edges and 16:9's sides in view; `0` or unset is 16:9; launcher setting DM_SCREEN_ASPECT_SITES diagnostic `=<mask>` with DM_SCREEN_ASPECT: which of the profile's layout-size conversion stubs follow the taller layout, one bit each (default all) DM_SCREEN_FOV diagnostic `off` with DM_SCREEN_ASPECT: the scene keeps the game's vertical angle (narrower sides) instead of 16:9's sides with more above and below DM_SCREEN_HUD diagnostic `=<edge>,<listed>,<full width>,<full height>[,<tallest>]` with DM_SCREEN_ASPECT: the layout rules' distances and sizes in the 1280x720 space (default 280,100,1270,710,1300) DM_SCREEN_MATCH switch `0` keeps the screen's refresh rate in fullscreen; by default a Mac screen whose rate is not a multiple of the game's frame rate switches to one that is (144 → 120 Hz) DM_SF_TRACE diagnostic `=1` logs every request on the game's own HIPC client sessions that the host answers (`hle_sf.c`) DM_SHAKE_G switch `=<G>`: on iOS, the acceleration beyond gravity above which a flick of the phone shakes the controller's six-axis sensor (default 1.5) DM_SHARED_FONT path Font file served for every shared-font type except the Nintendo extension (default `$DM_FONT_DIR/standard.ttf`, then macOS's Arial Unicode) DM_SHARED_FONT_EXT path Font file served for shared-font type 5, the Nintendo extension with the button icons (default `$DM_FONT_DIR/nintendo_ext.ttf`, made by `make_ext_font.py`) DM_SHOW_FPS player `1` shows the frame-rate counter at the top left (frames put on screen per second; on the Mac also the longest time between two of them and the mean GPU time per frame, and Window > Frame-Rate Counter turns it on and off); at IPA build it sets `DMShowFPS` in `Info.plist`, which `Documents/env.txt` overrides; the NSP script's Mac run command sets it unless `--no-show-fps` DM_SLOWFRAME diagnostic `=1` writes the per-frame timing breakdown to the log only for dropped frames (kept in a ring of the last 16 frames, judged 8 frames late) DM_SPIN switch `0` makes the rewriter's spin gate return at once, so guest poll loops spin with no sleep; the gate stays (on by default) DM_SPIN_LIST diagnostic `=1` makes `patch_nso.py` print every guest poll loop it found and sends through a spin gate DM_SPIN_POLL switch `=<µs>`: how long a spin-gate wait polls before it sleeps with the yield back-off (default 2000; `0` yields on every pass) DM_SVC diagnostic `=1` logs memory SVCs (`SetHeapSize`, `MapMemory`, `Map`/`UnmapPhysicalMemory`) with their addresses and sizes DM_SYMCHECK diagnostic `=1` checks every hashed module symbol lookup against a linear search and logs a red line for each mismatch DM_TBUF_ALIGN diagnostic `=<bytes>` uses that value as the linear-texture alignment for buffer textures when it is larger than the device's `minimumLinearTextureAlignmentForPixelFormat`: a Mac can then reproduce a phone's larger alignment (a 64-byte one fails the buffers a device with 64 bytes cannot view), to check `tbuf_as_2d`'s aligned-row copy DM_TEAM_ID switch Apple team ID for the per-game Xcode project, used when `--team-id` / `TEAM_ID` is not given; `build_ipa.sh` uses the placeholder `0000000000` (unsigned) when unset DM_TEMP path Temporary storage folder (default `$DM_ROOT/run/platform/temp`); stand-in system data goes in `<DM_TEMP>_sysdata`; the Mac launcher, the iOS app and the NSP script set it DM_TEST_ARCHIVE_CONSTANTS test Use optional function constants in the synthetic pipeline archive restart fixture DM_TEST_ARCHIVE_MIXED test Mix a newly compiled shader function with compacted bases in the archive restart fixture DM_TEST_BORDER test Path to the native t_border executable that test_dmsh_border.py runs a rewritten shader through on the GPU (`make check_t_border` sets it) DM_TEST_BUILD test Build folder of `dm/host/tests` whose `t_svc_memory` `test_memory_profile.py` runs (default `build`; `make asan` sets `build/asan`) DM_TEST_FS_FAIL diagnostic `=write:<n>[:<errno>]` makes the nth save write fail with that errno (default ENOSPC), which refuses the save transaction's commit DM_TEST_FS_FAILAT diagnostic `=<point>[:<count>][,…]` makes steps of the save transaction (`mountclone`, `reclone`, `guestname`, `renameback`) fail with ENOSPC DM_TEST_GEOMETRY test Path of the native `t_geometry` executable; `test_dmsh_geometry.py` runs its native geometry emitter checks only when it is set DM_TEST_GEOMETRY_PRIMITIVE_ID test Path to the native t_geometry_primitive_id replay executable used by test_dmsh_geometry.py with DMSH_TEST_GPU=1. DM_TEST_KEYRACE diagnostic `=<n>` creates up to n (at most 512) pthread keys on a thread of its own while the host starts up DM_TEST_KILL_AT diagnostic `=write:<n>` exits the process (`_exit(9)`) at the nth save write, imitating a kill mid-write DM_TEST_LEAK_GPU diagnostic `=1` allocates and keeps a 1 MB shared Metal buffer every 100 ticks: a GPU memory leak on demand DM_TEST_LINK_STALL diagnostic `=<start s>,<duration s>`: counting from the first present, pauses the display link at that point for that long, to check the present fallback DM_TEST_NO_METAL4 diagnostic `=1` treats the GPU as one without Metal 4, as on a virtual Mac: the NVN layer starts only its classic part and drops every present DM_TEST_PRESENT_LAG diagnostic `=<every n>,<ms>[,<in a row>][;…]` sleeps that long before every nth present (and the ones after it in the run): a slow frame on demand DM_TEST_SWKBD_HOLD_MS diagnostic `=<ms>` (with `DM_KBD`) keeps the system keyboard up that long before `DM_KBD`'s text is returned, as a player typing would DM_TEST_SWKBD_LAG_MS diagnostic `=<ms>` sleeps that long between the keyboard handing back its text and the game's thread getting the result, to check that auto-accept does not act early DM_TEST_TRANSFORM_FEEDBACK test Path to the native t_transform_feedback executable used by the Python feedback tests DM_TEST_UP_LEAK diagnostic `=1` keeps the old upload staging block instead of retiring it, as before the fix, to measure the leak DM_TEST_UP_LOST diagnostic `=<batch index>` treats that batch of uploads as dropped, to exercise the re-upload path DM_TEX_LAZY switch `1` / `2` (off by default; the launcher's Potato mode sets `2`): a pool walk makes no host texture for an ID whose texture has none yet, any ID with `1`, only IDs in CPU_NO_ACCESS pools with `2`; the entry is the dummy until a direct binding makes the texture (`nvn_mtl.m` `pool_entry`) DM_TEX_LAZY_MIN_KB switch `=<KB>`: with `DM_TEX_LAZY`, only textures whose storage is at least that size are left without a host texture (the Potato mode sets 4096) DM_TEX_RELEASE switch `1` gives back the guest copy of a texture's storage in a `CPU_NO_ACCESS` pool once its upload (or its creation, for a GPU-only texture) has completed on the GPU: its whole pages become zero pages; `2` also releases still-protected pages of CPU-visible textures uploaded by the tracked path (a later CPU write faults and re-uploads as before); `probe` only counts; off by default ([memory](reference/memory.md#the-guest-copy-of-uploaded-textures-given-back)) DM_TEX_RELEASE_METHOD diagnostic `free` releases with `madvise(MADV_FREE_REUSABLE)` instead of fresh zero pages (`DM_TEX_RELEASE`) DM_TEX_REL_DONOR switch `0` lets a texture made again over storage `DM_TEX_RELEASE` gave back read its zero pages; by default it is a GPU copy of the texture released there when that one has the same description, still has its host texture and its storage was not written since ([memory](reference/memory.md#the-guest-copy-of-uploaded-textures-given-back)) DM_THERMAL_CAP switch `0` turns off the thermal cap, which holds the frame step at 30 fps while iOS reports a serious or critical thermal state (on by default) DM_THR diagnostic `=1` logs each SVC (except `SleepThread`) with its first four arguments, and each `CreateThread` with entry, stack, priority and core DM_THRCPU diagnostic `=<tsv path>[,<seconds>]` writes each thread's CPU time (100% = one core) and the total every interval (default 10 s); on iOS a relative path is under `Documents` DM_TOUCH_HAPTICS player `0` turns off the light haptic tap when a touch control is pressed (on by default); launcher setting DM_TOUCH_LOG diagnostic `=1` logs each touch-screen read with touch points (sample, finger, position, attributes) and each gesture entry, up to 500 lines DM_UDC_SELFTEST diagnostic `=1` runs a start-up check of DontCare load and store on private depth-stencil and RGBA8 textures (clear, Load + DontCare, read back) and logs one result line DM_UE_SHADERS path Folder of the Unreal shader code archives decoded by `uepak.py`, for `shader_split.py` (default `ue_shaders` beside the RomFS); needed when the RomFS has Unreal paks DM_UE_TEXTURE_POOL switch Megabytes Unreal's texture streaming pool (`r.Streaming.PoolSize`) is raised to, overriding the profile's `ue_texture_pool`; `0` keeps the game's own pool. On iOS only this switch turns it on (`Documents/env.txt`) DM_UPSCALER player `metalfx` draws the game's own upscaler shaders (agl's NDSR network, found by the shader map) with MetalFX's spatial scaler; `game` (the default) runs them DM_VK_CAPTURE path `=<dir>` (Mac) writes every SPIR-V module the game creates to `<dir>/<key>.spv`; the NSP script's Vulkan shader capture stage sets it DM_VK_LOG diagnostic `=1` logs Vulkan object creation in the Vulkan-on-Metal layer DM_VSYNC_HZ switch `=<Hz>`: rate at which a host thread fires the vi vsync event when the display link does not drive it (default 60) DM_WAKE_UNLOCKED switch `0` signals a woken guest thread while the waker still holds the thread lock, as before; by default the signal comes after the lock is let go, so the woken thread does not sleep again on it DM_WATCH diagnostic `=<s>` dumps all threads after that many seconds (SIGALRM) and turns on the stall watchdog; off unless set DM_WATCH_SAMPLE diagnostic `=<path>` (Mac): when the stall watchdog fires, samples the process for 1 s with `/usr/bin/sample` and writes the thread stacks to that path DM_WATCH_STALL diagnostic `=<s>`: when the frame loop makes no progress for that long (default 15 with `DM_WATCH`), logs a red line, dumps the threads and exits DM_WEB_LOG diagnostic `1` logs each key an offline HTML page is given and where the focus is after it DM_WIDE_ASPECT switch the screen's width / height for Wide view, 1.8 to 2.6; the iOS front end sets it from its window when `DM_WIDE_VIEW=1` DM_WIDE_VIEW switch `1`: games with wide-view stubs (Ocarina of Time v131072, patches.py wide_view) render the screen's shape instead of 16:9 (launcher: Wide view) DM_WINDOW switch When set (to any value, `0` included) opens a Mac window with keyboard and controller input; unset runs headless with the guest on the current thread; the Mac launcher sets it DM_WINDOW_TOP diagnostic `1` (Mac, with `DM_WINDOW`) orders the game window in front without activating it and keeps it above other apps' windows, so a covered window does not slow the run; `regress.py` sets it DM_XCODE_DERIVED_DATA path Xcode derived data folder for `build_ipa.sh` (default `$W/build/ios/xcode-dd`); the NSP script points it into the game's build folder DM_XCODE_PROJECT_DIR path Folder of the per-game Xcode project that `build_ipa.sh --prepare-xcode` makes (default `$W/xcode`); the NSP script sets it DM_XV_FILE path File where the attachment validity ledger keeps the keys it disabled after a violation, read at the next launch DM_YIELD_BACKOFF switch `0` turns off the yield back-off; `=<cap µs>[:<start µs>]` sets its sleep cap and the run of yields after which it starts (default 250:2000)