aboutsummaryrefslogtreecommitdiff
path: root/layers/draw_state.cpp
diff options
context:
space:
mode:
authorJon Ashburn <jon@lunarg.com>2015-05-07 10:27:37 -0600
committerCourtney Goeltzenleuchter <courtney@LunarG.com>2015-06-17 19:47:01 -0600
commit1818420a8e9033de320b0aac091c90f884c05924 (patch)
treed8ac936f7b8600e6b93925cd9dc148922fd56ccb /layers/draw_state.cpp
parent9f2ed05f51c775a577b9e83cf23135d2b1addd04 (diff)
downloadusermoji-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-xlayers/draw_state.cpp37
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;