From 1818420a8e9033de320b0aac091c90f884c05924 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Thu, 7 May 2015 10:27:37 -0600 Subject: layers: Add initialization of instance dispatch table Make the layer init separate from either device or instance dispatch table init, since these are done at different times. --- layers/multi.cpp | 64 +++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 8 deletions(-) (limited to 'layers/multi.cpp') diff --git a/layers/multi.cpp b/layers/multi.cpp index 78ee302f..97326545 100644 --- a/layers/multi.cpp +++ b/layers/multi.cpp @@ -35,9 +35,11 @@ #include "loader_platform.h" static void initLayerTable(const VkBaseLayerObject *gpuw, VkLayerDispatchTable *pTable, const unsigned int layerNum); +static void initLayerInstanceTable(const VkBaseLayerObject *instw, VkLayerInstanceDispatchTable *pTable, const unsigned int layerNum); /******************************** Layer multi1 functions **************************/ static std::unordered_map tableMap1; +static std::unordered_map tableInstanceMap1; static bool layer1_first_activated = false; static VkLayerDispatchTable * getLayer1Table(const VkBaseLayerObject *gpuw) @@ -57,6 +59,23 @@ static VkLayerDispatchTable * getLayer1Table(const VkBaseLayerObject *gpuw) return it->second; } } +static VkLayerInstanceDispatchTable * getLayer1InstanceTable(const VkBaseLayerObject *instw) +{ + VkLayerInstanceDispatchTable *pTable; + + assert(instw); + std::unordered_map::const_iterator it = tableInstanceMap1.find((void *) instw->baseObject); + if (it == tableInstanceMap1.end()) + { + pTable = new VkLayerInstanceDispatchTable; + tableInstanceMap1[(void *) instw->baseObject] = pTable; + initLayerInstanceTable(instw, pTable, 1); + return pTable; + } else + { + return it->second; + } +} #ifdef __cplusplus extern "C" { #endif @@ -137,14 +156,14 @@ VK_LAYER_EXPORT void * VKAPI multi1GetProcAddr(VkPhysicalDevice gpu, const char* } } -VK_LAYER_EXPORT void * VKAPI multi1InstanceGetProcAddr(VkInstance inst, const char* pName) +VK_LAYER_EXPORT void * VKAPI multi1GetInstanceProcAddr(VkInstance inst, const char* pName) { VkBaseLayerObject* instw = (VkBaseLayerObject *) inst; if (inst == NULL) return NULL; - //TODO getLayer1InstanceTable(instw); + getLayer1InstanceTable(instw); if (!strcmp("vkCreateDevice", pName)) return (void *) multi1CreateDevice; @@ -161,8 +180,27 @@ VK_LAYER_EXPORT void * VKAPI multi1InstanceGetProcAddr(VkInstance inst, const ch /******************************** Layer multi2 functions **************************/ static std::unordered_map tableMap2; +static std::unordered_map tableInstanceMap2; static bool layer2_first_activated = false; +static VkLayerInstanceDispatchTable * getLayer2InstanceTable(const VkBaseLayerObject *instw) +{ + VkLayerInstanceDispatchTable *pTable; + + assert(instw); + std::unordered_map::const_iterator it = tableInstanceMap2.find((void *) instw->baseObject); + if (it == tableInstanceMap2.end()) + { + pTable = new VkLayerInstanceDispatchTable; + tableInstanceMap2[(void *) instw->baseObject] = pTable; + initLayerInstanceTable(instw, pTable, 2); + return pTable; + } else + { + return it->second; + } +} + static VkLayerDispatchTable * getLayer2Table(const VkBaseLayerObject *gpuw) { VkLayerDispatchTable *pTable; @@ -259,14 +297,14 @@ VK_LAYER_EXPORT void * VKAPI multi2GetProcAddr(VkPhysicalDevice gpu, const char* } } -VK_LAYER_EXPORT void * VKAPI multi2InstanceGetProcAddr(VkInstance inst, const char* pName) +VK_LAYER_EXPORT void * VKAPI multi2GetInstanceProcAddr(VkInstance inst, const char* pName) { VkBaseLayerObject* instw = (VkBaseLayerObject *) inst; if (inst == NULL) return NULL; - //TODO getLayer2InstanceTable(instw); + getLayer2InstanceTable(instw); if (!strcmp("vkCreateDevice", pName)) return (void *) multi2CreateDevice; @@ -379,17 +417,17 @@ VK_LAYER_EXPORT void * VKAPI vkGetInstanceProcAddr(VkInstance inst, const char* else if (!strcmp("vkGetProcAddr", pName)) return (void *) vkGetProcAddr; else if (!strcmp("multi1GetInstanceProcAddr", pName)) - return (void *) multi1GetProcAddr; + return (void *) multi1GetInstanceProcAddr; else if (!strcmp("multi2GetInstanceProcAddr", pName)) - return (void *) multi2GetProcAddr; + return (void *) multi2GetInstanceProcAddr; else if (!strcmp("vkGetInstanceProcAddr", pName)) return (void *) vkGetProcAddr; // use first layer activated as GPA dispatch table activation happens in order else if (layer1_first_activated) - return multi1InstanceGetProcAddr(inst, pName); + return multi1GetInstanceProcAddr(inst, pName); else if (layer2_first_activated) - return multi2InstanceGetProcAddr(inst, pName); + return multi2GetInstanceProcAddr(inst, pName); else return NULL; @@ -407,3 +445,13 @@ static void initLayerTable(const VkBaseLayerObject *gpuw, VkLayerDispatchTable * layer_initialize_dispatch_table(pTable, (PFN_vkGetProcAddr) gpuw->pGPA, (VkPhysicalDevice) gpuw->nextObject); } + +static void initLayerInstanceTable(const VkBaseLayerObject *instw, VkLayerInstanceDispatchTable *pTable, const unsigned int layerNum) +{ + if (layerNum == 2 && layer1_first_activated == false) + layer2_first_activated = true; + if (layerNum == 1 && layer2_first_activated == false) + layer1_first_activated = true; + + layer_init_instance_dispatch_table(pTable, (PFN_vkGetInstanceProcAddr) instw->pGPA, (VkInstance) instw->nextObject); +} -- cgit v1.2.3