diff options
| author | Jon Ashburn <jon@lunarg.com> | 2015-05-28 16:25:02 -0600 |
|---|---|---|
| committer | Courtney Goeltzenleuchter <courtney@LunarG.com> | 2015-06-17 20:56:36 -0600 |
| commit | 0d67c29d5d2a2f3383e11279a091a1f164f8eb95 (patch) | |
| tree | e3e1ccc09ecdb9eba13aff5c12ca748787742e84 /layers/mem_tracker.cpp | |
| parent | 813d8d2445d30223a6f46ccf4806f9e41754b333 (diff) | |
| download | usermoji-0d67c29d5d2a2f3383e11279a091a1f164f8eb95.tar.xz | |
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.
Diffstat (limited to 'layers/mem_tracker.cpp')
| -rw-r--r-- | layers/mem_tracker.cpp | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp index b77b7423..3898a543 100644 --- a/layers/mem_tracker.cpp +++ b/layers/mem_tracker.cpp @@ -796,7 +796,7 @@ static VkLayerDispatchTable * initDeviceTable(const VkBaseLayerObject *devw) return it->second; } - layer_initialize_dispatch_table(pTable, (PFN_vkGetDeviceProcAddr) devw->pGPA, (VkDevice) devw->nextObject); + layer_initialize_dispatch_table(pTable, devw); return pTable; } @@ -818,7 +818,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; } @@ -2151,17 +2151,17 @@ VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr( VkDevice dev, const char *funcName) { - VkBaseLayerObject* devw = (VkBaseLayerObject *) dev; - if (dev == NULL) { return NULL; } loader_platform_thread_once(&g_initOnce, initMemTracker); - initDeviceTable((const VkBaseLayerObject *) dev); - if (!strcmp(funcName, "vkGetDeviceProcAddr")) + /* loader uses this to force layer initialization; device object is wrapped */ + if (!strcmp(funcName, "vkGetDeviceProcAddr")) { + initDeviceTable((const VkBaseLayerObject *) dev); return (void *) vkGetDeviceProcAddr; + } if (!strcmp(funcName, "vkDestroyDevice")) return (void*) vkDestroyDevice; if (!strcmp(funcName, "vkQueueSubmit")) @@ -2296,11 +2296,13 @@ VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr( return (void*) vkDestroySwapChainWSI; if (!strcmp(funcName, "vkGetSwapChainInfoWSI")) return (void*) vkGetSwapChainInfoWSI; - else { - if (devw->pGPA == NULL) { + else + { + VkLayerDispatchTable **ppDisp = (VkLayerDispatchTable **) dev; + VkLayerDispatchTable* pTable = tableMap[*ppDisp]; + if (pTable->GetDeviceProcAddr == NULL) return NULL; - } - return devw->pGPA((VkObject)devw->nextObject, funcName); + return pTable->GetDeviceProcAddr(dev, funcName); } } @@ -2308,25 +2310,28 @@ VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr( VkInstance instance, const char *funcName) { - VkBaseLayerObject* instw = (VkBaseLayerObject *) instance; - if (instance == NULL) { return NULL; } loader_platform_thread_once(&g_initOnce, initMemTracker); - initInstanceTable((const VkBaseLayerObject *) instance); - if (!strcmp(funcName, "vkGetInstanceProcAddr")) + /* loader uses this to force layer initialization; instance object is wrapped */ + if (!strcmp(funcName, "vkGetInstanceProcAddr")) { + initInstanceTable((const VkBaseLayerObject *) instance); return (void *) vkGetInstanceProcAddr; + } + if (!strcmp(funcName, "vkDestroyInstance")) return (void *) vkDestroyInstance; if (!strcmp(funcName, "vkCreateDevice")) return (void*) vkCreateDevice; - else { - if (instw->pGPA == NULL) { + else + { + 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); } } |
