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>
This commit is contained in:
Georg Lehmann 2021-08-20 13:24:50 +02:00 committed by Alexandre Julliard
parent 11cfbe5c89
commit fc8dcb53c2
6 changed files with 16 additions and 3 deletions

View file

@ -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

View file

@ -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 */

View file

@ -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")

View file

@ -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);
}

View file

@ -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 */

View file

@ -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,
};