[PATCH v2 08/10] winevulkan/winex11: Implement vkCreateInstance.
Józef Kucia
joseph.kucia at gmail.com
Fri Feb 23 05:01:57 CST 2018
On Fri, Feb 23, 2018 at 8:23 AM, Roderick Colenbrander
<thunderbird2k at gmail.com> wrote:
> Signed-off-by: Roderick Colenbrander <thunderbird2k at gmail.com>
> ---
> configure.ac | 9 ++++++
> dlls/winevulkan/vulkan.c | 51 +++++++++++++++++++++++++++++--
> dlls/winevulkan/vulkan_private.h | 45 ++++++++++++++++++++++++++++
> dlls/winex11.drv/vulkan.c | 65 +++++++++++++++++++++++++++++++++++++---
> include/config.h.in | 3 ++
> 5 files changed, 167 insertions(+), 6 deletions(-)
> create mode 100644 dlls/winevulkan/vulkan_private.h
>
> diff --git a/configure.ac b/configure.ac
> index 39c9a4c498..14ed04655e 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -80,6 +80,7 @@ AC_ARG_WITH(sane, AS_HELP_STRING([--without-sane],[do not use SANE (scanner
> AC_ARG_WITH(tiff, AS_HELP_STRING([--without-tiff],[do not use TIFF]))
> AC_ARG_WITH(udev, AS_HELP_STRING([--without-udev],[do not use udev (plug and play support)]))
> AC_ARG_WITH(v4l, AS_HELP_STRING([--without-v4l],[do not use v4l1 (v4l support)]))
> +AC_ARG_WITH(vulkan, AS_HELP_STRING([--without-vulkan],[do not use Vulkan]))
> AC_ARG_WITH(xcomposite,AS_HELP_STRING([--without-xcomposite],[do not use the Xcomposite extension]),
> [if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_Xcomposite_h=no; fi])
> AC_ARG_WITH(xcursor, AS_HELP_STRING([--without-xcursor],[do not use the Xcursor extension]),
> @@ -1825,6 +1826,14 @@ then
> WINE_WARNING([No sound system was found. Windows applications will be silent.])
> fi
>
> +dnl *** Check for vulkan ***
> +if test "x$with_vulkan" != "xno"
> +then
> + WINE_CHECK_SONAME(vulkan, vkGetInstanceProcAddr)
> +fi
> +WINE_NOTICE_WITH(vulkan,[test "x$ac_cv_lib_soname_vulkan" = "x"],
> + [libvulkan ${notice_platform}development files not found, vulkan won't be supported.])
> +
> dnl **** Check for gcc specific options ****
>
> AC_SUBST(EXTRACFLAGS,"")
> diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
> index 8a3927c5c5..c43903d767 100644
> --- a/dlls/winevulkan/vulkan.c
> +++ b/dlls/winevulkan/vulkan.c
> @@ -24,8 +24,10 @@
> #include "winuser.h"
>
> #include "wine/debug.h"
> +#include "wine/heap.h"
> #include "wine/vulkan.h"
> #include "wine/vulkan_driver.h"
> +#include "vulkan_private.h"
>
> WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
>
> @@ -68,11 +70,56 @@ static BOOL wine_vk_init(HINSTANCE hinst)
> return TRUE;
> }
>
> +/* Helper function used for freeing an instance structure. This function supports full
> + * and partial object cleanups and can thus be used for vkCreateInstance failures.
> + */
> +static void wine_vk_instance_free(struct VkInstance_T *instance)
> +{
> + if (!instance)
> + return;
> +
> + if (instance->instance)
> + vk_funcs->p_vkDestroyInstance(instance->instance, NULL /* pAllocator */);
> +
> + heap_free(instance);
> +}
> +
> static VkResult WINAPI wine_vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
> VkInstance *pInstance)
> {
> - TRACE("%p %p %p\n", pCreateInfo, pAllocator, pInstance);
> - return vk_funcs->p_vkCreateInstance(pCreateInfo, pAllocator, pInstance);
> + struct VkInstance_T *instance = NULL;
> + VkResult res;
> +
> + TRACE("pCreateInfo %p, pAllocator %p, pInstance %p\n", pCreateInfo, pAllocator, pInstance);
> +
> + if (pAllocator)
> + FIXME("Support for allocation callbacks not implemented yet\n");
> +
> + instance = heap_alloc(sizeof(*instance));
> + if (!instance)
> + {
> + ERR("Failed to allocate memory for instance\n");
> + res = VK_ERROR_OUT_OF_HOST_MEMORY;
> + goto err;
> + }
> + instance->base.loader_magic = VULKAN_ICD_MAGIC_VALUE;
> +
> + res = vk_funcs->p_vkCreateInstance(pCreateInfo, NULL /* pAllocator */, &instance->instance);
> + if (res != VK_SUCCESS)
> + {
> + ERR("Failed to create instance, res=%d\n", res);
> + goto err;
> + }
> +
> + *pInstance = instance;
> + TRACE("Done, instance=%p native_instance=%p\n", instance, instance->instance);
> + return VK_SUCCESS;
> +
> +err:
> + if (instance)
> + wine_vk_instance_free(instance);
Nitpick, wine_vk_instance_free() performs a NULL check.
> +
> + return res;
> }
>
> static VkResult WINAPI wine_vkEnumerateInstanceExtensionProperties(const char *layer_name, uint32_t *count,
> diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h
> new file mode 100644
> index 0000000000..6b83e875a2
> --- /dev/null
> +++ b/dlls/winevulkan/vulkan_private.h
> @@ -0,0 +1,45 @@
> +/* Wine Vulkan ICD private data structures
> + *
> + * 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
> +#define __WINE_VULKAN_PRIVATE_H
> +
> +/* Magic value defined by Vulkan ICD / Loader spec */
> +#define VULKAN_ICD_MAGIC_VALUE 0x01CDC0DE
> +
> +/* Base 'class' for our Vulkan dispatchable objects such as VkDevice and VkInstance.
> + * This structure MUST be the first element of a dispatchable object as the ICD
> + * loader depends on it. For now only contains loader_magic, but over time more common
> + * functionality is expected.
> + */
> +struct wine_vk_base
> +{
> + /* Special section in each dispatchable object for use by the ICD loader for
> + * storing dispatch tables. The start contains a magical value '0x01CDC0DE'.
> + */
> + UINT_PTR loader_magic;
> +};
> +
> +struct VkInstance_T
> +{
> + struct wine_vk_base base;
> + VkInstance instance; /* native instance */
> +};
> +
> +#endif /* __WINE_VULKAN_PRIVATE_H */
> diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c
> index 3dad034288..992d2f8908 100644
> --- a/dlls/winex11.drv/vulkan.c
> +++ b/dlls/winex11.drv/vulkan.c
> @@ -20,22 +20,67 @@
> #include "config.h"
> #include "wine/port.h"
>
> +#include <stdarg.h>
> +
> +#include "windef.h"
> +#include "winbase.h"
> +
> #include "wine/debug.h"
> +#include "wine/library.h"
> #include "wine/vulkan.h"
> #include "wine/vulkan_driver.h"
>
> +#ifdef SONAME_LIBVULKAN
> +
> WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
>
> +static VkResult (*pvkCreateInstance)(const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *);
> +static void (*pvkDestroyInstance)(VkInstance, const VkAllocationCallbacks *);
> +
> +static BOOL wine_vk_init(void)
> +{
> + static BOOL init_done = FALSE;
> + static void *vulkan_handle;
> +
> + if (init_done) return (vulkan_handle != NULL);
> + init_done = TRUE;
> +
> + if (!(vulkan_handle = wine_dlopen(SONAME_LIBVULKAN, RTLD_NOW, NULL, 0))) return FALSE;
> +
> +#define LOAD_FUNCPTR(f) if((p##f = wine_dlsym(vulkan_handle, #f, NULL, 0)) == NULL) return FALSE;
> +LOAD_FUNCPTR(vkCreateInstance)
> +LOAD_FUNCPTR(vkDestroyInstance)
> +#undef LOAD_FUNCPTR
> +
> + return TRUE;
> +}
> +
> static VkResult X11DRV_vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
> VkInstance *pInstance)
> {
> - FIXME("stub: %p %p %p\n", pCreateInfo, pAllocator, pInstance);
> - return VK_ERROR_INCOMPATIBLE_DRIVER;
> + TRACE("pCreateInfo %p, pAllocater %p, pInstance %p\n", pCreateInfo, pAllocator, pInstance);
Typo: pAllocater.
> +
> + if (pAllocator)
> + FIXME("Support for allocation callbacks not implemented yet\n");
> +
> + /* TODO: convert win32 to x11 extensions here. */
> + if (pCreateInfo->enabledExtensionCount > 0)
> + {
> + FIXME("Extensions are not supported yet, aborting!\n");
> + return VK_ERROR_INCOMPATIBLE_DRIVER;
> + }
> +
> + return pvkCreateInstance(pCreateInfo, NULL /* pAllocator */, pInstance);
> }
>
> static void X11DRV_vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator)
> {
> - FIXME("stub: %p %p\n", instance, pAllocator);
> + TRACE("%p %p\n", instance, pAllocator);
> +
> + if (pAllocator)
> + FIXME("Support for allocation callbacks not implemented yet\n");
> +
> + pvkDestroyInstance(instance, NULL /* pAllocator */);
> }
>
> static VkResult X11DRV_vkEnumerateInstanceExtensionProperties(const char *layer_name, uint32_t *count,
> @@ -91,5 +136,17 @@ const struct vulkan_funcs *get_vulkan_driver(UINT version)
> return NULL;
> }
>
> - return &vulkan_funcs;
> + if (wine_vk_init())
> + return &vulkan_funcs;
> +
> + return NULL;
> }
> +
> +#else /* No vulkan */
> +
> +const struct vulkan_funcs *get_vulkan_driver(UINT version)
> +{
> + return NULL;
> +}
> +
> +#endif /* SONAME_LIBVULKAN */
> diff --git a/include/config.h.in b/include/config.h.in
> index d6cddb3c88..c212fd0324 100644
> --- a/include/config.h.in
> +++ b/include/config.h.in
> @@ -1554,6 +1554,9 @@
> /* Define to the soname of the libXxf86vm library. */
> #undef SONAME_LIBXXF86VM
>
> +/* Define to the soname of the libvulkan library. */
> +#undef SONAME_LIBVULKAN
> +
> /* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
> #undef STAT_MACROS_BROKEN
>
> --
> 2.14.3
>
>
>
More information about the wine-devel
mailing list