layers: Initialize debug_report instance proc table
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index 4b76f05..3371271 100644
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -1536,6 +1536,11 @@
if (result == VK_SUCCESS) {
enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
+
+ debug_report_init_instance_extension_dispatch_table(
+ pTable,
+ pTable->GetInstanceProcAddr,
+ *pInstance);
}
return result;
}
diff --git a/layers/layers_msg.h b/layers/layers_msg.h
index a5e90de..f73e4d3 100644
--- a/layers/layers_msg.h
+++ b/layers/layers_msg.h
@@ -96,6 +96,15 @@
return result;
}
+static inline void debug_report_init_instance_extension_dispatch_table(
+ VkLayerInstanceDispatchTable *table,
+ PFN_vkGetInstanceProcAddr gpa,
+ VkInstance inst)
+{
+ table->DbgCreateMsgCallback = (PFN_vkDbgCreateMsgCallback) gpa(inst, "vkDbgCreateMsgCallback");
+ table->DbgDestroyMsgCallback = (PFN_vkDbgDestroyMsgCallback) gpa(inst, "vkDbgDestroyMsgCallback");
+}
+
static void* msg_callback_get_proc_addr(
const char *funcName)
{
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index b6a839d..9e51e88 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -869,10 +869,16 @@
{
loader_platform_thread_once(&g_initOnce, initMemTracker);
- VkResult result = instance_dispatch_table(*pInstance)->CreateInstance(pCreateInfo, pInstance);
+ VkLayerInstanceDispatchTable *pTable = instance_dispatch_table(*pInstance);
+ VkResult result = pTable->CreateInstance(pCreateInfo, pInstance);
if (result == VK_SUCCESS) {
enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
+
+ debug_report_init_instance_extension_dispatch_table(
+ pTable,
+ pTable->GetInstanceProcAddr,
+ *pInstance);
}
return result;
}
diff --git a/layers/param_checker.cpp b/layers/param_checker.cpp
index 79903f3..15056f5 100644
--- a/layers/param_checker.cpp
+++ b/layers/param_checker.cpp
@@ -189,6 +189,12 @@
layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
return;
}
+
+ VkLayerInstanceDispatchTable *pTable = instance_dispatch_table(*pInstance);
+ debug_report_init_instance_extension_dispatch_table(
+ pTable,
+ pTable->GetInstanceProcAddr,
+ *pInstance);
}
VK_LAYER_EXPORT VkResult VKAPI vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, VkInstance* pInstance)
diff --git a/layers/shader_checker.cpp b/layers/shader_checker.cpp
index 20f1aae..d31d7f6 100644
--- a/layers/shader_checker.cpp
+++ b/layers/shader_checker.cpp
@@ -955,6 +955,11 @@
if (result == VK_SUCCESS) {
enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
+
+ debug_report_init_instance_extension_dispatch_table(
+ pTable,
+ pTable->GetInstanceProcAddr,
+ *pInstance);
}
return result;
}
diff --git a/vk-layer-generate.py b/vk-layer-generate.py
index c4a529d..57584c7 100755
--- a/vk-layer-generate.py
+++ b/vk-layer-generate.py
@@ -1378,12 +1378,19 @@
create_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
elif 'Create' in proto.name or 'Alloc' in proto.name:
create_line = ' loader_platform_thread_lock_mutex(&objLock);\n'
- create_line += ' create_obj(*%s, %s);\n' % (proto.params[-1].name, obj_type_mapping[proto.params[-1].ty.strip('*').replace('const ', '')])
- create_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
+ create_line += ' if (result == VK_SUCCESS) {\n'
if 'CreateDevice' in proto.name:
- create_line += ' if (result == VK_SUCCESS) {\n'
- create_line += ' enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);\n'
- create_line += ' }\n'
+ create_line += ' enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);\n'
+ elif 'CreateInstance' in proto.name:
+ create_line += ' enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);\n'
+ create_line += ' VkLayerInstanceDispatchTable *pTable = instance_dispatch_table(*pInstance);\n'
+ create_line += ' debug_report_init_instance_extension_dispatch_table(\n'
+ create_line += ' pTable,\n'
+ create_line += ' pTable->GetInstanceProcAddr,\n'
+ create_line += ' *pInstance);\n'
+ create_line += ' create_obj(*%s, %s);\n' % (proto.params[-1].name, obj_type_mapping[proto.params[-1].ty.strip('*').replace('const ', '')])
+ create_line += ' }\n'
+ create_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
if 'GetDeviceQueue' in proto.name:
destroy_line = ' loader_platform_thread_lock_mutex(&objLock);\n'
@@ -1664,6 +1671,24 @@
' return result;\n'
'}\n' % (qual, decl, ret_val, table, proto.params[0].name, proto.c_call()))
return "\n".join(funcs);
+ elif proto.name == "CreateInstance":
+ funcs.append('%s%s\n'
+ '{\n'
+ ' loader_platform_thread_once(&initOnce, initThreading);\n'
+ '\n'
+ ' %s %s_dispatch_table(*pInstance)->CreateInstance(pCreateInfo, pInstance);\n'
+ '\n'
+ ' if (result == VK_SUCCESS) {\n'
+ ' enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);\n'
+ ' VkLayerInstanceDispatchTable *pTable = instance_dispatch_table(*pInstance);\n'
+ ' debug_report_init_instance_extension_dispatch_table(\n'
+ ' pTable,\n'
+ ' pTable->GetInstanceProcAddr,\n'
+ ' *pInstance);\n'
+ ' }\n'
+ ' return result;\n'
+ '}\n' % (qual, decl, ret_val, table))
+ return "\n".join(funcs);
if len(checked_params) == 0:
return None
# Surround call with useObject and finishUsingObject for each checked_param