fix(vulkan): MSAA crash on AMD RADV due to vkCreateRenderPass2 null dispatch
Some checks are pending
Build / Build (arm64) (push) Waiting to run
Build / Build (x86-64) (push) Waiting to run
Build / Build (macOS arm64) (push) Waiting to run
Build / Build (windows-arm64) (push) Waiting to run
Build / Build (windows-x86-64) (push) Waiting to run
Security / CodeQL (C/C++) (push) Waiting to run
Security / Semgrep (push) Waiting to run
Security / Sanitizer Build (ASan/UBSan) (push) Waiting to run

Instance was created with Vulkan 1.1 but depthResolveSupported_ was gated
on the physical device's API version (1.2+ on RADV). This caused
vkCreateRenderPass2 (core 1.2) to dispatch through a null function pointer
when MSAA was enabled. Now requests 1.2 instance with 1.1 minimum fallback
and gates depth resolve on the actual instance API version. Also removes
all diagnostic crash-phase instrumentation from the previous investigation.
This commit is contained in:
Kelsi 2026-04-03 20:58:32 -07:00
parent 9c4e61a227
commit 17c16150d6
6 changed files with 22 additions and 89 deletions

View file

@ -27,10 +27,6 @@ static void releaseMouseGrab() {
static void releaseMouseGrab() {}
#endif
// Render-phase marker set by GameScreen::render() — lets crash handler
// identify which render call was active when backtrace is incomplete.
extern volatile const char* g_crashRenderPhase;
#ifdef __linux__
static void crashHandlerSigaction(int sig, siginfo_t* info, void* /*ucontext*/) {
releaseMouseGrab();
@ -39,15 +35,14 @@ static void crashHandlerSigaction(int sig, siginfo_t* info, void* /*ucontext*/)
const char* sigName = (sig == SIGSEGV) ? "SIGSEGV" :
(sig == SIGABRT) ? "SIGABRT" :
(sig == SIGFPE) ? "SIGFPE" : "UNKNOWN";
const char* phase = (const char*)g_crashRenderPhase;
void* faultAddr = info ? info->si_addr : nullptr;
fprintf(stderr, "\n=== CRASH: signal %s (%d) renderPhase=%s faultAddr=%p ===\n",
sigName, sig, phase ? phase : "?", faultAddr);
fprintf(stderr, "\n=== CRASH: signal %s (%d) faultAddr=%p ===\n",
sigName, sig, faultAddr);
backtrace_symbols_fd(frames, n, STDERR_FILENO);
FILE* f = fopen("/tmp/wowee_debug.log", "a");
if (f) {
fprintf(f, "\n=== CRASH: signal %s (%d) renderPhase=%s faultAddr=%p ===\n",
sigName, sig, phase ? phase : "?", faultAddr);
fprintf(f, "\n=== CRASH: signal %s (%d) faultAddr=%p ===\n",
sigName, sig, faultAddr);
fflush(f);
backtrace_symbols_fd(frames, n, fileno(f));
fclose(f);