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/draw_state.cpp | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) (limited to 'layers/draw_state.cpp') diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index 95fa1f5e..cedf652b 100755 --- a/layers/draw_state.cpp +++ b/layers/draw_state.cpp @@ -59,8 +59,12 @@ unordered_map renderPassMap; unordered_map frameBufferMap; static VkLayerDispatchTable nextTable; +static VkLayerInstanceDispatchTable nextInstanceTable; static VkBaseLayerObject *pCurObj; static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_initOnce); +static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_tabDeviceOnce); +static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_tabInstanceOnce); + // TODO : This can be much smarter, using separate locks for separate global data static int globalLockInitialized = 0; static loader_platform_thread_mutex globalLock; @@ -1438,6 +1442,23 @@ static void synchAndPrintDSConfig(const VkCmdBuffer cb) } } +// TODO handle multiple GPUs/instances for both instance and device dispatch tables +static void initDeviceTable(void) +{ + PFN_vkGetProcAddr fpNextGPA; + fpNextGPA = (PFN_vkGetProcAddr) pCurObj->pGPA; + assert(fpNextGPA); + layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkPhysicalDevice) pCurObj->nextObject); +} + +static void initInstanceTable(void) +{ + PFN_vkGetInstanceProcAddr fpNextGPA; + fpNextGPA = (PFN_vkGetInstanceProcAddr) pCurObj->pGPA; + assert(fpNextGPA); + layer_init_instance_dispatch_table(&nextInstanceTable, fpNextGPA, (VkInstance) pCurObj->nextObject); +} + static void initDrawState(void) { const char *strOpt; @@ -1455,13 +1476,6 @@ static void initDrawState(void) if (g_logFile == NULL) g_logFile = stdout; } - // initialize Layer dispatch table - // TODO handle multiple GPUs - PFN_vkGetProcAddr fpNextGPA; - fpNextGPA = (PFN_vkGetProcAddr) pCurObj->pGPA; - assert(fpNextGPA); - - layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkPhysicalDevice) pCurObj->nextObject); if (!globalLockInitialized) { @@ -1477,8 +1491,6 @@ static void initDrawState(void) VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice) { - pCurObj = (VkBaseLayerObject *) gpu; - loader_platform_thread_once(&g_initOnce, initDrawState); VkResult result = nextTable.CreateDevice(gpu, pCreateInfo, pDevice); return result; } @@ -2732,6 +2744,7 @@ VK_LAYER_EXPORT void* VKAPI vkGetProcAddr(VkPhysicalDevice gpu, const char* func return NULL; pCurObj = gpuw; loader_platform_thread_once(&g_initOnce, initDrawState); + loader_platform_thread_once(&g_tabDeviceOnce, initDeviceTable); if (!strcmp(funcName, "vkGetProcAddr")) return (void *) vkGetProcAddr; @@ -2882,9 +2895,9 @@ VK_LAYER_EXPORT void * VKAPI vkGetInstanceProcAddr(VkInstance instance, const ch if (instance == NULL) return NULL; - //TODO - //pCurObj = gpuw; - //loader_platform_thread_once(&g_initInstanceOnce, initInstanceDrawState); + pCurObj = instw; + loader_platform_thread_once(&g_initOnce, initDrawState); + loader_platform_thread_once(&g_tabInstanceOnce, initInstanceTable); if (!strcmp(funcName, "vkGetInstanceProcAddr")) return (void *) vkGetInstanceProcAddr; -- cgit v1.2.3