diff options
| author | Jon Ashburn <jon@lunarg.com> | 2015-05-07 10:27:37 -0600 |
|---|---|---|
| committer | Courtney Goeltzenleuchter <courtney@LunarG.com> | 2015-06-17 19:47:01 -0600 |
| commit | 1818420a8e9033de320b0aac091c90f884c05924 (patch) | |
| tree | d8ac936f7b8600e6b93925cd9dc148922fd56ccb /layers/multi.cpp | |
| parent | 9f2ed05f51c775a577b9e83cf23135d2b1addd04 (diff) | |
| download | usermoji-1818420a8e9033de320b0aac091c90f884c05924.tar.xz | |
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.
Diffstat (limited to 'layers/multi.cpp')
| -rw-r--r-- | layers/multi.cpp | 64 |
1 files changed, 56 insertions, 8 deletions
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<void *, VkLayerDispatchTable *> tableMap1; +static std::unordered_map<void *, VkLayerInstanceDispatchTable *> 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<void *, VkLayerInstanceDispatchTable *>::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<void *, VkLayerDispatchTable *> tableMap2; +static std::unordered_map<void *, VkLayerInstanceDispatchTable *> tableInstanceMap2; static bool layer2_first_activated = false; +static VkLayerInstanceDispatchTable * getLayer2InstanceTable(const VkBaseLayerObject *instw) +{ + VkLayerInstanceDispatchTable *pTable; + + assert(instw); + std::unordered_map<void *, VkLayerInstanceDispatchTable *>::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); +} |
