Environment variables¶
The port reads a few hundred environment variables. Some are for players (upscaler, frame rate,
controls). Most are diagnostics and developer switches. This page lists every variable found in
src/, gpu/, bbsc/, scripts/, launcher/, run.sh, packaging/ and tools/, with what the
code does with it. The information comes from the code on main (0.51-linux.16). When a comment and
the code disagree, the code wins.
How to set them¶
In the launcher: go to Advanced → Developer → Extra variables (NAME=value, space-separated).
The settings key is extra_env in the launcher's settings.json. The field is parsed in
game_environment() (launcher/bbport_launcher.py:693):
for item in s["extra_env"].split():
if "=" in item:
key, value = item.split("=", 1)
env[key] = value
- The field is split on whitespace. Each piece is split at its first
=:BB_UPSCALER=fsr4 BB_AUDIO_GAIN=1.5 RADV_DEBUG=nohiz. - There is no quoting. A value cannot contain spaces, and quotes are kept literally as part of
the value (
BB_X="a"gives"a"with the quotes). Use separators the variable itself accepts, such as;or,. - A piece without
=is ignored without any message. If a name appears twice, the last one wins. - Any name is accepted, including third-party ones (
RADV_DEBUG,MANGOHUD,VK_*,__GL_*). - The result goes to
run.sh. Both the launcher's Play button and--play(Steam shortcut, Steam Deck game mode) use it.
From a terminal (source checkout): BB_GAME_DIR=/path/to/CUSA03173 BB_FPS=60 bash run.sh.
Without the launcher, nothing sets the launcher's variables. run.sh then uses its own defaults
(game folder ../CUSA03173, uncapped frame rate, and so on).
From a terminal (AppImage): BB_UPSCALER=fsr4 ./Bloodborne-bbport-x86_64.AppImage --play
starts the game with the launcher's saved settings. Mind the precedence below: the launcher's own
settings replace a variable of the same name from the shell. Extra variables replace both. The
AppImage keeps its data (bbport.ini, saves, logs) in BB_DATA_DIR, by default
~/.local/share/bbport.
bbport.ini: many graphics options live in bbport.ini and the in-game menu, not in the
environment. A few variables override those keys at start: BB_UPSCALER, BB_UPSCALE_PRESET,
BB_FSR_SHARPNESS, BB_JITTER, BB_REACTIVE* and BB_OBJECT_MOTION
(gpu/shim/bbport_settings.cpp:192-208). Values set this way stay in force until the next start.
Precedence¶
The environment is built in this order. A later step wins.
- The environment the launcher (or the AppImage) was started with.
- The launcher's own settings (
game_environment(),launcher/bbport_launcher.py:619-698). - Some are always written:
BB_GAME_DIR,BB_MODS_*,BB_PROMPTS,BB_GESTURES_NO_MOTION,BB_PATCHES_*,BB_LANGUAGE,BB_REGION,BB_MENU_LANGUAGE,BB_FULLSCREEN,BB_PRESENT_MODE,BB_SKIP_NETWORK_CHOICE,BB_FPS,BB_DISCORDandBB_STEAM_OVERLAY. For these, a shell value is replaced. - Others are written only when the setting is on or not empty:
BB_HDR,BB_FPS_LIMIT,BB_DRAW_PIPE,BB_READBACKS,BB_PREUPLOAD,BB_PC_MODEL,BB_GPU_PROFILE,BB_PAD_DEADZONE(only when the dead zone is not 4 %),BB_PAD_LIGHTBARand others. For these, a shell value survives while the setting is off. - Hunter's Atlas (
atlas_environment(),launcher/bbport_launcher.py:598): alwaysBB_ATLAS_ENABLED(0 when the map is off or not prepared); with the map on alsoBB_MAP_DIR,BB_MAP_ART_DIR,BB_MAP_FONT,BB_MAP_CATALOG,BB_MAP_CONFIG,BB_MAP_TRAVEL_ENABLED,BB_MAP_ITEMS_ENABLED,BB_MAP_ITEM_CATEGORIES,BB_MAP_FOG_ENABLED=0andBB_MAP_NPC_MODE=all. - Online (only when Play online is on and the online module exists):
scripts/online.pyenvironment()addsBB_ONLINE,BB_SHADNET_*,BB_UPNP,BB_COMMUNITY_SERVER,BB_SEAMLESSHUNT_TOMBS,SHADPS4_P2P_*and the BBSC options (scripts/bbsc.py). - Extra variables come last and override everything above, including the launcher's own settings and the BBSC options.
run.shmostly fills in defaults with${VAR:-default}, so a value you set is kept. It does force a few:BB_AS_0_3=1forcesBB_GUEST_IN_PLACE=0,BB_HOST_COPY_WAITS=allandBB_PRODUCER_CHECK=1.BB_SAVE_LOG=1forcesBB_FRAME_STATS=1.BB_AUTO_RENDER_RES=1makesrun.shunsetBB_RENDER_RES,BB_OUTPUT_RESandBB_UI_RES, so do not set it by hand.- When
bbport.iniasks for a non-1080p output without live resolution andBB_RENDER_RESis unset,run.shexportsBB_RENDER_RES,BB_OUTPUT_RESandBB_DMEM_MBitself. BB_BBSC_LIBis unset unlessBB_BBSC=1andBB_ONLINE=1.SHADPS4_HTTP_HOST_OVERRIDES_JSONis rewritten whenever online play is on.BB_PRESENCE_DIRis rewritten when Discord is on, andBB_TROPHY_DIRwhen the trophy list is prepared.MANGOHUDis dropped while Steam's own performance overlay (mangoapp) runs.run.shexports defaults that differ from the code's built-in ones:BB_COPY_GPU_BUFFERS=1,BB_GPU_WRITE_TWINS=1,BB_GPU_WRITE_TWINS_MAX=65536,BB_PREUPLOAD=1,BB_UFFD=0,BB_GUEST_IN_PLACE=$BB_PC_MODEL,BB_VBLANK_HZ(fromBB_FPS) andBB_PC_MODEL(1 on AMD, 0 elsewhere).- libbbsc sets
BBSC_MOD_SEAMLESS=0andSHADPS4_BBSC_FIVE_HUNTERS=0itself on a public game server (The Hunter's Dream, nodreamforthehunter.com, shadps4.net or scej-network.jp; Seamless Hunt is not one), whatever was asked (bbsc/emulator/mod/linux/bbsc_mod_linux.cpp:360, the list inbbsc/emulator/mod/bbsc_http.cpp:245).
Value formats vary from one variable to another:
- The shadPS4-style
Flag()(gpu/shim/core/emulator_settings.h:14) takes any value starting with1,yortas on. - Most port switches look at a leading
1, or treat everything but0as on. - A few logs and traps turn on when set to any value,
0included. - BBSC switches are off only with
0.
The Values column gives the rule for each variable. Where it says "(default X)", that is the behaviour when the variable is unset. In the tables:
- Launcher: marks variables the launcher writes from a setting. Use the setting rather than the extra field.
- Internal: marks variables set by
run.shor the package. Leave them alone.
Most useful¶
| Variable | What it does |
|---|---|
BB_UPSCALER |
Upscaler at start: off, fsr3, fsr4, fsr411, taa, dlss (overrides bbport.ini/menu). |
BB_UPSCALE_PRESET |
Upscaler preset at start: 0 Native AA, 1 Quality, 2 Balanced, 3 Performance, 4 Ultra Performance. |
BB_FSR_SHARPNESS |
Upscaler sharpening strength, 0–2 (default 0.5). |
BB_RENDER_RES |
Fixed render resolution WxH patched in at start (presets then need a restart). |
BB_FPS |
Frame-rate patch: uncap (default), 60, 90 or 30 (launcher: Frame rate → Mode). |
BB_FPS_LIMIT |
FPS cap; 0 or unset = no limit (launcher: FPS limit). |
BB_PRESENT_MODE |
Vulkan present mode: Mailbox (default), Fifo (vsync), FifoRelaxed or Immediate. |
BB_DISPLAY |
Monitor for the window/fullscreen: number or part of its name. |
BB_GPU_ID |
Which GPU to use, by Vulkan device index. |
BB_PC_MODEL |
Memory model: 1 = new (default on AMD), 0 = the 0.3 one (default elsewhere). |
BB_DRAW_PIPE |
Two-stage GPU pipeline, 20–30 % faster: 1 on, 0 off (default on with 8+ CPU threads). |
BB_PREUPLOAD |
Background upload into VRAM: 0 off, 1 rewritten memory only (run.sh default), 2 everything (~3 GB more VRAM). |
BB_ASYNC_PIPELINES |
0 makes the game wait for shader compiles instead of skipping a draw for a frame or two. |
BB_ANISO |
Anisotropic filtering ratio (default 16; 0 = the game's own). |
BB_DLSS |
0 turns DLSS support off on NVIDIA. |
RADV_DEBUG / BB_AUTO_NOHIZ |
AMD GCN 3–5 on RADV: run.sh sets RADV_DEBUG=nohiz unless BB_AUTO_NOHIZ=0. |
BB_PAD_DEADZONE / BB_PAD_DEADZONE_OUTER |
Inner (default 5) and outer (default 127) stick dead zones, of 127 (launcher: Controls → Stick dead zone (%), the inner one). |
BB_MOUSE_DEADZONE |
Minimum stick deflection used for mouse look (default 16 of 127). |
BB_AUDIO_GAIN |
Master volume multiplier, up to 8 (default 1.0). |
BB_SAVE_LOG |
1 saves the log and per-frame statistics to <data>/logs/ (for bug reports). |
MANGOHUD |
1 shows the MangoHud overlay. |
Display & window¶
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BB_CJK_FONT |
path to a font file (unset: fontconfig's choice for zh-cn) | Font merged into the in-game menu font for Simplified Chinese texts; without one, fc-match picks a system font (Noto Sans CJK, WenQuanYi...), else Chinese text shows as boxes. | gpu/shim/bbport_overlay.cpp:1145 |
BB_DISPLAY |
monitor number (1, 2, ... in SDL order) or part of its name (unset: SDL's primary display) | Launcher: Graphics > Display > Monitor. The monitor the window and fullscreen go to (issue #69); bb-gpu-capabilities --displays lists them, and the log says which one was taken. No match: the primary one. |
gpu/shim/window.cpp:16, launcher/bbport_launcher.py:644 |
BB_FULLSCREEN |
1 or 0 (windowed) | Launcher: Graphics > Display > Fullscreen. Creates the game window fullscreen when the value starts with 1. | gpu/shim/window.cpp:116, launcher/bbport_launcher.py:639 |
BB_GPU_ID |
Vulkan device index (-1: automatic ranking) | Which GPU the game uses, by its index in the Vulkan device list; out of range asserts. bb-gpu-capabilities follows it too. | gpu/shim/core/emulator_settings.h:22, gpu/shadps4/video_core/renderer_vulkan/vk_instance.cpp:146, tools/gpu_capabilities.c:257 |
BB_HDR |
1/y/t or unset (off) | Launcher: Graphics > Display > Allow HDR (set only when on). Allows an HDR swapchain (the colour-space extension and an HDR surface format) when the display offers it. | gpu/shim/core/emulator_settings.h:60, gpu/shadps4/video_core/renderer_vulkan/vk_swapchain.cpp:246, launcher/bbport_launcher.py:652 |
BB_LIVE_RES |
0 | 1 (default: bbport.ini live_resolution, else off) | For output sizes other than 1080p: 1 = live resolution changes (guest at 1080p, host targets scaled at run time, change without restart; slower), 0 = startup resolution patch. Overrides bbport.ini live_resolution=0/1/auto. Outputs wider than 16:9 always take the startup patch. | run.sh:75-122 |
BB_MENU_LANGUAGE |
en, ru, es, it, fr, de, pt_BR, zh_CN (first two letters compared; unset: LC_ALL/LC_MESSAGES/LANG/LANGUAGE) | Launcher: the launcher's own language. Language of the in-game menu until one is chosen in it (bbport.ini menu_language wins). | gpu/shim/bbport_settings.cpp:165, launcher/bbport_launcher.py:638 |
BB_NVIDIA_EGL |
0 = off (default on) | Packaged builds with the host NVIDIA driver: sets __EGL_VENDOR_LIBRARY_FILENAMES to the host's EGL vendor files, NVIDIA first (issue #107); 0 leaves it unchanged. | launcher/bbport_vulkan.py:116-124 |
BB_NVIDIA_LIB_DIR |
directory (default none) | Packaged builds: an extra directory searched for the host NVIDIA Vulkan driver library. | launcher/bbport_vulkan.py:74-76 |
BB_OUTPUT_RES |
WxH | Internal (run.sh exports it from bbport.ini output_res for non-1080p outputs without live resolution; unset again on restart). Output size the upscaler fills when the scene is rendered at a startup-patched size (BB_RENDER_RES); also passed to scripts/patches.py. | gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:199, run.sh:119, run.sh:190 |
BB_PRESENT_MODE |
Mailbox, Fifo, FifoRelaxed, Immediate (Mailbox) | Launcher: Graphics > Display > Present mode. Vulkan present mode; a mode the driver lacks falls back to Fifo. Any other value logs an error and uses Mailbox. | gpu/shim/core/emulator_settings.h:25, gpu/shadps4/video_core/renderer_vulkan/vk_swapchain.cpp:281, launcher/bbport_launcher.py:640 |
BB_PRESENT_THREAD |
0 = off; else on (on) | Swapchain work runs on a separate swap thread next to the present thread; 0 runs it on the present thread. | gpu/shadps4/core/libraries/videoout/driver.cpp:76-81 |
BB_RENDER_RES |
WxH (unset = live resolution path; scene at the menu's preset) | Explicitly sets the game's render resolution with a patch at start (the older path). Fixes the scene size: presets and resolution then need a restart, and TAA at another size is refused. Above 1920x1080 run.sh raises BB_DMEM_MB to 9152. | gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:208, run.sh:71, run.sh:119 |
BB_UI_RES |
WxH (unset: 1920x1080) | Internal (run.sh exports it from patches.py --print-scaled for outputs wider than 16:9 on the startup patch, unless bbport.ini aspect_patch=0; unset again on restart). The game's UI coordinate space: 1080 high and as wide as the output's aspect ratio (2580x1080 for 3440x1440), the HUD canvas width patches.py writes (ultrawide_writes). The UI composition recognizes UI draws by this size and scales them to the output; scripts/hud_layout.py lays out the menu movies for it. |
gpu/shadps4/video_core/renderer_vulkan/ui_composition.h:24, run.sh:119-122, run.sh:124 |
LC_ALL / LC_MESSAGES / LANG / LANGUAGE |
locale | In-game menu language when BB_MENU_LANGUAGE is unset; the launcher also derives its UI and game language from the system locale. | gpu/shim/bbport_settings.cpp:151-163, launcher/bbport_i18n.py:4984-5010 |
VK_ADD_DRIVER_FILES |
ICD JSON list | Packaged builds: prepended to the bundled driver list. | launcher/bbport_vulkan.py:72-73 |
VK_DRIVER_FILES |
ICD JSON list (default: loader's) | Vulkan loader's driver list. run.sh --software sets Lavapipe; packaged builds set it to the host NVIDIA ICD plus bundled Mesa unless you set it (or VK_ICD_FILENAMES) yourself; dropped when it points into Steam's pressure-vessel. | run.sh:4-13, launcher/bbport_vulkan.py:66-80, packaging/bbport-entry.c:37-49 |
VK_ICD_FILENAMES |
ICD JSON list | Older name of VK_DRIVER_FILES; if set, packaged builds leave driver selection alone. | launcher/bbport_vulkan.py:66-67 |
__EGL_VENDOR_LIBRARY_FILENAMES |
file list | If set, packaged builds do not replace it with the host's EGL vendor files (see BB_NVIDIA_EGL). | launcher/bbport_vulkan.py:119 |
Graphics & upscalers¶
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BB_ANISO |
integer (16); 0 = the game's own samplers | Mipmapped linear samplers of graphics draws get this anisotropic filtering ratio instead of the PS4's (sharper floors, stairs and walls at grazing angles). | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:3584 |
BB_AUTO_NOHIZ |
0 = off (default 1) | On GCN 3–5 GPUs under RADV (Polaris, Vega and their APUs) run.sh sets RADV_DEBUG=nohiz to avoid black halos/missing geometry from depth compression; 0 disables that. Ignored if you set RADV_DEBUG yourself. | run.sh:212 |
BB_DLSS |
0 = off; unset = on when available | NVIDIA DLSS through the optional bridge library (libbbport_dlss.so + NVIDIA's libnvidia-ngx-dlss). 0 disables it; without the libraries or on other GPUs nothing changes. | gpu/shadps4/video_core/renderer_vulkan/vk_dlss.cpp:176, gpu/shadps4/video_core/renderer_vulkan/vk_dlss.h:8 |
BB_FSR1 |
1/y/t or 0 (off) | shadPS4's FSR 1 pass in the presenter (spatial upscale of the final image); separate from the port's upscalers (bbport.ini upscaler). | gpu/shim/core/emulator_settings.h:59, gpu/shadps4/video_core/renderer_vulkan/vk_presenter.cpp:175 |
BB_FSR411_DIR |
directory (unset = fsr4_411 next to run.sh) | Internal (run.sh sets it to /fsr4_411 when that exists). Where the FSR 4.1.1 assets built by tools/fsr4cap/build_assets.sh are looked up. | gpu/shadps4/video_core/renderer_vulkan/vk_fsr4.cpp:244, run.sh:34, launcher/bbport_launcher.py:449 |
BB_FSR411_VARIANT |
int8 / fp8emu (unset = FP8 when the GPU supports it and its assets exist, else INT8) | Forces which FSR 4.1.1 model variant runs: int8 skips FP8; fp8emu uses the emulated-FP8 set (needs FP16 cooperative matrices). | gpu/shadps4/video_core/renderer_vulkan/fsr411/fsr411.cpp:295 |
BB_FSR4_DIR |
directory (fsr4_shaders) | Where the FSR 4 (v07) SPIR-V passes and weights from tools/fetch_fsr4_assets.sh are loaded from. | gpu/shadps4/video_core/renderer_vulkan/vk_fsr4.cpp:26, gpu/shadps4/video_core/renderer_vulkan/vk_fsr4.h:7 |
BB_FSR4_LINEAR |
0 = off; unset/other = on | FSR 4 gets the game's tonemapped sRGB frame decoded to linear light and the output encoded again. 0 (or toggle bit 63): the encoded frame as before (A/B). | gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:1846 |
BB_FSR4_OPT |
0 = originals; unset/other = optimized | FSR 4 uses the fixed/faster passes from fsr4_shaders/opt/ (tools/fsr4_optimize.sh) when present. 0 keeps AMD's original passes. | gpu/shadps4/video_core/renderer_vulkan/vk_fsr4.cpp:126 |
BB_FSR_SHARPNESS |
number 0–2 (bbport.ini sharpness, default 0.5) | Upscaler sharpening (RCAS) strength; overrides the bbport.ini/menu value "sharpness" at start. Above 1 an extra sharpen pass adds the rest. | gpu/shim/bbport_settings.cpp:199, gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:1269 |
BB_INTEL_TONEMAP_FIX |
0 | 1 (default: on for Intel CPUs, off otherwise) | Applies the community "Intel Black Tonemap Fix" patch (tone mapping turns black on Intel CPUs, DLC areas most); 0/1 forces it off or on. | scripts/patches.py:59-62, scripts/patches.py:100 |
BB_INTERP_INT_FIX |
1 = on, 0 = off (unset = on for GPUs without fragment-shader barycentrics, e.g. older NVIDIA/Pascal) | Forces the integer-interpolation workaround in translated shaders on or off. | gpu/shadps4/video_core/renderer_vulkan/vk_pipeline_cache.cpp:414 |
BB_JITTER |
0/1 (1; overrides bbport.ini jitter) | Camera jitter for the temporal upscalers. | gpu/shim/bbport_settings.cpp:199, gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:354 |
BB_MOTION_LARGE |
0 = off; unset/other = on | Large bone palettes (16–64 KiB, the large beasts) get object motion vectors like small skeletons. 0 leaves them to camera vectors as before. | gpu/shadps4/video_core/renderer_vulkan/motion_history.h:46 |
BB_OBJECT_MOTION |
0/1 (bbport.ini object_motion, off by default) | Per-object motion vectors for the temporal upscaler: less ghosting on characters, about 10% FPS. The variable overrides bbport.ini at start. | gpu/shim/bbport_settings.cpp:202, gpu/shadps4/video_core/renderer_vulkan/vk_object_motion.cpp:58 |
BB_OCCLUSION_QUERIES |
1 = on (off; BB_PM4_SELFTEST=1 also turns it on) | Opt-in: the game's occlusion queries become real Vulkan occlusion queries. Off: counters are a fixed "everything visible" sequence (the 0.3 model), because with an upscaler jittered tests made light glows flash. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:253 |
BB_ZPASS_IN_ORDER |
0 = off; unset/other = on | Without BB_OCCLUSION_QUERIES: the stand-in occlusion counts are written in order with the draws, after the DMA that zeroes the query's block, as on the PS4. Written ahead of it, the game's queries never finished and it made new ones until it read a null handle (issue #23). 0: written at decode, as before. | gpu/shadps4/video_core/amdgpu/liverpool.cpp:588 |
BB_RCAS |
1/y/t or 0 (1) | RCAS sharpening in shadPS4's presenter FSR 1 pass (only with BB_FSR1); not the in-game Sharpening (RCAS) setting. | gpu/shim/core/emulator_settings.h:65, gpu/shadps4/video_core/renderer_vulkan/vk_presenter.cpp:176 |
BB_RCAS_ATTENUATION |
integer, thousandths (250 = 0.25) | RCAS attenuation of shadPS4's presenter FSR 1 pass. | gpu/shim/core/emulator_settings.h:26, gpu/shadps4/video_core/renderer_vulkan/vk_presenter.cpp:178 |
BB_REACTIVE |
0/1 (bbport.ini reactive, off by default) | Reactive mask for the upscaler (opt-in): on Bloodborne's thin mist it trades trails for jitter shimmer. Overrides bbport.ini at start. | gpu/shim/bbport_settings.cpp:200, gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:947 |
BB_REACTIVE_MAX |
0-1 (0.9; overrides bbport.ini reactive_max) | Upper bound of the TAA reactive mask (never fully reactive). | gpu/shim/bbport_settings.cpp:201, gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:1064 |
BB_REACTIVE_SCALE |
0-16 (1; overrides bbport.ini reactive_scale) | Reactive mask = relative colour change times this scale. | gpu/shim/bbport_settings.cpp:200, gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:1064 |
BB_REACTIVE_THRESHOLD |
0-1 (0.2; overrides bbport.ini reactive_threshold) | Reactive mask is zero below this colour change. | gpu/shim/bbport_settings.cpp:201, gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:1064 |
BB_UPSCALER |
off / fsr3 / fsr4 / fsr411 / taa / dlss / none (unset = bbport.ini upscaler / in-game menu) | Overrides the upscaler chosen in bbport.ini/menu at start; any unknown value means off. none also disables the upscaler machinery entirely (no camera tracking, the menu cannot turn it on). scripts/patches.py only distinguishes fsr3 from everything else. | gpu/shim/bbport_settings.cpp:192, gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:190, scripts/patches.py:511 |
BB_UPSCALE_PRESET |
0 Native AA, 1 Quality, 2 Balanced, 3 Performance, 4 Ultra Performance (overrides bbport.ini preset) | Upscaler preset at start. Note: run.sh's startup render size still comes from bbport.ini; only patches.py --print-preset-size honours it. |
gpu/shim/bbport_settings.cpp:202, scripts/patches.py:513 |
RADV_DEBUG |
RADV flags (run.sh may set nohiz) | Mesa RADV debug flags; if you set it, run.sh's automatic nohiz for GCN 3–5 (BB_AUTO_NOHIZ) is skipped. | run.sh:212 |
Performance & memory¶
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BB_ASYNC_PIPELINES |
0 = off; anything else / unset = on | New graphics pipelines of passes drawn every frame compile on worker threads while their draws are skipped for a frame or two, instead of the game standing still for the driver. 0: compiled on the GPU thread, the game waits. | gpu/shadps4/video_core/renderer_vulkan/vk_pipeline_cache.cpp:734, gpu/shadps4/video_core/renderer_vulkan/vk_pipeline_cache.h:212 |
BB_ASYNC_PIPELINE_THREADS |
integer ≥1 (unset = CPU threads / 4, clamped 1–4) | Number of worker threads for BB_ASYNC_PIPELINES. | gpu/shadps4/video_core/renderer_vulkan/vk_pipeline_cache.cpp:643 |
BB_ASYNC_SUBMIT |
0 = off; unset/other = on | Submissions go out from the recording threads once their segments are recorded, instead of the GPU thread waiting for them (~65 µs each). Only with recording worker threads. | gpu/shadps4/video_core/renderer_vulkan/vk_scheduler.cpp:150 |
BB_CONSTANTS_IN_PLACE |
1 = on (off) | With BB_GUEST_IN_PLACE: small read-only buffers (constants) are read by the GPU where the game wrote them instead of being copied when the draw is decoded or recorded. Experiment toggle bit 1 inverts it at run time. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:507, gpu/shadps4/video_core/buffer_cache/buffer.h:57 |
BB_CONSTRAM_PIPE |
0 = off; unset/other = on | With the two-stage draw pipe: before the command processor writes guest memory with the CPU (constant RAM dump), it waits only for the queued packets that read those bytes, not all of them. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:900, gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.h:114 |
BB_COPY_GPU_BUFFERS |
first char 1/y/t = on; run.sh exports 1 when unset (code default without run.sh: off) | Internal. The command buffers of each submission are copied when the game submits them and decoded from the copy (the game reused that memory before the GPU thread got to it: "Unimplemented PM4 type 0" after loading a save). 0 decodes guest memory directly. | run.sh:276, gpu/shim/core/emulator_settings.h:56, gpu/shadps4/video_core/amdgpu/liverpool.h:252 |
BB_COPY_MERGE_KB |
integer KiB (64) | Maximum gap between buffer copies of the game's copy shader (HLE path) that are merged into one batch. | gpu/shadps4/video_core/renderer_vulkan/vk_shader_hle.cpp:203 |
BB_COPY_SHADER_NATIVE |
0 = HLE; unset/other = native | With the game's memory in place, the game's buffer copy shader runs as itself (translated). 0: the copy list is read on the CPU and copied by the port (older HLE path). Experiment bit 2 inverts it at run time. | gpu/shadps4/video_core/renderer_vulkan/vk_shader_hle.cpp:272 |
BB_COPY_THREADS |
0-16 (a quarter of the available hardware threads, 1-4) | Number of threads that split large guest memory copies. | gpu/shim/bbport_copy.cpp:30, src/runtime_memory.c:738 |
BB_DIRECT_SEGMENT |
0 = off; unset/other = on | With BB_ASYNC_SUBMIT, commands recorded on the GPU thread (e.g. upscaler passes) get their own command-buffer segment instead of waiting for the recording threads (~90 µs). 0: the wait. | gpu/shadps4/video_core/renderer_vulkan/vk_scheduler.cpp:647 |
BB_DMEM_MB |
MiB, 5056–16384 (default 5056; run.sh sets 9152 for render sizes above 1080p) | Direct memory size reported to the game (retail PS4: 5056 MiB); the resolution patches above 1080p need more or the game exits at start. | src/runtime_memory.c:22-30, run.sh:132, run.sh:132 |
BB_DRAW_PIPE |
1 = on, 0 = off (unset = on with 8+ CPU threads) | Launcher: Advanced > Performance > "Two-stage GPU pipeline" (Auto/On/Off). Two-stage GPU command pipeline (decode and record on separate threads): 20–30% faster; turn off if unstable. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:830, launcher/bbport_launcher.py:657 |
BB_FAULT_SKIP_TEXTURES |
0 = off; unset/other = on | A write fault on a page no tracked image protects skips the texture cache lock (guest threads no longer wait 0.3–0.6 s behind texture uploads). 0: every fault takes the lock, as before. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:4328 |
BB_FAULT_WINDOW |
KiB, clamped 4-1024 and rounded up to a power of two (256) | Size of the window unprotected around a guest write fault (write tracking), so neighbouring writes do not fault again. Window at or below one tracker page = feature off. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:691-698 |
BB_FPS_LIMIT |
frames per second; 0 or unset = no limit | Launcher: Graphics > Frame rate > FPS limit (set only when > 0). Frames per second the present thread lets through. | gpu/shim/core/emulator_settings.h:51, launcher/bbport_launcher.py:655 |
BB_FRAMES_AHEAD |
integer ≥0 (1); 0 = no bound | The GPU command thread runs at most this many guest frames ahead of the GPU, so GPU-bound frames finish at an even rate instead of in bursts. | gpu/shadps4/video_core/renderer_vulkan/vk_presenter.cpp:475 |
BB_GARLIC_VRAM |
0 = off; any other value on (unset = on, except on integrated GPUs) | With the PC memory model, Garlic memory (what the GPU reads a lot: geometry, textures) gets a VRAM copy kept current like a default heap; 0 keeps it in place too. Ignored when the fixed arena is in use. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:474-479, 2189-2192 |
BB_GC_IDLE_SECONDS |
seconds, clamped 1-63 (20) | Texture collector: below the pressure mark an image is evicted once unused for this long (the textures of an area left behind). | gpu/shadps4/video_core/texture_cache/texture_cache.cpp:1345, 1367-1371 |
BB_GC_PRESSURE_IDLE_SECONDS |
seconds, clamped 0-63 (5) | Texture collector: under VRAM pressure an image is evicted once unused for this long (over the critical mark for 1 s first, then by submissions). | gpu/shadps4/video_core/texture_cache/texture_cache.cpp:1379-1388 |
BB_GC_PRESSURE_PERCENT |
percent, clamped 10-75 (60) | Texture collector, dedicated GPUs below 8 GB: the pressure mark is at least this share of the budget (was 40 %, about what the game holds outside textures, so such cards were under pressure all session). The critical mark is unchanged. | gpu/shadps4/video_core/texture_cache/texture_cache.cpp:62-76 |
BB_GC_KEEP_GPU_WRITTEN |
0 = off; else on (on) | Texture collector: images the GPU wrote stay in VRAM until past the critical mark and unused for a minute, linear ones like tiled ones (issue #30). 0: linear ones are downloaded and freed under mere pressure, as before. | gpu/shadps4/video_core/texture_cache/texture_cache.cpp:1453 |
BB_GC_TILE_BACK |
0 = off; else on (on) | Texture collector: past the critical mark, a GPU-written tiled image unused for a minute is tiled back into the game's memory before it is freed (issues #13, #14). 0 = dropped unwritten as before, which left the Hunter's Dream black. Multisampled images are always dropped. | gpu/shadps4/video_core/texture_cache/texture_cache.cpp:1435-1470, 201-250 |
BB_GPU_COMMAND_WRITES |
0 = off; unset/other = on | With BB_GUEST_IN_PLACE: the game's WRITE_DATA commands are performed by the GPU in stream order, as the PS4 command processor does, instead of a CPU store at decode time. 0: CPU store. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:212, gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.h:204 |
BB_GPU_LABELS |
0 = off; 1 = on; unset = on except on AMD GFX8 (Polaris, RX 4xx/5xx) | With BB_GUEST_IN_PLACE and honest labels: end-of-pipe labels (fences) are written by the GPU itself into the game's memory. 0: by a CPU thread after the GPU. GFX8 stalled with GPU-written labels (upstream #203), so it gets the CPU's unless 1. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:301-316 |
BB_GPU_SPIN_US |
microseconds, negative = 0 (200 with 12+ hardware threads, else 0) | The GPU command thread spins this long before sleeping when it runs out of work, so the next of the ~20 submissions of a frame is picked up without a condition-variable wake-up. 0 = no spinning (saves CPU on small machines). | gpu/shadps4/video_core/amdgpu/liverpool.cpp:163-171 |
BB_GPU_TIMESTAMPS |
0 = off; unset/other = on | With BB_GUEST_IN_PLACE: the game's GPU timestamps (100 MHz clock) are written by the GPU in stream order. 0: written by the CPU. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:290 |
BB_GPU_WRITE_TWINS |
1 = on; run.sh exports 1 when unset (code default without run.sh: off) | Internal. A guest write into a page holding bytes the GPU is still writing (counters, small compute outputs) does not wait for the GPU: the guest's bytes are kept as a "twin". Not with BB_READBACKS=2. | run.sh:279, gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:291-306 |
BB_GPU_WRITE_TWINS_MAX |
bytes per page; run.sh exports 65536 when unset (code default without run.sh: 1024) | Internal. Only pages with at most this many GPU-written bytes get twins; larger outputs (vertices the CPU reads back, FaceGen) keep waiting for the GPU. | run.sh:279, gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:296, 308-313 |
BB_GUEST_GPU_MEMORY |
1 = on (off; implied by BB_GUEST_IN_PLACE=1 on a capable GPU) | Guest direct memory comes from GPU-visible Vulkan chunks (dma-buf, or host import on NVIDIA) instead of the memfd, so the GPU reads the game's data in place. Disables BB_UFFD (dma-buf cannot be write-protected by userfaultfd). | gpu/shim/bbport_guest_memory.cpp:700-718, gpu/shadps4/video_core/page_manager.cpp:723-728, run.sh:195 |
BB_GUEST_IN_PLACE |
1 = on, anything else = off | Internal (run.sh: = BB_PC_MODEL, forced 0 by BB_AS_0_3=1; set by hand overrides the memory model). The GPU uses the game's direct memory where it is (GPU-visible chunks) instead of copies in VRAM, and command-processor writes/labels/timestamps are done by the GPU in order. Part of the new memory model (BB_PC_MODEL=1). | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:515, gpu/shadps4/video_core/buffer_cache/buffer.h:38, run.sh:239 |
BB_GUEST_MEMORY |
dmabuf, host, or unset (AMD: dma-buf chunks; other GPUs: host memory import first) | How the game's direct memory is made GPU-visible in the new memory model: dma-buf chunks or imported host memory (VK_EXT_external_memory_host). host fails instead of falling back when import does not work. |
gpu/shim/bbport_guest_memory.cpp:668 |
BB_GUEST_VRAM |
1 or unset (off) | Experiment: the game's direct memory in VRAM the CPU maps through the PCI BAR (Resizable BAR), as GDDR is the PS4's one memory: no VRAM copies. | gpu/shim/bbport_guest_memory.cpp:37 |
BB_HONEST_FLUSH_US |
integer µs (2000; a header comment says 1000) | With honest labels: at the end of a guest submission, recorded work that signals wait for is submitted at most once per this interval while the GPU still has work. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:400 |
BB_HONEST_IDLE_BACKLOG |
integer bytes (65536) | With honest labels: work is not submitted early "because the GPU is idle" while this many bytes of draws are still queued for the recording thread. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:416 |
BB_HONEST_IDLE_FLUSH |
0 = off; unset/other = on | With honest labels: signalled work is submitted at once when the GPU has finished everything submitted (instead of waiting for BB_HONEST_FLUSH_US). | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:412 |
BB_HONEST_LABELS |
1 = on (unset = on only with BB_GUEST_IN_PLACE) | Fences/labels (EOP, EOS, mem semaphores) are written once the GPU has finished the work before them, as the hardware does, instead of when that work is recorded. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:98, gpu/shadps4/video_core/amdgpu/liverpool.cpp:448 |
BB_HOST_COPY_WAITS |
all (unset = only when needed) | Internal (run.sh sets all with BB_AS_0_3=1). all: before every guest write, wait for all host copies (the old 0.3 behaviour). Default: wait only when a host copy may still read the written range. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.h:130, run.sh:239 |
BB_INDIRECT_GUARD |
0 = off; unset/other = on | Guards indirect compute dispatches: implausible group counts (garbage from particle simulations that caused device lost) are zeroed and the dispatch skipped, and counted in the log. 0: the game's counts as they are. | gpu/shadps4/video_core/renderer_vulkan/vk_indirect_guard.cpp:57, gpu/shadps4/video_core/renderer_vulkan/vk_indirect_guard.h:11 |
BB_INDIRECT_DRAW_GUARD |
0 = off; unset/other = on | Guards indirect draws: a vertex (or index) count times the instance count past BB_INDIRECT_DRAW_GUARD_MAX (garbage that would keep the GPU busy past the driver's timeout, issue #19) is zeroed and the draw skipped, and counted in the log. An open render pass is paused for the check and continued. 0: the game's arguments as they are. | gpu/shadps4/video_core/renderer_vulkan/vk_indirect_draw_guard.cpp:60, gpu/shadps4/video_core/renderer_vulkan/vk_indirect_draw_guard.h:13 |
BB_INDIRECT_DRAW_GUARD_MAX |
integer 1–4294967295, decimal or 0x hex (16777216); invalid keeps the default | Most vertices (or indices) times instances one indirect draw may run before BB_INDIRECT_DRAW_GUARD skips it. | gpu/shadps4/video_core/renderer_vulkan/vk_indirect_draw_guard.cpp:42 |
BB_INDIRECT_GUARD_MAX |
integer 1–4294967295, decimal or 0x hex (4194304); invalid keeps the default | Most workgroups one indirect dispatch may launch before BB_INDIRECT_GUARD skips it. | gpu/shadps4/video_core/renderer_vulkan/vk_indirect_guard.cpp:35 |
BB_LAYER_MEMORY |
1 = on, 0 = off (unset = chosen by the memory model per GPU) | The layer's memory module: the game's memory bound in place with VRAM copies, without sparse binding (NVIDIA's sparse binding stalls the GPU for seconds). 0: AMD's sparse arena. See BB_PC_MODEL. | gpu/shim/bbport_guest_memory.cpp:546, run.sh:204 |
BB_LAYER_MIRROR_FLOOR_PERCENT |
percent, max 90 (25) | Layer memory module: share of the driver's VRAM budget the VRAM mirrors keep against the texture collector; above it they yield to images, below it images yield. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:3930 |
BB_LAYER_MIRROR_GROWTH_MB |
MiB; 0 = none (64) | Layer memory module: the most room a growing VRAM mirror gets above its current end. | gpu/shadps4/video_core/buffer_cache/buffer_cache_layer.cpp:610-616 |
BB_LAYER_RELOAD_RESET |
0 = off; else on (on) | Layer memory module: a block the GPU once wrote in place that the loaders then write whole may have a VRAM copy again (dynamic blocks piled up over area loads and lamp travel, lowering the frame rate). 0: kept in place for good, as before. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:2596 |
BB_LAYER_UNMAP_RESET |
0 = off; else on (on) | Layer memory module: blocks the game unmaps whole lose what kept them in place (CPU writes, GPU writes in place, failed watches); memory mapped there again starts as new. 0: as before. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:3308 |
BB_LAYER_READ_TRAPS |
1 = on (off) | What the GPU writes into a VRAM copy only is made no-access for the CPU until it is copied back, so the CPU never reads stale data. Off by default for now. | gpu/shadps4/video_core/buffer_cache/buffer_cache_layer.cpp:1285 |
BB_LAYER_WATCH |
0 = off; else on (on; needs BB_LAYER_WRITE_TRAPS) | Layer memory module: blocks the CPU writes unannounced get VRAM copies too, write-trapped and uploaded again after the CPU's next write. | gpu/shadps4/video_core/buffer_cache/buffer_cache_layer.cpp:410-424 |
BB_PC_MODEL |
1 = new | 0 = 0.3 model (default: 1 on AMD GPUs, 0 elsewhere) | Launcher: Advanced → "Memory and translation model" (Auto leaves it to run.sh). Memory model: 1 = the GPU uses the game's memory in place and the command processor's work is translated (implies BB_GUEST_IN_PLACE=1); 0 = 0.3 model (VRAM copies, write tracking). A value in extra variables wins over "Auto". | run.sh:212, run.sh:199, launcher/bbport_launcher.py:671 |
BB_PC_MODEL_ANY_GPU |
1 or unset (off) | Lets the new memory model's sparse arena run on non-AMD GPUs that would otherwise fall back to the 0.3 model (NVIDIA: rebinding memory held the GPU for seconds). | gpu/shim/bbport_guest_memory.cpp:513, gpu/shim/bbport_guest_memory.h:35 |
BB_PIPELINE_CACHE |
1/y/t or 0 (1) | The port's pipeline cache: shaders are compiled again at startup from the stored list (warm-up). 0 turns it off. | gpu/shim/core/emulator_settings.h:64, gpu/shadps4/video_core/renderer_vulkan/vk_pipeline_serialization.cpp:330 |
BB_PIPE_SIGNALS |
0 = off; unset/other = on (with honest labels and the draw pipe) | Fences, GPU-idle/frame signals and their submissions are handed to the draw recording thread as ordered tasks instead of draining it first (~15 waits a frame). | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:376, gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.h:234 |
BB_PIPE_SPIN_US |
integer µs ≥0 (200 with 12+ CPU threads, else 50) | How long the draw-pipe consumer spins waiting for work before sleeping. Lower values leave more CPU to the game on few-core machines (Steam Deck). | gpu/shadps4/video_core/renderer_vulkan/vk_draw_pipe.h:209 |
BB_PREP_WORKERS |
integer 0–16 (half the CPU threads, clamped 1–8) | Number of idle-priority worker threads that prepare draws speculatively ahead of the GPU thread (pipeline and resource selection). 0 = none. | gpu/shadps4/video_core/renderer_vulkan/vk_draw_prep.cpp:54 |
BB_PREUPLOAD |
0 = off, 1 = rewritten memory already in VRAM only (no new VRAM), 2 = all of the game's GPU memory (~3 GB more VRAM); without run.sh unset = 0 | Launcher: Advanced > Performance > "Background pre-upload into VRAM" (run.sh exports 1 when unset). Background upload of the game's GPU memory into VRAM ahead of use: fewer hitches when areas load. Always off with BB_GUEST_IN_PLACE (the GPU reads the game's memory itself). | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:386, run.sh:197, launcher/bbport_launcher.py:661 |
BB_PREUPLOAD_MB |
integer MiB per frame (16) | Most memory the background pre-upload (BB_PREUPLOAD) puts into VRAM per frame. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:1625 |
BB_READBACKS |
0 = off, 1 = relaxed, 2 = precise (1 = relaxed) | Launcher: Advanced > Performance > "GPU data readbacks by the CPU" (Relaxed = unset, Off = 0, Precise = 2). shadPS4's GPU readback mode. Relaxed by default: without readbacks FaceGen reads stale GPU-written vertices (vertex explosions). 2 also read-protects GPU-written pages and disables BB_GPU_WRITE_TWINS. | gpu/shim/core/emulator_settings.h:27-29, launcher/bbport_launcher.py:659, 524-525 |
BB_READBACK_LINEAR |
1/y/t or 0 (off) | shadPS4's readback of linear (untiled or narrow) images to guest memory. | gpu/shim/core/emulator_settings.h:66, gpu/shadps4/video_core/texture_cache/texture_cache.cpp:786 |
BB_READBACK_QUEUE |
0 = off; unset/other = on | Uses a separate compute/transfer queue to read back GPU data finished long ago, without waiting behind the queued frame. 0 turns it off. | gpu/shadps4/video_core/renderer_vulkan/vk_instance.cpp:499 |
BB_STAGING_KEEP_MB |
integer MiB (512) | How much of the staging upload ring is kept (and populated at startup) instead of being trimmed when idle; re-creating blocks during streaming bursts caused stutter. | gpu/shadps4/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp:27 |
BB_SUBMIT_AHEAD |
integer >= 0 (2) | The first K submissions of a frame do not wait for the previous frame, so translation overlaps the GPU (1080p Yahar'gul: 101 -> 154 FPS). 8 or more leaked the game's heap; if the heap grows anyway K becomes 0 for the session. | gpu/shadps4/core/libraries/gnmdriver/gnmdriver.cpp:134-149 |
BB_TEXTURE_HELPER |
1 = on, 0 = off (unset = off) | A spinning helper thread binds textures for the draw recording thread. Measured neutral on 16 threads, so opt-in. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:2195 |
BB_UFFD |
first char 1 = on (run.sh: 0) | Internal (run.sh exports 0 when unset). Write tracking with userfaultfd write-protection instead of mprotect (no address-space write lock); falls back to mprotect if the kernel lacks it. Off by default: the Steam Deck crashed with it. Ignored with BB_GUEST_GPU_MEMORY=1. | run.sh:272, gpu/shadps4/video_core/page_manager.cpp:545-551, 723-737 |
BB_VBLANK_HZ |
Hz; 0 or >120 = uncapped (60 if unset in the library) | Internal (run.sh derives it from BB_FPS (uncap 480, 90 90, else 60). Vblank rate. Above 120 Hz (or 0) a finished frame is presented at once instead of on the next vblank tick; 60/90 are the fixed-timestep presets. | gpu/shim/core/emulator_settings.h:30, run.sh:280 |
BB_VK_RECORD_THREAD |
0 = off; unset/other = on | Vulkan commands are recorded on dedicated recording threads. 0 records on the calling thread (suspected in vertex explosions, issue #39). | gpu/shadps4/video_core/renderer_vulkan/vk_scheduler.cpp:120 |
BB_VK_RECORD_THREADS |
integer 1–8 (3 with 12+ CPU threads, 2 with 8+, else 1) | Number of Vulkan recording threads; the command stream is cut into segments recorded in parallel. | gpu/shadps4/video_core/renderer_vulkan/vk_scheduler.cpp:97 |
BB_VK_SEGMENT_KB |
integer KiB ≥1 (64) | Size of command-stream segments handed to the recording threads (~60 draws per 64 KiB). | gpu/shadps4/video_core/renderer_vulkan/vk_scheduler.cpp:127 |
BB_VMA_BLOCK_MB |
integer MiB ≥1 (64; VMA's own default is 256) | Size of Vulkan memory allocator blocks. Smaller blocks are returned to the driver sooner when freed. | gpu/shadps4/video_core/renderer_vulkan/vk_instance.cpp:906 |
BB_VMA_DEDICATED_MB |
MiB; 0 = never (4) | Images of this size or more get dedicated memory, returned to the driver when freed (shared VMA blocks left ~0.9 GB of holes after texture evictions). | gpu/shadps4/video_core/texture_cache/image.cpp:107-113 |
BB_VRAM_IDLE_SECONDS |
seconds (60) | Mirrored (VRAM-copied) blocks not bound for this long go back in place. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:1823, gpu/shadps4/video_core/buffer_cache/buffer_cache.h:412 |
BB_VRAM_PRESSURE_IDLE_SECONDS |
seconds (3) | Near the critical VRAM mark, blocks no binding used directly for this long (an area left behind) go back in place first, longest unused first. | gpu/shadps4/video_core/buffer_cache/buffer_cache_layer.cpp:903-913 |
BB_VRAM_PRESSURE_PERCENT |
percent, max 95; 0 = off (85) | How full VRAM is against the driver's budget: "tight" from this percent, "full" 5 points above (fewer VRAM copies then). | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:2045 |
BB_VRAM_PROMOTE_PERCENT |
percent (90) | Past this share of the driver's VRAM budget no new VRAM copies are made; candidates wait and are read in place meanwhile (issue #32: 8 GB cards). | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:3944 |
MESA_SHADER_CACHE_MAX_SIZE |
size (run.sh default 4G) | Mesa's shader cache size, larger than Mesa's default. | run.sh:31 |
__GL_SHADER_DISK_CACHE |
run.sh default 1 | NVIDIA's shader disk cache on (run.sh default; keeps compiled pipelines between sessions). | run.sh:25-30 |
__GL_SHADER_DISK_CACHE_SIZE |
bytes (run.sh default 10737418240) | NVIDIA's shader cache size (10 GiB by default here). | run.sh:30 |
__GL_SHADER_DISK_CACHE_SKIP_CLEANUP |
run.sh default 1 | NVIDIA's shader cache without its size cleanup (as Steam sets it). | run.sh:29 |
| BB_WINDOW_RECT | x,y,w,h as fractions of the game's display, e.g. 0,0,1,0.5 (default off) | Local co-op: the window's place and size on the game's display (BB_DISPLAY), without borders, instead of fullscreen. Needs X11 (SDL_VIDEO_DRIVER=x11): Wayland lets no window place itself. | gpu/shim/window.cpp |
Controls & input¶
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BB_GAMEPAD |
SDL GUID, part of the name, or the device path (/dev/hidrawN, /dev/input/eventN; the log's gamepad connected line shows it) (default: first controller) |
Launcher: Controls → Gamepad → "Controller". Preferred controller, so wheels and other always-connected devices do not take over. The path tells two pads of the same model apart (local co-op). | src/runtime_pad.c (preferred_gamepad), launcher/bbport_launcher.py:642 |
BB_GAMEPAD_STRICT |
1 (default off) | Local co-op: only the BB_GAMEPAD controller, never the first one or the one in use instead; with no BB_GAMEPAD, no controller at all. | src/runtime_pad.c (gamepad_strict) |
BB_KEYBOARD |
0 (default on) | Local co-op: this game ignores the keyboard and the mouse, and never takes the mouse. | src/runtime_pad.c (keyboard_enabled) |
BB_PAD_BACKGROUND |
1 (default off) | Local co-op: the controller keeps driving the game while another window has the focus, and the game keeps its sound then (bbport.ini's mute_unfocused is ignored). Launcher: the Multiplayer → Local tab sets it, with BB_WINDOW_RECT, BB_GAMEPAD, BB_GAMEPAD_STRICT, BB_KEYBOARD, BB_AUDIO and BB_DATA_DIR for each player (launcher/bbport_coop.py). |
gpu/shim/window.cpp, gpu/shim/bbgpu.cpp (bbgpu_audio_muted) |
BB_MOUSE_DEADZONE |
0–100 of 127 (default 16) | Minimum right-stick deflection used for mouse look, so slow mouse movement still turns the camera past the game's dead zone. | src/runtime_pad.c:760 |
BB_PAD_CENTER |
lx,ly,rx,ry (default: measured) | Overrides the measured neutral position of each stick axis. | src/runtime_pad.c:27, src/runtime_pad.c:113-118 |
BB_PAD_CENTER_CAL |
0 = off (default on) | Disables measuring each axis' neutral and travel (for third-party pads whose axes are biased). | src/runtime_pad.c:28, src/runtime_pad.c:110 |
BB_PAD_DEADZONE |
0–126 (default 5) | Launcher: Controls → "Stick dead zone (%)" (percent × 127 / 100; written only when not 4 %). Inner stick dead zone, as shadPS4's analog_deadzone. | src/runtime_pad.c:113, launcher/bbport_launcher.py:645 |
BB_PAD_DEADZONE_OUTER |
1–127 (default 127) | Outer stick dead zone: travel up to this value maps to full deflection (helps pads that never reach full). | src/runtime_pad.c:26, src/runtime_pad.c:115 |
BB_PAD_LIGHTBAR |
RRGGBB hex colour, an optional leading # (unset: SDL's own, the player's colour) | Launcher: Controls → "Controller light bar colour" (set only when on). Every controller with a light bar (DualShock 4, DualSense) shows this colour, set when it is opened. | src/runtime_pad.c:297, launcher/bbport_launcher.py:649, launcher/bbport_launcher.py:1461 |
BB_PROMPTS |
playstation | xbox | switch | keyboard (default playstation) | Launcher: Controls → Gamepad → "Button prompts" (Automatic follows the controller). Button prompts of the game's menus, made from the game's files at start. | run.sh:136, scripts/menu_prompts.py:57, launcher/bbport_launcher.py:631 |
BB_STEAM_INPUT_X11 |
0 = keep Wayland (default on) | Launched from Steam with Steam Input on a Wayland desktop, the game window goes through Xwayland (SDL_VIDEO_DRIVER=x11): Steam sends its virtual controller's input only to a focused window it can see, and it sees only X11 windows (issue #12). Not when SDL_VIDEO_DRIVER is set. |
run.sh |
BB_STEAM_OVERLAY |
1 = on (default 0) | Launcher: Setup → Game → "Steam overlay", under "Add to Steam" (saved as soon as it changes). Started from Steam, the game gets Steam's 64-bit gameoverlayrenderer.so in LD_PRELOAD, read from the nearest process above that still has it (the AppImage's sharun clears LD_PRELOAD in every program it runs), and nothing else Steam preloads. On a Wayland desktop the window goes through Xwayland (SDL_VIDEO_DRIVER=x11), since Steam draws its overlay only on X11 windows; not when SDL_VIDEO_DRIVER is set (issue #28). |
run.sh:370, launcher/bbport_launcher.py:687, launcher/bbport_launcher.py:1260 |
Audio¶
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BB_AUDIO |
none, or unset (sound on) | none keeps the game silent: the runtime uses a silent timer instead of an SDL audio device, and the trophy chime is off too. |
src/runtime_audio.c:83, gpu/shim/bbport_overlay.cpp:832 |
BB_AUDIO_DUMP |
file path prefix (default off) | Writes the raw converted PCM of each audio port to |
src/runtime_audio.c:252 |
BB_AUDIO_GAIN |
float >0 and ≤8 (default 1.0) | Master gain applied to the game's audio output. | src/runtime_audio.c:173 |
BB_AUDIO_STATS |
any value = on (default off) | Per-port audio timing statistics (gaps between submissions) in the log. | src/runtime_audio.c:251 |
BB_AUDIO_TRACE |
1 = on (default off) | Logs AJM decoder configurations and failing jobs, plus sound file opens and failed reads (missing game sounds). | src/runtime_ajm.c:77, src/runtime_file.c:222 |
BB_SOUND_HACK |
0 = off (default on) | Bloodborne "sound hack": sets the flag at 0x204E of userdata0010 in each save before the game reads it, otherwise some sounds (e.g. weapon sounds) never play; 0 leaves saves untouched. | src/runtime_savedata.c:72-79 |
Game & patches¶
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BB_FPS |
uncap | 60 | 90 | 30 (default uncap) | Launcher: Graphics → Frame rate → "Mode". Frame-rate patch: uncap = delta-time patch with 480 Hz vblank and sprint fix; 60/90 = fixed-timestep patches (90 adds the sprint fix); 30 = unpatched. Also picks BB_VBLANK_HZ when that is unset. | run.sh:77, run.sh:77, scripts/patches.py:17-21 |
BB_GAME_MENU |
0, or unset (on) | 0 leaves the game's System menu as it is: no port pages (Display, Game effects, Game patches) built into the game's own menu. | gpu/shim/bbport_game_menu.cpp:596, gpu/shim/bbport_game_menu.h:5 |
BB_GESTURES_NO_MOTION |
0 | 1 (default 0) | Launcher: Controls → Gamepad → "Gestures menu without motion-control icons". Dommo's stripped-down gestures menu (no motion-control icons), made from the game's files at start. | run.sh:137, scripts/menu_prompts.py:15, launcher/bbport_launcher.py:632 |
BB_GX_COMMAND_HEAP |
0 = off (default 1) | Patch that enlarges the game's two per-frame GX command heaps to 1 MiB (crashes when a frame fills the 256 KiB heap); 0 keeps the game's size. | scripts/patches.py:83-91 |
BB_LANGUAGE |
PS4 system language number: 0 Japanese, 1 English, 2 French, 3 Spanish, 4 German, 5 Italian, 8 Russian, ... (runtime default 1) | Launcher: Setup > Game language (Auto: from the desktop locale). The system language the runtime reports to the game; also picks the trophy names' language and the in-game menu's default language. | src/runtime_services.c:70, gpu/shim/bbport_game_menu.cpp:104, launcher/bbport_launcher.py:635 |
BB_MODS_ENABLED |
0 | 1 (default 1) | Launcher: Mods → Mods → "Load mods". Whether mods are merged into the game's files for this launch. | run.sh:166, launcher/bbport_launcher.py:629 |
BB_PATCHES |
patch names separated by ";" (default none) | Extra patch names (from patches/Bloodborne.xml) applied at start. | run.sh:190, run.sh:190 |
BB_REGION |
eu | na | empty (default: the dump's param.sfo) | Launcher: Setup → "Game region". The game's region for this launch; picks the regional text (e.g. Spanish from Spain or Latin American). | run.sh:189, scripts/content_profile.py:3-5, launcher/bbport_launcher.py:636 |
BB_SKIP_GAME_CHECK |
1 = skip (default check) | Skips the check that the game files are the supported 1.09 dump (wrong eboot, missing update, broken extraction). | scripts/game_check.py:11, scripts/game_check.py:72, scripts/prepare.py:288 |
BB_SKIP_NETWORK_CHOICE |
0 | 1 (default 1) | Launcher: Multiplayer → Online → "Skip the "play online / offline" choice" (default on). Patch: the title screen goes straight to the main menu, online when online play is on (BB_ONLINE=1), as PLAY ONLINE on a PS4, offline otherwise; 0 shows the online/offline dialog. | scripts/patches.py:73-80, launcher/bbport_launcher.py:650 |
BB_TROPHY_KEY |
32 hex characters (default none) | Launcher: Trophies → "Trophy key". The PS4 trophy key; decrypts trophy names and descriptions in the game's language (without it they are in English). | run.sh:351, scripts/trophies.py:495, launcher/bbport_launcher.py:689 |
BB_USER_NAME |
text (Hunter) | The PS4 user name reported to the game and the online module; also the default answer to a text-input dialog when the on-screen keyboard is unavailable. | src/runtime_services.c:55, gpu/bbnet/include/core/user_manager.h:38 |
Saves & files¶
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BBSC_SAVE_DIR |
folder path; default unset | Folder holding userdata0000.. on hosts that keep saves elsewhere (bbhost); BBSC counts its slots as the active save and copies it in its save backups. On the port BBSC looks in ./user (working folder) otherwise. | bbsc/emulator/src/core/bloodborne_re.cpp:5931, bbsc/emulator/src/core/bloodborne_re.cpp:14468 |
BB_CONFIG |
path (run.sh: /bbport.ini; the GPU library alone: ./bbport.ini) | Internal (run.sh default $BB_DATA_DIR/bbport.ini). Path of bbport.ini, the settings file read by the GPU library (in-game menu settings), the controls (key./pad. lines) and the launcher. | run.sh:21, gpu/shim/bbport_settings.cpp:21, src/runtime_pad.c:519 |
BB_DATA_DIR |
directory (default: the port directory; AppImage/Nix: $XDG_DATA_HOME/bbport) | Internal. Writable directory for generated files (out/), saves (user/), bbport.ini, mods, patches and logs. | run.sh:16-18, launcher/bbport_launcher.py:56, packaging/appimage-sharun.sh:74 |
BB_DLC_DIR |
directory (default none) | Launcher: Setup → "DLC folder". Folder with the dumped add-ons (one folder each, e.g. SPEXPANSIONDLC03); linked as |
run.sh:178, launcher/bbport_launcher.py:626 |
BB_GAME_DIR |
directory (default ../CUSA03173) | Launcher: Setup → "Game folder". The game's folder (eboot.bin, sce_module, …). | run.sh:63-65, launcher/bbport_launcher.py:622, scripts/patches.py:494 |
BB_GPU_USER_DIR |
directory | Internal (run.sh: defaults to BB_USER_DIR, else /user). Where the GPU library keeps its caches (pipeline cache etc.) and the player's DLSS folder ( |
gpu/shadps4/common/path_util.cpp:88, gpu/shadps4/video_core/renderer_vulkan/vk_dlss.cpp:95, run.sh:24 |
BB_MODS_CONFIG |
file (default /mods.json) | Launcher: always set to /mods.json. The mods list/configuration used by scripts/mods.py. | run.sh:165, launcher/bbport_launcher.py:628 |
BB_MODS_DIR |
directory (default /mods) | Launcher: Mods → Mods → "Mods folder". Folder the mods are loaded from (also used by BB_MOD_TRACE). | run.sh:165, launcher/bbport_launcher.py:627, src/runtime_file.c:390 |
BB_PATCHES_CONFIG |
file (default /patches.json) | Launcher: always set to /patches.json. Configuration of the external patches. | run.sh:192, launcher/bbport_launcher.py:634 |
BB_PATCHES_DIR |
directory (default /patches) | Launcher: Mods → Third-party patches → "Patches folder". Folder of external patch files. | run.sh:192, launcher/bbport_launcher.py:633 |
BB_USER_DIR |
folder path; default /user (run.sh); BBSC falls back to ./user | Launcher: Setup > Saves > "Saves folder". User folder: saves, trophies, DLC links, host_overrides.json, bbsc/ logs. The launcher sets it only when a saves folder is chosen; also the default of BB_GPU_USER_DIR. | launcher/bbport_launcher.py:624, run.sh:24, 88, 313, bbsc/emulator/mod/linux/bbsc_mod_linux.cpp:114 |
Hunter's Atlas (map)¶
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BB_ATLAS_ENABLED |
1 or 0 (unset: the map's own settings.ini) |
Launcher: Mods → Map (Hunter's Atlas) → "In-game map". The in-game map on or off; while set, the map's own switch in the game is greyed out. 0: none of its code runs. | src/probe.c:626, gpu/shim/bbport_map.cpp:304 |
BB_MAP_DIR |
folder (navigation-map/maps) |
Launcher: the maps Hunter's Atlas generated. | gpu/shim/bbport_map.cpp:294 |
BB_MAP_ART_DIR |
folder (<maps>/../art) |
Launcher: the map's pictures. | gpu/shim/bbport_map_art.cpp:79 |
BB_MAP_FONT |
file | Launcher: the font the map's names are drawn with. | gpu/shim/bbport_overlay.cpp:1232 |
BB_MAP_CATALOG |
file (<maps>/../catalog.json) |
Launcher: names of places and items. | gpu/shim/bbport_map.cpp:174 |
BB_MAP_CONFIG |
file (<maps>/../settings.ini) |
Launcher: the map's settings file. | gpu/shim/bbport_map.cpp:295 |
BB_MAP_TRAVEL_ENABLED |
1 = on (off) | Launcher: "Travel to lamps from the map". | gpu/shim/bbport_map_features.cpp:70, src/runtime_atlas_state.c:162 |
BB_MAP_ITEMS_ENABLED |
1 = on (off) | Launcher: "Items on the map". | gpu/shim/bbport_map_features.cpp:70 |
BB_MAP_FOG_ENABLED |
1 = on (off; the launcher writes 0) | Areas not visited yet stay hidden. | gpu/shim/bbport_map_features.cpp:70 |
BB_MAP_NPC_MODE |
all | new_dialogue | hidden (all) | Which characters the map shows. | gpu/shim/bbport_map_features.cpp:71 |
BB_MAP_ITEM_CATEGORIES |
comma list (healing,insight,equipment,echoes) | Which items the map shows. | gpu/shim/bbport_map_features.cpp:73 |
BB_MAP_SOUND_GAIN |
0–2 (0.024) | Volume of the map's sounds. | src/runtime_audio.c:75 |
BB_ATLAS_DEBUG |
1 = on (off) | Logs what the map reads from the game's quick menu. | src/runtime_map.c:107, gpu/shim/bbport_atlas_menu.cpp:35 |
BB_ATLAS_QA / BB_ATLAS_QA_DEVICE / BB_MAP_TEST_CONTROL / BB_MAP_TEST_TRACE |
test hooks | Automated map tests. | gpu/shim/bbport_map.cpp:388, gpu/shim/bbport_map.cpp:412, gpu/shim/bbport_map.cpp:412, gpu/shim/bbport_atlas_menu.cpp:70 |
Online & co-op¶
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BB_SEAMLESSHUNT_TOMBS |
1 = keep (0) | Launcher: Multiplayer → Online → "Bloodstains on Seamless Hunt". Keeps bloodstains and death visions on Seamless Hunt's game server. Off by default: they crash the game with "Transaction failed" there (#10), so those requests are left unanswered and the game goes on without them. | scripts/online.py:177, scripts/online.py:508 |
BB_BRIDGE |
1 = on (default 0) | Launcher: Multiplayer → Online → shadNet server "The Hunter's Dream". Uses bbbridge on this PC as the shadNet server: run.sh starts bbbridge-cli for the launch (or reuses one already listening on 127.0.0.1:31313) and stops it when the game ends. | run.sh:308, scripts/online.py:159 |
BB_CLIENT_VERSION |
text (shadPS4 bbport) | Client version string reported to the shadNet server, for a server whose clientversions.cfg expects another format. | gpu/bbnet/shadps4/shadnet/client.cpp:542 |
BB_COMMUNITY_SERVER |
host[:port] (launcher sets it when online) | Launcher: Multiplayer → Online → "Game server". The community game server (messages, bloodstains, phantoms) the game's own server traffic is redirected to. | scripts/online.py:500, scripts/online.py:500 |
BB_NP_COUNTRY |
country code (us) | Country reported for the PSN user by the online module. | gpu/bbnet/include/core/user_manager.h:45 |
BB_NP_LANGUAGE |
language code (en) | Language reported for the PSN user by the online module. | gpu/bbnet/include/core/user_manager.h:46 |
BB_ONLINE |
1 or 0/unset (off) | Launcher: Multiplayer → Online (online play on). Online play: the runtime loads the online module (gpu/bbnet) and sends the game's network and PSN imports to it; run.sh then sets up the shadNet server, overrides, bbbridge and BBSC. | src/runtime_net.c:26, gpu/bbnet/include/core/emulator_settings.h:83, run.sh:294 |
BB_SHADNET_NPID |
online ID (empty: shadNet off) | Launcher: Multiplayer → Online (online ID; The Hunter's Dream: the Discord sign-in's). Online ID used to log in to the shadNet server; empty disables the shadNet user. | gpu/bbnet/include/core/user_manager.h:41, scripts/online.py:162 |
BB_SHADNET_PASSWORD |
text (empty) | Launcher: Multiplayer → Online (password). Password for the shadNet login. | gpu/bbnet/include/core/user_manager.h:42, scripts/online.py:163 |
BB_SHADNET_SERVER |
host:port (code fallback 127.0.0.1:31313) | Launcher: Multiplayer → Online (server); run.sh default play.seamlesshunt.com:31313 when online. shadNet server the online module connects to. | gpu/bbnet/include/core/emulator_settings.h:85, run.sh:299, scripts/online.py:499 |
BB_SHADNET_TOKEN |
text (empty) | Token passed with the shadNet login (np_handler); the launcher never sets it. | gpu/bbnet/include/core/user_manager.h:43, gpu/bbnet/shadps4/core/libraries/np/np_handler.cpp:85 |
BB_SHADNET_WEBAPI |
URL (code fallback http://127.0.0.1:31315) | Launcher: Multiplayer → Online (WebAPI); run.sh default http:// |
gpu/bbnet/include/core/emulator_settings.h:86, run.sh:307, scripts/online.py:501 |
BB_UPNP |
1/y/t or 0 (1) | Launcher: Multiplayer → Online (UPnP); The Hunter's Dream forces 0. Opens the P2P UDP port on the router through UPnP (issue #121). | gpu/bbnet/include/core/emulator_settings.h:88, gpu/bbnet/shadps4/core/libraries/network/p2p_sockets.cpp:239, scripts/online.py:164 |
SHADPS4_BLOODBORNE_SEAMLESS_COOP |
non-empty and not "0" = on; default off | Launcher: Multiplayer → Online (own server + bbport.json online_seamless, no UI row). Online module: routes summon-messenger HTTP requests to the shadNet WebAPI (the server needs BloodborneSeamlessCoop=true). Inside libbbsc the same name is redirected to BBSC_MOD_SEAMLESS and ignored. | gpu/bbnet/shadps4/core/libraries/network/http.cpp:814, 805-808, scripts/online.py:184, bbsc/emulator/src/core/bloodborne_re.cpp:959 |
SHADPS4_P2P_PORT |
1-65535 (unset: a random port each time) | Launcher: Multiplayer → Online (P2P port; 0 = not set); The Hunter's Dream sets the bridge's port. Pins the local UDP port of the P2P transport (useful for a manual port forward); an invalid value stops the transport. | gpu/bbnet/shadps4/core/libraries/network/p2p_sockets.cpp:201, scripts/online.py:166 |
SHADPS4_P2P_RELAY |
0/off, auto/direct, a.b.c.d:port, or unset (relay forced) | Launcher: set to 0 when seamless co-op is off or for The Hunter's Dream. UDP relay on the shadNet server's address (port 3478): unset sends every peer through it from the first frame; auto/direct = direct first, relay after 2 s; 0/off disables it; ip:port is a test override. | gpu/bbnet/shadps4/core/libraries/network/p2p_sockets.cpp:586, scripts/online.py:157, scripts/online.py:157 |
SHADPS4_P2P_RELAY_PORT |
1-65535 (3478) | Port of the P2P UDP relay. | gpu/bbnet/shadps4/core/libraries/network/p2p_sockets.cpp:594 |
SSL_CERT_FILE |
CA bundle path (default: first found) | CA certificates for HTTPS when online; run.sh picks the system bundle if unset or unreadable. | run.sh:302 |
Seamless co-op (BBSC)¶
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BBSC_MOD_HOOKS |
"0" off, anything else or unset on (mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Co-op hooks". Master switch that installs the BBSC co-op hooks (warps, world sync, Hunter's Dream, messages...); most other BBSC features need it. In libbbsc it stands in for SHADPS4_BLOODBORNE_RE_TRACE. | bbsc/emulator/mod/mod.json:12, bbsc/emulator/src/core/bloodborne_re.cpp:962, bbsc/emulator/src/core/bloodborne_re.cpp:962 |
BBSC_MOD_SEAMLESS |
"0" off, anything else or unset on (mod.json default true). Forced to 0 by libbbsc on a public game server. | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Seamless summon". Master switch for Wozzardman's seamless summon (summon without the vanilla signs and waits). In libbbsc it stands in for SHADPS4_BLOODBORNE_SEAMLESS_COOP. | bbsc/emulator/mod/mod.json:11, bbsc/emulator/src/core/bloodborne_re.cpp:958, bbsc/emulator/mod/linux/bbsc_mod_linux.cpp:370 |
BBSC_RELAY |
host[:port] (port default 20444); empty/unset: the game server address from the host_overrides file | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Relay address". BBSC relay server for warps and world sync. Unset: taken from SHADPS4_HTTP_HOST_OVERRIDES_JSON, else |
bbsc/emulator/mod/mod.json:41, bbsc/emulator/mod/bbsc_relay.cpp:123-160 |
BBSC_SCALE_BOSS_HP |
integer percent; default 100 (code and mod.json); launcher range 0-300, the code clamps to 0-1000 | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Boss HP per guest (%)". Extra health for bosses, per guest. Needs SHADPS4_BBSC_SCALING; a summoned guest uses the host's numbers (sent over the relay). | bbsc/emulator/mod/mod.json:34, bbsc/emulator/src/core/bloodborne_re.cpp:13515, bbsc/emulator/src/core/bloodborne_re.cpp:13515 |
BBSC_SCALE_BOSS_STAGGER |
integer percent; default 20 (code and mod.json); launcher range 0-200, the code clamps to 0-1000 | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Boss stagger resistance per guest (%)". Bosses are harder to stagger, per guest. Needs SHADPS4_BBSC_SCALING; a summoned guest uses the host's numbers (sent over the relay). | bbsc/emulator/mod/mod.json:37, bbsc/emulator/src/core/bloodborne_re.cpp:13516, bbsc/emulator/src/core/bloodborne_re.cpp:13516 |
BBSC_SCALE_DAMAGE |
integer percent; default 15 (code and mod.json); launcher range 0-200, the code clamps to 0-1000 | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Enemy damage per guest (%)". Extra damage for enemies and bosses, per guest. Needs SHADPS4_BBSC_SCALING; a summoned guest uses the host's numbers (sent over the relay). | bbsc/emulator/mod/mod.json:35, bbsc/emulator/src/core/bloodborne_re.cpp:13516, bbsc/emulator/src/core/bloodborne_re.cpp:13516 |
BBSC_SCALE_ENEMY_HP |
integer percent; default 40 (code and mod.json); launcher range 0-300, the code clamps to 0-1000 | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Enemy HP per guest (%)". Extra health for normal enemies, per guest. Needs SHADPS4_BBSC_SCALING; a summoned guest uses the host's numbers (sent over the relay). | bbsc/emulator/mod/mod.json:33, bbsc/emulator/src/core/bloodborne_re.cpp:13515, bbsc/emulator/src/core/bloodborne_re.cpp:13515 |
BBSC_SCALE_ENEMY_STAGGER |
integer percent; default 15 (code and mod.json); launcher range 0-200, the code clamps to 0-1000 | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Enemy stagger resistance per guest (%)". Normal enemies are harder to stagger, per guest. Needs SHADPS4_BBSC_SCALING; a summoned guest uses the host's numbers (sent over the relay). | bbsc/emulator/mod/mod.json:36, bbsc/emulator/src/core/bloodborne_re.cpp:13516, bbsc/emulator/src/core/bloodborne_re.cpp:13516 |
BBSC_SCALE_NPC_HUNTERS |
only "1" turns it on (default off; mod.json default false) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Scale NPC hunters". Henryk, Djura and the other hostile NPC hunters also get the enemy scaling (off = vanilla). | bbsc/emulator/mod/mod.json:32, bbsc/emulator/src/core/bloodborne_re.cpp:13727 |
BB_BBSC |
1 = on (default 0) | Launcher: Multiplayer → Online → "Seamless co-op (BBSC)". Loads BBSC (libbbsc.so) into the game; only takes effect together with BB_ONLINE=1. | run.sh:294, run.sh:294, scripts/bbsc.py:60 |
SHADPS4_BBSC_AREA_LIST_CAP |
"0" off, any other value on; default on (BBSC default-on switch, not in mod.json) | Asks the server for fewer messages and bloodstains per area: long lists crashed the game ("Panic 265"). | bbsc/emulator/src/core/bbsc_persistence.h:49, bbsc/emulator/src/core/bloodborne_re.cpp (CapBbscAreaListRequest) |
SHADPS4_BBSC_BELLS_ANYWHERE |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Bells anywhere". The kit's bells ring anywhere, the Hunter's Dream included; role, Insight and being online still count. | bbsc/emulator/mod/mod.json, bbsc/emulator/src/core/bbsc_persistence.h:52 |
SHADPS4_BBSC_CINEMATIC |
"0" off, any other value on; default on (BBSC default-on switch, not in mod.json) | The camera that follows a co-op partner while you are dead (needs SHADPS4_BBSC_SPECTATE): Tab, E or left click the next hunter, Shift+Tab or Q the previous one, F a free camera and back, F1 off until the next death; R1/L1 and the sticks on a gamepad. On Linux the free filming camera (F1 at any time) is left out: every key and mouse button also reaches the game through bbport's pad. | bbsc/emulator/src/core/bbsc_persistence.h:46, bbsc/emulator/src/core/bbsc_cinematic.cpp, bbsc/emulator/mod/linux/bbsc_mod_linux.cpp:751 |
SHADPS4_BBSC_CONNECT_FIRST |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Cross-map summon". Cross-map summon: join first, then one load into the host's map. | bbsc/emulator/mod/mod.json:13, bbsc/emulator/src/core/bbsc_persistence.h:33, bbsc/emulator/src/core/bloodborne_re.cpp:16788 |
SHADPS4_BBSC_DEATH_PENALTY |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Bloodstain on death". A kept death (session not lost) still drops a bloodstain and the echoes. | bbsc/emulator/mod/mod.json:25, bbsc/emulator/src/core/bbsc_persistence.h:27, bbsc/emulator/src/core/bloodborne_re.cpp:8171 |
SHADPS4_BBSC_DREAM |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Hunter's Dream together". A guest uses the Doll, workshop and messengers in the host's Hunter's Dream. | bbsc/emulator/mod/mod.json:16, bbsc/emulator/src/core/bbsc_persistence.h:26, bbsc/emulator/src/core/bloodborne_re.cpp:10086 |
SHADPS4_BBSC_FIVE_HUNTERS |
"0" off, any other value on (default on; mod.json default true) Forced to 0 by libbbsc on a public game server. | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Five hunters". The host may summon up to 4 guests (5 hunters). | bbsc/emulator/mod/mod.json:27, bbsc/emulator/src/core/bbsc_persistence.h:45, bbsc/emulator/src/core/bbsc_patch_tables.h:442, bbsc/emulator/src/core/bloodborne_re.cpp:15425, bbsc/emulator/mod/linux/bbsc_mod_linux.cpp:371 |
SHADPS4_BBSC_FLOOR_GUARD |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Floor guard". No crash when a character's floor was unloaded. | bbsc/emulator/mod/mod.json:30, bbsc/emulator/src/core/bbsc_persistence.h:25, bbsc/emulator/src/core/bloodborne_re.cpp:12704 |
SHADPS4_BBSC_FREE_BELL |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Free Beckoning Bell". The Beckoning Bell costs no Insight. | bbsc/emulator/mod/mod.json:26, bbsc/emulator/src/core/bbsc_persistence.h:44, bbsc/emulator/src/core/bloodborne_re.cpp:15751 |
SHADPS4_BBSC_FULL_ECHOES |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Full echoes". A summoned guest is paid the host's rate of Blood Echoes, not half. | bbsc/emulator/mod/mod.json:21, bbsc/emulator/src/core/bbsc_persistence.h:22, bbsc/emulator/src/core/bbsc_patch_tables.h:430 |
SHADPS4_BBSC_GUEST_ITEMS |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Guest items". A guest picks up and keeps items in the host's world. | bbsc/emulator/mod/mod.json:23, bbsc/emulator/src/core/bbsc_persistence.h:23, bbsc/emulator/src/core/bbsc_patch_tables.h:432, bbsc/emulator/src/core/bloodborne_re.cpp:6542 |
SHADPS4_BBSC_INVADE_ANYWHERE |
"0" off, any other value on; default on (BBSC default-on switch, not in mod.json) | Every world open to invaders (Bell Maiden SpEffect 9020). | bbsc/emulator/src/core/bbsc_persistence.h:48, bbsc/emulator/src/core/bloodborne_re.cpp:14727 |
SHADPS4_BBSC_LAMP |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Lamps in co-op". The host can use lamps during a session (lamp prompt works in co-op; only while hosting). | bbsc/emulator/mod/mod.json:18, bbsc/emulator/src/core/bbsc_persistence.h:29, bbsc/emulator/src/core/bbsc_patch_tables.h:418 |
SHADPS4_BBSC_LOAD_COVER |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Black fade on joins". The guest's summon/follow loads happen behind a black fade. | bbsc/emulator/mod/mod.json:29, bbsc/emulator/src/core/bbsc_persistence.h:21, bbsc/emulator/src/core/bloodborne_re.cpp:7106 |
SHADPS4_BBSC_MESSAGES |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Co-op texts". Co-op texts that fit seamless play (no "Returning to your world"). | bbsc/emulator/mod/mod.json:28, bbsc/emulator/src/core/bbsc_persistence.h:32, bbsc/emulator/src/core/bloodborne_re.cpp:12762 |
SHADPS4_BBSC_NO_FOG_WALLS |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "No co-op fog walls". Co-op area fog walls hidden; leaving the area is allowed. | bbsc/emulator/mod/mod.json:17, bbsc/emulator/src/core/bbsc_persistence.h:31, bbsc/emulator/src/core/bbsc_patch_tables.h:424, bbsc/emulator/src/core/bloodborne_re.cpp:9821 |
SHADPS4_BBSC_NO_HP_PENALTY |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "No guest HP cut". Removes the summoned guest's 30% max HP cut (effect 9006). | bbsc/emulator/mod/mod.json:22, bbsc/emulator/src/core/bbsc_persistence.h:30, bbsc/emulator/src/core/bloodborne_re.cpp:9707 |
SHADPS4_BBSC_P2P_CHANNEL |
a value starting with 0, f or F turns it off; else on (mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "P2P channel". Sends BBSC's own messages (follow, world sync, scaling, leaving) straight to the other players over the game's own connection when there is no BBSC relay; needed on public servers (The Hunter's Dream). | bbsc/emulator/mod/mod.json:40, bbsc/emulator/mod/bbsc_channel.cpp:348-352 |
SHADPS4_BBSC_PEERS |
npid=host:port,npid=host:port (unset) | Static peer map ("direct connection" mode, e.g. on Tailscale/Radmin/ZeroTier): a listed player's address wins over the server lookup. The port is that player's SHADPS4_P2P_PORT. | gpu/bbnet/shadps4/core/libraries/np/np_matching2/np_matching2_signaling.cpp:112 |
SHADPS4_BBSC_PEERS_JSON |
file path ( |
JSON file of static peers ({"NPID": "host:port"}); entries in SHADPS4_BBSC_PEERS win. | gpu/bbnet/shadps4/core/libraries/np/np_matching2/np_matching2_signaling.cpp:113 |
SHADPS4_BBSC_PERSIST |
"0" off, any other value on; default on (BBSC default-on switch, not in mod.json) | Keeps the co-op session alive through loads and deaths (persistent-session patches). 0 disables them. | bbsc/emulator/src/core/bbsc_persistence.h:38, bbsc/emulator/src/core/bbsc_persistence.cpp:125 |
SHADPS4_BBSC_PERSIST_BOSS |
"0" off, any other non-empty value on; default off (not a default-on switch) | Persistent-session patch group "Boss": keeps the session through a boss clear. | bbsc/emulator/src/core/bbsc_patch_tables.h:414, bbsc/emulator/src/core/bbsc_persistence.h:84-86 |
SHADPS4_BBSC_PERSIST_HOSTDEAD |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Stay when the host dies". The guest keeps the session if the host dies. | bbsc/emulator/mod/mod.json:19, bbsc/emulator/src/core/bbsc_persistence.h:42, bbsc/emulator/src/core/bbsc_patch_tables.h:422 |
SHADPS4_BBSC_PERSIST_MATCHCHECK |
"0" off, any other value on; default on (BBSC default-on switch, not in mod.json) | Ignores the post-load matching-check kick. | bbsc/emulator/src/core/bbsc_persistence.h:39, bbsc/emulator/src/core/bbsc_patch_tables.h:416 |
SHADPS4_BBSC_PERSIST_TASKS |
"0" off, any other value on; default on (BBSC default-on switch, not in mod.json) | Keeps member tasks across a kept load. | bbsc/emulator/src/core/bbsc_persistence.h:41, bbsc/emulator/src/core/bbsc_patch_tables.h:420 |
SHADPS4_BBSC_REJOIN |
"0" off, any other value on; default on (BBSC default-on switch, not in mod.json) | Guest rejoin / reinsert after a kept death. | bbsc/emulator/src/core/bbsc_persistence.h:40, bbsc/emulator/src/core/bloodborne_re.cpp:3470 |
SHADPS4_BBSC_SCALING |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Enemy scaling". Enemies and bosses get stronger (HP, damage, stagger) for every guest; replaces the game's own boss buff. Amounts: BBSC_SCALE_*. | bbsc/emulator/mod/mod.json:31, bbsc/emulator/src/core/bbsc_persistence.h:47, bbsc/emulator/src/core/bbsc_patch_tables.h:436, bbsc/emulator/src/core/bloodborne_re.cpp:13515 |
SHADPS4_BBSC_SHARED_PROGRESS |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Shared progress". When a guest goes home, bosses, shortcuts, doors and lamps the host has done are added to the guest's own world (adds only; NPC quests and the character untouched; saves backed up first). | bbsc/emulator/mod/mod.json:38, bbsc/emulator/src/core/bbsc_persistence.h:17, bbsc/emulator/src/core/bloodborne_re.cpp:10791 |
SHADPS4_BBSC_SKIP_LEAVE_LIMIT |
"0" off, any other non-empty value on; default off | Persistent-session patch group "LeaveLimit"; exact effect not described in code, see bbsc/emulator/src/core/bbsc_patch_tables.h:426. | bbsc/emulator/src/core/bbsc_patch_tables.h:426 |
SHADPS4_BBSC_SOLID_NPCS |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Solid NPCs". A guest sees NPCs solid, not as grey wandering ghosts. | bbsc/emulator/mod/mod.json:24, bbsc/emulator/src/core/bbsc_persistence.h:24, bbsc/emulator/src/core/bbsc_patch_tables.h:434, bbsc/emulator/src/core/bloodborne_re.cpp:13934 |
SHADPS4_BBSC_SPECTATE |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Respawn in place". A dead player respawns in place / spectates instead of leaving the session. | bbsc/emulator/mod/mod.json:20, bbsc/emulator/src/core/bbsc_persistence.h:43, bbsc/emulator/src/core/bbsc_patch_tables.h:428, bbsc/emulator/src/core/bloodborne_re.cpp:3996 |
SHADPS4_BBSC_TIMELINE |
"0" off, any other value on; default on (BBSC default-on switch, not in mod.json) | A short bbsc-timeline-*.txt of what happened in each game (joins, hosts, deaths, bosses) in <user dir>/bbsc/logs, next to bbsc-mod-*.log; the last 5 are kept. |
bbsc/emulator/src/core/bbsc_persistence.h:51, bbsc/emulator/src/core/bloodborne_re.cpp:1028, bbsc/emulator/mod/linux/bbsc_mod_linux.cpp |
SHADPS4_BBSC_WARP_JOIN |
"0" off, any other value on; default on (BBSC default-on switch, not in mod.json) | After a cross-map join, one more real reload (fixes lighting). | bbsc/emulator/src/core/bbsc_persistence.h:34, bbsc/emulator/src/core/bloodborne_re.cpp:4503 |
SHADPS4_BBSC_WARP_TOGETHER |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Warp together". The guest follows the host through lamp warps. | bbsc/emulator/mod/mod.json:14, bbsc/emulator/src/core/bbsc_persistence.h:17, bbsc/emulator/src/core/bloodborne_re.cpp:4733 |
SHADPS4_BBSC_WORLD_SYNC |
"0" off, any other value on (default on; mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "World sync". The guest loads the host's map with the host's world state (doors, bosses, lifts). | bbsc/emulator/mod/mod.json:15, bbsc/emulator/src/core/bbsc_persistence.h:20, bbsc/emulator/src/core/bloodborne_re.cpp:5191 |
SHADPS4_BBSC_WORLD_SYNC_ALL |
"0" off, any other value on; default on (BBSC default-on switch, not in mod.json) | With SHADPS4_BBSC_WORLD_SYNC, the guest takes the host's world flags for every area, not only the one the host is in. | bbsc/emulator/src/core/bbsc_persistence.h:50, bbsc/emulator/src/core/bloodborne_re.cpp:5214 |
SHADPS4_BLOODBORNE_RE_TRACE |
ignored by libbbsc (aliased to BBSC_MOD_HOOKS) | No effect in this port. In the BBSC emulator build this installed the BBSC hooks; in the port's libbbsc (BBSC_MOD) the name is redirected to BBSC_MOD_HOOKS, so setting it has no effect. | bbsc/emulator/src/core/bloodborne_re.cpp:962, bbsc/emulator/src/core/bbsc_persistence.h:36 |
Discord¶
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BB_DISCORD |
0 = off (default 1) | Launcher: Setup → "Discord status" (default on). Discord Rich Presence helper (scripts/discord_presence.py) that shows the area and co-op partners; 0 turns it off. | run.sh:359, launcher/bbport_launcher.py:686 |
SHADPS4_BBSC_DISCORD |
"0" or "false" off, else on (mod.json default true) | Launcher: Multiplayer > Online > Seamless co-op (BBSC) > BBSC settings > "Discord status". BBSC's own Discord status (area, boss fights, number of hunters). Read only by bbsc_discord.cpp, which the Linux libbbsc does not compile (bbsc/CMakeLists.txt), so it has no effect in this port; bbport's presence is BB_DISCORD. | bbsc/emulator/mod/bbsc_discord.cpp:31-35, bbsc/CMakeLists.txt:22-29, bbsc/emulator/mod/mod.json:39 |
Diagnostics & logs¶
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BB_BREADCRUMBS |
0 = off; unset/other = on | GPU breadcrumbs (VK_AMD_buffer_marker): on device lost the log says which draw/dispatch never finished. 0 turns them off. | gpu/shadps4/video_core/renderer_vulkan/vk_breadcrumbs.cpp:59, gpu/shadps4/video_core/renderer_vulkan/vk_breadcrumbs.h:7 |
BB_BUFFER_STATS |
1 = on (off) | Prints every 5 s how buffer bindings reach the GPU by guest region (stream copies, arena bindings, re-uploaded bytes) and how many frames the GPU lags behind. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:984, gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:4799 |
BB_CAMERA_LOG |
any value = on (off) | Prints the camera position every 100 ms (for scripted movement tests at different frame rates). | gpu/shadps4/video_core/renderer_vulkan/vk_camera_motion.cpp:295 |
BB_CAPTURE_DIR |
directory (unset = current directory) | Where the frame analyzer (BB_CAPTURE_TRIGGER) writes frame_ | gpu/shadps4/video_core/renderer_vulkan/vk_frame_capture.cpp:87 |
BB_CAPTURE_TRIGGER |
file path (unset = off) | Frame analyzer: creating this file records the next full frame (every render pass with its targets, depth, draw count, shaders, textures, and compute dispatches) to a text file. | gpu/shadps4/video_core/renderer_vulkan/vk_frame_capture.cpp:133, gpu/shadps4/video_core/renderer_vulkan/vk_frame_capture.h:2 |
BB_CE_STATS |
1 or unset (off) | Statistics of the constant engine's dumps (DumpConstRam per second, bytes, pages) and how often the translator reads memory a dump wrote in the last 100 ms. | gpu/shim/bbport_ce_stats.h:1 |
BB_COPY_SHADER_TRACE |
any value = on (off) | Logs the copy shader's buffers every 2 s. | gpu/shadps4/video_core/renderer_vulkan/vk_shader_hle.cpp:161 |
BB_DCB_STATS |
first char 1/y/t (off) | Structure of graphics command buffers (read-only scan, printed every 5 s): how many buffers, draws per buffer, state set before the first draw. | gpu/shadps4/video_core/amdgpu/liverpool.cpp:1071, 1383 |
BB_DEBUG_MOTION |
1 = on (off) | Blends the motion vectors as colors into the frame before it is shown. | gpu/shadps4/video_core/renderer_vulkan/vk_camera_motion.cpp:77, gpu/shadps4/video_core/renderer_vulkan/vk_camera_motion.h:3 |
BB_DUMP_DIR |
directory (out/dump) | Where the upscaler/present/final frame dumps (BB_DUMP_TRIGGER, BB_PRESENT_DUMP_TRIGGER, BB_FINAL_DUMP_TRIGGER) are written. | gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:91 |
BB_DUMP_FRAMES |
integer ≥1 (8) | How many frames one BB_DUMP_TRIGGER dump records. | gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:70 |
BB_DUMP_SHADERS |
1/y/t or 0 (off) | shadPS4's shader dump: writes the translated shaders to disk. | gpu/shim/core/emulator_settings.h:58, gpu/shadps4/video_core/renderer_vulkan/vk_pipeline_cache.cpp:1332 |
BB_DUMP_TRIGGER |
file path (unset = off) | Creating this file dumps the upscaler's images of the next BB_DUMP_FRAMES frames as raw files in BB_DUMP_DIR (temporal stability checks; tools/dump_view.py converts them). | gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:56 |
BB_FAULT_WAIT |
1 or unset (off) | A fatal fault or a GPU-library assertion leaves the process alive and stopped in its handler, so a debugger can attach (bash tools/debug_attach.sh |
src/probe.c:150, gpu/shim/common/assert.cpp:12 |
BB_FILE_TRACE |
1 = on (default off) | Logs every guest path the game opens, stats or checks (mods, missing files). | src/runtime_file.c:127-129 |
BB_FINAL_DUMP_TRIGGER |
file path (unset = off) | Creating this file saves the next frame as presented (after FSR and post-processing) as final_ |
gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:164, gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.h:41 |
BB_FRAME_LOG |
file path (unset = off) | With BB_FRAME_STATS: one CSV line per flip (frame time, waits, stage times, allocations…), to find what long frames (stutter) have in common. BB_SAVE_LOG=1 points it at logs/ | gpu/shadps4/core/libraries/videoout/driver.cpp:526, run.sh:47 |
BB_FRAME_STATS |
Flag(): first char 1/y/t = on (off) | Launcher: Advanced > Developer > "Frame statistics in the log" (run.sh also sets it with BB_SAVE_LOG=1). Prints flip rate and frame-time spread (plus many internal counters) every 5 s. Without it a short summary line is printed every 30 s. | gpu/shadps4/core/libraries/videoout/driver.cpp:380, launcher/bbport_launcher.py:665 |
BB_FREE_CHECK |
1 = on (off) | Launcher: Advanced > Developer > "Crash diagnostics" (together with BB_WRITE_LOG and BB_PRODUCER_CHECK). Diagnostic for the guest heap corruption at guest offset 0x263b8e7: every write the GPU emulation makes to guest memory is checked against the free list of the game's label pool, and a watcher thread reports corrupted free lists. Slightly slower. | gpu/shim/bbport_free_check.h:2, gpu/shim/bbport_free_check.cpp:488-494, launcher/bbport_launcher.py:679 |
BB_FSR4_PROFILE |
1 = on (off) | FSR 4 / 4.1.1: GPU time per pass, printed every 300 frames. fsr4-bench sets it itself. | gpu/shadps4/video_core/renderer_vulkan/fsr411/fsr411.cpp:280, gpu/tools/fsr4_bench.cpp:305 |
BB_FSR4_STATS |
1 or unset (off) | Prints the driver's per-pass statistics of the FSR 4 pipelines (registers, spills, instruction counts) when VK_KHR_pipeline_executable_properties is available; read by the patched FSR 4 provider, set by fsr4_bench --stats. | gpu/patches/fsr-vulkan/0001-FSR-4-v07-provider-BB_FSR4_PROFILE-pass-timings-BB_F.patch:50, gpu/tools/fsr4_bench.cpp:307 |
BB_GAME_MENU_TRACE |
1 or unset (off) | How often the game asks for the port's menu texts (per 2 s). | gpu/shim/bbport_game_menu.cpp:474 |
BB_GARLIC_VRAM_RANGE |
begin,end (C integers, hex with 0x) (unset = whole address space) | Keeps VRAM copies only for guest addresses in [begin, end): for finding the block whose copy goes stale by halving the range. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:2188 |
BB_GNM_CENSUS |
1 or unset (off) | Hooks the eboot's libGnm entry points, counts the calls per function and prints the busiest every 5 s. | gpu/shim/bbport_gnm_hooks.h:4, gpu/shim/bbport_gnm_hooks.cpp:513 |
BB_GNM_CENSUS_FILE |
file path (unset: no file) | With the Gnm census: writes every function's total calls so far (offset, calls, cb method, PM4) to this file. | gpu/shim/bbport_gnm_hooks.cpp:437 |
BB_GNM_CENSUS_RANGE |
first:last table indices (all) | Hooks only that range of the libGnm table (for bisecting). | gpu/shim/bbport_gnm_hooks.cpp:543 |
BB_GNM_OBSERVE |
1 or unset (off) | Command buffer methods run through an observing stub; submissions are checked against the packets known API calls wrote (statistics in the census report). Also enables the hooks without BB_GNM_CENSUS. | gpu/shim/bbport_gnm_hooks.cpp:69, gpu/shim/bbport_gnm_hooks.cpp:514 |
BB_GNM_TRACE |
hex offset[:count] (count 40) | With the census or observer: prints the arguments, the caller and the packets written by the first count calls of the libGnm function at that offset. |
gpu/shim/bbport_gnm_hooks.cpp:84, gpu/shim/bbport_gnm_hooks.cpp:524 |
BB_GPU_LOG |
trace, debug, info, warning, error, critical (warning) | Log level of the GPU library (shadPS4 log); unknown values mean warning. | gpu/shim/common/logging/log.cpp:11, gpu/shim/common/logging/log.h:2 |
BB_GPU_PROFILE |
1 = on (off) | Launcher: Advanced > Developer > "GPU profile in the log". GPU time per render pass, dispatch and upscaler run, printed every 5 s (GPU ms per frame by label). | gpu/shadps4/video_core/renderer_vulkan/vk_gpu_profiler.cpp:13, gpu/shadps4/video_core/renderer_vulkan/vk_gpu_profiler.h:2, launcher/bbport_launcher.py:683 |
BB_HEAP_SITES |
1 or unset (off) | Wraps the game's malloc replacement and counts live allocations per call site; prints the sites whose live bytes grew (what leaks when the guest heap runs out). Also patches the deferred object release to count failed registry checks. | gpu/shim/bbport_heap_sites.cpp:2, gpu/shim/bbport_guest_hooks.cpp:45 |
BB_HLE_STATS |
any value = on (off) | Logs how often the compute-shader substitutions (HLE) fire. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:2385 |
BB_IMAGE_COPY_LOG |
any value = on (off) | Logs (first 40) the compute image copies the port recognizes and replaces. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:2947 |
BB_IMAGE_SYNC_LOG |
set (any value) = on (off) | Logs image refreshes from memory the GPU wrote, and the images refreshed most per 5 s with their flags. | gpu/shadps4/video_core/texture_cache/texture_cache.cpp:326, 910-921 |
BB_IMAGE_WATCH |
guest address (hex with 0x) (unset = off) | Prints how the image at that guest address is used (first 300 events). | gpu/shadps4/video_core/texture_cache/texture_cache.cpp:308 |
BB_LABEL_TRAP |
1, 2, or unset (off); needs BB_FREE_CHECK=1 | Label trap of the free check: 1 makes pool pages with pending fence labels read-only (slow), 2 puts breakpoints on the guest allocator's release and the collector's done branch; a label block released before its fence landed is reported. | gpu/shim/bbport_free_check.cpp:657, gpu/shim/bbport_free_check.h:49 |
BB_LAYER_PAGED_STATS |
any value = on (off) | Prints paged buffer bindings per shader every 5 s (layer memory module). | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:3182 |
BB_LAYER_WRITE_LOG |
set (any value) = on (off) | Layer memory module: logs large (1 MiB+) GPU writes kept in place, and the images near them. | gpu/shadps4/video_core/buffer_cache/buffer_cache_layer.cpp:1234-1236 |
BB_MOD_TRACE |
1 = on (default off) | Logs the first 32 files the game opens from the mods folder. | src/runtime_file.c:390-398 |
BB_MOTION_SELECT_LOG |
1 = on (off) | Logs each G-buffer vertex shader once with its buffer sizes and whether object motion selected it. | gpu/shadps4/video_core/renderer_vulkan/vk_pipeline_cache.cpp:900 |
BB_OCCLUSION_READ_TRACE |
1 = on (off) | Pages with occlusion counters become no-access after an event until the game's first access, to report whether results were on the CPU by then. | gpu/shadps4/video_core/renderer_vulkan/vk_occlusion.cpp:360, gpu/shadps4/video_core/renderer_vulkan/vk_occlusion.h:60 |
BB_OCCLUSION_TRACE |
integer N (0) | Logs the first N occlusion events with their frame and render pass. | gpu/shadps4/video_core/renderer_vulkan/vk_occlusion.cpp:274 |
BB_PASS_BREAK_TRACE |
1 = on (off) | Every 5 s: who ended a render pass that began again with the same state (attachments stored and loaded again). | gpu/shadps4/video_core/renderer_vulkan/vk_scheduler.cpp:267, gpu/shadps4/video_core/renderer_vulkan/vk_scheduler.h:789 |
BB_PRESENT_DUMP_COUNT |
integer ≥1 (1) | How many consecutive frames one BB_PRESENT_DUMP_TRIGGER saves. | gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:2222 |
BB_PRESENT_DUMP_TRIGGER |
file path (unset = off) | Creating this file saves the completed display buffer (with the game's UI) as present_ |
gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:2220, gpu/shadps4/video_core/renderer_vulkan/vk_presenter.cpp:407 |
BB_PRODUCER_CHECK |
1 = on (off) | Launcher: Advanced > Developer > "Crash diagnostics" (also set by run.sh with BB_AS_0_3=1). Checks that only one thread at a time records into the scheduler (costs an atomic exchange per recorded command). | gpu/shadps4/video_core/renderer_vulkan/vk_scheduler.h:845, launcher/bbport_launcher.py:681, run.sh:239 |
BB_READBACK_LOG |
file path (unset = off) | Internal (set by run.sh when BB_SAVE_LOG=1 to logs/ | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:138-160, run.sh:48 |
BB_RECORDER_TRACE |
1 = on (off) | Prints the most frequent direct command-buffer callers every 2000 calls. | gpu/shadps4/video_core/renderer_vulkan/vk_scheduler.cpp:315, gpu/shadps4/video_core/renderer_vulkan/vk_scheduler.h:822 |
BB_RESIDENCY_MIX |
1 or 2 (off) | Prints bindings per kind (none, in place, mirror, mixed) and written, every 2 s; 2 also lists the in-place or mixed bindings with the most bytes (layer module). | gpu/shadps4/video_core/buffer_cache/buffer_cache_layer.cpp:106-110, 162-164, gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:459-465 |
BB_RESIDENCY_REPORT |
trigger file path (unset = off) | When the file appears (checked once a second), reports the blocks bound in place in the last seconds and why they have no VRAM copy. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:3108 |
BB_RES_STATS |
1 = on (off) | Every 5 s: whether bound shaders read their resource descriptors from user-data registers or from tables in memory, per draw and dispatch. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:2317 |
BB_SAMPLE_THREAD |
thread name (default off) | With frame stats: samples where that guest thread runs with SIGPROF and reports it. | src/runtime_kernel.c:464, src/runtime_kernel.c:464 |
BB_SAVE_LOG |
1 = on (default off) | Launcher: Advanced → Developer → "Save the log and statistics to a file". Also writes this run's output to /logs/ | run.sh:41-53, launcher/bbport_launcher.py:667 |
BB_SAVE_TRACE |
1 = on (default off) | Logs every operation on save files (/savedataN). | src/runtime_file.c:224-225 |
BB_SCENE_DEBUG |
file path (unset = off) | Once the file exists (it is consumed), prints for one frame why passes keep the native size and which scene targets are read at native size. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:1644, gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:1644 |
BB_SECTIONS |
1 = on (off) | Time the draw recording thread spends per part of a draw (and ordered tasks by function), printed with the draw-pipe statistics. | gpu/shim/bbport_sections.h:51, gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:1300 |
BB_SYNC_TRACE |
set (any value) = on (off) | Prints each SyncForCpuRead (command-processor read of memory: drain and finish of the GPU work). | gpu/shadps4/video_core/amdgpu/liverpool.cpp:1363 |
BB_TAA_DIAGNOSTICS |
integer 1–3 (unset = off) | TAA upscaler: selects a diagnostic output of the TAA shader, and with BB_DUMP_TRIGGER also dumps the TAA history images. Meaning of 1–3: see gpu/shadps4/video_core/host_shaders/taa.comp:16. | gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:797, gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:1976 |
BB_TILE_BACK_LOG |
set (any value) = on (off) | Logs each image written back into the game's memory because a texel buffer reads it, with the age of its last GPU write (first 400). | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:3651 |
BB_TIMELINE |
output file path (unset = off) | Records a timeline of the frame's way to the GPU (guest submissions and waits, decoding, Vulkan submissions, GPU completion); starts BB_TIMELINE_START seconds in, written once when the buffer is full (~15 s of play). | gpu/shim/bbport_timeline.h:2-5, 42 |
BB_TIMELINE_START |
seconds (30) | With BB_TIMELINE= |
gpu/shim/bbport_timeline.h:4 |
BB_TRACE_ADDR |
addr,size (C integers; size default 4096) (unset = off) | That guest range is traced from the start by the binding trace; only has an effect when BB_TRACE_SIZE is also set (non-zero). | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:2643 |
BB_TRACE_SEMA |
any value = on (default off) | Logs every blocking semaphore wait (deadlock diagnosis). | src/runtime_sema.c:69 |
BB_TRACE_SHADER |
hex hash[,hash…] (unset = off) | For those shaders: the buffers they bind (address, size, read/written, whether in place or in VRAM, how often), printed every 5 s. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:3034 |
BB_TRACE_SIZE |
bytes (C integer) (0 = off) | Bindings over GPU-written buffers of that size are counted by the path they take and reported every 5 s. | gpu/shadps4/video_core/buffer_cache/buffer_cache.h:318-320, gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:2638 |
BB_UI_TRACE |
any value = on (off) | Logs the draws of frames that ended without the output-size UI (shown at the game's own size), and of one that had it. | gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.h:229, gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:393 |
BB_VK_MARKERS |
1/y/t or 0 (off) | Vulkan debug markers for guest and host passes (for RenderDoc and similar tools). | gpu/shim/core/emulator_settings.h:71, gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:65 |
BB_VK_VALIDATION |
1/y/t or 0 (off) | Launcher: Advanced > Developer > Vulkan validation layers. Enables the Vulkan validation layers (much slower). | gpu/shim/core/emulator_settings.h:74, gpu/shadps4/video_core/renderer_vulkan/vk_presenter.cpp:155, launcher/bbport_launcher.py:685 |
BB_VK_VALIDATION_SYNC |
1/y/t or 0 (off) | Synchronisation validation in the Vulkan validation layer (with BB_VK_VALIDATION). | gpu/shim/core/emulator_settings.h:76, gpu/shadps4/video_core/renderer_vulkan/vk_platform.cpp:311 |
BB_VRAM_ACCESS_TRAP |
set (any value) = on (off) | Blocks moved to VRAM are closed to the CPU (PROT_NONE); the first CPU access to each is recorded (code site, read or write) and the block opened again. Finds CPU readers of data the GPU writes in VRAM. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:2994 |
BB_VRAM_TRAP_RANGE |
addr,size (C integers) (unset = all blocks) | With BB_VRAM_ACCESS_TRAP: only blocks over that range, re-armed for every packet, every access counted by site. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:2977 |
BB_WAIT_LOG |
file (default off) | With BB_SAMPLE_THREAD/frame stats: writes per-frame wait sites (cond/mutex/sema/sleep, counts and ms) to this file. | src/runtime_kernel.c:389 |
BB_WAIT_TRACE |
1 or unset (off) | Attributes each wait for GPU ticks (Scheduler::Wait) to its thread and call stack; the frame stats print the stacks that waited longest. | gpu/shim/bbport_wait_trace.h:2 |
BB_WARN_META_TEXTURE |
any value = on (off) | Logs a warning when a shader reads texture metadata as a texture. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:3336 |
BB_WATCH |
addr,size (unset = off) | What the shader translator reads on the CPU from that guest range (user data pointing into it, constants copied from it), printed every 2 s. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:1076 |
BB_WRITE_LOG |
1, 2, or unset/0 (off) | Launcher: Advanced > Developer > Crash diagnostics (with BB_FREE_CHECK, BB_PRODUCER_CHECK). Ring of the writes the GPU emulation makes to guest memory (fences, WriteData, DMA, downloads), dumped when the guest faults. 1 logs at the write itself (changes timing), 2 where the command thread decodes the fence or WriteData. | gpu/shim/bbport_write_log.h:2, gpu/shim/bbport_write_log.cpp:37, launcher/bbport_launcher.py:680 |
BB_WRITE_VERIFY |
1 = on (off; only without write tracking) | Pages the GPU side watches are write-protected anyway to verify that every CPU write to them is announced. | gpu/shadps4/video_core/buffer_cache/buffer.h:53, gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:497-503 |
MANGOHUD |
1 = on (default off) | Launcher: Advanced → Developer → "MangoHud". MangoHud overlay. run.sh keeps it off if Steam's performance overlay (mangoapp) runs, and uses the system MangoHud instead of the bundled one when installed. | run.sh:246, launcher/bbport_launcher.py:663 |
SHADPS4_BBSC_TRACE_MAPS |
"0" off, any other non-empty value on; default off | Logs which maps are resident (and which one the player is in) whenever the set changes. | bbsc/emulator/src/core/bloodborne_re.cpp:6305 |
SHADPS4_BBSC_TRACE_WALLS |
"0" off, any other value on; default on (BBSC default-on switch, not in mod.json) | Logs which map objects get shown/made solid (fog walls). | bbsc/emulator/src/core/bbsc_persistence.h:28, bbsc/emulator/src/core/bloodborne_re.cpp:8840 |
SHADPS4_CAPTURE_BLOODBORNE_SUMMON |
non-empty and not "0" = on; default off | Online module writes capture files of summon-messenger HTTP requests (for collect-logs). Listed as default-on in BBSC but only the online module reads it. | gpu/bbnet/shadps4/core/libraries/network/http.cpp:734, bbsc/emulator/src/core/bbsc_persistence.h:37 |
VK_LOADER_LAYERS_DISABLE |
layer list | Internal. run.sh --software disables all implicit layers; with MANGOHUD=1 and a system MangoHud, run.sh adds the bundled MangoHud layer so only one overlay draws. | run.sh:12, run.sh:255 |
Developer/tests¶
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BBSC_EMULATOR |
path | No effect in this port. Windows bbsc-launch only: another program to start instead of the emulator. Not built for the Linux port. | bbsc/emulator/mod/bbsc_launch.cpp:263-268 |
BBSC_URL_OVERRIDES |
0 = off | No effect in this port. Windows bbsc.dll only (bbhost): turns off its own URL overrides. The Linux build leaves URL overrides to the online module and never reads it. | bbsc/emulator/mod/bbsc_http.cpp:158, 176-181 |
BB_ASYNC_FENCES |
1 = on; anything else off (off) | Experiment: an end-of-pipe fence is written once the guest memory copies on the copy threads are done instead of waiting for them. Measured slower (79 vs 83 FPS), so off. Ignored when honest labels are in use. | gpu/shadps4/video_core/amdgpu/liverpool.cpp:476 |
BB_AS_0_3 |
1 = on (default off) | Launcher: Advanced → Developer → "Synchronisation as in 0.3". Reverts what changed since the 0.3 release, for comparisons: run.sh forces BB_GUEST_IN_PLACE=0, BB_HOST_COPY_WAITS=all, BB_PRODUCER_CHECK=1 (overriding any value you set for those). | run.sh:238, launcher/bbport_launcher.py:675 |
BB_CAMERA_INVERSE |
own (unset = the game's stored inverse) | own: camera motion vectors use the inverse of the view matrix computed by the port instead of the one the game stores (A/B test; they agree to float precision). | gpu/shadps4/video_core/renderer_vulkan/vk_camera_motion.cpp:280 |
BB_CAMERA_Y |
up / down (unset = from the G-buffer viewport) | Forces the screen y sign used by camera motion vectors (for tests); normally the frame's G-buffer viewport decides. | gpu/shadps4/video_core/renderer_vulkan/vk_camera_motion.cpp:313 |
BB_CHUNK_TEXTURES |
0 = off; else on (on) | A/B switch for the PC memory model (BB_GUEST_IN_PLACE): texture data is read by the GPU straight from the guest memory chunk it is in (no CPU copy, no VRAM buffer copy) when the range is contiguous. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:419, gpu/shadps4/video_core/buffer_cache/buffer_cache.h:209 |
BB_CHUNK_UPLOADS |
0 = off; else on (on) | A/B switch for the PC memory model: VRAM copies are uploaded by GPU copies from the guest chunks; 0 = CPU staging instead. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:410 |
BB_CONTENT_SKU |
full | trial (default full) | AppContent SKU reported to the game (a probe setting, not a licence check). | run.sh:189, scripts/content_profile.py:33 |
BB_CP_DECODER |
1 = on (off) | Opt-in: graphics command buffers are decoded by the translator's own decoder (gpu/cp) instead of shadPS4's packet walk. Off by default: the GPU thread spends ~7 % more per draw. | gpu/shadps4/video_core/amdgpu/liverpool.cpp:906, gpu/shadps4/video_core/amdgpu/liverpool.h:111 |
BB_CP_SHADOW |
1 = on (off) | Self-check: the translator's own decoder (gpu/cp) also decodes every top-level graphics buffer in the shadow and the register files are compared; the first differences are printed. Off with the PM4 self-test or BB_CP_DECODER=1. | gpu/shadps4/video_core/amdgpu/liverpool.cpp:1059-1108 |
BB_DEBUG_KEEP |
1 (set by tools/debug_attach.sh) | tools/debug_attach.py: keep the process stopped/attached after the dump; see tools/debug_attach.py:74. | tools/debug_attach.py:74, tools/debug_attach.sh:18 |
BB_DEBUG_OUT |
file (default stdout) | Output file of tools/debug_attach.py (gdb attach helper). | tools/debug_attach.py:5 |
BB_DIRECT_MEMORY_ACCESS |
1/y/t or 0 (off) | shadPS4's direct memory access in shaders: when off, shaders that read memory themselves (uses_dma) get no DMA buffer. | gpu/shim/core/emulator_settings.h:57, gpu/shadps4/shader_recompiler/ir/passes/shader_info_collection_pass.cpp:179 |
BB_DUMP_GOT |
guest GOT offset (hex/dec) | With BB_SAMPLE_THREAD sampling: prints which host function a guest GOT slot calls. | src/runtime_kernel.c:480 |
BB_FENCE_DELAY_TEST |
1 = on (off) | Experiment: holds every 200th fence back 80 ms, to test whether late labels corrupt the guest heap (the sequence numbers come from BB_FREE_CHECK=1). | gpu/shadps4/video_core/amdgpu/liverpool.cpp:407-414 |
BB_FIXED_ARENA |
1/0 forces on/off (unset = on when guest memory is host-imported, i.e. NVIDIA) | NVIDIA workaround for the sparse arena: the arena keeps the first binding of every block, so game data is read in place and never moved to VRAM. Not used with the layer memory module (BB_LAYER_MEMORY); only with BB_GUEST_IN_PLACE. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:435-457 |
BB_FSR411_OUT |
directory (default fsr4_411 in the tree; launcher sets it) | Internal. Where tools/fsr4cap/build_assets.sh writes the FSR 4.1.1 asset set. | tools/fsr4cap/build_assets.sh:37, launcher/bbport_launcher.py:466 |
BB_FSR4CAP_CLEAN |
1 = remove work folder (launcher sets it when packaged) | Internal. build_assets.sh removes its work folder after building FSR 4.1.1 assets. | tools/fsr4cap/build_assets.sh:142, launcher/bbport_launcher.py:462 |
BB_FSR4CAP_FP8 |
auto | 1 | 0 (default auto) | FSR 4.1.1 capture: also record the DLL's FP8 matrix variant outside RDNA4 via GE-Proton's FP16 emulation (1), or never (0); auto records it only where the DLL uses it (RDNA4). | tools/fsr4cap/capture_all.sh:10-15, tools/fsr4cap/capture_all.sh:176 |
BB_FSR4CAP_RUNNER |
steam | direct (default automatic) | FSR 4.1.1 capture: steam = use Steam's runtime even where umu-run would be used; direct = run Proton directly from the start. | tools/fsr4cap/capture_all.sh:37, tools/fsr4cap/proton.sh:118-135 |
BB_FSR4CAP_SPOOF |
0 = off (default 1) | FSR 4.1.1 capture: when AMD's DLL offers only FSR 3/2 on this GPU, retry with the GPU reported as an RX 7800 XT. | tools/fsr4cap/capture_all.sh:16-19, tools/fsr4cap/capture_all.sh:131 |
BB_FSR4CAP_WORK |
directory (default out/fsr4cap; launcher sets /fsr4cap when packaged) | Internal. Work folder of build_assets.sh (must be under $HOME for Steam's runtime). | tools/fsr4cap/build_assets.sh:19-20, tools/fsr4cap/build_assets.sh:36, launcher/bbport_launcher.py:461 |
BB_FSR4_TIERS |
space-separated list (default "1080 2160") | Which FSR 4 asset tiers tools/fetch_fsr4_assets.sh downloads. | tools/fetch_fsr4_assets.sh:6, tools/fetch_fsr4_assets.sh:18 |
BB_GAME_PROFILE |
none, or unset (by TITLE_ID) | none runs the game as an unknown one, without the Bloodborne profile (the code notes Bloodborne then crashes). |
gpu/games/game_profile.cpp:22, gpu/games/bloodborne.cpp:17 |
BB_GC_BUDGET_MB |
MiB (unset = 0 = driver budget, integrated GPUs only) | Texture collector: applies the integrated-GPU rule (marks at 70/85/95 % of the budget) with this fixed budget on any GPU. For tests on a desktop. | gpu/shadps4/video_core/texture_cache/texture_cache.cpp:1324-1335 |
BB_GPU_DATA_CHECK |
0 = off; else on (on) | With the PC memory model, GPU writes not finished yet and data the GPU wrote into a VRAM copy count as GPU-modified for CPU access checks (issue #122). 0 = not counted. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:1366-1374 |
BB_GPU_LABELS_PORTABLE |
anything but 0 = on (off) | Writes GPU labels with portable Vulkan buffer updates even when VK_AMD_buffer_marker is available (testing the non-AMD path). | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:326 |
BB_GPU_WRITES_IN_PLACE |
1 = on (off) | With the PC memory model and no write tracking, GPU-written buffers are kept in the game's memory (in place) instead of VRAM; costs ~9 ms a frame over PCIe on an RX 7800 XT. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:1118-1127 |
BB_GUEST_HOOKS |
0 = off; else on (on) | Hooks in the game's own code from its profile (gpu/games): the memory hooks with the PC memory model, the fixes of the game's own bugs (BB_JOB_SLOT_FIX, BB_KERNEL_CLAMP) with either model. 0 = none, as for a game the port knows nothing about. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:572-583, gpu/shim/bbgpu.cpp:384-393, gpu/games/bloodborne.cpp:17 |
BB_JOB_SLOT_FIX |
0 = off (default on) | A render job that fails gives its pool slot back (the game kept it: Laurence's cinematic above 30 FPS emptied the pool and hung); also when a runner is destroyed holding one. | gpu/shim/bbport_guest_hooks.cpp:443-470 |
BB_KERNEL_CLAMP |
0 = off (default on) | Raises the blur kernel's base sample count to 3 at the entry of 0xbbc3e0 (game data now and then gives 2: exception 0xa0020007). | gpu/shim/bbport_guest_hooks.cpp:472-491 |
BB_GUEST_HOOK_TRAPS |
1 or unset (off) | Keeps the guest hooks as int3 traps instead of native detours. | gpu/shim/bbport_guest_hooks.cpp:72, gpu/shim/bbport_guest_hooks.cpp:529 |
BB_GUEST_WHOLE_CHUNKS |
1 or unset (off) | Acts as if mapping a dma-buf at an offset failed (tests the NVIDIA path). | gpu/shim/bbport_guest_memory.cpp:608 |
BB_HEAP_HOOKS |
0, or unset (on) | 0 (bisecting): the game heap's ranges are not reported to the GPU side. | gpu/shim/bbport_guest_hooks.cpp:513 |
BB_HLE_OFF |
bit mask, decimal or 0x hex (0): 1 = image copy, 2 = metadata clear, 4 = image clear | Experiment: the selected compute-shader substitutions (HLE) run as the game's own shaders instead. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:2389 |
BB_HONEST_FLIPS |
1 = on (off) | Experiment: a flip completes once the GPU has finished the frame (as on the PS4) instead of when the frame is queued. Did not help, so off. | gpu/shadps4/core/libraries/videoout/driver.cpp:745-755 |
BB_HONEST_IDLE_US |
microseconds (200) | With honest labels (BB_HONEST_LABELS): how long the GPU command thread waits idle before flushing unsubmitted work that fences may be waiting for. | gpu/shadps4/video_core/amdgpu/liverpool.cpp:136-146 |
BB_HOT_PAGES |
1 = on (off) | Opt-in: pages the guest writes again and again stay writable and are uploaded on every use instead of faulting. Off by default: in Hunter's Nightmare the set grew to ~14k pages and cost far more (33 FPS). | gpu/shadps4/video_core/buffer_cache/region_manager.h:259-273 |
BB_IMAGE_TRAPS |
0 = off; else on (on, only with the PC memory model and no write tracking) | Pages under images are trapped for writes, so a write nobody announced still reaches the texture cache. 0 = announced writes only, as before. | gpu/shadps4/video_core/page_manager.cpp:225-240 |
BB_IME_TEXT |
text (default unset) | Answers every on-screen keyboard (IME) dialog at once with this text (automated runs). | src/runtime_services.c:298 |
BB_INPLACE_TEXTURES |
1 = on (off) | A/B switch for the PC memory model: texture data bound in place whatever its memory type. Off by default: sampled data looked smeared and ghosted with it (2026-10-04). | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:411, 426-433 |
BB_INTERNAL_HEIGHT |
pixels (1080) | Height of the video-out driver's internal screen (shadPS4 setting). See BB_RENDER_RES for the render size. | gpu/shim/core/emulator_settings.h:24, gpu/shadps4/core/libraries/videoout/video_out.cpp:494 |
BB_INTERNAL_WIDTH |
pixels (1920) | Width of the video-out driver's internal screen (shadPS4 setting). | gpu/shim/core/emulator_settings.h:23, gpu/shadps4/core/libraries/videoout/video_out.cpp:493 |
BB_LAYER_GPU_WRITES |
0, 1 or 2 (1) | Layer memory module (BB_LAYER_MEMORY): where GPU writes may land in VRAM copies: 0 nowhere (in place), 1 in blocks the CPU has not written since they were handed out (render targets and other GPU-only data), 2 anywhere (gave exploding vertices and garbage textures). | gpu/shadps4/video_core/buffer_cache/buffer_cache.h:220-223, gpu/shadps4/video_core/buffer_cache/buffer_cache_layer.cpp:1209-1217 |
BB_LAYER_PAGED |
0 = off; else on (on) | Layer memory module (tests): 0 cuts huge bindings in place instead of going through the page table. | gpu/shadps4/video_core/buffer_cache/buffer_cache_layer.cpp:1200-1207 |
BB_LAYER_VOLATILE |
1 = on (off) | Layer memory module: a range with a few unannounced ("volatile") blocks goes into one mirror anyway, those blocks refreshed for every binding that reads them. Off by default: the refreshes cost copies and render-pass breaks. | gpu/shadps4/video_core/buffer_cache/buffer_cache_layer.cpp:58-70 |
BB_LAYER_VOLATILE_IN_PASS |
0 = off; else on (on) | Layer memory module: a read over volatile blocks inside an open render pass is bound in place instead of refreshing the mirror (a refresh copy ends the pass). 0 = refreshed in passes too (as before). | gpu/shadps4/video_core/buffer_cache/buffer_cache_layer.cpp:300-309 |
BB_LAYER_WATCH_HOT |
1 = on (off) | Experiment (layer memory module): blocks the CPU writes often are watched too and uploaded again after every write, as the 0.3 model does. Off: they go back in place (uploading them ended render passes). | gpu/shadps4/video_core/buffer_cache/buffer_cache_layer.cpp:428-438 |
BB_LAYER_WRITE_TRAPS |
0 = off; else on (on) | Layer memory module: blocks with a VRAM copy are write-protected so a write the game does not announce sends the block back in place before the next binding (else stale copies give exploding vertices and garbage textures). BB_LAYER_WATCH needs it. | gpu/shadps4/video_core/buffer_cache/buffer_cache_layer.cpp:1386-1406 |
BB_MEM_SEMAPHORE_ORDER |
0 = off; else on (on, only with honest labels) | A MEM_SEMAPHORE signal is given once the GPU has finished the work before it, in stream order. 0 = signalled when decoded (as before). | gpu/shadps4/video_core/amdgpu/liverpool.cpp:497-507 |
BB_MENU_KEYS_FILE |
file path (unset: off) | Scripted menu tests: tokens in the file (toggle up down left right enter back l1 r1) are pressed one per frame when the file appears; it is then removed. | gpu/shim/bbport_overlay.cpp:1087 |
BB_NULL_GPU |
1/y/t or 0 (off) | shadPS4's null GPU: the command processor is not bound to the rasterizer, so nothing is drawn. | gpu/shim/core/emulator_settings.h:61, gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:75 |
BB_OBJECT_MOTION_ALL |
1 = on (off) | Keeps the old broad object-motion path (every candidate draw, without the bone-palette gate) for visual A/B tests. | gpu/shadps4/video_core/renderer_vulkan/vk_pipeline_cache.cpp:921, gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:1705 |
BB_OCCLUSION_LABEL_ORDER |
0 = off; unset/other = on | With occlusion queries: results recorded before a label are written before it, as on the PS4. 0: labels may go ahead (statistics only). | gpu/shadps4/video_core/renderer_vulkan/vk_occlusion.cpp:228 |
BB_PACKAGE_FSR411 |
1 = include (build-time, default off) | Nix build: package the FSR 4.1.1 models (extracted from AMD's DLLs; never in a public package). | packaging/default.nix:12-14 |
BB_PAD_FILE |
file (default off) | Scripted input for automated runs: button names held while listed, lx=/ly=/rx=/ry= stick overrides, re-read when the file changes; token "replay" starts BB_PAD_REPLAY. | src/runtime_pad.c:898 |
BB_CAM_TRACE |
file (default off) | Writes "ms yaw pitch" (radians) to this file whenever the camera turns, to measure how the game turns it for a stick input (with BB_PAD_FILE). Not with mouse_camera=direct. | gpu/shim/bloodborne_cam.cpp (TraceTick) |
BB_PAD_RECORD |
file (default off) | F9 starts/stops recording the pad state (gamepad or keyboard) to this file. | src/runtime_pad.c:943 |
BB_PAD_REPLAY |
file (default off) | Plays a BB_PAD_RECORD recording back, started by the token "replay" in BB_PAD_FILE. | src/runtime_pad.c:975, src/runtime_pad.c:975 |
BB_PIPE_VERIFY |
integer N (0 = off) | Every Nth draw-pipe packet also carries the full register state, for verification. Exact check: see gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:1177. | gpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:822 |
BB_PM4_SELFTEST |
1 = on (off) | Self-test of command-processor packets Bloodborne never sends (occlusion queries, COPY_DATA, COND_EXEC, predication, MEM_SEMAPHORE, timestamps): injected ~40 s into the game and the results printed. Turns on BB_OCCLUSION_QUERIES. | gpu/shadps4/video_core/amdgpu/pm4_selftest.cpp:221, gpu/shadps4/video_core/amdgpu/pm4_selftest.h:2 |
BB_PM4_SELFTEST_STEPS |
bit mask (C integer, 0x allowed) (all steps) | PM4 self-test (BB_PM4_SELFTEST): which steps run (bit n = step n); others skipped. | gpu/shadps4/video_core/amdgpu/pm4_selftest.cpp:250-254 |
BB_PRESET_FILE |
file path holding a preset number (unset = off) | Read about once a second; switches the upscaler preset like the menu does (scripted tests of live preset changes). | gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:323 |
BB_PROBE |
path to a program; default bin/bb-probe (packaged) or out/bb-probe | Runs this instead of bb-probe, e.g. a gdb wrapper; bb-gpu-capabilities is then taken from its folder. | run.sh:90, 236-239 |
BB_RESIDENCY_VRAM_LIMIT_MB |
MiB (unset = 0 = no limit) | Tests: VRAM counts as "full" after this many MiB of residency blocks, so blocks fall back to system memory read over the bus. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:1643-1648 |
BB_SCENE_STENCIL_BITS |
1 = on (off) | Forces reduced-size depth/stencil scene targets on GPUs without shader stencil export (e.g. Pascal), where they normally stay native (tests). | gpu/shadps4/video_core/renderer_vulkan/vk_scene_resolution.cpp:25 |
BB_SHADOWS |
1 = on (off) | With the PC memory model on a discrete GPU, a read-only binding of data the CPU writes in place is copied once per submission into VRAM and bound there. Off by default: cost more than reading in place (48 -> 44 FPS). | gpu/shadps4/video_core/buffer_cache/buffer_cache.h:305-309, gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:2782 |
BB_SKIP_CPU_CHECK |
1 = skip (default check) | Skips the start-up check for the CPU features the game's code needs (AVX, BMI1, MOVBE, LZCNT, POPCNT); without them the game crashes with SIGILL. | src/probe.c:45-52 |
BB_SUBMIT_LOCK |
gpu | ahead | anything else (unset = frame/decode behaviour) | Submission lock mode with honest labels: unset/other = submissions are handed to the GPU first and return once the previous frame finished; gpu = the lock as before (wait for GPU idle); ahead = experiment, submissions never wait and sceGnmSubmitDone(F) waits for frame F-1. Only "gpu" and "ahead" are compared in code. | gpu/shadps4/core/libraries/gnmdriver/gnmdriver.cpp:92-130, gpu/shadps4/core/libraries/gnmdriver/gnmdriver.h:229 |
BB_TEST_STAGE |
integer | Test only. Used only inside tests/test_run_settings.py's fake probe. | tests/test_run_settings.py:45 |
BB_TIMEOUT |
seconds, 0 = none (run.sh default 0) | Watchdog: run.sh passes it as bb-probe --timeout; the process is stopped after that many seconds. | run.sh:404, src/probe.c:381-437 |
BB_TOGGLE_FILE |
file path (unset = off) | The file holds "N [M]", re-read every 250 ms: N is a bit mask of optimizations switched off while the game runs, M temporary experiment bits (A/B without restarting). Bits listed in src/runtime_memory.c and gpu/shim/bbport_toggles.h. | src/runtime_memory.c:774, src/runtime_memory.c:774, gpu/shim/bbport_toggles.h:1 |
BB_TROPHY_PREVIEW |
trophy id (default off) | At the game's first trophy call, shows that trophy's notice without recording it, to check how it looks. | src/runtime_services.c:399 |
BB_UI_TRIGGER_VS |
hex shader hash (0x34e8a281) | Vertex shader hash that marks the UI/movie phase of a frame for the upscaler. | gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:196, gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.h:225 |
BB_UPSCALE_BEFORE_CS |
hex shader hash (0x9a9cf8a9) | Compute shader hash before which the upscaler runs on the scene color (the post-processing combine pass). | gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.cpp:193, gpu/shadps4/video_core/renderer_vulkan/vk_temporal_upscaler.h:207 |
BB_VRAM_LIMIT_MB |
integer MiB (0 = no limit) | Tests: the driver's VRAM budget is taken as at most N MiB, so the texture collector and VRAM copies behave as on a smaller card. Allocations themselves are not limited. | gpu/shadps4/video_core/renderer_vulkan/vk_instance.cpp:39 |
BB_WORK_RETIRED |
0 = off; else on (on) | GPU idle (sceGnmSubmitDone not blocking) also requires the draw recording thread and its deferred fences to be done; 0 = only submissions counted (Steam Deck crashes noted). | gpu/shadps4/video_core/amdgpu/liverpool.h:141-150, gpu/shadps4/core/libraries/gnmdriver/gnmdriver.cpp:94 |
BB_WRITE_TRACKING |
1 = on (off; on anyway without the PC memory model) | Forces page write tracking (protection) back on with the PC memory model (BB_GUEST_IN_PLACE), where it is otherwise off. | gpu/shadps4/video_core/buffer_cache/buffer_cache.cpp:487-495, gpu/shadps4/video_core/buffer_cache/buffer.h:48 |
SHADPS4_BBSC_NO_FAST_SIGN |
— | No effect in this port. Named only in the vanilla-emulator stub of SwitchEnabled; never read by libbbsc. | bbsc/emulator/src/core/bbsc_persistence.h:59-67 |
SHADPS4_BBSC_NO_GUEST_HOOKS |
"0" off, any other non-empty value on; default off | Isolation switch: skips the per-tick guest pre-match warp, deferred reload and responder re-ring (byte patches stay installed). | bbsc/emulator/src/core/bloodborne_re.cpp:16170 |
SHADPS4_BBSC_NO_PLACEMENT_HEADER |
— | No effect in this port. Named only in the vanilla-emulator stub of SwitchEnabled (counts as set when BBSC is not built in); never read by libbbsc. | bbsc/emulator/src/core/bbsc_persistence.h:59-67 |
SHADPS4_BBSC_PHANTOM_FLAGS |
"0" off, any other non-empty value on; default off | Re-enables an experiment writing the phantom creation flags onto the guest (made the guest invisible and immune to damage). | bbsc/emulator/src/core/bloodborne_re.cpp:3813 |
SHADPS4_BBSC_REINSERT |
joined | leftjoined; unset, empty or 0: off (default) | Experimental: after a kept session end, replays the room members once the stage load is consumed; "leftjoined" also announces them as left first. | bbsc/emulator/src/core/bloodborne_re.cpp:3396 |
SHADPS4_BBSC_REINSERT_DELAY_MS |
milliseconds; default 6000 | Delay before the experimental SHADPS4_BBSC_REINSERT replay runs. | bbsc/emulator/src/core/bloodborne_re.cpp:3427 |
SHADPS4_BBSC_REJOIN_V6 |
"0" off, any other non-empty value on; default off | Restores the older v6 deferred rejoin path instead of the default v7. | bbsc/emulator/src/core/bloodborne_re.cpp:3474 |
SHADPS4_P2P_SAME_HOST |
any value but 0 (off) | Two instances on one machine: the peer given as this network's own public address is reached through loopback. | gpu/bbnet/shadps4/core/libraries/network/p2p_sockets.cpp:65 |
Internal¶
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BB_SAVEDATA_TITLE |
title id | Set by the runtime, not by you: the save folder's title id, for BBSC's save path (BBSC_SAVE_DIR). |
src/runtime_savedata.c:106 |
BB_AUTO_RENDER_RES |
1 or unset | Internal (run.sh sets it with BB_RENDER_RES/BB_OUTPUT_RES). Marks BB_RENDER_RES/BB_OUTPUT_RES as chosen by run.sh from bbport.ini output_res (startup patch); run.sh drops them (and BB_UI_RES) on an in-game restart so they are recomputed, and the menu shows the matching hint. | run.sh:68-70, run.sh:119, gpu/shim/bbport_overlay.cpp:442 |
BB_BBSC_LIB |
path to libbbsc.so; default out/bbsc/libbbsc.so or BB_BBSC_PACKAGED_LIB | Internal. Library bb-probe loads into the game for seamless co-op. run.sh unsets it unless BB_BBSC=1 and BB_ONLINE=1, then resolves it (an explicit value is kept as an override). | src/probe.c:340, run.sh:341, 287-295 |
BB_BBSC_PACKAGED_LIB |
path (set by the AppImage entry) | Internal. Location of the packaged libbbsc.so; run.sh falls back to it when BB_BBSC_LIB is unset, the launcher uses it to know BBSC is available. | packaging/appimage-sharun.sh:73, run.sh:341, launcher/bbport_launcher.py:559 |
BB_BRIDGE_CLI |
path (default out/bbbridge/bbbridge-cli; AppImage sets its copy) | Internal. The bbbridge-cli binary used for The Hunter's Dream. | run.sh:313, launcher/bbport_launcher.py:566, packaging/appimage-sharun.sh:71 |
BB_BUNDLED_VK_DRIVER_FILES |
colon-separated ICD list (set by the Nix wrapper) | Internal. The package's own Mesa ICDs; bbport_vulkan.py puts them in VK_DRIVER_FILES (after the host NVIDIA ICD if one is found). | launcher/bbport_vulkan.py:71, packaging/default.nix:215 |
BB_DLSS_DIR |
directory (unset = next to bb-probe) | Internal. Where the DLSS bridge (libbbport_dlss.so) and NVIDIA's libnvidia-ngx-dlss are looked up. The AppImage entry sets it to its own dlss folder. | gpu/shadps4/video_core/renderer_vulkan/vk_dlss.cpp:61, packaging/appimage-sharun.sh:69, launcher/bbport_launcher.py:434 |
BB_FSR4CAP_CHECKED |
1 (set by the script itself) | Internal. build_assets.sh marks that the DLL check already ran (re-exec guard). | tools/fsr4cap/build_assets.sh:49-51 |
BB_FSR4CAP_ON_HOST |
1 (set by the script itself) | Internal. capture_all.sh re-runs itself on the host through systemd-run; this marks the re-run. | tools/fsr4cap/capture_all.sh:47, tools/fsr4cap/capture_all.sh:62 |
BB_FSR4CAP_SHELL |
1 (set by the script itself) | Internal. build_assets.sh re-exec guard inside nix-shell (missing build tools). | tools/fsr4cap/build_assets.sh:65-68 |
BB_FSR4CAP_TOOLS |
directory (launcher sets it when bundled) | Internal. Folder holding prebuilt dxil-spirv and fsr4cap.exe, so build_assets.sh needs no MinGW toolchain. | tools/fsr4cap/build_assets.sh:13, tools/fsr4cap/build_assets.sh:38, launcher/bbport_launcher.py:465 |
BB_FSR4CAP_UMU_SHELL |
1 (set by the script itself) | Internal. capture_all.sh re-exec guard inside a nix-shell with umu-launcher (NixOS). | tools/fsr4cap/capture_all.sh:40-44 |
BB_HOST_<NAME> |
set by the packaged entry | Internal. Copies of host variables the packaged entry dropped (LD_PRELOAD, LD_LIBRARY_PATH, GTK_, pressure-vessel VK_ …), kept only for the log. | packaging/bbport-entry.c:19-28, packaging/appimage-sharun.sh:73-79 |
BB_IN_NIX_SHELL |
1 (set by run.sh) | Internal. run.sh re-exec guard when it re-runs itself inside nix-shell. | run.sh:37-39 |
BB_NET_MODULE |
path (AppImage sets its copy; default gpu/libbbnet.so beside bb-probe) | Internal. The online module (libbbnet.so) the runtime dlopens. | src/runtime_net.c:43-50, packaging/appimage-sharun.sh:70, launcher/bbport_launcher.py:582 |
BB_PKGEXTRACT |
path (AppImage sets its copy) | Internal. pkgextract binary for "Install from PKG". | scripts/pkg_install.py:50-51, launcher/bbport_launcher.py:573, packaging/appimage-sharun.sh:72 |
BB_PREBUILT |
1 (AppImage/Nix wrapper) | Internal. Packaged build: binaries are installed next to run.sh, nothing is built and no nix-shell is used; the launcher stores data in BB_DATA_DIR. | run.sh:14, run.sh:284, launcher/bbport_launcher.py:55, packaging/appimage-sharun.sh:66 |
BB_PRESENCE_DIR |
directory (run.sh: out/presence, new each start) | Internal (run.sh, when Discord is on). Where the game writes the current area (area) and co-op partners (coop) for the Discord Rich Presence helper. |
run.sh:360, src/runtime_file.c:317, gpu/bbnet/shadps4/core/libraries/np/np_signaling/np_signaling_state.cpp:248 |
BB_TROPHY_DIR |
directory (run.sh sets it) | Internal. Trophy list and icons prepared by scripts/trophies.py; trophies are recorded there and shown in the overlay. | run.sh:354, src/runtime_services.c:335 |
BB_VULKANINFO |
path (default vulkaninfo) | Internal. vulkaninfo binary used by bbport_vulkan.py --vulkan-info (packaged builds set their copy). | launcher/bbport_vulkan.py:199, packaging/appimage-sharun.sh:68 |
DISABLE_GAMESCOPE_WSI |
1 (set by the packaged entry) | Internal. Set when Steam's pressure-vessel Vulkan variables were dropped, turning off the host's gamescope WSI layer. | packaging/bbport-entry.c:61-63, packaging/appimage-sharun.sh:87 |
DISABLE_MANGOHUD |
1 (set by run.sh) | Internal. Set when Steam's performance overlay already draws MangoHud. | run.sh:250 |
DISABLE_VK_LAYER_VALVE_steam_fossilize_1 |
1 (set by the Nix entry) | Internal. Disables Steam's fossilize Vulkan layer in the Nix package. | packaging/bbport-entry.c:65 |
DISABLE_VK_LAYER_VALVE_steam_overlay_1 |
1 (set by the Nix entry) | Internal. Disables Steam's overlay Vulkan layer (a host library) in the Nix package. | packaging/bbport-entry.c:64 |
GSK_RENDERER |
launcher default cairo | Internal. GTK renderer of the launcher window (setdefault: your value wins). | launcher/bbport_launcher.py:38 |
PYTHON |
path (default python3 on PATH) | Internal. Python used by run.sh for its scripts (the AppImage/Nix set their own). | run.sh:54-62, packaging/appimage-sharun.sh:67 |
SHADPS4_HTTP_HOST_OVERRIDES_JSON |
path to a JSON file; unset: |
Internal. Host-overrides file (game URL rewrites) for the online module and BBSC's relay lookup. run.sh writes it from scripts/online.py whenever Online is on, overwriting any value given. | run.sh:315, gpu/bbnet/shadps4/core/libraries/network/http.cpp:336-343, bbsc/emulator/mod/bbsc_relay.cpp:150-156 |
Not read by the game¶
These names look like game variables but are read only by the BBSC server's Docker image (tools/bbsc-server); putting them in the launcher has no effect.
| Variable | Values (default) | What it does | Where |
|---|---|---|---|
BBSC_BBHOST |
0 = off (default 1) | Server-side (tools/bbsc-server Docker image): 0 starts it without its bbhost-compatible service (TCP 18671, UDP 3478). Not a game variable. | tools/bbsc-server/entrypoint.sh:16-18 |
BBSC_HOST |
address (required) | Server-side (tools/bbsc-server): the address players reach the BBSC game server at. Not a game variable. | tools/bbsc-server/entrypoint.sh:2-14 |
BBSC_SHADNET |
address (default BBSC_HOST) | Server-side (tools/bbsc-server): the shadNet server the BBSC server talks to. Not a game variable. | tools/bbsc-server/entrypoint.sh:3-7 |
Known quirks¶
BB_UPSCALERis read in three places.- The GPU library takes
off/fsr3/fsr4/fsr411/taa/dlss(anything else means off). nonealso switches off the upscaler machinery entirely.scripts/patches.pyonly tellsfsr3from the rest when it sizes the startup render patch.BB_UPSCALE_PRESETis likewise ignored byrun.sh's startup size, which follows bbport.ini.- Two defaults.
BB_PREUPLOAD,BB_COPY_GPU_BUFFERS,BB_GPU_WRITE_TWINSandBB_GPU_WRITE_TWINS_MAX:run.shexports a value different from the code's built-in default. The tables give both.BB_SHADNET_SERVER/BB_SHADNET_WEBAPI: the code falls back to127.0.0.1,run.shto Seamless Hunt'splay.seamlesshunt.com.BB_TIMEOUT: bb-probe's own default is 10 s, butrun.shpasses 0 (no watchdog).- Two names. Inside libbbsc,
SHADPS4_BLOODBORNE_RE_TRACEis redirected toBBSC_MOD_HOOKS, andSHADPS4_BLOODBORNE_SEAMLESS_COOPtoBBSC_MOD_SEAMLESS(bloodborne_re.cpp:942-955).SHADPS4_BLOODBORNE_SEAMLESS_COOPkeeps a separate meaning in the online module (summons through the WebAPI). - BBSC switches not in mod.json have no launcher toggle, but they are on by default and can be
turned off with
=0: SHADPS4_BBSC_WARP_JOIN,PERSIST,PERSIST_MATCHCHECK,PERSIST_TASKSandREJOIN;CINEMATIC(F1 free camera) andINVADE_ANYWHERE;TRACE_WALLS, a log.- BBSC scaling: the launcher limits
BBSC_SCALE_*to 0–300/0–200, but the code clamps to 0–1000. - Variables that need another one:
BB_TRACE_ADDRneedsBB_TRACE_SIZE.BB_LABEL_TRAPneedsBB_FREE_CHECK=1.BB_TIMELINE_STARTneedsBB_TIMELINE.BB_GNM_TRACEandBB_GNM_CENSUS_RANGEneedBB_GNM_CENSUSorBB_GNM_OBSERVE.BB_FSR1,BB_RCASandBB_RCAS_ATTENUATIONdrive shadPS4's old FSR 1 presenter pass, not the port's upscaler or its sharpening.- No effect in the Linux port:
SHADPS4_BBSC_DISCORD:bbsc_discord.cppis not built, although the launcher still writes it.BBSC_URL_OVERRIDESandBBSC_EMULATOR: Windows only.SHADPS4_BBSC_NO_PLACEMENT_HEADERandSHADPS4_BBSC_NO_FAST_SIGN: never read.SHADPS4_BLOODBORNE_RE_TRACE: aliased, see above.SHADPS4_BBSC_INTROis named in a comment (bbsc_persistence.h) and never read.
Undocumented¶
These variables are read, but the code does not say clearly enough what every value does:
SHADPS4_BBSC_SKIP_LEAVE_LIMIT: enables the persistent-session patch group "LeaveLimit"; its effect is not described (bbsc/emulator/src/core/bbsc_patch_tables.h:426).BB_TAA_DIAGNOSTICS: the meaning of values 1–3 is in the shader (gpu/shadps4/video_core/host_shaders/taa.comp:16).BB_PIPE_VERIFY: the exact check is ingpu/shadps4/video_core/renderer_vulkan/vk_rasterizer.cpp:1177.BB_DEBUG_KEEP: used only bytools/debug_attach.py:74.