It seems like there are no valid reasons to swallow segfaults from native Vulkan side. While returning an out of spec error instead of firing access violation may actually help some games to continue working after driver crash that leads to obscure errors. Also, Vulkan is left in the undefined state.
From: Paul Gofman pgofman@codeweavers.com
--- dlls/winevulkan/vulkan_loader.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/dlls/winevulkan/vulkan_loader.h b/dlls/winevulkan/vulkan_loader.h index 2efa56e0193..62ab59e32d2 100644 --- a/dlls/winevulkan/vulkan_loader.h +++ b/dlls/winevulkan/vulkan_loader.h @@ -98,9 +98,19 @@ struct wine_vk_debug_report_params extern const struct unix_funcs *unix_funcs; extern unixlib_handle_t unix_handle DECLSPEC_HIDDEN;
-static inline NTSTATUS vk_unix_call(enum unix_call code, void *params) +#define vk_unix_call(code, params) vk_unix_call_(__FUNCTION__, code, params) +static inline NTSTATUS vk_unix_call_(const char * function, enum unix_call code, void *params) { - return __wine_unix_call(unix_handle, code, params); + NTSTATUS ret; + if ((ret = __wine_unix_call(unix_handle, code, params)) == STATUS_ACCESS_VIOLATION) + { + volatile int *null_ptr = NULL; + + MESSAGE("wine: winevulkan: access violation calling %u from %s.\n", code, function); + /* Propagate access violation. */ + *null_ptr = 1; + } + return ret; }
struct unix_funcs