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/mem_tracker.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/mem_tracker.cpp')
| -rw-r--r-- | layers/mem_tracker.cpp | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp index 2e9307d5..20a69c31 100644 --- a/layers/mem_tracker.cpp +++ b/layers/mem_tracker.cpp @@ -43,8 +43,12 @@ using namespace std; #include "layers_msg.h" 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; @@ -771,6 +775,23 @@ static void printCBList( } } +// 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 initMemTracker( void) { @@ -790,14 +811,6 @@ static void initMemTracker( } } - // 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) { // TODO/TBD: Need to delete this mutex sometime. How??? One @@ -815,8 +828,6 @@ VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice( const VkDeviceCreateInfo *pCreateInfo, VkDevice *pDevice) { - pCurObj = (VkBaseLayerObject *) gpu; - loader_platform_thread_once(&g_initOnce, initMemTracker); VkResult result = nextTable.CreateDevice(gpu, pCreateInfo, pDevice); // Save off device in case we need it to create Fences globalDevice = *pDevice; @@ -925,6 +936,7 @@ VK_LAYER_EXPORT VkResult VKAPI vkEnumerateLayers( { pCurObj = (VkBaseLayerObject *) gpu; loader_platform_thread_once(&g_initOnce, initMemTracker); + loader_platform_thread_once(&g_tabDeviceOnce, initDeviceTable); VkResult result = nextTable.EnumerateLayers(gpu, maxStringSize, pLayerCount, pOutLayers, pReserved); return result; @@ -2149,6 +2161,7 @@ VK_LAYER_EXPORT void* VKAPI vkGetProcAddr( } pCurObj = gpuw; loader_platform_thread_once(&g_initOnce, initMemTracker); + loader_platform_thread_once(&g_tabDeviceOnce, initDeviceTable); if (!strcmp(funcName, "vkGetProcAddr")) return (void *) vkGetProcAddr; @@ -2311,9 +2324,10 @@ VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr( if (instance == NULL) { return NULL; } - //TODO - //pCurObj = instw; - //loader_platform_thread_once(&g_initInstanceOnce, initInstanceMemTracker); + + pCurObj = instw; + loader_platform_thread_once(&g_initOnce, initMemTracker); + loader_platform_thread_once(&g_tabInstanceOnce, initInstanceTable); if (!strcmp(funcName, "vkGetProcAddr")) return (void *) vkGetProcAddr; |
