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/multi.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/multi.cpp')
| -rw-r--r-- | layers/multi.cpp | 72 |
1 files changed, 35 insertions, 37 deletions
diff --git a/layers/multi.cpp b/layers/multi.cpp index 2cc9e0c4..b0e8f212 100644 --- a/layers/multi.cpp +++ b/layers/multi.cpp @@ -149,22 +149,26 @@ VK_LAYER_EXPORT void * VKAPI multi1GetDeviceProcAddr(VkDevice device, const char if (device == NULL) return NULL; - getLayer1Table(devw); - if (!strcmp("vkGetDeviceProcAddr", pName)) + + if (!strcmp("vkGetDeviceProcAddr", pName)) { + getLayer1Table(devw); return (void *) multi1GetDeviceProcAddr; + } if (!strcmp("vkDestroyDevice", pName)) return (void *) multi1DestroyDevice; if (!strcmp("vkCreateSampler", pName)) return (void *) multi1CreateSampler; - else if (!strcmp("vkCreateGraphicsPipeline", pName)) + if (!strcmp("vkCreateGraphicsPipeline", pName)) return (void *) multi1CreateGraphicsPipeline; - else if (!strcmp("vkStorePipeline", pName)) + if (!strcmp("vkStorePipeline", pName)) return (void *) multi1StorePipeline; else { - if (devw->pGPA == NULL) + VkLayerDispatchTable **ppDisp = (VkLayerDispatchTable **) device; + VkLayerDispatchTable* pTable = tableMap1[*ppDisp]; + if (pTable->GetDeviceProcAddr == NULL) return NULL; - return devw->pGPA((VkObject) devw->nextObject, pName); + return pTable->GetDeviceProcAddr(device, pName); } } @@ -175,18 +179,22 @@ VK_LAYER_EXPORT void * VKAPI multi1GetInstanceProcAddr(VkInstance inst, const ch if (inst == NULL) return NULL; - getLayer1InstanceTable(instw); - if (!strcmp("vkGetInstanceProcAddr", pName)) + + if (!strcmp("vkGetInstanceProcAddr", pName)) { + getLayer1InstanceTable(instw); return (void *) multi1GetInstanceProcAddr; + } if (!strcmp("vkDestroyInstance", pName)) return (void *) multi1DestroyInstance; - else if (!strcmp("GetGlobalExtensionInfo", pName)) + if (!strcmp("GetGlobalExtensionInfo", pName)) return (void*) vkGetGlobalExtensionInfo; else { - if (instw->pGPA == NULL) + VkLayerInstanceDispatchTable **ppDisp = (VkLayerInstanceDispatchTable **) inst; + VkLayerInstanceDispatchTable* pTable = tableInstanceMap1[*ppDisp]; + if (pTable->GetInstanceProcAddr == NULL) return NULL; - return instw->pGPA((VkObject) instw->nextObject, pName); + return pTable->GetInstanceProcAddr(inst, pName); } } @@ -310,10 +318,10 @@ VK_LAYER_EXPORT void * VKAPI multi2GetDeviceProcAddr(VkDevice device, const char if (device == NULL) return NULL; - getLayer2Table(devw); - - if (!strcmp("vkGetDeviceProcAddr", pName)) + if (!strcmp("vkGetDeviceProcAddr", pName)) { + getLayer2Table(devw); return (void *) multi2GetDeviceProcAddr; + } if (!strcmp("vkDestroyDevice", pName)) return (void *) multi2DestroyDevice; if (!strcmp("vkCreateCommandBuffer", pName)) @@ -321,9 +329,11 @@ VK_LAYER_EXPORT void * VKAPI multi2GetDeviceProcAddr(VkDevice device, const char else if (!strcmp("vkBeginCommandBuffer", pName)) return (void *) multi2BeginCommandBuffer; else { - if (devw->pGPA == NULL) + VkLayerDispatchTable **ppDisp = (VkLayerDispatchTable **) device; + VkLayerDispatchTable* pTable = tableMap2[*ppDisp]; + if (pTable->GetDeviceProcAddr == NULL) return NULL; - return devw->pGPA((VkObject) devw->nextObject, pName); + return pTable->GetDeviceProcAddr(device, pName); } } @@ -334,10 +344,10 @@ VK_LAYER_EXPORT void * VKAPI multi2GetInstanceProcAddr(VkInstance inst, const ch if (inst == NULL) return NULL; - getLayer2InstanceTable(instw); - - if (!strcmp("vkGetInstanceProcAddr", pName)) + if (!strcmp("vkGetInstanceProcAddr", pName)) { + getLayer2InstanceTable(instw); return (void *) multi2GetInstanceProcAddr; + } if (!strcmp("vkEnumeratePhysicalDevices", pName)) return (void *) multi2EnumeratePhysicalDevices; if (!strcmp("vkDestroyInstance", pName)) @@ -347,27 +357,15 @@ VK_LAYER_EXPORT void * VKAPI multi2GetInstanceProcAddr(VkInstance inst, const ch else if (!strcmp("GetGlobalExtensionInfo", pName)) return (void*) vkGetGlobalExtensionInfo; else { - if (instw->pGPA == NULL) + VkLayerInstanceDispatchTable **ppDisp = (VkLayerInstanceDispatchTable **) inst; + VkLayerInstanceDispatchTable* pTable = tableInstanceMap2[*ppDisp]; + if (pTable->GetInstanceProcAddr == NULL) return NULL; - return instw->pGPA((VkObject) instw->nextObject, pName); + return pTable->GetInstanceProcAddr(inst, pName); } } /********************************* Common functions ********************************/ -VK_LAYER_EXPORT VkResult VKAPI vkEnumerateLayers(VkPhysicalDevice gpu, size_t maxStringSize, - size_t* pLayerCount, char* const* pOutLayers, - void* pReserved) -{ - if (pLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL || pOutLayers[1] == NULL || pReserved == NULL) - return VK_ERROR_INVALID_POINTER; - - if (*pLayerCount < 2) - return VK_ERROR_INITIALIZATION_FAILED; - *pLayerCount = 2; - strncpy((char *) pOutLayers[0], "multi1", maxStringSize); - strncpy((char *) pOutLayers[1], "multi2", maxStringSize); - return VK_SUCCESS; -} struct extProps { uint32_t version; @@ -479,7 +477,7 @@ static void initLayerTable(const VkBaseLayerObject *devw, VkLayerDispatchTable * if (layerNum == 1 && layer2_first_activated == false) layer1_first_activated = true; - layer_initialize_dispatch_table(pTable, (PFN_vkGetDeviceProcAddr) devw->pGPA, (VkDevice) devw->nextObject); + layer_initialize_dispatch_table(pTable, devw); } static void initLayerInstanceTable(const VkBaseLayerObject *instw, VkLayerInstanceDispatchTable *pTable, const unsigned int layerNum) @@ -489,5 +487,5 @@ static void initLayerInstanceTable(const VkBaseLayerObject *instw, VkLayerInstan if (layerNum == 1 && layer2_first_activated == false) layer1_first_activated = true; - layer_init_instance_dispatch_table(pTable, (PFN_vkGetInstanceProcAddr) instw->pGPA, (VkInstance) instw->nextObject); + layer_init_instance_dispatch_table(pTable, instw); } |
