[PATCH 4/4] winevulkan: Return NULL for unavailable device functions.
Georg Lehmann
dadschoorse at gmail.com
Sat Jul 3 11:42:13 CDT 2021
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51360
Signed-off-by: Georg Lehmann <dadschoorse at gmail.com>
---
dlls/winevulkan/loader.c | 12 +++++++++---
dlls/winevulkan/make_vulkan | 2 ++
dlls/winevulkan/vulkan.c | 8 ++++++++
dlls/winevulkan/vulkan_private.h | 1 +
4 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c
index 4857a0adc7a..1f39373698f 100644
--- a/dlls/winevulkan/loader.c
+++ b/dlls/winevulkan/loader.c
@@ -147,9 +147,15 @@ 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, FALSE))
+ {
+ func = wine_vk_get_device_proc_addr(name);
+ if (func)
+ return func;
+ }
+
+ if (!unix_funcs->p_is_available_device_function(device, name, TRUE))
+ return NULL;
/* 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 ec2049c85eb..362948cb990 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -2777,6 +2777,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):
@@ -2980,6 +2981,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 *, BOOL);\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..39261f1a1b3 100644
--- a/dlls/winevulkan/vulkan.c
+++ b/dlls/winevulkan/vulkan.c
@@ -1610,3 +1610,11 @@ 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, BOOL check_instance)
+{
+ if (check_instance)
+ return wine_vk_is_available_instance_function(device->phys_dev->instance, 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..040aca86756 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, BOOL check_instance) DECLSPEC_HIDDEN;
#endif /* __WINE_VULKAN_PRIVATE_H */
--
2.32.0
More information about the wine-devel
mailing list