[PATCH 04/10] winex11: Add stubs for global Vulkan functions.

Roderick Colenbrander <[email protected]>
Newsgroups gmane.comp.emulators.wine.patches
Message-ID <[email protected]>
Signed-off-by: Roderick Colenbrander <[email protected]>
---
 dlls/winex11.drv/Makefile.in      |  1 +
 dlls/winex11.drv/vulkan.c         | 65 ++++++++++++++++++++++++++++++++++++++-
 dlls/winex11.drv/vulkan_private.h | 45 +++++++++++++++++++++++++++
 dlls/winex11.drv/vulkan_thunks.c  | 18 +++++++++++
 4 files changed, 128 insertions(+), 1 deletion(-)
 create mode 100644 dlls/winex11.drv/vulkan_private.h
 create mode 100644 dlls/winex11.drv/vulkan_thunks.c

diff --git a/dlls/winex11.drv/Makefile.in b/dlls/winex11.drv/Makefile.in
index 747f509b44..fc6c288d66 100644
--- a/dlls/winex11.drv/Makefile.in
+++ b/dlls/winex11.drv/Makefile.in
@@ -21,6 +21,7 @@ C_SRCS = \
 	settings.c \
 	systray.c \
 	vulkan.c \
+	vulkan_thunks.c \
 	window.c \
 	wintab.c \
 	x11drv_main.c \
diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c
index f58bad9c5a..cff474190a 100644
--- a/dlls/winex11.drv/vulkan.c
+++ b/dlls/winex11.drv/vulkan.c
@@ -25,6 +25,8 @@
 
 #ifdef SONAME_LIBVULKAN
 
+#include "vulkan_private.h"
+
 WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
 
 /* For now default to 3 as it felt like a reasonable version feature wise to support.
@@ -34,10 +36,71 @@ WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
  */
 #define WINE_VULKAN_ICD_VERSION 3
 
+void* WINAPI X11DRV_vk_icdGetInstanceProcAddr(VkInstance instance, const char* pName);
+
+
+static void *wine_vk_get_global_proc_addr(const char* name)
+{
+    int i;
+    for (i = 0; i < vk_global_dispatch_table_size; i++)
+    {
+        if (strcmp(name, vk_global_dispatch_table[i].name) == 0)
+        {
+            TRACE("Found pName=%s in global table\n", name);
+            return vk_global_dispatch_table[i].func;
+        }
+    }
+    return NULL;
+}
+
+VkResult WINAPI X11DRV_vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
+        VkInstance *pInstance)
+{
+    FIXME("stub: %p, %p, %p\n", pCreateInfo, pAllocator, pInstance);
+    return VK_ERROR_INCOMPATIBLE_DRIVER;
+}
+
+VkResult WINAPI X11DRV_vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount,
+        VkExtensionProperties* pProperties)
+{
+    FIXME("stub: %p, %p, %p\n", pLayerName, pPropertyCount, pProperties);
+    return VK_ERROR_OUT_OF_HOST_MEMORY;
+}
+
+PFN_vkVoidFunction WINAPI X11DRV_vkGetInstanceProcAddr(VkInstance instance, const char* pName)
+{
+    /* Just forward to vk_icdGetInstanceProcAddr as they are equal. The vk_icd version was
+     * apparently added for dll injection reasons.
+     */
+    return X11DRV_vk_icdGetInstanceProcAddr(instance, pName);
+}
 
+/* Implementation of vk_icdGetInstanceProcAddr. We will load any function the caller requests
+ * and which we are aware of. Hopefully we don't have to do any extension filtering, which
+ * seems to be taken care of by the loader.
+ */
 void* WINAPI X11DRV_vk_icdGetInstanceProcAddr(VkInstance instance, const char* pName)
 {
-    FIXME("stub: %p, %s\n", instance, pName ? pName : "NULL");
+    void *func;
+    TRACE("%p, %s\n", instance, pName ? pName : "NULL");
+
+    /* Only global functions can be retrieved when NULL.
+     * Note: the docs are not clear if we can still query global
+     *       functions when a non-NULL instance object is passed in.
+     */
+    if (!instance)
+    {
+        func = wine_vk_get_global_proc_addr(pName);
+        if (!func)
+        {
+            TRACE("Function %s not found\n", pName);
+            return NULL;
+        }
+        return func;
+    }
+
+    /* TODO: add loading of instance and device functions. */
+    FIXME("Function %s not found\n", pName);
     return NULL;
 }
 
diff --git a/dlls/winex11.drv/vulkan_private.h b/dlls/winex11.drv/vulkan_private.h
new file mode 100644
index 0000000000..bb722ddb06
--- /dev/null
+++ b/dlls/winex11.drv/vulkan_private.h
@@ -0,0 +1,45 @@
+/* X11DRV Vulkan ICD implementation
+ *
+ * Copyright 2017 Roderick Colenbrander
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_VULKAN_PRIVATE_H /* __WINE_VULKAN_PRIVATE_H */
+#define __WINE_VULKAN_PRIVATE_H
+
+#ifndef __WINE_CONFIG_H
+# error You must include config.h to use this header
+#endif
+
+#ifdef SONAME_LIBVULKAN
+
+struct vulkan_func
+{
+    const char *name;
+    const char *extension;
+    void *func;
+};
+
+/* For use by vk_icdGetInstanceProcAddr / vkGetInstanceProcAddr */
+extern const struct vulkan_func vk_global_dispatch_table[] DECLSPEC_HIDDEN;
+extern const int vk_global_dispatch_table_size DECLSPEC_HIDDEN;
+
+VkResult WINAPI X11DRV_vkCreateInstance(const VkInstanceCreateInfo*, const VkAllocationCallbacks*, VkInstance*) DECLSPEC_HIDDEN;
+VkResult WINAPI X11DRV_vkEnumerateInstanceExtensionProperties(const char*, uint32_t*, VkExtensionProperties*) DECLSPEC_HIDDEN;
+PFN_vkVoidFunction WINAPI X11DRV_vkGetInstanceProcAddr(VkInstance, const char*) DECLSPEC_HIDDEN;
+
+#endif /* SONAME_LIBVULKAN */
+#endif /* __WINE_VULKAN_PRIVATE_H */
diff --git a/dlls/winex11.drv/vulkan_thunks.c b/dlls/winex11.drv/vulkan_thunks.c
new file mode 100644
index 0000000000..fc3c65762a
--- /dev/null
+++ b/dlls/winex11.drv/vulkan_thunks.c
@@ -0,0 +1,18 @@
+/* Automatically generated from Vulkan vk.xml; DO NOT EDIT! */
+
+#include "config.h"
+#include "wine/port.h"
+
+#ifdef SONAME_LIBVULKAN
+
+#include "wine/vulkan.h"
+#include "vulkan_private.h"
+
+const struct vulkan_func vk_global_dispatch_table[] = {
+    {"vkCreateInstance", NULL, &X11DRV_vkCreateInstance},
+    {"vkEnumerateInstanceExtensionProperties", NULL, &X11DRV_vkEnumerateInstanceExtensionProperties},
+    {"vkGetInstanceProcAddr", NULL, &X11DRV_vkGetInstanceProcAddr},
+};
+const int vk_global_dispatch_table_size = 3;
+
+#endif /* SONAME_LIBVULKAN */
-- 
2.13.6
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.