misc: Add create_info struct to CreateInstance()

Allows extnesion or layer enablement at CreateInstance
Khronos Bug 13637
diff --git a/tools/glave/scripts/vk_generate.py b/tools/glave/scripts/vk_generate.py
index 9cea651..570a203 100755
--- a/tools/glave/scripts/vk_generate.py
+++ b/tools/glave/scripts/vk_generate.py
@@ -338,7 +338,7 @@
         #   big case to handle is when ptrs to structs have embedded data that needs to be accounted for in packet
         custom_ptr_dict = {'XGL_DEVICE_CREATE_INFO': {'add_txt': 'add_XGL_DEVICE_CREATE_INFO_to_packet(pHeader, (XGL_DEVICE_CREATE_INFO**) &(pPacket->pCreateInfo), pCreateInfo)',
                                                   'finalize_txt': ''},
-                           'XGL_APPLICATION_INFO': {'add_txt': 'add_XGL_APPLICATION_INFO_to_packet(pHeader, (XGL_APPLICATION_INFO**)&(pPacket->pAppInfo), pAppInfo)',
+                           'XGL_INSTANCE_CREATE_INFO': {'add_txt': 'add_XGL_INSTANCE_CREATE_INFO_to_packet(pHeader, (XGL_INSTANCE_CREATE_INFO**)&(pPacket->pCreateInfo), pCreateInfo)',
                                                 'finalize_txt': ''},
                            'XGL_PHYSICAL_GPU': {'add_txt': 'glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pGpus), *pGpuCount*sizeof(XGL_PHYSICAL_GPU), pGpus)',
                                                 'finalize_txt': 'default'},
@@ -550,7 +550,7 @@
                     if 'void' not in proto.ret or '*' in proto.ret:
                         func_body.append('    pPacket->result = result;')
                     for pp_dict in ptr_packet_update_list:
-                        if ('DEVICE_CREATE_INFO' not in proto.params[pp_dict['index']].ty) and ('APPLICATION_INFO' not in proto.params[pp_dict['index']].ty) and ('ppUpdateArray' != proto.params[pp_dict['index']].name):
+                        if ('DEVICE_CREATE_INFO' not in proto.params[pp_dict['index']].ty) and ('INSTANCE_CREATE_INFO' not in proto.params[pp_dict['index']].ty) and ('ppUpdateArray' != proto.params[pp_dict['index']].name):
                             func_body.append('    %s;' % (pp_dict['finalize_txt']))
                     func_body.append('    FINISH_TRACE_PACKET();')
                     if 'AllocMemory' in proto.name:
@@ -729,6 +729,25 @@
         pid_enum.append('    glv_finalize_buffer_address(pHeader, (void**)&((*ppStruct)->pEngineName));')
         pid_enum.append('    glv_finalize_buffer_address(pHeader, (void**)&*ppStruct);')
         pid_enum.append('};\n')
+        pid_enum.append('static void add_XGL_INSTANCE_CREATE_INFO_to_packet(glv_trace_packet_header*  pHeader, XGL_INSTANCE_CREATE_INFO** ppStruct, const XGL_INSTANCE_CREATE_INFO *pInStruct)')
+        pid_enum.append('{')
+        pid_enum.append('    uint32_t i = 0;')
+        pid_enum.append('    glv_add_buffer_to_trace_packet(pHeader, (void**)ppStruct, sizeof(XGL_INSTANCE_CREATE_INFO), pInStruct);')
+        pid_enum.append('    add_XGL_APPLICATION_INFO_to_packet(pHeader, (XGL_APPLICATION_INFO**) &((*ppStruct)->pAppInfo), pInStruct->pAppInfo);')
+        pid_enum.append('    glv_add_buffer_to_trace_packet(pHeader, (void**)&((*ppStruct)->pAllocCb), sizeof(XGL_ALLOC_CALLBACKS), pInStruct->pAllocCb);')
+        pid_enum.append('    glv_finalize_buffer_address(pHeader, (void**)&((*ppStruct)->pAllocCb));')
+        pid_enum.append('    if (pInStruct->extensionCount > 0) ')
+        pid_enum.append('    {')
+        pid_enum.append('        glv_add_buffer_to_trace_packet(pHeader, (void**)(&(*ppStruct)->ppEnabledExtensionNames), pInStruct->extensionCount * sizeof(char *), pInStruct->ppEnabledExtensionNames);')
+        pid_enum.append('        for (i = 0; i < pInStruct->extensionCount; i++)')
+        pid_enum.append('        {')
+        pid_enum.append('            glv_add_buffer_to_trace_packet(pHeader, (void**)(&((*ppStruct)->ppEnabledExtensionNames[i])), strlen(pInStruct->ppEnabledExtensionNames[i]) + 1, pInStruct->ppEnabledExtensionNames[i]);')
+        pid_enum.append('            glv_finalize_buffer_address(pHeader, (void**)(&((*ppStruct)->ppEnabledExtensionNames[i])));')
+        pid_enum.append('        }')
+        pid_enum.append('        glv_finalize_buffer_address(pHeader, (void **)&(*ppStruct)->ppEnabledExtensionNames);')
+        pid_enum.append('    }')
+        pid_enum.append('    glv_finalize_buffer_address(pHeader, (void**)&*ppStruct);')
+        pid_enum.append('};\n')
         pid_enum.append('//=============================================================================\n')
         pid_enum.append('static void add_XGL_DEVICE_CREATE_INFO_to_packet(glv_trace_packet_header*  pHeader, XGL_DEVICE_CREATE_INFO** ppStruct, const XGL_DEVICE_CREATE_INFO *pInStruct)')
         pid_enum.append('{')
@@ -736,7 +755,7 @@
         pid_enum.append('    glv_add_buffer_to_trace_packet(pHeader, (void**)ppStruct, sizeof(XGL_DEVICE_CREATE_INFO), pInStruct);')
         pid_enum.append('    glv_add_buffer_to_trace_packet(pHeader, (void**)&(*ppStruct)->pRequestedQueues, pInStruct->queueRecordCount*sizeof(XGL_DEVICE_QUEUE_CREATE_INFO), pInStruct->pRequestedQueues);')
         pid_enum.append('    glv_finalize_buffer_address(pHeader, (void**)&(*ppStruct)->pRequestedQueues);')
-        pid_enum.append('    if (pInStruct->extensionCount > 0) ')
+        pid_enum.append('    if (pInStruct->extensionCount > 0)')
         pid_enum.append('    {')
         pid_enum.append('        glv_add_buffer_to_trace_packet(pHeader, (void**)(&(*ppStruct)->ppEnabledExtensionNames), pInStruct->extensionCount * sizeof(char *), pInStruct->ppEnabledExtensionNames);')
         pid_enum.append('        for (i = 0; i < pInStruct->extensionCount; i++)')
@@ -825,9 +844,21 @@
     def _generate_interp_funcs(self):
         # Custom txt for given function and parameter.  First check if param is NULL, then insert txt if not
         # TODO : This code is now too large and complex, need to make codegen smarter for pointers embedded in struct params to handle those cases automatically
-        custom_case_dict = { 'CreateInstance' : {'param': 'pAppInfo', 'txt': ['XGL_APPLICATION_INFO* pInfo = (XGL_APPLICATION_INFO*)pPacket->pAppInfo;\n',
-                                                       'pInfo->pAppName = (const char*)glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pPacket->pAppInfo->pAppName);\n',
-                                                       'pInfo->pEngineName = (const char*)glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pPacket->pAppInfo->pEngineName);']},
+        custom_case_dict = { 'CreateInstance' : {'param': 'pCreateInfo', 'txt': ['XGL_INSTANCE_CREATE_INFO *pInfo = (XGL_INSTANCE_CREATE_INFO *) pPacket->pCreateInfo;\n',
+                                                       'XGL_APPLICATION_INFO **ppAppInfo = (XGL_APPLICATION_INFO**) &pInfo->pAppInfo;\n',
+                                                       '*ppAppInfo = (XGL_APPLICATION_INFO*) glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t) pInfo->pAppInfo);\n',
+                                                       '(*ppAppInfo)->pAppName = (const char*)glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)(*ppAppInfo)->pAppName);\n',
+                                                       '(*ppAppInfo)->pEngineName = (const char*)glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)(*ppAppInfo)->pEngineName);',
+                                                       'if (pInfo->extensionCount > 0)\n',
+                                                       '{',
+                                                       '    pInfo->ppEnabledExtensionNames = (const char *const*)glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pInfo->ppEnabledExtensionNames);\n',
+                                                       '    const char **pNames = (const char**)pInfo->ppEnabledExtensionNames;\n',
+                                                       '    uint32_t i;\n'
+                                                       '    for (i = 0; i < pInfo->extensionCount; i++)\n',
+                                                       '    {\n',
+                                                       '        pNames[i] = (const char*)glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)(pInfo->ppEnabledExtensionNames[i]));\n',
+                                                       '    }\n',
+                                                       '}']},
                              'CreateShader' : {'param': 'pCreateInfo', 'txt': ['XGL_SHADER_CREATE_INFO* pInfo = (XGL_SHADER_CREATE_INFO*)pPacket->pCreateInfo;\n',
                                                'pInfo->pCode = glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pPacket->pCreateInfo->pCode);']},
                              'CreateDynamicViewportState' : {'param': 'pCreateInfo', 'txt': ['XGL_DYNAMIC_VP_STATE_CREATE_INFO* pInfo = (XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pPacket->pCreateInfo;\n',
diff --git a/tools/glave/src/glv_extensions/glvtrace_xgl/glvtrace_xgl_trace.c b/tools/glave/src/glv_extensions/glvtrace_xgl/glvtrace_xgl_trace.c
index c1d8974..3f46c6c 100644
--- a/tools/glave/src/glv_extensions/glvtrace_xgl/glvtrace_xgl_trace.c
+++ b/tools/glave/src/glv_extensions/glvtrace_xgl/glvtrace_xgl_trace.c
@@ -43,8 +43,7 @@
 XGLMemInfo g_memInfo = {0, NULL, NULL, 0};
 
 GLVTRACER_EXPORT XGL_RESULT XGLAPI __HOOKED_xglCreateInstance(
-    const XGL_APPLICATION_INFO* pAppInfo,
-    const XGL_ALLOC_CALLBACKS* pAllocCb,
+    const XGL_INSTANCE_CREATE_INFO* pCreateInfo,
     XGL_INSTANCE* pInstance)
 {
     glv_trace_packet_header* pHeader;
@@ -58,8 +57,8 @@
         glv_platform_get_next_lib_sym((void **) &real_xglCreateInstance,"xglCreateInstance");
     }
     startTime = glv_get_time();
-    result = real_xglCreateInstance(pAppInfo, pAllocCb, pInstance);
-    CREATE_TRACE_PACKET(xglCreateInstance, sizeof(XGL_INSTANCE) + get_struct_chain_size((void*)pAppInfo) + ((pAllocCb == NULL) ? 0 :sizeof(XGL_ALLOC_CALLBACKS)));
+    result = real_xglCreateInstance(pCreateInfo, pInstance);
+    CREATE_TRACE_PACKET(xglCreateInstance, sizeof(XGL_INSTANCE) + get_struct_chain_size((void*)pCreateInfo));
     pHeader->entrypoint_begin_time = startTime;
     if (isHooked == FALSE) {
         AttachHooks();
@@ -68,11 +67,9 @@
     }
     pPacket = interpret_body_as_xglCreateInstance(pHeader);
 
-    add_XGL_APPLICATION_INFO_to_packet(pHeader, (XGL_APPLICATION_INFO**)&(pPacket->pAppInfo), pAppInfo);
-    glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pAllocCb), sizeof(XGL_ALLOC_CALLBACKS), pAllocCb);
+    add_XGL_INSTANCE_CREATE_INFO_to_packet(pHeader, (XGL_INSTANCE_CREATE_INFO**)&(pPacket->pCreateInfo), pCreateInfo);
     glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pInstance), sizeof(XGL_INSTANCE), pInstance);
     pPacket->result = result;
-    glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pAllocCb));
     glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pInstance));
     FINISH_TRACE_PACKET();
     return result;