Module: wine Branch: master Commit: fc8dcb53c2cebf9a08d9c49a4f7fc021b79fc819 URL: https://source.winehq.org/git/wine.git/?a=commit;h=fc8dcb53c2cebf9a08d9c49a4...
Author: Georg Lehmann dadschoorse@gmail.com Date: Fri Aug 20 13:24:50 2021 +0200
winevulkan: Return NULL for unavailable device functions.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51360 Signed-off-by: Georg Lehmann dadschoorse@gmail.com Signed-off-by: Liam Middlebrook lmiddlebrook@nvidia.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winevulkan/loader.c | 9 ++++++--- dlls/winevulkan/loader_thunks.h | 1 + dlls/winevulkan/make_vulkan | 2 ++ dlls/winevulkan/vulkan.c | 5 +++++ dlls/winevulkan/vulkan_private.h | 1 + dlls/winevulkan/vulkan_thunks.c | 1 + 6 files changed, 16 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/loader_thunks.h b/dlls/winevulkan/loader_thunks.h index fa0c3155658..516cb0f17c2 100644 --- a/dlls/winevulkan/loader_thunks.h +++ b/dlls/winevulkan/loader_thunks.h @@ -422,6 +422,7 @@ struct unix_funcs
/* winevulkan specific functions */ BOOL (WINAPI *p_is_available_instance_function)(VkInstance, const char *); + BOOL (WINAPI *p_is_available_device_function)(VkDevice, const char *); };
#endif /* __WINE_VULKAN_LOADER_THUNKS_H */ 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 */ diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index b19e3f73dae..a65e544f1f9 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -8720,4 +8720,5 @@ const struct unix_funcs loader_funcs = &wine_vkWaitSemaphoresKHR, &wine_vkWriteAccelerationStructuresPropertiesKHR, &wine_vk_is_available_instance_function, + &wine_vk_is_available_device_function, };