Turn the recorder thread on by default on AMD GPUs too; vk_recorder = 0 turns it off where the device is lost

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Valiantsin DzerakhandClaude Opus 5.5 committed 2026-11-10 19:25:37 +03:00
1 parent 396c4ae621
commit bb8b4b1797
3 files changed
+11 -13

No files matched your search

+1 -1
View File
@@ -58,7 +58,7 @@ Copy your `totk.ini` into the build folder and prepare the shaders (`tools\prepa
--version v143`). Shader preparation runs `totk.exe` too, so move `pgo\*.profraw` out of the build folder afterwards: --version v143`). Shader preparation runs `totk.exe` too, so move `pgo\*.profraw` out of the build folder afterwards:
its counts describe shader building, not play. its counts describe shader building, not play.
Keep the default settings, with the GPU command recorder on (`vk_recorder = 1`, the default except on AMD). Keep the default settings, with the GPU command recorder on (`vk_recorder = 1`, the default).
### 3. Training scenes ### 3. Training scenes
+8 -11
View File
@@ -218,16 +218,13 @@ typedef struct { VkCommandBuffer cb; int begin, crumb; uint64_t n; } A_BeginCb;
void rec_begin(VkCommandBuffer cb, uint64_t fence, int crumb, uint64_t n) { void rec_begin(VkCommandBuffer cb, uint64_t fence, int crumb, uint64_t n) {
static int mode = -1; static int mode = -1;
if (mode < 0) { if (mode < 0) {
// Default off on AMD GPUs. With the recorder those drivers lost the device or hung the GPU at startup on // On by default on every GPU. 0.2.8 turned it on for AMD too, and some RDNA 2, 3 and 4 systems lost the device
// RDNA 2, 3 and 4, under AMD's Windows driver and under RADV (issues #5, #40, #277 and #283: a black screen, // or hung the GPU at startup (issues #5, #40, #277 and #283: a black screen, or VK_ERROR_DEVICE_LOST with a
// or VK_ERROR_DEVICE_LOST with a breadcrumb naming a part of a replay submission, and vk_recorder = 0 gets // breadcrumb naming a part of a replay submission), so 0.3.x kept it off on AMD. Since then the recorder
// past it). Keeping objects until their submission completed and ending a part from the recorder // begins, ends and submits its own parts (TOTK_REC_END, which ended a GPU hang on AMD at split submissions),
// (rec_end_cb) fixed the white scene on an RX 6700 XT, but not this: 0.2.8 turned the recorder on for every // and AMD players who turned it on reported more FPS, so it is on again; TOTK_VK_RECORDER=0 turns it off
// GPU and the AMD reports came back the same day. TOTK_VK_RECORDER=1 turns it on for an A/B run. // where the device is still lost.
const char *set = cfg_get("TOTK_VK_RECORDER"); mode = rt_knob("VK_RECORDER", "1");
mode = rt_knob("VK_RECORDER", vk_caps.amd ? "0" : "1");
if (!mode && vk_caps.amd && !(set && *set))
rt_log("vk_rec: no recorder thread on AMD GPUs (TOTK_VK_RECORDER=1 turns it on)");
if (mode) { if (mode) {
plat_event_init(&wake_ev, 0, 0); plat_event_init(&wake_ev, 0, 0);
rec_prio = plat_thread_priority_get(); rec_prio = plat_thread_priority_get();
@@ -297,7 +294,7 @@ void rec_end(void) {
// submission was split (vk_sync.c vk_sync_split): the GPU hung or the scene turned green, then white. Moving the end // submission was split (vk_sync.c vk_sync_split): the GPU hung or the scene turned green, then white. Moving the end
// fixed that; begin and submit followed. TOTK_REC_END=0 brings the old split back: the submitting thread begins, // fixed that; begin and submit followed. TOTK_REC_END=0 brings the old split back: the submitting thread begins,
// ends and submits every part. // ends and submits every part.
// The line is written only when a part was recorded by the recorder: with the recorder off (the default on AMD) the // The line is written only when a part was recorded by the recorder: with the recorder off (TOTK_VK_RECORDER=0) the
// switch changes nothing, and reports read an unconditional line as proof that the recorder was running (#315). // switch changes nothing, and reports read an unconditional line as proof that the recorder was running (#315).
typedef struct { int kind; uint64_t n; } A_EndCb; typedef struct { int kind; uint64_t n; } A_EndCb;
int rec_end_cb(VkCommandBuffer cb, int crumb, uint64_t n) { int rec_end_cb(VkCommandBuffer cb, int crumb, uint64_t n) {
+2 -1
View File
@@ -127,7 +127,8 @@
# Vulkan. # Vulkan.
# Vulkan validation layer: checks every call and slows the game down a lot. Needs the layer installed (Vulkan SDK). # Vulkan validation layer: checks every call and slows the game down a lot. Needs the layer installed (Vulkan SDK).
# vk_validation = 0 # vk_validation = 0
# A thread of its own makes the Vulkan calls of each frame, 0 or 1. Default: on, except on AMD GPUs. # A thread of its own makes the Vulkan calls of each frame, 0 or 1. Default: on. Set 0 if an AMD GPU shows a black
# screen or stops with VK_ERROR_DEVICE_LOST.
# vk_recorder = 1 # vk_recorder = 1
# Dynamic vertex input, 0 or 1. Default: on, except on Intel's Windows driver for integrated GPUs (UHD, Iris Xe), # Dynamic vertex input, 0 or 1. Default: on, except on Intel's Windows driver for integrated GPUs (UHD, Iris Xe),
# which draws black patches with it. # which draws black patches with it.