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;
Signed-off-by: Georg Lehmann dadschoorse@gmail.com --- dlls/winemac.drv/vulkan.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 21ebcc56519..f546e3ccfa5 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -420,12 +420,32 @@ static VkResult macdrv_vkEnumerateInstanceExtensionProperties(const char *layer_ return res; }
+static const char *wine_vk_native_fn_name(const char *name) +{ + const char *create_surface_name = + pvkCreateMetalSurfaceEXT ? "vkCreateMetalSurfaceEXT" : "vkCreateMacOSSurfaceMVK"; + + if (!strcmp(name, "vkCreateWin32SurfaceKHR")) + return create_surface_name; + /* We just need something where non-NULL is returned if the correct extension is enabled. + * So since there is no native equivalent of this function check for the create + * surface function. + */ + if (!strcmp(name, "vkGetPhysicalDeviceWin32PresentationSupportKHR")) + return create_surface_name; + + return name; +} + static void *macdrv_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 = macdrv_get_vk_device_proc_addr(name))) return proc_addr;
@@ -438,6 +458,9 @@ static void *macdrv_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 = macdrv_get_vk_instance_proc_addr(instance, name))) return proc_addr;
Signed-off-by: Liam Middlebrook lmiddlebrook@nvidia.com
On 8/20/21 4:24 AM, Georg Lehmann wrote:
Signed-off-by: Georg Lehmann dadschoorse@gmail.com
dlls/winemac.drv/vulkan.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 21ebcc56519..f546e3ccfa5 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -420,12 +420,32 @@ static VkResult macdrv_vkEnumerateInstanceExtensionProperties(const char *layer_ return res; }
+static const char *wine_vk_native_fn_name(const char *name) +{
- const char *create_surface_name =
pvkCreateMetalSurfaceEXT ? "vkCreateMetalSurfaceEXT" : "vkCreateMacOSSurfaceMVK";
- if (!strcmp(name, "vkCreateWin32SurfaceKHR"))
return create_surface_name;
- /* We just need something where non-NULL is returned if the correct extension is enabled.
* So since there is no native equivalent of this function check for the create
* surface function.
*/
- if (!strcmp(name, "vkGetPhysicalDeviceWin32PresentationSupportKHR"))
return create_surface_name;
- return name;
+}
static void *macdrv_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 = macdrv_get_vk_device_proc_addr(name))) return proc_addr;
@@ -438,6 +458,9 @@ static void *macdrv_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 = macdrv_get_vk_instance_proc_addr(instance, name))) return proc_addr;
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49542 Signed-off-by: Georg Lehmann dadschoorse@gmail.com --- dlls/winevulkan/loader.c | 6 ++++++ dlls/winevulkan/make_vulkan | 4 ++++ dlls/winevulkan/vulkan.c | 5 +++++ dlls/winevulkan/vulkan_private.h | 2 ++ 4 files changed, 17 insertions(+)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index 6bc32620bba..4857a0adc7a 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -116,6 +116,9 @@ PFN_vkVoidFunction WINAPI vkGetInstanceProcAddr(VkInstance instance, const char return NULL; }
+ if (!unix_funcs->p_is_available_instance_function(instance, name)) + return NULL; + func = wine_vk_get_instance_proc_addr(name); if (func) return func;
@@ -175,6 +178,9 @@ void * WINAPI vk_icdGetPhysicalDeviceProcAddr(VkInstance instance, const char *n { TRACE("%p, %s\n", instance, debugstr_a(name));
+ if (!unix_funcs->p_is_available_instance_function(instance, name)) + return NULL; + return wine_vk_get_phys_dev_proc_addr(name); }
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 55b5b71691e..760c460b6fe 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -2788,6 +2788,7 @@ class VkGenerator(object): continue
f.write(" &{1}{0},\n".format(vk_func.name, prefix)) + f.write(" &wine_vk_is_available_instance_function,\n") f.write("};\n")
def generate_thunks_h(self, f, prefix): @@ -2988,6 +2989,9 @@ class VkGenerator(object): continue
f.write(" {0};\n".format(vk_func.pfn(conv=False, call_conv="WINAPI"))) + f.write("\n") + f.write(" /* winevulkan specific functions */\n") + f.write(" BOOL (WINAPI *p_is_available_instance_function)(VkInstance, const char *);\n") f.write("};\n\n")
f.write("#endif /* __WINE_VULKAN_LOADER_THUNKS_H */\n") diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index fb0ffbdfe6c..3658a4378cb 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1605,3 +1605,8 @@ void WINAPI wine_vkDestroyDebugReportCallbackEXT(
free(object); } + +BOOL WINAPI wine_vk_is_available_instance_function(VkInstance instance, const char *name) +{ + return !!vk_funcs->p_vkGetInstanceProcAddr(instance->instance, name); +} diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index 83dc90ca15e..ce83b2b7032 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -212,4 +212,6 @@ uint64_t wine_vk_unwrap_handle(VkObjectType type, uint64_t handle) DECLSPEC_HIDD
extern const struct unix_funcs loader_funcs;
+BOOL WINAPI wine_vk_is_available_instance_function(VkInstance instance, const char *name) DECLSPEC_HIDDEN; + #endif /* __WINE_VULKAN_PRIVATE_H */
Signed-off-by: Liam Middlebrook lmiddlebrook@nvidia.com
On 8/20/21 4:24 AM, Georg Lehmann wrote:
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49542 Signed-off-by: Georg Lehmann dadschoorse@gmail.com
dlls/winevulkan/loader.c | 6 ++++++ dlls/winevulkan/make_vulkan | 4 ++++ dlls/winevulkan/vulkan.c | 5 +++++ dlls/winevulkan/vulkan_private.h | 2 ++ 4 files changed, 17 insertions(+)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index 6bc32620bba..4857a0adc7a 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -116,6 +116,9 @@ PFN_vkVoidFunction WINAPI vkGetInstanceProcAddr(VkInstance instance, const char return NULL; }
- if (!unix_funcs->p_is_available_instance_function(instance, name))
return NULL;
func = wine_vk_get_instance_proc_addr(name); if (func) return func;
@@ -175,6 +178,9 @@ void * WINAPI vk_icdGetPhysicalDeviceProcAddr(VkInstance instance, const char *n { TRACE("%p, %s\n", instance, debugstr_a(name));
- if (!unix_funcs->p_is_available_instance_function(instance, name))
return NULL;
}return wine_vk_get_phys_dev_proc_addr(name);
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 55b5b71691e..760c460b6fe 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -2788,6 +2788,7 @@ class VkGenerator(object): continue
f.write(" &{1}{0},\n".format(vk_func.name, prefix))
f.write(" &wine_vk_is_available_instance_function,\n") f.write("};\n") def generate_thunks_h(self, f, prefix):
@@ -2988,6 +2989,9 @@ class VkGenerator(object): continue
f.write(" {0};\n".format(vk_func.pfn(conv=False, call_conv="WINAPI")))
f.write("\n")
f.write(" /* winevulkan specific functions */\n")
f.write(" BOOL (WINAPI *p_is_available_instance_function)(VkInstance, const char *);\n") f.write("};\n\n") f.write("#endif /* __WINE_VULKAN_LOADER_THUNKS_H */\n")
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index fb0ffbdfe6c..3658a4378cb 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1605,3 +1605,8 @@ void WINAPI wine_vkDestroyDebugReportCallbackEXT(
free(object);
}
+BOOL WINAPI wine_vk_is_available_instance_function(VkInstance instance, const char *name) +{
- return !!vk_funcs->p_vkGetInstanceProcAddr(instance->instance, name);
+} diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index 83dc90ca15e..ce83b2b7032 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -212,4 +212,6 @@ uint64_t wine_vk_unwrap_handle(VkObjectType type, uint64_t handle) DECLSPEC_HIDD
extern const struct unix_funcs loader_funcs;
+BOOL WINAPI wine_vk_is_available_instance_function(VkInstance instance, const char *name) DECLSPEC_HIDDEN;
- #endif /* __WINE_VULKAN_PRIVATE_H */
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51360 Signed-off-by: Georg Lehmann dadschoorse@gmail.com --- dlls/winevulkan/loader.c | 9 ++++++--- dlls/winevulkan/make_vulkan | 2 ++ dlls/winevulkan/vulkan.c | 5 +++++ dlls/winevulkan/vulkan_private.h | 1 + 4 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index 4857a0adc7a..86684cdf00c 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -147,9 +147,12 @@ PFN_vkVoidFunction WINAPI vkGetDeviceProcAddr(VkDevice device, const char *name) * vkCommandBuffer or vkQueue. * Loader takes care of filtering of extensions which are enabled or not. */ - func = wine_vk_get_device_proc_addr(name); - if (func) - return func; + if (unix_funcs->p_is_available_device_function(device, name)) + { + func = wine_vk_get_device_proc_addr(name); + if (func) + return func; + }
/* vkGetDeviceProcAddr was intended for loading device and subdevice functions. * idTech 6 titles such as Doom and Wolfenstein II, however use it also for diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 760c460b6fe..ef4693651d2 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -2789,6 +2789,7 @@ class VkGenerator(object):
f.write(" &{1}{0},\n".format(vk_func.name, prefix)) f.write(" &wine_vk_is_available_instance_function,\n") + f.write(" &wine_vk_is_available_device_function,\n") f.write("};\n")
def generate_thunks_h(self, f, prefix): @@ -2992,6 +2993,7 @@ class VkGenerator(object): f.write("\n") f.write(" /* winevulkan specific functions */\n") f.write(" BOOL (WINAPI *p_is_available_instance_function)(VkInstance, const char *);\n") + f.write(" BOOL (WINAPI *p_is_available_device_function)(VkDevice, const char *);\n") f.write("};\n\n")
f.write("#endif /* __WINE_VULKAN_LOADER_THUNKS_H */\n") diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 3658a4378cb..6f90db9736e 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1610,3 +1610,8 @@ BOOL WINAPI wine_vk_is_available_instance_function(VkInstance instance, const ch { return !!vk_funcs->p_vkGetInstanceProcAddr(instance->instance, name); } + +BOOL WINAPI wine_vk_is_available_device_function(VkDevice device, const char *name) +{ + return !!vk_funcs->p_vkGetDeviceProcAddr(device->device, name); +} diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index ce83b2b7032..6aa60f8c9ae 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -213,5 +213,6 @@ uint64_t wine_vk_unwrap_handle(VkObjectType type, uint64_t handle) DECLSPEC_HIDD extern const struct unix_funcs loader_funcs;
BOOL WINAPI wine_vk_is_available_instance_function(VkInstance instance, const char *name) DECLSPEC_HIDDEN; +BOOL WINAPI wine_vk_is_available_device_function(VkDevice device, const char *name) DECLSPEC_HIDDEN;
#endif /* __WINE_VULKAN_PRIVATE_H */
Signed-off-by: Liam Middlebrook lmiddlebrook@nvidia.com
On 8/20/21 4:24 AM, Georg Lehmann wrote:
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51360 Signed-off-by: Georg Lehmann dadschoorse@gmail.com
dlls/winevulkan/loader.c | 9 ++++++--- dlls/winevulkan/make_vulkan | 2 ++ dlls/winevulkan/vulkan.c | 5 +++++ dlls/winevulkan/vulkan_private.h | 1 + 4 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index 4857a0adc7a..86684cdf00c 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -147,9 +147,12 @@ PFN_vkVoidFunction WINAPI vkGetDeviceProcAddr(VkDevice device, const char *name) * vkCommandBuffer or vkQueue. * Loader takes care of filtering of extensions which are enabled or not. */
- func = wine_vk_get_device_proc_addr(name);
- if (func)
return func;
if (unix_funcs->p_is_available_device_function(device, name))
{
func = wine_vk_get_device_proc_addr(name);
if (func)
return func;
}
/* vkGetDeviceProcAddr was intended for loading device and subdevice functions.
- idTech 6 titles such as Doom and Wolfenstein II, however use it also for
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 760c460b6fe..ef4693651d2 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -2789,6 +2789,7 @@ class VkGenerator(object):
f.write(" &{1}{0},\n".format(vk_func.name, prefix)) f.write(" &wine_vk_is_available_instance_function,\n")
f.write(" &wine_vk_is_available_device_function,\n") f.write("};\n") def generate_thunks_h(self, f, prefix):
@@ -2992,6 +2993,7 @@ class VkGenerator(object): f.write("\n") f.write(" /* winevulkan specific functions */\n") f.write(" BOOL (WINAPI *p_is_available_instance_function)(VkInstance, const char *);\n")
f.write(" BOOL (WINAPI *p_is_available_device_function)(VkDevice, const char *);\n") f.write("};\n\n") f.write("#endif /* __WINE_VULKAN_LOADER_THUNKS_H */\n")
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 3658a4378cb..6f90db9736e 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1610,3 +1610,8 @@ BOOL WINAPI wine_vk_is_available_instance_function(VkInstance instance, const ch { return !!vk_funcs->p_vkGetInstanceProcAddr(instance->instance, name); }
+BOOL WINAPI wine_vk_is_available_device_function(VkDevice device, const char *name) +{
- return !!vk_funcs->p_vkGetDeviceProcAddr(device->device, name);
+} diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index ce83b2b7032..6aa60f8c9ae 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -213,5 +213,6 @@ uint64_t wine_vk_unwrap_handle(VkObjectType type, uint64_t handle) DECLSPEC_HIDD extern const struct unix_funcs loader_funcs;
BOOL WINAPI wine_vk_is_available_instance_function(VkInstance instance, const char *name) DECLSPEC_HIDDEN; +BOOL WINAPI wine_vk_is_available_device_function(VkDevice device, const char *name) DECLSPEC_HIDDEN;
#endif /* __WINE_VULKAN_PRIVATE_H */
Thanks for re-sending this. After a month or so to think it over, I think this is the right solution given the information we have coming to us from the specification. I also expect that this will fix some of the failing Vulkan CTS test cases where the finer rules for vk*GetProcAddress were exercised.
Signed-off-by: Liam Middlebrook lmiddlebrook@nvidia.com
On 8/20/21 4:24 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;