On 18.11.20 23:42, Paul Gofman wrote:
I was testing Serious Sam 4 crash on start on Nvidia and found that it also happens due to debug function implementation in winevulkan. More precisely, in case of Serious Sam, the crash happens in host vkSetDebugUtilsObjectNameEXT() when called with objectType VK_OBJECT_TYPE_SURFACE_KHR. wine_vk_unwrap_handle() returns an unwrapped handler for this object type, while the native handle is actually wrapped in struct wine_vk_surfaceby wine driver (winex11.drv). I tested that correctly unwrapping it fixes the crash.
I wasn't aware that the wine drivers wrap VkSurfaceKHR, but now that I think about it makes sense.
I am a bit unsure how to properly fix it. The straightforward way is to
pull all the debug functions to wine[x11|mac].drv, but that means pulling rather lot. Besides, debugging functions have to be queried from device which winex11 currently doesn't do so we would probably need to also pull vkCreateDevice() to initialize native function pointers.
This would duplicate a lot of code and make changes harder. I would like to avoid this solution.
The other much shorter way would be to export the unwrapping function from the wine driver which will be unwrapping handles wrapped in there. It would probably be unfortunate to introduce a special export for that, maybe we could put it in the generated 'struct vulkan_funcs' somehow?
That would fix the unwrapping issue, but it's not really a full solution: We also need to handle VkSurfaceKHR in the debug callbacks wrappers.
Any suggestions?
Another solution is defining a struct similar to this:
struct wine_vk_driver_surface_base { VkSurfaceKHR surface; /* native surface */ struct wine_vk_mapping mapping; };
The wine drivers would use that as the first member in their wrapper, set the native surface and winevulkan can handle VkSurfaceKHR like every other wrapped handle. I have already done a bit of work [0] on that and it should fix your issue.
Thanks,
Georg Lehmann
[0] - https://github.com/DadSchoorse/wine/tree/wrapped-surface