aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Ashburn <jon@lunarg.com>2015-05-06 10:15:07 -0600
committerJon Ashburn <jon@lunarg.com>2015-05-07 16:24:43 -0600
commitc5104f208dd40c53c47a77d84b4c5cd68065af26 (patch)
tree2bcce4f0d3cf736a33e2c0127fedd79a1267f4e9
parent8abcd57aee10259ad7066200383c0769bdb7e3f4 (diff)
downloadusermoji-c5104f208dd40c53c47a77d84b4c5cd68065af26.tar.xz
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()
-rw-r--r--include/vkLayer.h1
-rw-r--r--include/vulkan.h8
-rw-r--r--loader/gpa_helper.h4
-rw-r--r--loader/loader.c11
-rw-r--r--loader/table_ops.h3
-rwxr-xr-xvk-generate.py9
-rwxr-xr-xvk-layer-generate.py13
-rwxr-xr-xvulkan.py4
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")]),