mirror of
https://github.com/tangerineturtle1/NX2navi.git
synced 2026-11-15 19:19:58 -04:00
Every RX 6000 loss whose pass marks named a pass was in one that starts with a native mesh draw, on every version from 0.6.0 to 0.9.2 and with every other setting tried each way; RDNA 1 cards on the same driver draw through the fallback and RDNA 3 and 4 on AMD's other driver draw natively, and neither has such a report. That the native mesh path is the cause is not shown. The decision moves into vk_mesh_path.h with a test of each device kind and setting; has_mesh_shader keeps saying what the hardware has, so the recorder thread and the low-end card test do not change. On those cards no native mesh pipeline is built any more: the seed list and the boot prewarm skip them. The early tail stays off with the fallback, a combination never measured. The fatal line names the mesh path, and NX2NAVI_VK_NOOPT's default applies with mesh_fallback = 0 alone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
49 lines
3.2 KiB
C
49 lines
3.2 KiB
C
// How the game's task and mesh programs are drawn (vk_device.c create_device). Header only, so that
|
|
// tests/mesh_path_check.c checks the decision without a device.
|
|
//
|
|
// native VK_EXT_mesh_shader pipelines
|
|
// fallback the mesh fallback: the programs run as compute passes and an ordinary draw reads what they wrote
|
|
// (vk_exec_draw.c "mesh fallback", vk_mesh_fb.c)
|
|
// emulation the mesh emulation (mesh_emulation = 1 on a device without mesh shaders, vk_exec_draw.c)
|
|
// none a device without mesh shaders with both off: mesh draws are skipped
|
|
//
|
|
// mesh_fallback = auto (the default) takes the fallback on a device without mesh shaders, and on AMD's Windows driver
|
|
// for RDNA 1 and 2 (vk_caps.amd_sc), which has them on RDNA 2. That driver lost the device ("No fault detected", a
|
|
// timeout) minutes into play on RX 6600 to RX 6950 XT cards in every version from 0.6.0 to 0.9.2 (0.10.x built its mesh
|
|
// pipelines without the driver's optimiser, NX2NAVI_VK_NOOPT, which no reporter has confirmed), with the pipeline
|
|
// library, the replay workers, the asynchronous replay, the lazy write-back and the low-end GPU mode each on and off.
|
|
// Where the pass marks named the pass the GPU was in, it was one that starts with a native mesh draw. The same driver
|
|
// on RDNA 1 has no mesh shaders and draws through this fallback, and AMD's driver for RDNA 3 and 4 (LLPC) draws them
|
|
// natively; neither has such a report. That the native mesh path is the cause is not shown: the fallback is what the
|
|
// marks leave to try, at the cost of a compute pass and a pass break per mesh draw, and of mesh programs that are
|
|
// left out of the picture until their compute passes are built, at their first sight in a run. mesh_fallback = 0
|
|
// draws them natively again; 1 takes the fallback on every device.
|
|
#pragma once
|
|
#include <string.h>
|
|
|
|
enum { MESH_PATH_NATIVE, MESH_PATH_FALLBACK, MESH_PATH_EMULATION, MESH_PATH_NONE };
|
|
|
|
// has_mesh: the device has VK_EXT_mesh_shader with task and mesh shaders; amd_sc: AMD's Windows driver for RDNA 1 and
|
|
// 2; fallback: the mesh_fallback setting ("auto", "0", "1"; anything else reads as auto); emulation: mesh_emulation
|
|
// ("0" off). *why: the reason, for the boot line.
|
|
static inline int mesh_path_decide(int has_mesh, int amd_sc, const char *fallback, const char *emulation,
|
|
const char **why) {
|
|
const char *w;
|
|
int path;
|
|
if (!has_mesh && strcmp(emulation, "0"))
|
|
path = MESH_PATH_EMULATION, w = "mesh_emulation = 1 on a device without mesh shaders";
|
|
else if (!strcmp(fallback, "1"))
|
|
path = MESH_PATH_FALLBACK, w = "mesh_fallback = 1";
|
|
else if (!strcmp(fallback, "0"))
|
|
path = has_mesh ? MESH_PATH_NATIVE : MESH_PATH_NONE, w = "mesh_fallback = 0";
|
|
else if (!has_mesh)
|
|
path = MESH_PATH_FALLBACK, w = "this device has no mesh shaders";
|
|
else if (amd_sc)
|
|
path = MESH_PATH_FALLBACK, w = "the default on AMD's driver for RDNA 1 and 2, where native mesh pipelines lost "
|
|
"the device in play; mesh_fallback = 0 draws them natively";
|
|
else
|
|
path = MESH_PATH_NATIVE, w = "VK_EXT_mesh_shader";
|
|
if (why) *why = w;
|
|
return path;
|
|
}
|