[PATCH v2 4/4] winevulkan: Return NULL for unavailable device functions.

Liam Middlebrook lmiddlebrook at nvidia.com
Fri Aug 20 13:07:04 CDT 2021


Signed-off-by: Liam Middlebrook <lmiddlebrook at 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 at 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 */
> 



More information about the wine-devel mailing list