On 03.07.21 20:45, Liam Middlebrook wrote:
I like how simple this solution is.
At first I was a bit worried that this would make the outstanding patchset from Derek Lesho more complex, but I think the same strategy you're applying here for a map of Win32 function to Unix platform function could be applied. That said, it's still not the cleanest feeling.
When I filed https://bugs.winehq.org/show_bug.cgi?id=51360 I was thinking a solution for this would look like the follow steps (roughly):
- Add logic in make_vulkan to correspond what extensions must be
supported by the host implementation for a command to be enabled.
- At Get*ProcAddr time check that function name against the list of
extensions, and ensure that said extensions are supported by the VkInstance/VkDevice.
You're solution is a lot simpler, and I like it. But I can't help but worry that with Derek's pending work (or any potential future work in the same vein) this will cause issues.
Yes, for platform specific extensions we have to manually replace the name of the win32 function. For Derek's (CC'ed) patches this should be relatively simple as far as I can tell, vkGetMemoryWin32HandleKHR maps to vkGetMemoryFdKHR and vkGetMemoryWin32HandlePropertiesKHR to vkGetMemoryFdPropertiesKHR. It's the same story for the external semaphore/fence extensions, if we ever get around to support those.
I share your general skepticism but given that there aren't many platform specific extensions and I see none which could cause issues, I think this is good enough. If we have to in the future, we can still go for something similar to your proposed solution. But I don't really want to make make_vulkan more complex without a good reason.
Thanks,
Georg Lehmann
I'm not conceptually opposed to this, but I want to make sure the implications of this simpler solution are discussed before I give my sign-off on it.
Thanks,
Liam Middlebrook
On 7/3/21 9:42 AM, Georg Lehmann wrote:
Signed-off-by: Georg Lehmann dadschoorse@gmail.com
dlls/winex11.drv/vulkan.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index bdc287afeea..1bbdba2ce1d 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -435,12 +435,25 @@ static VkResult X11DRV_vkGetDeviceGroupSurfacePresentModesKHR(VkDevice device, return pvkGetDeviceGroupSurfacePresentModesKHR(device, x11_surface->surface, flags); } +static const char *wine_vk_native_fn_name(const char *name) +{ + if (!strcmp(name, "vkCreateWin32SurfaceKHR")) + return "vkCreateXlibSurfaceKHR"; + if (!strcmp(name, "vkGetPhysicalDeviceWin32PresentationSupportKHR")) + return "vkGetPhysicalDeviceXlibPresentationSupportKHR";
+ return name; +}
static void *X11DRV_vkGetDeviceProcAddr(VkDevice device, const char *name) { void *proc_addr; TRACE("%p, %s\n", device, debugstr_a(name)); + if (!pvkGetDeviceProcAddr(device, wine_vk_native_fn_name(name))) + return NULL;
if ((proc_addr = X11DRV_get_vk_device_proc_addr(name))) return proc_addr; @@ -453,6 +466,9 @@ static void *X11DRV_vkGetInstanceProcAddr(VkInstance instance, const char *name) TRACE("%p, %s\n", instance, debugstr_a(name)); + if (!pvkGetInstanceProcAddr(instance, wine_vk_native_fn_name(name))) + return NULL;
if ((proc_addr = X11DRV_get_vk_instance_proc_addr(instance, name))) return proc_addr;