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',