From e7990b44827f0ea0d805d41d3da742689803d98a Mon Sep 17 00:00:00 2001 From: Taekyun Kim Date: Mon, 11 Apr 2016 16:17:35 +0900 Subject: [PATCH] wsi: Load ICD and dispatch ICD functions Return ICD functions in vk_icdGetInstanceProcAddr() if there's no our implementation for that name. Change-Id: I5297f2bf9c6d7ffbf272b8e33c63b394b2dfd23d --- src/wsi/entry-points.c | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/wsi/entry-points.c b/src/wsi/entry-points.c index fc2de54..46ce175 100644 --- a/src/wsi/entry-points.c +++ b/src/wsi/entry-points.c @@ -24,11 +24,14 @@ #include "wsi.h" #include +#include +#include #define VK_ENTRY_POINT(name, type) { "vk"#name, vk_##name, VK_FUNC_TYPE_##type } -typedef enum vk_func_type vk_func_type_t; -typedef struct vk_entry vk_entry_t; +typedef enum vk_func_type vk_func_type_t; +typedef struct vk_entry vk_entry_t; +typedef struct vk_icd_loader vk_icd_loader_t; enum vk_func_type { VK_FUNC_TYPE_GLOBAL, @@ -42,6 +45,11 @@ struct vk_entry { vk_func_type_t type; }; +struct vk_icd_loader { + void *lib; + PFN_vkGetInstanceProcAddr gpa; +}; + static const vk_entry_t entry_points[] = { VK_ENTRY_POINT(DestroySurfaceKHR, INSTANCE), VK_ENTRY_POINT(GetPhysicalDeviceSurfaceSupportKHR, INSTANCE), @@ -93,6 +101,32 @@ get_entry_point(const char *name) return NULL; } +static vk_icd_loader_t icd; + +static void __attribute__((constructor)) +icd_init(void) +{ + const char *filename; + + filename = getenv("VK_TIZEN_ICD"); + VK_CHECK(filename, return, "No ICD library given.\n"); + + dlerror(); + + icd.lib = dlopen(filename, RTLD_LAZY | RTLD_LOCAL); + VK_CHECK(icd.lib, return, "dlopen() failed - %s\n", dlerror()); + + icd.gpa = dlsym(icd.lib, "vk_icdGetInstanceProcAddr"); + VK_CHECK(icd.gpa, return, "vk_icdGetInstanceProcAddr() not present.\n"); +} + +static void __attribute__((destructor)) +icd_fini(void) +{ + if (icd.lib) + dlclose(icd.lib); +} + VK_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr(VkInstance instance, const char *name) { @@ -101,5 +135,5 @@ vk_icdGetInstanceProcAddr(VkInstance instance, const char *name) if (entry) return entry->func; - return NULL; + return icd.gpa(instance, name); } -- 2.7.4