From 0d67c29d5d2a2f3383e11279a091a1f164f8eb95 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Thu, 28 May 2015 16:25:02 -0600 Subject: loader: Support layers that don't have an extension entrypoint Change all layers and loader interface to init dispatch tables on GPA("GetXXXProcAddr"). After that initialization rest of dispatch tables are inited via unwrapped object using the GPA in the dispatch table. This also allows App generated GPA calls that the loader can't resolve to function correctly. --- layers/param_checker.cpp | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) (limited to 'layers/param_checker.cpp') diff --git a/layers/param_checker.cpp b/layers/param_checker.cpp index 4068ac62..a27d54e0 100644 --- a/layers/param_checker.cpp +++ b/layers/param_checker.cpp @@ -83,9 +83,9 @@ static VkLayerDispatchTable * initDeviceTable(const VkBaseLayerObject *devw) return it->second; } - VkDevice device = (VkDevice) devw->nextObject; - layer_initialize_dispatch_table(pTable, (PFN_vkGetDeviceProcAddr) devw->pGPA, (VkDevice) device); + layer_initialize_dispatch_table(pTable, devw); + VkDevice device = (VkDevice) devw->baseObject; pDebugMarkerTable->CmdDbgMarkerBegin = (PFN_vkCmdDbgMarkerBegin) devw->pGPA(device, "vkCmdDbgMarkerBegin"); pDebugMarkerTable->CmdDbgMarkerEnd = (PFN_vkCmdDbgMarkerEnd) devw->pGPA(device, "vkCmdDbgMarkerEnd"); pDebugMarkerTable->DbgSetObjectTag = (PFN_vkDbgSetObjectTag) devw->pGPA(device, "vkDbgSetObjectTag"); @@ -111,7 +111,7 @@ static VkLayerInstanceDispatchTable * initInstanceTable(const VkBaseLayerObject return it->second; } - layer_init_instance_dispatch_table(pTable, (PFN_vkGetInstanceProcAddr) instw->pGPA, (VkInstance) instw->nextObject); + layer_init_instance_dispatch_table(pTable, instw); return pTable; } @@ -1977,8 +1977,6 @@ static inline void* layer_intercept_proc(const char *name) return NULL; name += 2; - if (!strcmp(name, "GetDeviceProcAddr")) - return (void*) vkGetDeviceProcAddr; if (!strcmp(name, "DestroyDevice")) return (void*) vkDestroyDevice; if (!strcmp(name, "GetDeviceQueue")) @@ -2201,8 +2199,6 @@ static inline void* layer_intercept_instance_proc(const char *name) return NULL; name += 2; - if (!strcmp(name, "GetInstanceProcAddr")) - return (void*) vkGetInstanceProcAddr; if (!strcmp(name, "CreateInstance")) return (void*) vkCreateInstance; if (!strcmp(name, "DestroyInstance")) @@ -2223,46 +2219,56 @@ static inline void* layer_intercept_instance_proc(const char *name) VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(VkDevice device, const char* funcName) { - VkBaseLayerObject* devw = (VkBaseLayerObject *) device; void* addr; if (device == NULL) { return NULL; } loader_platform_thread_once(&initOnce, initParamChecker); - initDeviceTable((const VkBaseLayerObject *) device); + + /* loader uses this to force layer initialization; device object is wrapped */ + if (!strcmp(funcName, "vkGetDeviceProcAddr")) { + initDeviceTable((const VkBaseLayerObject *) device); + return (void*) vkGetDeviceProcAddr; + } addr = layer_intercept_proc(funcName); if (addr) { return addr; } else { - if (devw->pGPA == NULL) { + VkLayerDispatchTable **ppDisp = (VkLayerDispatchTable **) device; + VkLayerDispatchTable* pTable = tableMap[*ppDisp]; + if (pTable->GetDeviceProcAddr == NULL) return NULL; - } - return devw->pGPA((VkObject)devw->nextObject, funcName); + return pTable->GetDeviceProcAddr(device, funcName); } } VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr(VkInstance instance, const char* funcName) { - VkBaseLayerObject* instw = (VkBaseLayerObject *) instance; void* addr; if (instance == NULL) { return NULL; } loader_platform_thread_once(&initOnce, initParamChecker); - initInstanceTable((const VkBaseLayerObject *) instance); + + /* loader uses this to force layer initialization; instance object is wrapped */ + if (!strcmp(funcName, "vkGetInstanceProcAddr")) { + initInstanceTable((const VkBaseLayerObject *) instance); + return (void*) vkGetInstanceProcAddr; + } addr = layer_intercept_instance_proc(funcName); if (addr) { return addr; } else { - if (instw->pGPA == NULL) { + VkLayerInstanceDispatchTable **ppDisp = (VkLayerInstanceDispatchTable **) instance; + VkLayerInstanceDispatchTable* pTable = tableInstanceMap[*ppDisp]; + if (pTable->GetInstanceProcAddr == NULL) return NULL; - } - return instw->pGPA((VkObject)instw->nextObject, funcName); + return pTable->GetInstanceProcAddr(instance, funcName); } } -- cgit v1.2.3