winevulkan: Use __wine_unix_call for checking Vulkan functions availability.

This commit is contained in:
Jacek Caban 2022-08-25 22:30:56 +02:00 committed by Alexandre Julliard
parent 05d2576b1f
commit 395061e367
7 changed files with 43 additions and 15 deletions

View file

@ -88,6 +88,18 @@ static void *wine_vk_get_global_proc_addr(const char *name)
return NULL;
}
static BOOL is_available_instance_function(VkInstance instance, const char *name)
{
struct is_available_instance_function_params params = { .instance = instance, .name = name };
return vk_unix_call(unix_is_available_instance_function, &params);
}
static BOOL is_available_device_function(VkDevice device, const char *name)
{
struct is_available_device_function_params params = { .device = device, .name = name };
return vk_unix_call(unix_is_available_device_function, &params);
}
PFN_vkVoidFunction WINAPI vkGetInstanceProcAddr(VkInstance instance, const char *name)
{
void *func;
@ -111,7 +123,7 @@ PFN_vkVoidFunction WINAPI vkGetInstanceProcAddr(VkInstance instance, const char
return NULL;
}
if (!unix_funcs->p_is_available_instance_function(instance, name))
if (!is_available_instance_function(instance, name))
return NULL;
func = wine_vk_get_instance_proc_addr(name);
@ -142,7 +154,7 @@ PFN_vkVoidFunction WINAPI vkGetDeviceProcAddr(VkDevice device, const char *name)
* vkCommandBuffer or vkQueue.
* Loader takes care of filtering of extensions which are enabled or not.
*/
if (unix_funcs->p_is_available_device_function(device, name))
if (is_available_device_function(device, name))
{
func = wine_vk_get_device_proc_addr(name);
if (func)
@ -176,7 +188,7 @@ void * WINAPI vk_icdGetPhysicalDeviceProcAddr(VkInstance instance, const char *n
{
TRACE("%p, %s\n", instance, debugstr_a(name));
if (!unix_funcs->p_is_available_instance_function(instance, name))
if (!is_available_instance_function(instance, name))
return NULL;
return wine_vk_get_phys_dev_proc_addr(name);

View file

@ -15,6 +15,8 @@
enum unix_call
{
unix_init,
unix_is_available_instance_function,
unix_is_available_device_function,
unix_vkAcquireNextImage2KHR,
unix_vkAcquireNextImageKHR,
unix_vkAcquirePerformanceConfigurationINTEL,

View file

@ -2839,6 +2839,8 @@ class VkGenerator(object):
f.write("const unixlib_entry_t __wine_unix_call_funcs[] =\n")
f.write("{\n")
f.write(" init_vulkan,\n")
f.write(" vk_is_available_instance_function,\n")
f.write(" vk_is_available_device_function,\n")
for vk_func in self.registry.funcs.values():
if not vk_func.needs_exposing():
continue
@ -2857,8 +2859,6 @@ class VkGenerator(object):
f.write("const struct unix_funcs loader_funcs =\n")
f.write("{\n")
f.write(" wine_vk_call,\n")
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):
@ -3050,6 +3050,8 @@ class VkGenerator(object):
f.write("enum unix_call\n")
f.write("{\n")
f.write(" unix_init,\n")
f.write(" unix_is_available_instance_function,\n")
f.write(" unix_is_available_device_function,\n")
for vk_func in self.registry.funcs.values():
if not vk_func.needs_exposing():
continue

View file

@ -1872,12 +1872,14 @@ NTSTATUS wine_vkCreateRayTracingPipelinesNV(void *args)
return res;
}
BOOL WINAPI wine_vk_is_available_instance_function(VkInstance instance, const char *name)
NTSTATUS vk_is_available_instance_function(void *arg)
{
return !!vk_funcs->p_vkGetInstanceProcAddr(instance->instance, name);
struct is_available_instance_function_params *params = arg;
return !!vk_funcs->p_vkGetInstanceProcAddr(params->instance->instance, params->name);
}
BOOL WINAPI wine_vk_is_available_device_function(VkDevice device, const char *name)
NTSTATUS vk_is_available_device_function(void *arg)
{
return !!vk_funcs->p_vkGetDeviceProcAddr(device->device, name);
struct is_available_device_function_params *params = arg;
return !!vk_funcs->p_vkGetDeviceProcAddr(params->device->device, params->name);
}

View file

@ -94,6 +94,18 @@ struct wine_vk_debug_report_params
const char *message;
};
struct is_available_instance_function_params
{
VkInstance instance;
const char *name;
};
struct is_available_device_function_params
{
VkDevice device;
const char *name;
};
extern const struct unix_funcs *unix_funcs;
extern unixlib_handle_t unix_handle DECLSPEC_HIDDEN;
@ -105,8 +117,6 @@ static inline NTSTATUS vk_unix_call(enum unix_call code, void *params)
struct unix_funcs
{
NTSTATUS (WINAPI *p_vk_call)(enum unix_call, void *);
BOOL (WINAPI *p_is_available_instance_function)(VkInstance, const char *);
BOOL (WINAPI *p_is_available_device_function)(VkDevice, const char *);
};
#endif /* __WINE_VULKAN_LOADER_H */

View file

@ -214,7 +214,7 @@ NTSTATUS init_vulkan(void *args) DECLSPEC_HIDDEN;
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;
NTSTATUS vk_is_available_instance_function(void *arg) DECLSPEC_HIDDEN;
NTSTATUS vk_is_available_device_function(void *arg) DECLSPEC_HIDDEN;
#endif /* __WINE_VULKAN_PRIVATE_H */

View file

@ -10289,6 +10289,8 @@ uint64_t wine_vk_unwrap_handle(VkObjectType type, uint64_t handle)
const unixlib_entry_t __wine_unix_call_funcs[] =
{
init_vulkan,
vk_is_available_instance_function,
vk_is_available_device_function,
wine_vkAcquireNextImage2KHR,
wine_vkAcquireNextImageKHR,
wine_vkAcquirePerformanceConfigurationINTEL,
@ -10757,6 +10759,4 @@ static NTSTATUS WINAPI wine_vk_call(enum unix_call code, void *params)
const struct unix_funcs loader_funcs =
{
wine_vk_call,
wine_vk_is_available_instance_function,
wine_vk_is_available_device_function,
};