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