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/draw_state.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/draw_state.cpp')
| -rwxr-xr-x | layers/draw_state.cpp | 37 |
1 files changed, 25 insertions, 12 deletions
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<VkRenderPass, VkRenderPassCreateInfo*> renderPassMap; unordered_map<VkFramebuffer, VkFramebufferCreateInfo*> 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; |
