From: Jacek Caban jacek@codeweavers.com
--- dlls/winevulkan/loader.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index 1c45c036c18..fa596c1f9e5 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -242,7 +242,7 @@ VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, params.pCreateInfo = create_info; params.pAllocator = allocator; params.pInstance = instance; - return unix_funcs->p_vk_call(unix_vkCreateInstance, ¶ms); + return vk_unix_call(unix_vkCreateInstance, ¶ms); }
VkResult WINAPI vkEnumerateInstanceExtensionProperties(const char *layer_name, @@ -267,7 +267,7 @@ VkResult WINAPI vkEnumerateInstanceExtensionProperties(const char *layer_name, params.pLayerName = layer_name; params.pPropertyCount = count; params.pProperties = properties; - return unix_funcs->p_vk_call(unix_vkEnumerateInstanceExtensionProperties, ¶ms); + return vk_unix_call(unix_vkEnumerateInstanceExtensionProperties, ¶ms); }
VkResult WINAPI vkEnumerateInstanceVersion(uint32_t *version) @@ -283,7 +283,7 @@ VkResult WINAPI vkEnumerateInstanceVersion(uint32_t *version) }
params.pApiVersion = version; - return unix_funcs->p_vk_call(unix_vkEnumerateInstanceVersion, ¶ms); + return vk_unix_call(unix_vkEnumerateInstanceVersion, ¶ms); }
static HANDLE get_display_device_init_mutex(void)
From: Jacek Caban jacek@codeweavers.com
--- dlls/winevulkan/loader.c | 18 +++++++++++++++--- dlls/winevulkan/make_vulkan | 6 ++++-- dlls/winevulkan/vulkan.c | 10 ++++++---- dlls/winevulkan/vulkan_loader.h | 14 ++++++++++++-- dlls/winevulkan/vulkan_private.h | 4 ++-- 5 files changed, 39 insertions(+), 13 deletions(-)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index fa596c1f9e5..d3f20e0d544 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -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, ¶ms); +} + +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, ¶ms); +} + 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); diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index cb5d8b948c2..0adbd9a0d3b 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -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 diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index da89cdd5ba2..4c2350927d5 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -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); } diff --git a/dlls/winevulkan/vulkan_loader.h b/dlls/winevulkan/vulkan_loader.h index 3ba945dbfcc..97aae6c438d 100644 --- a/dlls/winevulkan/vulkan_loader.h +++ b/dlls/winevulkan/vulkan_loader.h @@ -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 */ diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index 83a26988e8b..4a0f9b02a97 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -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 */
From: Jacek Caban jacek@codeweavers.com
--- dlls/winevulkan/loader.c | 6 ++++-- dlls/winevulkan/make_vulkan | 11 +++-------- dlls/winevulkan/vulkan.c | 2 +- dlls/winevulkan/vulkan_loader.h | 8 ++------ dlls/winevulkan/vulkan_private.h | 2 +- 5 files changed, 11 insertions(+), 18 deletions(-)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index d3f20e0d544..61e4eaf112d 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -34,7 +34,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(vulkan); DEFINE_DEVPROPKEY(DEVPROPKEY_GPU_LUID, 0x60b193cb, 0x5276, 0x4d0f, 0x96, 0xfc, 0xf1, 0x73, 0xab, 0xad, 0x3e, 0xc6, 2); DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_GPU_VULKAN_UUID, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5c, 2);
-const struct unix_funcs *unix_funcs; +NTSTATUS (WINAPI *p_vk_direct_unix_call)(unixlib_handle_t handle, unsigned int code, void *args); unixlib_handle_t unix_handle;
static HINSTANCE hinstance; @@ -231,7 +231,9 @@ static BOOL WINAPI wine_vk_init(INIT_ONCE *once, void *param, void **context) &unix_handle, sizeof(unix_handle), NULL)) return FALSE;
- return !vk_unix_call(unix_init, &unix_funcs); + if (vk_unix_call(unix_init, &p_vk_direct_unix_call)) return FALSE; + if (!p_vk_direct_unix_call) p_vk_direct_unix_call = __wine_unix_call; + return TRUE; }
static BOOL wine_vk_init_once(void) diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 0adbd9a0d3b..0463e3b78f7 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -176,7 +176,7 @@ class ThunkType(Enum): # - PUBLIC means the implementation is fully auto generated. # - PRIVATE thunks can be used in custom implementations for # struct conversion. -# - loader_thunk sets whether to create a thunk for unix_funcs. +# - loader_thunk sets whether to create a thunk for unix funcs. FUNCTION_OVERRIDES = { # Global functions "vkCreateInstance" : {"dispatch" : False, "driver" : True, "thunk" : ThunkType.NONE, "loader_thunk" : ThunkType.PRIVATE}, @@ -777,7 +777,7 @@ class VkFunction(object): if self.type != "void" and not self.returns_longlong(): body += "return " if self.needs_direct_call(): - body += "unix_funcs->p_vk_call(unix_{0}, ¶ms);\n".format(self.name) + body += "p_vk_direct_unix_call(unix_handle, unix_{0}, ¶ms);\n".format(self.name) else: body += "vk_unix_call(unix_{0}, ¶ms);\n".format(self.name) if self.returns_longlong(): @@ -2851,16 +2851,11 @@ class VkGenerator(object): f.write("};\n") f.write("C_ASSERT(ARRAYSIZE(__wine_unix_call_funcs) == unix_count);\n\n")
- f.write("static NTSTATUS WINAPI wine_vk_call(enum unix_call code, void *params)\n") + f.write("NTSTATUS WINAPI vk_direct_unix_call(unixlib_handle_t handle, unsigned int code, void *params)\n") f.write("{\n") f.write(" return __wine_unix_call_funcs[code](params);\n") f.write("}\n\n")
- f.write("const struct unix_funcs loader_funcs =\n") - f.write("{\n") - f.write(" wine_vk_call,\n") - f.write("};\n") - def generate_thunks_h(self, f, prefix): self._generate_copyright(f)
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 4c2350927d5..7f9026268bf 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -444,7 +444,7 @@ NTSTATUS init_vulkan(void *args) }
- *(const struct unix_funcs **)args = &loader_funcs; + *(void **)args = vk_direct_unix_call; return STATUS_SUCCESS; }
diff --git a/dlls/winevulkan/vulkan_loader.h b/dlls/winevulkan/vulkan_loader.h index 97aae6c438d..1bee2cb71c6 100644 --- a/dlls/winevulkan/vulkan_loader.h +++ b/dlls/winevulkan/vulkan_loader.h @@ -106,7 +106,8 @@ struct is_available_device_function_params const char *name; };
-extern const struct unix_funcs *unix_funcs; +extern NTSTATUS (WINAPI *p_vk_direct_unix_call)(unixlib_handle_t handle, unsigned int code, + void *args) DECLSPEC_HIDDEN; extern unixlib_handle_t unix_handle DECLSPEC_HIDDEN;
static inline NTSTATUS vk_unix_call(enum unix_call code, void *params) @@ -114,9 +115,4 @@ static inline NTSTATUS vk_unix_call(enum unix_call code, void *params) return __wine_unix_call(unix_handle, code, params); }
-struct unix_funcs -{ - NTSTATUS (WINAPI *p_vk_call)(enum unix_call, void *); -}; - #endif /* __WINE_VULKAN_LOADER_H */ diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index 4a0f9b02a97..4460539ae59 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -212,7 +212,7 @@ uint64_t wine_vk_unwrap_handle(VkObjectType type, uint64_t handle) DECLSPEC_HIDD
NTSTATUS init_vulkan(void *args) DECLSPEC_HIDDEN;
-extern const struct unix_funcs loader_funcs; +NTSTATUS WINAPI vk_direct_unix_call(unixlib_handle_t handle, unsigned int code, void *arg) DECLSPEC_HIDDEN;
NTSTATUS vk_is_available_instance_function(void *arg) DECLSPEC_HIDDEN; NTSTATUS vk_is_available_device_function(void *arg) DECLSPEC_HIDDEN;