aboutsummaryrefslogtreecommitdiff
path: root/layers/mem_tracker.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/mem_tracker.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/mem_tracker.cpp')
-rw-r--r--layers/mem_tracker.cpp40
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;