Georg Lehmann : winevulkan: Return NULL for unavailable device functions.

Alexandre Julliard julliard at winehq.org
Fri Aug 20 16:12:56 CDT 2021


Module: wine
Branch: master
Commit: fc8dcb53c2cebf9a08d9c49a4f7fc021b79fc819
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=fc8dcb53c2cebf9a08d9c49a4f7fc021b79fc819

Author: Georg Lehmann <dadschoorse at 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 at gmail.com>
Signed-off-by: Liam Middlebrook <lmiddlebrook at nvidia.com>
Signed-off-by: Alexandre Julliard <julliard at 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,
 };




More information about the wine-cvs mailing list