From c5104f208dd40c53c47a77d84b4c5cd68065af26 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Wed, 6 May 2015 10:15:07 -0600 Subject: misc: Add vkGetInstanceProcAddr() entrypoint Adding this entrypoint as this has been discussed in khronos and is needed for the loader/layer/extension proposal. Caveats: 1) Have not updated layers or any tests/demos yet that will come later; 2) No one including loader is using this call yet; 3) Leaving exisitng vkGetProcAddr() as is for now; later once loader is using vkGetInstanceProcAddr call can switch vkGetProcAddr() to vkGetDeviceProcAddr() --- include/vkLayer.h | 1 + include/vulkan.h | 8 ++++++-- loader/gpa_helper.h | 4 ++++ loader/loader.c | 11 +++++++++++ loader/table_ops.h | 3 +++ vk-generate.py | 9 +++++++++ vk-layer-generate.py | 13 ++++++++----- vulkan.py | 4 ++++ 8 files changed, 46 insertions(+), 7 deletions(-) diff --git a/include/vkLayer.h b/include/vkLayer.h index e95811b8..87a79e5d 100644 --- a/include/vkLayer.h +++ b/include/vkLayer.h @@ -26,6 +26,7 @@ typedef struct VkBaseLayerObject_ typedef struct VkLayerDispatchTable_ { PFN_vkGetProcAddr GetProcAddr; + PFN_vkGetInstanceProcAddr GetInstanceProcAddr; PFN_vkCreateInstance CreateInstance; PFN_vkDestroyInstance DestroyInstance; PFN_vkEnumeratePhysicalDevices EnumeratePhysicalDevices; diff --git a/include/vulkan.h b/include/vulkan.h index 00ebbf51..ed222438 100644 --- a/include/vulkan.h +++ b/include/vulkan.h @@ -33,7 +33,7 @@ #include "vk_platform.h" // Vulkan API version supported by this file -#define VK_API_VERSION VK_MAKE_VERSION(0, 93, 0) +#define VK_API_VERSION VK_MAKE_VERSION(0, 93, 1) #ifdef __cplusplus extern "C" @@ -2136,6 +2136,7 @@ typedef VkResult (VKAPI *PFN_vkCreateInstance)(const VkInstanceCreateInfo* pCrea typedef VkResult (VKAPI *PFN_vkDestroyInstance)(VkInstance instance); typedef VkResult (VKAPI *PFN_vkEnumeratePhysicalDevices)(VkInstance instance, uint32_t* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices); typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceInfo)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceInfoType infoType, size_t* pDataSize, void* pData); +typedef void * (VKAPI *PFN_vkGetInstanceProcAddr)(VkInstance instance, const char * pName); typedef void * (VKAPI *PFN_vkGetProcAddr)(VkPhysicalDevice physicalDevice, const char * pName); typedef VkResult (VKAPI *PFN_vkCreateDevice)(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice); typedef VkResult (VKAPI *PFN_vkDestroyDevice)(VkDevice device); @@ -2271,10 +2272,13 @@ VkResult VKAPI vkGetPhysicalDeviceInfo( size_t* pDataSize, void* pData); +void * VKAPI vkGetInstanceProcAddr( + VkInstance instance, + const char* pName); + void * VKAPI vkGetProcAddr( VkPhysicalDevice physicalDevice, const char* pName); - // Device functions VkResult VKAPI vkCreateDevice( diff --git a/loader/gpa_helper.h b/loader/gpa_helper.h index b2a6f311..b9bd688b 100644 --- a/loader/gpa_helper.h +++ b/loader/gpa_helper.h @@ -38,6 +38,8 @@ static inline void* globalGetProcAddr(const char *name) return (void*) vkEnumeratePhysicalDevices; if (!strcmp(name, "GetPhysicalDeviceInfo")) return (void*) vkGetPhysicalDeviceInfo; + if (!strcmp(name, "GetInstanceProcAddr")) + return (void*) vkGetInstanceProcAddr; if (!strcmp(name, "GetProcAddr")) return (void*) vkGetProcAddr; if (!strcmp(name, "CreateDevice")) @@ -312,6 +314,8 @@ static inline void *loader_non_passthrough_gpa(const char *name) return (void*) vkEnumeratePhysicalDevices; if (!strcmp(name, "GetPhysicalDeviceInfo")) return (void*) vkGetPhysicalDeviceInfo; + if (!strcmp(name, "GetInstanceProcAddr")) + return (void*) vkGetInstanceProcAddr; if (!strcmp(name, "GetProcAddr")) return (void*) vkGetProcAddr; if (!strcmp(name, "CreateDevice")) diff --git a/loader/loader.c b/loader/loader.c index 17778d5b..c452ce52 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -1288,6 +1288,17 @@ LOADER_EXPORT VkResult VKAPI vkEnumeratePhysicalDevices( return (count > 0) ? VK_SUCCESS : res; } +LOADER_EXPORT void * VKAPI vkGetInstanceProcAddr(VkInstance instance, const char * pName) +{ + if (instance != VK_NULL_HANDLE) { + + /* return entrypoint addresses that are global (in the loader)*/ + return globalGetProcAddr(pName); + } + + return NULL; +} + LOADER_EXPORT void * VKAPI vkGetProcAddr(VkPhysicalDevice gpu, const char * pName) { if (gpu == VK_NULL_HANDLE) { diff --git a/loader/table_ops.h b/loader/table_ops.h index 3a3535d2..1b59a453 100644 --- a/loader/table_ops.h +++ b/loader/table_ops.h @@ -35,6 +35,7 @@ static inline void loader_initialize_dispatch_table(VkLayerDispatchTable *table, table->DestroyInstance = (PFN_vkDestroyInstance) gpa(gpu, "vkDestroyInstance"); table->EnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices) gpa(gpu, "vkEnumeratePhysicalDevices"); table->GetPhysicalDeviceInfo = (PFN_vkGetPhysicalDeviceInfo) gpa(gpu, "vkGetPhysicalDeviceInfo"); + table->GetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) gpa(gpu, "vkGetInstanceProcAddr"); table->GetProcAddr = (PFN_vkGetProcAddr) gpa(gpu, "vkGetProcAddr"); table->CreateDevice = (PFN_vkCreateDevice) gpa(gpu, "vkCreateDevice"); table->DestroyDevice = (PFN_vkDestroyDevice) gpa(gpu, "vkDestroyDevice"); @@ -176,6 +177,8 @@ static inline void *loader_lookup_dispatch_table(const VkLayerDispatchTable *tab return (void *) table->EnumeratePhysicalDevices; if (!strcmp(name, "GetPhysicalDeviceInfo")) return (void *) table->GetPhysicalDeviceInfo; + if (!strcmp(name, "GetInstanceProcAddr")) + return (void *) table->GetInstanceProcAddr; if (!strcmp(name, "GetProcAddr")) return (void *) table->GetProcAddr; if (!strcmp(name, "CreateDevice")) diff --git a/vk-generate.py b/vk-generate.py index 024fce89..28d176b0 100755 --- a/vk-generate.py +++ b/vk-generate.py @@ -204,7 +204,10 @@ class IcdGetProcAddrSubcommand(IcdDummyEntrypointsSubcommand): for proto in self.protos: if proto.name == "GetProcAddr": gpa_proto = proto + if proto.name == "GetInstanceProcAddr": + gpa_instance_proto = proto + gpa_instance_decl = self._generate_stub_decl(gpa_instance_proto) gpa_decl = self._generate_stub_decl(gpa_proto) gpa_pname = gpa_proto.params[-1].name @@ -216,6 +219,12 @@ class IcdGetProcAddrSubcommand(IcdDummyEntrypointsSubcommand): (gpa_proto.ret, self.prefix, proto.name)) body = [] + body.append("%s %s" % (self.qual, gpa_instance_decl)) + body.append("{") + body.append(" return NULL;") + body.append("}") + body.append("") + body.append("%s %s" % (self.qual, gpa_decl)) body.append("{") body.append(generate_get_proc_addr_check(gpa_pname)) diff --git a/vk-layer-generate.py b/vk-layer-generate.py index 8e5967ef..3f2282c1 100755 --- a/vk-layer-generate.py +++ b/vk-layer-generate.py @@ -510,7 +510,7 @@ class GenericLayerSubcommand(Subcommand): stmt = '' funcs = [] if proto.ret != "void": - ret_val = "VkResult result = " + ret_val = "%s result = " % proto.ret stmt = " return result;\n" if proto.name == "EnumerateLayers": funcs.append('%s%s\n' @@ -711,7 +711,7 @@ class APIDumpSubcommand(Subcommand): elif 'Create' in proto.name or 'Alloc' in proto.name or 'MapMemory' in proto.name: create_params = -1 if proto.ret != "void": - ret_val = "VkResult result = " + ret_val = "%s result = " % proto.ret stmt = " return result;\n" f_open = 'loader_platform_thread_lock_mutex(&printLock);\n ' log_func = ' if (StreamControl::writeAddress == true) {' @@ -748,9 +748,12 @@ class APIDumpSubcommand(Subcommand): pindex += 1 log_func = log_func.strip(', ') log_func_no_addr = log_func_no_addr.strip(', ') - if proto.ret != "void": + if proto.ret == "VkResult": log_func += ') = " << string_VkResult((VkResult)result) << endl' log_func_no_addr += ') = " << string_VkResult((VkResult)result) << endl' + elif proto.ret == "void*": + log_func += ') = " << result << endl' + log_func_no_addr += ') = " << result << endl' else: log_func += ')\\n"' log_func_no_addr += ')\\n"' @@ -1335,7 +1338,7 @@ class ObjectTrackerSubcommand(Subcommand): ret_val = '' stmt = '' if proto.ret != "void": - ret_val = "VkResult result = " + ret_val = "%s result = " % proto.ret stmt = " return result;\n" if proto.name == "EnumerateLayers": funcs.append('%s%s\n' @@ -1476,7 +1479,7 @@ class ThreadingSubcommand(Subcommand): stmt = '' funcs = [] if proto.ret != "void": - ret_val = "VkResult result = " + ret_val = "%s result = " % proto.ret stmt = " return result;\n" if proto.name == "EnumerateLayers": funcs.append('%s%s\n' diff --git a/vulkan.py b/vulkan.py index cb0b04f9..e795da17 100755 --- a/vulkan.py +++ b/vulkan.py @@ -235,6 +235,10 @@ core = Extension( Param("size_t*", "pDataSize"), Param("void*", "pData")]), + Proto("void*", "GetInstanceProcAddr", + [Param("VkInstance", "instance"), + Param("const char*", "pName")]), + Proto("void*", "GetProcAddr", [Param("VkPhysicalDevice", "gpu"), Param("const char*", "pName")]), -- cgit v1.2.3