Module: vkd3d Branch: master Commit: 783a2c2cdf9ba67d4093a864d6b8e4e87a3740f8 URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=783a2c2cdf9ba67d4093a864...
Author: Józef Kucia jkucia@codeweavers.com Date: Wed Jan 17 12:48:15 2018 +0100
libs/vkd3d: Use vkGetInstanceProcAddr() to load global Vulkan functions.
It's enough to load vkGetInstanceProcAddr() in a platform-specific way.
Signed-off-by: Józef Kucia jkucia@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
include/vkd3d.h | 12 ++----- libs/vkd3d-utils/vkd3d_utils_main.c | 2 +- libs/vkd3d/device.c | 64 +++++++++++++++++++------------------ libs/vkd3d/utils.c | 23 ++++++++++++- libs/vkd3d/vkd3d_private.h | 13 ++++++-- libs/vkd3d/vulkan_procs.h | 2 +- 6 files changed, 71 insertions(+), 45 deletions(-)
diff --git a/include/vkd3d.h b/include/vkd3d.h index 5ae7603..8886499 100644 --- a/include/vkd3d.h +++ b/include/vkd3d.h @@ -43,21 +43,15 @@ typedef bool (*vkd3d_join_thread_pfn)(void *thread);
struct vkd3d_instance;
-struct vkd3d_vulkan_procs_info -{ - PFN_vkCreateInstance vkCreateInstance; - PFN_vkDestroyInstance vkDestroyInstance; - PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; - PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; -}; - struct vkd3d_instance_create_info { vkd3d_signal_event_pfn signal_event_pfn; vkd3d_create_thread_pfn create_thread_pfn; vkd3d_join_thread_pfn join_thread_pfn; size_t wchar_size; - const struct vkd3d_vulkan_procs_info *vulkan_procs_info; + + /* If set to NULL, libvkd3d loads libvulkan. */ + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr_pfn; };
struct vkd3d_device_create_info diff --git a/libs/vkd3d-utils/vkd3d_utils_main.c b/libs/vkd3d-utils/vkd3d_utils_main.c index 2ea0a16..f68c47b 100644 --- a/libs/vkd3d-utils/vkd3d_utils_main.c +++ b/libs/vkd3d-utils/vkd3d_utils_main.c @@ -41,7 +41,7 @@ HRESULT WINAPI D3D12CreateDevice(IUnknown *adapter, instance_create_info.create_thread_pfn = NULL; instance_create_info.join_thread_pfn = NULL; instance_create_info.wchar_size = sizeof(WCHAR); - instance_create_info.vulkan_procs_info = NULL; + instance_create_info.vkGetInstanceProcAddr_pfn = NULL;
device_create_info.minimum_feature_level = minimum_feature_level; device_create_info.instance = NULL; diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 7225320..b93c169 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -140,7 +140,7 @@ static unsigned int vkd3d_enable_extensions(const char *extensions[],
static void vkd3d_init_instance_caps(struct vkd3d_instance *instance) { - const struct vkd3d_vulkan_procs_info *vk_procs = &instance->vk_global_procs; + const struct vkd3d_vk_global_procs *vk_procs = &instance->vk_global_procs; struct vkd3d_vulkan_info *vulkan_info = &instance->vk_info; VkExtensionProperties *vk_extensions; uint32_t count; @@ -173,46 +173,47 @@ static void vkd3d_init_instance_caps(struct vkd3d_instance *instance) vkd3d_free(vk_extensions); }
-static bool vkd3d_init_vk_global_procs(struct vkd3d_instance *instance, - const struct vkd3d_vulkan_procs_info *vulkan_procs_info) +static HRESULT vkd3d_init_vk_global_procs(struct vkd3d_instance *instance, + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr) { - struct vkd3d_vulkan_procs_info *procs = &instance->vk_global_procs; - - instance->libvulkan = NULL; + HRESULT hr;
- if (vulkan_procs_info) + if (!vkGetInstanceProcAddr) { - *procs = *vulkan_procs_info; - return true; - } + if (!(instance->libvulkan = dlopen("libvulkan.so.1", RTLD_NOW))) + { + ERR("Failed to load libvulkan.\n"); + return E_FAIL; + }
- if (!(instance->libvulkan = dlopen("libvulkan.so.1", RTLD_NOW))) + if (!(vkGetInstanceProcAddr = dlsym(instance->libvulkan, "vkGetInstanceProcAddr"))) + { + ERR("Could not load function pointer for vkGetInstanceProcAddr().\n"); + dlclose(instance->libvulkan); + instance->libvulkan = NULL; + return E_FAIL; + } + } + else { - ERR("Failed to load libvulkan.\n"); - return false; + instance->libvulkan = NULL; }
-#define LOAD_PROC(name) \ - if (!(procs->name = dlsym(instance->libvulkan, #name))) \ - { \ - ERR("Could not get proc addr for '" #name "'.\n"); \ - dlclose(instance->libvulkan); \ - instance->libvulkan = NULL; \ - return false; \ + if (FAILED(hr = vkd3d_load_vk_global_procs(&instance->vk_global_procs, vkGetInstanceProcAddr))) + { + if (instance->libvulkan) + dlclose(instance->libvulkan); + instance->libvulkan = NULL; + return hr; } - LOAD_PROC(vkCreateInstance) - LOAD_PROC(vkDestroyInstance) - LOAD_PROC(vkGetInstanceProcAddr) - LOAD_PROC(vkEnumerateInstanceExtensionProperties) -#undef LOAD_PROC
- return true; + return S_OK; }
static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance, const struct vkd3d_instance_create_info *create_info) { - const struct vkd3d_vulkan_procs_info *vk_global_procs = &instance->vk_global_procs; + const struct vkd3d_vk_global_procs *vk_global_procs = &instance->vk_global_procs; const char *extensions[MAX_INSTANCE_EXTENSION_COUNT]; VkApplicationInfo application_info; VkInstanceCreateInfo instance_info; @@ -236,10 +237,10 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance, instance->join_thread = create_info->join_thread_pfn; instance->wchar_size = create_info->wchar_size;
- if (!vkd3d_init_vk_global_procs(instance, create_info->vulkan_procs_info)) + if (FAILED(hr = vkd3d_init_vk_global_procs(instance, create_info->vkGetInstanceProcAddr_pfn))) { - ERR("Failed to initialize Vulkan global procs.\n"); - return E_FAIL; + ERR("Failed to initialize Vulkan global procs, hr %#x.\n", hr); + return hr; }
memset(&instance->vk_info, 0, sizeof(instance->vk_info)); @@ -276,7 +277,8 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance, if (FAILED(hr = vkd3d_load_vk_instance_procs(&instance->vk_procs, vk_global_procs, vk_instance))) { ERR("Failed to load instance procs, hr %#x.\n", hr); - vk_global_procs->vkDestroyInstance(vk_instance, NULL); + if (instance->vk_procs.vkDestroyInstance) + instance->vk_procs.vkDestroyInstance(vk_instance, NULL); if (instance->libvulkan) dlclose(instance->libvulkan); return hr; diff --git a/libs/vkd3d/utils.c b/libs/vkd3d/utils.c index 84141aa..a326cae 100644 --- a/libs/vkd3d/utils.c +++ b/libs/vkd3d/utils.c @@ -350,6 +350,27 @@ HRESULT hresult_from_vk_result(VkResult vr) } }
+#define LOAD_GLOBAL_PFN(name) \ + if (!(procs->name = (void *)vkGetInstanceProcAddr(NULL, #name))) \ + { \ + ERR("Could not get global proc addr for '" #name "'.\n"); \ + return E_FAIL; \ + } + +HRESULT vkd3d_load_vk_global_procs(struct vkd3d_vk_global_procs *procs, + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr) +{ + memset(procs, 0, sizeof(*procs)); + + procs->vkGetInstanceProcAddr = vkGetInstanceProcAddr; + + LOAD_GLOBAL_PFN(vkCreateInstance) + LOAD_GLOBAL_PFN(vkEnumerateInstanceExtensionProperties) + + TRACE("Loaded global Vulkan procs.\n"); + return S_OK; +} + #define LOAD_INSTANCE_PFN(name) \ if (!(procs->name = (void *)global_procs->vkGetInstanceProcAddr(instance, #name))) \ { \ @@ -358,7 +379,7 @@ HRESULT hresult_from_vk_result(VkResult vr) }
HRESULT vkd3d_load_vk_instance_procs(struct vkd3d_vk_instance_procs *procs, - const struct vkd3d_vulkan_procs_info *global_procs, VkInstance instance) + const struct vkd3d_vk_global_procs *global_procs, VkInstance instance) { memset(procs, 0, sizeof(*procs));
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 44d90b9..f4bae9d 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -49,6 +49,13 @@ struct d3d12_command_list; struct d3d12_device;
+struct vkd3d_vk_global_procs +{ + PFN_vkCreateInstance vkCreateInstance; + PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; +}; + #define DECLARE_VK_PFN(name) PFN_##name name; struct vkd3d_vk_instance_procs { @@ -87,7 +94,7 @@ struct vkd3d_instance size_t wchar_size;
struct vkd3d_vulkan_info vk_info; - struct vkd3d_vulkan_procs_info vk_global_procs; + struct vkd3d_vk_global_procs vk_global_procs; void *libvulkan;
LONG refcount; @@ -748,8 +755,10 @@ const char *debug_vk_queue_flags(VkQueueFlags flags) DECLSPEC_HIDDEN;
HRESULT hresult_from_vk_result(VkResult vr) DECLSPEC_HIDDEN;
+HRESULT vkd3d_load_vk_global_procs(struct vkd3d_vk_global_procs *procs, + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr) DECLSPEC_HIDDEN; HRESULT vkd3d_load_vk_instance_procs(struct vkd3d_vk_instance_procs *procs, - const struct vkd3d_vulkan_procs_info *global_procs, VkInstance instance) DECLSPEC_HIDDEN; + const struct vkd3d_vk_global_procs *global_procs, VkInstance instance) DECLSPEC_HIDDEN; HRESULT vkd3d_load_vk_device_procs(struct vkd3d_vk_device_procs *procs, const struct vkd3d_vk_instance_procs *parent_procs, VkDevice device) DECLSPEC_HIDDEN;
diff --git a/libs/vkd3d/vulkan_procs.h b/libs/vkd3d/vulkan_procs.h index b1ec77d..cbdcda8 100644 --- a/libs/vkd3d/vulkan_procs.h +++ b/libs/vkd3d/vulkan_procs.h @@ -29,8 +29,8 @@ #endif
/* Instance functions (obtained by vkGetInstanceProcAddr). */ +VK_INSTANCE_PFN(vkDestroyInstance) /* Load vkDestroyInstance() first. */ VK_INSTANCE_PFN(vkCreateDevice) -VK_INSTANCE_PFN(vkDestroyInstance) VK_INSTANCE_PFN(vkEnumerateDeviceExtensionProperties) VK_INSTANCE_PFN(vkEnumerateDeviceLayerProperties) VK_INSTANCE_PFN(vkEnumeratePhysicalDevices)