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.
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index 95fa1f5..cedf652 100755
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -59,8 +59,12 @@
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 @@
}
}
+// 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 @@
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 @@
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 @@
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 @@
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;