Vulkan: Report surface init failures instead of asserting later

VulkanGraphicsContext::InitSurface() threw away VulkanContext::InitSurface()'s
VkResult and carried on, so a failed surface init surfaced as
_dbg_assert_(GetAvailablePresentModes().size() > 0) in the VKContext
constructor rather than as a graphics error with the usual backend fallback.
The vkCreate*SurfaceKHR failure path in ReinitSurface() didn't log anything
either, so the assert was the only trace of it.

Now ReinitSurface() logs and sets init_error_ for all three ways it can bail
(surface creation, ChooseQueue, present mode enumeration), InitSurface()
checks the result, and MainThreadFunc() passes the message back out instead of
writing it to a local it then drops - Windows/main.cpp was reporting
"Failed to initialize main thread function." to the user.

Also deletes the Application on that failure path, which was leaked.
This commit is contained in:
Henrik Rydgård committed 2026-08-30 01:18:37 +02:00
1 parent 31daeb4b6c
commit f7c2c55e83
6 files changed
+39 -11

No files matched your search

+6 -2
View File
@@ -884,10 +884,14 @@ int main(int argc, const char* argv[]) {
}
int retval = 0;
MainThreadFunc(graphicsContext, new HeadlessApplication(), windowDesc, [&retval, &coreParameter, &testOptions, &testFilenames](GraphicsContext *graphicsContext) {
if (!MainThreadFunc(graphicsContext, new HeadlessApplication(), windowDesc, [&retval, &coreParameter, &testOptions, &testFilenames](GraphicsContext *graphicsContext) {
retval = RunTests(graphicsContext, coreParameter, testOptions, testFilenames);
return false;
});
}, &errorMessage)) {
// No fallbacks in headless - if we can't run it, we can't. Let's not get confusing.
fprintf(stderr, "Failed to initialize graphics surface: %s\n", errorMessage.c_str());
retval = 1;
}
graphicsContext->ShutdownAPI();