aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobin Ehlis <tobin@lunarg.com>2014-12-01 12:53:53 -0700
committerCourtney Goeltzenleuchter <courtney@LunarG.com>2014-12-11 16:07:34 -0700
commit27a30ec3f0a270b2c1104f11fae23f14b649ec37 (patch)
tree9154adb626661694ccabb1491d6d434e3cd3a6f3
parent81ab843f92a9a4c470a4d854d0f5c464c966437e (diff)
downloadusermoji-27a30ec3f0a270b2c1104f11fae23f14b649ec37.tar.xz
layers: Added codegen for glave glvtrace_xgl_xgl Header and C files
-rwxr-xr-xxgl-layer-generate.py733
1 files changed, 733 insertions, 0 deletions
diff --git a/xgl-layer-generate.py b/xgl-layer-generate.py
index 57a03c06..e36830a9 100755
--- a/xgl-layer-generate.py
+++ b/xgl-layer-generate.py
@@ -495,6 +495,694 @@ class Subcommand(object):
func_body.append("}\n")
return "\n".join(func_body)
+ def _generate_trace_func_ptrs(self):
+ func_ptrs = []
+ func_ptrs.append('// Pointers to real functions and declarations of hooked functions')
+ func_ptrs.append('#ifdef WIN32')
+ func_ptrs.append('extern INIT_ONCE gInitOnce;')
+ for proto in self.protos:
+ if 'Dbg' not in proto.name and 'Wsi' not in proto.name:
+ func_ptrs.append('#define __HOOKED_xgl%s hooked_xgl%s' % (proto.name, proto.name))
+
+ func_ptrs.append('\n#elif defined(PLATFORM_LINUX)')
+ func_ptrs.append('extern pthread_once_t gInitOnce;')
+ for proto in self.protos:
+ if 'Dbg' not in proto.name and 'Wsi' not in proto.name:
+ func_ptrs.append('#define __HOOKED_xgl%s xgl%s' % (proto.name, proto.name))
+
+ func_ptrs.append('#endif\n')
+ return "\n".join(func_ptrs)
+
+ def _generate_trace_func_protos(self):
+ func_protos = []
+ func_protos.append('// Hooked function prototypes\n')
+ for proto in self.protos:
+ if 'Dbg' not in proto.name and 'Wsi' not in proto.name:
+ func_protos.append('%s;' % proto.c_func(prefix="__HOOKED_xgl", attr="XGLAPI"))
+
+ return "\n".join(func_protos)
+
+ def _generate_func_ptr_assignments(self):
+ func_ptr_assign = []
+ for proto in self.protos:
+ if 'Dbg' not in proto.name and 'Wsi' not in proto.name:
+ func_ptr_assign.append('static %s( XGLAPI * real_xgl%s)(' % (proto.ret, proto.name))
+ for p in proto.params:
+ if 'color' == p.name:
+ func_ptr_assign.append(' %s %s[4],' % (p.ty.replace('[4]', ''), p.name))
+ else:
+ func_ptr_assign.append(' %s %s,' % (p.ty, p.name))
+ func_ptr_assign[-1] = func_ptr_assign[-1].replace(',', ') = xgl%s;\n' % (proto.name))
+ func_ptr_assign.append('static BOOL isHooked = FALSE;\n')
+ return "\n".join(func_ptr_assign)
+
+ def _generate_attach_hooks(self):
+ hooks_txt = []
+ hooks_txt.append('void AttachHooks()\n{\n BOOL hookSuccess = TRUE;\n#if defined(WIN32)')
+ hooks_txt.append(' Mhook_BeginMultiOperation(FALSE);')
+ hooks_txt.append(' if (real_xglInitAndEnumerateGpus != NULL)')
+ hooks_txt.append(' {\n isHooked = TRUE;')
+ hook_operator = '='
+ for proto in self.protos:
+ if 'Dbg' not in proto.name and 'Wsi' not in proto.name:
+ hooks_txt.append(' hookSuccess %s Mhook_SetHook((PVOID*)&real_xgl%s, hooked_xgl%s);' % (hook_operator, proto.name, proto.name))
+ hook_operator = '&='
+ hooks_txt.append(' }\n')
+ hooks_txt.append(' if (!hookSuccess)\n {')
+ hooks_txt.append(' glv_LogError("Failed to hook XGL.");\n }\n')
+ hooks_txt.append(' Mhook_EndMultiOperation();\n')
+ hooks_txt.append('#elif defined(__linux__)')
+ hooks_txt.append(' if (real_xglInitAndEnumerateGpus == xglInitAndEnumerateGpus)')
+ hooks_txt.append(' hookSuccess = glv_platform_get_next_lib_sym((PVOID*)&real_xglInitAndEnumerateGpus,"xglInitAndEnumerateGpus");')
+ hooks_txt.append(' isHooked = TRUE;')
+ for proto in self.protos:
+ if 'Dbg' not in proto.name and 'Wsi' not in proto.name and 'InitAndEnumerateGpus' not in proto.name:
+ hooks_txt.append(' hookSuccess %s glv_platform_get_next_lib_sym((PVOID*)&real_xgl%s, "xgl%s");' % (hook_operator, proto.name, proto.name))
+ hooks_txt.append(' if (!hookSuccess)\n {')
+ hooks_txt.append(' glv_LogError("Failed to hook XGL.");\n }\n')
+ hooks_txt.append('#endif\n}\n')
+ return "\n".join(hooks_txt)
+
+ def _generate_detach_hooks(self):
+ hooks_txt = []
+ hooks_txt.append('void DetachHooks()\n{\n#ifdef __linux__\n return;\n#elif defined(WIN32)')
+ hooks_txt.append(' BOOL unhookSuccess = TRUE;\n if (real_xglGetGpuInfo != NULL)\n {')
+ hook_operator = '='
+ for proto in self.protos:
+ if 'Dbg' not in proto.name and 'Wsi' not in proto.name:
+ hooks_txt.append(' unhookSuccess %s Mhook_Unhook((PVOID*)&real_xgl%s);' % (hook_operator, proto.name))
+ hook_operator = '&='
+ hooks_txt.append(' }\n isHooked = FALSE;\n')
+ hooks_txt.append(' if (!unhookSuccess)\n {')
+ hooks_txt.append(' glv_LogError("Failed to unhook XGL.");\n }')
+ hooks_txt.append('#endif\n}')
+ hooks_txt.append('#ifdef WIN32\nINIT_ONCE gInitOnce = INIT_ONCE_STATIC_INIT;\n#elif defined(PLATFORM_LINUX)\npthread_once_t gInitOnce = PTHREAD_ONCE_INIT;\n#endif\n')
+ return "\n".join(hooks_txt)
+
+ def _generate_init_tracer(self):
+ init_tracer = []
+ init_tracer.append('void InitTracer()\n{')
+ init_tracer.append(' gMessageStream = glv_MessageStream_create(FALSE, "127.0.0.1", GLV_BASE_PORT + GLV_TID_XGL);')
+ init_tracer.append(' glv_trace_set_trace_file(glv_FileLike_create_msg(gMessageStream));')
+ init_tracer.append('// glv_tracelog_set_log_file(glv_FileLike_create_file(fopen("glv_log_traceside.txt","w")));')
+ init_tracer.append(' glv_tracelog_set_tracer_id(GLV_TID_XGL);\n}\n')
+ return "\n".join(init_tracer)
+
+ # InitAndEnumerateGpus is unique enough that it gets custom generation code
+ def _gen_iande_gpus(self):
+ iae_body = []
+ iae_body.append('GLVTRACER_EXPORT XGL_RESULT XGLAPI __HOOKED_xglInitAndEnumerateGpus(')
+ iae_body.append(' const XGL_APPLICATION_INFO* pAppInfo,')
+ iae_body.append(' const XGL_ALLOC_CALLBACKS* pAllocCb,')
+ iae_body.append(' XGL_UINT maxGpus,')
+ iae_body.append(' XGL_UINT* pGpuCount,')
+ iae_body.append(' XGL_PHYSICAL_GPU* pGpus)')
+ iae_body.append('{')
+ iae_body.append(' glv_trace_packet_header* pHeader;')
+ iae_body.append(' XGL_RESULT result;')
+ iae_body.append(' uint64_t startTime;')
+ iae_body.append(' struct_xglInitAndEnumerateGpus* pPacket;')
+ iae_body.append('')
+ iae_body.append(' glv_platform_thread_once(&gInitOnce, InitTracer);')
+ iae_body.append(' SEND_ENTRYPOINT_ID(xglInitAndEnumerateGpus);')
+ iae_body.append(' if (real_xglInitAndEnumerateGpus == xglInitAndEnumerateGpus)')
+ iae_body.append(' {')
+ iae_body.append(' glv_platform_get_next_lib_sym((void **) &real_xglInitAndEnumerateGpus,"xglInitAndEnumerateGpus");')
+ iae_body.append(' }')
+ iae_body.append(' startTime = glv_get_time();')
+ iae_body.append(' result = real_xglInitAndEnumerateGpus(pAppInfo, pAllocCb, maxGpus, pGpuCount, pGpus);')
+ iae_body.append('')
+ iae_body.append(' // since we do not know how many gpus will be found must create trace packet after calling xglInit')
+ iae_body.append(' CREATE_TRACE_PACKET(xglInitAndEnumerateGpus, calc_size_XGL_APPLICATION_INFO(pAppInfo) + ((pAllocCb == NULL) ? 0 :sizeof(XGL_ALLOC_CALLBACKS))')
+ iae_body.append(' + sizeof(XGL_UINT) + ((pGpus && pGpuCount) ? *pGpuCount * sizeof(XGL_PHYSICAL_GPU) : 0));')
+ iae_body.append(' pHeader->entrypoint_begin_time = startTime;')
+ iae_body.append(' if (isHooked == FALSE) {')
+ iae_body.append(' AttachHooks();')
+ iae_body.append(' AttachHooks_xgldbg();')
+ iae_body.append(' AttachHooks_xglwsix11ext();')
+ iae_body.append(' }')
+ iae_body.append(' pPacket = interpret_body_as_xglInitAndEnumerateGpus(pHeader);')
+ iae_body.append(' add_XGL_APPLICATION_INFO_to_packet(pHeader, (XGL_APPLICATION_INFO**)&(pPacket->pAppInfo), pAppInfo);')
+ iae_body.append(' if (pAllocCb) {')
+ iae_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pAllocCb), sizeof(XGL_ALLOC_CALLBACKS), pAllocCb);')
+ iae_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pAllocCb));')
+ iae_body.append(' }')
+ iae_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pGpuCount), sizeof(XGL_UINT), pGpuCount);')
+ iae_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pGpuCount));')
+ iae_body.append(' if (pGpuCount && pGpus)')
+ iae_body.append(' {')
+ iae_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pGpus), sizeof(XGL_PHYSICAL_GPU) * *pGpuCount, pGpus);')
+ iae_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pGpus));')
+ iae_body.append(' }')
+ iae_body.append(' pPacket->maxGpus = maxGpus;')
+ iae_body.append(' pPacket->result = result;')
+ iae_body.append(' FINISH_TRACE_PACKET();')
+ iae_body.append(' return result;')
+ iae_body.append('}\n')
+ return "\n".join(iae_body)
+
+ def _gen_unmap_memory(self):
+ um_body = []
+ um_body.append('GLVTRACER_EXPORT XGL_RESULT XGLAPI __HOOKED_xglUnmapMemory(')
+ um_body.append(' XGL_GPU_MEMORY mem)')
+ um_body.append('{')
+ um_body.append(' glv_trace_packet_header* pHeader;')
+ um_body.append(' XGL_RESULT result;')
+ um_body.append(' struct_xglUnmapMemory* pPacket;')
+ um_body.append(' XGLAllocInfo *entry;')
+ um_body.append(' SEND_ENTRYPOINT_PARAMS("xglUnmapMemory(mem %p)\\n", mem);')
+ um_body.append(' // insert into packet the data that was written by CPU between the xglMapMemory call and here')
+ um_body.append(' // Note must do this prior to the real xglUnMap() or else may get a FAULT')
+ um_body.append(' entry = find_mem_info_entry(mem);')
+ um_body.append(' CREATE_TRACE_PACKET(xglUnmapMemory, (entry) ? entry->size : 0);')
+ um_body.append(' pPacket = interpret_body_as_xglUnmapMemory(pHeader);')
+ um_body.append(' if (entry)')
+ um_body.append(' {')
+ um_body.append(' assert(entry->handle == mem);')
+ um_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**) &(pPacket->pData), entry->size, entry->pData);')
+ um_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pData));')
+ um_body.append(' entry->pData = NULL;')
+ um_body.append(' }')
+ um_body.append(' result = real_xglUnmapMemory(mem);')
+ um_body.append(' pPacket->mem = mem;')
+ um_body.append(' pPacket->result = result;')
+ um_body.append(' FINISH_TRACE_PACKET();')
+ um_body.append(' return result;')
+ um_body.append('}\n')
+ return "\n".join(um_body)
+
+#EL == EnumerateLayers
+#I think this another case where you have to make the real call prior to CREATE_TRACE_PACKET(). SInce you
+#don't know how many layers will be returned or how big the strings will be. Alternatively, could be
+#on the safe side of CREATE_TRACE_PACKET with maxStringSize*maxLayerCount.
+#EL also needs a loop where add a trace buffer for each layer, depending on how you CREATE_TRACE_PACKET.
+
+ def _generate_trace_funcs(self):
+ func_body = []
+ for proto in self.protos:
+ if 'InitAndEnumerateGpus' == proto.name:
+ func_body.append(self._gen_iande_gpus())
+ elif 'UnmapMemory' == proto.name:
+ func_body.append(self._gen_unmap_memory())
+ elif 'Dbg' not in proto.name and 'Wsi' not in proto.name:
+ packet_update_txt = ''
+ return_txt = ''
+ packet_size = ''
+ in_data_size = False # flag when we need to capture local input size variable for in/out size
+ buff_ptr_indices = []
+ func_body.append('GLVTRACER_EXPORT %s XGLAPI __HOOKED_xgl%s(' % (proto.ret, proto.name))
+ for p in proto.params: # TODO : For all of the ptr types, check them for NULL and return 0 is NULL
+ if 'color' == p.name:
+ func_body.append(' %s %s[4],' % (p.ty.replace('[4]', ''), p.name))
+ else:
+ func_body.append(' %s %s,' % (p.ty, p.name))
+ if '*' in p.ty and 'pSysMem' != p.name:
+ if 'pData' == p.name:
+ if 'dataSize' == proto.params[proto.params.index(p)-1].name:
+ packet_size += 'dataSize + '
+ elif 'counterCount' == proto.params[proto.params.index(p)-1].name:
+ packet_size += 'sizeof(%s) + ' % p.ty.strip('*').strip('const ')
+ else:
+ packet_size += '((pDataSize != NULL && pData != NULL) ? *pDataSize : 0) + '
+ elif '**' in p.ty and 'VOID' in p.ty:
+ packet_size += 'sizeof(XGL_VOID*) + '
+ elif 'VOID' in p.ty:
+ packet_size += 'sizeof(%s) + ' % p.name
+ elif 'CHAR' in p.ty:
+ packet_size += '((%s != NULL) ? strlen((const char *)%s) + 1 : 0) + ' % (p.name, p.name)
+ elif 'DEVICE_CREATE_INFO' in p.ty:
+ packet_size += 'calc_size_XGL_DEVICE_CREATE_INFO(pCreateInfo) + '
+ elif 'pDataSize' in p.name:
+ packet_size += '((pDataSize != NULL) ? sizeof(XGL_SIZE) : 0) + '
+ in_data_size = True;
+ elif 'IMAGE_SUBRESOURCE' in p.ty and 'pSubresource' == p.name:
+ packet_size += '((pSubresource != NULL) ? sizeof(XGL_IMAGE_SUBRESOURCE) : 0) + '
+ else:
+ packet_size += 'sizeof(%s) + ' % p.ty.strip('*').strip('const ')
+ buff_ptr_indices.append(proto.params.index(p))
+ else:
+ if 'color' == p.name:
+ packet_update_txt += ' memcpy((void*)pPacket->color, color, 4 * sizeof(XGL_UINT32));\n'
+ else:
+ packet_update_txt += ' pPacket->%s = %s;\n' % (p.name, p.name)
+ if 'Count' in p.name and proto.params[-1].name != p.name and p.name not in ['queryCount', 'vertexCount', 'indexCount', 'startCounter'] and proto.name not in ['CmdLoadAtomicCounters', 'CmdSaveAtomicCounters']:
+ packet_size += '%s*' % p.name
+ if '' == packet_size:
+ packet_size = '0'
+ else:
+ packet_size = packet_size.strip(' + ')
+ func_body[-1] = func_body[-1].replace(',', ')')
+ func_body.append('{\n glv_trace_packet_header* pHeader;')
+ if 'VOID' not in proto.ret or '*' in proto.ret:
+ func_body.append(' %s result;' % proto.ret)
+ return_txt = 'result = '
+ if in_data_size:
+ func_body.append(' XGL_SIZE dataSizeIn = (pDataSize == NULL) ? 0 : *pDataSize;')
+ func_body.append(' struct_xgl%s* pPacket = NULL;' % proto.name)
+ func_body.append(' SEND_ENTRYPOINT_ID(xgl%s);' % proto.name)
+ if 'EnumerateLayers' == proto.name:
+ func_body.append(' %sreal_xgl%s;' % (return_txt, proto.c_call()))
+ func_body.append(' XGL_SIZE totStringSize = 0;')
+ func_body.append(' uint32_t i = 0;')
+ func_body.append(' for (i = 0; i < *pOutLayerCount; i++)')
+ func_body.append(' totStringSize += (pOutLayers[i] != NULL) ? strlen((const char*)pOutLayers[i]) + 1: 0;')
+ func_body.append(' CREATE_TRACE_PACKET(xgl%s, totStringSize);' % (proto.name))
+ elif proto.name in ['CreateShader', 'CreateGraphicsPipeline', 'CreateComputePipeline']:
+ func_body.append(' size_t customSize;')
+ if 'CreateShader' == proto.name:
+ func_body.append(' customSize = (pCreateInfo != NULL) ? pCreateInfo->codeSize : 0;')
+ func_body.append(' CREATE_TRACE_PACKET(xglCreateShader, sizeof(XGL_SHADER_CREATE_INFO) + sizeof(XGL_SHADER) + customSize);')
+ elif 'CreateGraphicsPipeline' == proto.name:
+ func_body.append(' customSize = calculate_pipeline_state_size(pCreateInfo->pNext);')
+ func_body.append(' CREATE_TRACE_PACKET(xglCreateGraphicsPipeline, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO) + sizeof(XGL_PIPELINE) + customSize);')
+ else: #'CreateComputePipeline'
+ func_body.append(' customSize = calculate_pipeline_state_size(pCreateInfo->pNext);')
+ func_body.append(' CREATE_TRACE_PACKET(xglCreateComputePipeline, sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO) + sizeof(XGL_PIPELINE) + customSize + calculate_pipeline_shader_size(&pCreateInfo->cs));')
+ func_body.append(' %sreal_xgl%s;' % (return_txt, proto.c_call()))
+ else:
+ func_body.append(' CREATE_TRACE_PACKET(xgl%s, %s);' % (proto.name, packet_size))
+ func_body.append(' %sreal_xgl%s;' % (return_txt, proto.c_call()))
+ func_body.append(' pPacket = interpret_body_as_xgl%s(pHeader);' % proto.name)
+ func_body.append(packet_update_txt.strip('\n'))
+ if 'MapMemory' == proto.name: # Custom code for MapMem case
+ func_body.append(' if (ppData != NULL)')
+ func_body.append(' {')
+ func_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->ppData), sizeof(XGL_VOID*), *ppData);')
+ func_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(pPacket->ppData));')
+ func_body.append(' add_data_to_mem_info(mem, *ppData);')
+ func_body.append(' }')
+ func_body.append(' pPacket->result = result;')
+ func_body.append(' FINISH_TRACE_PACKET();')
+ else:
+ # TODO : Clean this up. Too much custom code and branching.
+ for idx in buff_ptr_indices:
+ if 'DEVICE_CREATE_INFO' in proto.params[idx].ty:
+ func_body.append(' add_XGL_DEVICE_CREATE_INFO_to_packet(pHeader, (XGL_DEVICE_CREATE_INFO**) &(pPacket->pCreateInfo), pCreateInfo);')
+ elif 'CHAR' in proto.params[idx].ty:
+ func_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->%s), ((%s != NULL) ? strlen((const char *)%s) + 1 : 0), %s);' % (proto.params[idx].name, proto.params[idx].name, proto.params[idx].name, proto.params[idx].name))
+ elif 'Count' in proto.params[idx-1].name and 'queryCount' != proto.params[idx-1].name:
+ func_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->%s), %s*sizeof(%s), %s);' % (proto.params[idx].name, proto.params[idx-1].name, proto.params[idx].ty.strip('*').strip('const '), proto.params[idx].name))
+ elif 'dataSize' == proto.params[idx].name:
+ func_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->%s), dataSize, %s);' % (proto.params[idx].name, proto.params[idx].name))
+ elif 'pDataSize' == proto.params[idx].name:
+ func_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->%s), sizeof(XGL_SIZE), &dataSizeIn);' % (proto.params[idx].name))
+ elif 'pData' == proto.params[idx].name:
+ if 'dataSize' == proto.params[idx-1].name:
+ func_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->%s), dataSize, %s);' % (proto.params[idx].name, proto.params[idx].name))
+ elif in_data_size:
+ func_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->%s), dataSizeIn, %s);' % (proto.params[idx].name, proto.params[idx].name))
+ else:
+ func_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->%s), (pDataSize != NULL && pData != NULL) ? *pDataSize : 0, %s);' % (proto.params[idx].name, proto.params[idx].name))
+ else:
+ func_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->%s), sizeof(%s), %s);' % (proto.params[idx].name, proto.params[idx].ty.strip('*').strip('const '), proto.params[idx].name))
+ # Some custom add_* and finalize_* function calls for Create* API calls
+ if proto.name in ['CreateShader', 'CreateGraphicsPipeline', 'CreateComputePipeline']:
+ if 'CreateShader' == proto.name:
+ func_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo->pCode), customSize, pCreateInfo->pCode);')
+ func_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pCreateInfo->pCode));')
+ elif 'CreateGraphicsPipeline' == proto.name:
+ func_body.append(' add_pipeline_state_to_trace_packet(pHeader, (XGL_VOID**)&pPacket->pCreateInfo->pNext, pCreateInfo->pNext);')
+ else:
+ func_body.append(' add_pipeline_state_to_trace_packet(pHeader, (XGL_VOID**)&(pPacket->pCreateInfo->pNext), pCreateInfo->pNext);')
+ func_body.append(' add_pipeline_shader_to_trace_packet(pHeader, (XGL_PIPELINE_SHADER*)&pPacket->pCreateInfo->cs, &pCreateInfo->cs);')
+ func_body.append(' finalize_pipeline_shader_address(pHeader, &pPacket->pCreateInfo->cs);')
+ if 'VOID' not in proto.ret or '*' in proto.ret:
+ func_body.append(' pPacket->result = result;')
+ for idx in buff_ptr_indices:
+ if 'DEVICE_CREATE_INFO' not in proto.params[idx].ty:
+ func_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(pPacket->%s));' % (proto.params[idx].name))
+ func_body.append(' FINISH_TRACE_PACKET();')
+ if 'AllocMemory' in proto.name:
+ func_body.append(' add_new_handle_to_mem_info(*pMem, pAllocInfo->allocationSize, NULL);')
+ elif 'FreeMemory' in proto.name:
+ func_body.append(' rm_handle_from_mem_info(mem);')
+ if 'VOID' not in proto.ret or '*' in proto.ret:
+ func_body.append(' return result;')
+ func_body.append('}\n')
+ return "\n".join(func_body)
+
+ def _generate_helper_funcs(self):
+ hf_body = []
+ hf_body.append('// Support for shadowing CPU mapped memory')
+ hf_body.append('typedef struct _XGLAllocInfo {')
+ hf_body.append(' XGL_GPU_SIZE size;')
+ hf_body.append(' XGL_GPU_MEMORY handle;')
+ hf_body.append(' XGL_VOID *pData;')
+ hf_body.append(' BOOL valid;')
+ hf_body.append('} XGLAllocInfo;')
+ hf_body.append('typedef struct _XGLMemInfo {')
+ hf_body.append(' unsigned int numEntrys;')
+ hf_body.append(' XGLAllocInfo *pEntrys;')
+ hf_body.append(' XGLAllocInfo *pLastMapped;')
+ hf_body.append(' unsigned int capacity;')
+ hf_body.append('} XGLMemInfo;')
+ hf_body.append('')
+ hf_body.append('static XGLMemInfo mInfo = {0, NULL, NULL, 0};')
+ hf_body.append('')
+ hf_body.append('static void init_mem_info_entrys(XGLAllocInfo *ptr, const unsigned int num)')
+ hf_body.append('{')
+ hf_body.append(' unsigned int i;')
+ hf_body.append(' for (i = 0; i < num; i++)')
+ hf_body.append(' {')
+ hf_body.append(' XGLAllocInfo *entry = ptr + i;')
+ hf_body.append(' entry->pData = NULL;')
+ hf_body.append(' entry->size = 0;')
+ hf_body.append(' entry->handle = NULL;')
+ hf_body.append(' entry->valid = FALSE;')
+ hf_body.append(' }')
+ hf_body.append('}')
+ hf_body.append('')
+ hf_body.append('static void init_mem_info()')
+ hf_body.append('{')
+ hf_body.append(' mInfo.numEntrys = 0;')
+ hf_body.append(' mInfo.capacity = 1024;')
+ hf_body.append(' mInfo.pLastMapped = NULL;')
+ hf_body.append('')
+ hf_body.append(' mInfo.pEntrys = GLV_NEW_ARRAY(XGLAllocInfo, mInfo.capacity);')
+ hf_body.append('')
+ hf_body.append(' if (mInfo.pEntrys == NULL)')
+ hf_body.append(' glv_LogError("init_mem_info() malloc failed\\n");')
+ hf_body.append(' else')
+ hf_body.append(' init_mem_info_entrys(mInfo.pEntrys, mInfo.capacity);')
+ hf_body.append('}')
+ hf_body.append('')
+ hf_body.append('static void delete_mem_info()')
+ hf_body.append('{')
+ hf_body.append(' GLV_DELETE(mInfo.pEntrys);')
+ hf_body.append(' mInfo.pEntrys = NULL;')
+ hf_body.append(' mInfo.numEntrys = 0;')
+ hf_body.append(' mInfo.capacity = 0;')
+ hf_body.append(' mInfo.pLastMapped = NULL;')
+ hf_body.append('}')
+ hf_body.append('')
+ hf_body.append('static XGLAllocInfo * get_mem_info_entry()')
+ hf_body.append('{')
+ hf_body.append(' unsigned int i;')
+ hf_body.append(' XGLAllocInfo *entry;')
+ hf_body.append(' if (mInfo.numEntrys > mInfo.capacity)')
+ hf_body.append(' {')
+ hf_body.append(' glv_LogError("get_mem_info_entry() bad internal state numEntrys\\n");')
+ hf_body.append(' return NULL;')
+ hf_body.append(' }')
+ hf_body.append('')
+ hf_body.append(' if (mInfo.numEntrys == mInfo.capacity)')
+ hf_body.append(' { // grow the array 2x')
+ hf_body.append(' mInfo.capacity *= 2;')
+ hf_body.append(' mInfo.pEntrys = (XGLAllocInfo *) GLV_REALLOC(mInfo.pEntrys, mInfo.capacity * sizeof(XGLAllocInfo));')
+ hf_body.append(' //init the newly added entrys')
+ hf_body.append(' init_mem_info_entrys(mInfo.pEntrys + mInfo.capacity / 2, mInfo.capacity / 2);')
+ hf_body.append(' }')
+ hf_body.append('')
+ hf_body.append(' assert(mInfo.numEntrys < mInfo.capacity);')
+ hf_body.append(' entry = mInfo.pEntrys;')
+ hf_body.append(' for (i = 0; i < mInfo.capacity; i++)')
+ hf_body.append(' {')
+ hf_body.append(' if ((entry + i)->valid == FALSE)')
+ hf_body.append(' return entry + i;')
+ hf_body.append(' }')
+ hf_body.append('')
+ hf_body.append(' glv_LogError("get_mem_info_entry() did not find an entry\\n");')
+ hf_body.append(' return NULL;')
+ hf_body.append('}')
+ hf_body.append('')
+ hf_body.append('static XGLAllocInfo * find_mem_info_entry(const XGL_GPU_MEMORY handle)')
+ hf_body.append('{')
+ hf_body.append(' XGLAllocInfo *entry = mInfo.pEntrys;')
+ hf_body.append(' unsigned int i;')
+ hf_body.append(' if (mInfo.pLastMapped && mInfo.pLastMapped->handle == handle && mInfo.pLastMapped->valid)')
+ hf_body.append(' return mInfo.pLastMapped;')
+ hf_body.append(' for (i = 0; i < mInfo.numEntrys; i++)')
+ hf_body.append(' {')
+ hf_body.append(' if ((entry + i)->valid && (handle == (entry + i)->handle))')
+ hf_body.append(' return entry + i;')
+ hf_body.append(' }')
+ hf_body.append('')
+ hf_body.append(' return NULL;')
+ hf_body.append('}')
+ hf_body.append('')
+ hf_body.append('static void add_new_handle_to_mem_info(const XGL_GPU_MEMORY handle, XGL_GPU_SIZE size, XGL_VOID *pData)')
+ hf_body.append('{')
+ hf_body.append(' XGLAllocInfo *entry;')
+ hf_body.append('')
+ hf_body.append(' if (mInfo.capacity == 0)')
+ hf_body.append(' init_mem_info();')
+ hf_body.append('')
+ hf_body.append(' entry = get_mem_info_entry();')
+ hf_body.append(' if (entry)')
+ hf_body.append(' {')
+ hf_body.append(' entry->valid = TRUE;')
+ hf_body.append(' entry->handle = handle;')
+ hf_body.append(' entry->size = size;')
+ hf_body.append(' entry->pData = pData; // NOTE: xglFreeMemory will free this mem, so no malloc()')
+ hf_body.append(' mInfo.numEntrys++;')
+ hf_body.append(' }')
+ hf_body.append('}')
+ hf_body.append('')
+ hf_body.append('static void add_data_to_mem_info(const XGL_GPU_MEMORY handle, XGL_VOID *pData)')
+ hf_body.append('{')
+ hf_body.append(' XGLAllocInfo *entry = find_mem_info_entry(handle);')
+ hf_body.append('')
+ hf_body.append(' if (entry)')
+ hf_body.append(' {')
+ hf_body.append(' entry->pData = pData;')
+ hf_body.append(' }')
+ hf_body.append(' mInfo.pLastMapped = entry;')
+ hf_body.append('}')
+ hf_body.append('')
+ hf_body.append('static void rm_handle_from_mem_info(const XGL_GPU_MEMORY handle)')
+ hf_body.append('{')
+ hf_body.append(' XGLAllocInfo *entry = find_mem_info_entry(handle);')
+ hf_body.append('')
+ hf_body.append(' if (entry)')
+ hf_body.append(' {')
+ hf_body.append(' entry->valid = FALSE;')
+ hf_body.append(' entry->pData = NULL;')
+ hf_body.append(' entry->size = 0;')
+ hf_body.append(' entry->handle = NULL;')
+ hf_body.append('')
+ hf_body.append(' mInfo.numEntrys--;')
+ hf_body.append(' if (entry == mInfo.pLastMapped)')
+ hf_body.append(' mInfo.pLastMapped = NULL;')
+ hf_body.append(' if (mInfo.numEntrys == 0)')
+ hf_body.append(' delete_mem_info();')
+ hf_body.append(' }')
+ hf_body.append('}')
+ hf_body.append('')
+ hf_body.append('static size_t calculate_pipeline_shader_size(const XGL_PIPELINE_SHADER* shader)')
+ hf_body.append('{')
+ hf_body.append(' size_t size = 0;')
+ hf_body.append(' XGL_UINT i, j;')
+ hf_body.append(' ')
+ hf_body.append(' size += sizeof(XGL_PIPELINE_SHADER);')
+ hf_body.append(' // descriptor sets')
+ hf_body.append(' for (i = 0; i < XGL_MAX_DESCRIPTOR_SETS; i++)')
+ hf_body.append(' {')
+ hf_body.append(' for (j = 0; j < shader->descriptorSetMapping[i].descriptorCount; j++)')
+ hf_body.append(' {')
+ hf_body.append(' size += sizeof(XGL_DESCRIPTOR_SLOT_INFO);')
+ hf_body.append(' if (shader->descriptorSetMapping[i].pDescriptorInfo[j].slotObjectType == XGL_SLOT_NEXT_DESCRIPTOR_SET)')
+ hf_body.append(' {')
+ hf_body.append(' size += sizeof(XGL_DESCRIPTOR_SET_MAPPING);')
+ hf_body.append(' }')
+ hf_body.append(' }')
+ hf_body.append(' }')
+ hf_body.append('')
+ hf_body.append(' // constant buffers')
+ hf_body.append(' if (shader->linkConstBufferCount > 0 && shader->pLinkConstBufferInfo != NULL)')
+ hf_body.append(' {')
+ hf_body.append(' XGL_UINT i;')
+ hf_body.append(' for (i = 0; i < shader->linkConstBufferCount; i++)')
+ hf_body.append(' {')
+ hf_body.append(' size += sizeof(XGL_LINK_CONST_BUFFER);')
+ hf_body.append(' size += shader->pLinkConstBufferInfo[i].bufferSize;')
+ hf_body.append(' }')
+ hf_body.append(' }')
+ hf_body.append(' return size;')
+ hf_body.append('}')
+ hf_body.append('')
+ hf_body.append('static void add_pipeline_shader_to_trace_packet(glv_trace_packet_header* pHeader, XGL_PIPELINE_SHADER* packetShader, const XGL_PIPELINE_SHADER* paramShader)')
+ hf_body.append('{')
+ hf_body.append(' XGL_UINT i, j;')
+ hf_body.append(' // descriptor sets')
+ hf_body.append(' for (i = 0; i < XGL_MAX_DESCRIPTOR_SETS; i++)')
+ hf_body.append(' {')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(packetShader->descriptorSetMapping[i].pDescriptorInfo), sizeof(XGL_DESCRIPTOR_SLOT_INFO)* paramShader->descriptorSetMapping[i].descriptorCount, paramShader->descriptorSetMapping[i].pDescriptorInfo);')
+ hf_body.append(' for (j = 0; j < paramShader->descriptorSetMapping[i].descriptorCount; j++)')
+ hf_body.append(' {')
+ hf_body.append(' if (paramShader->descriptorSetMapping[i].pDescriptorInfo[j].slotObjectType == XGL_SLOT_NEXT_DESCRIPTOR_SET)')
+ hf_body.append(' {')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(packetShader->descriptorSetMapping[i].pDescriptorInfo[j].pNextLevelSet), sizeof(XGL_DESCRIPTOR_SET_MAPPING), paramShader->descriptorSetMapping[i].pDescriptorInfo[j].pNextLevelSet);')
+ hf_body.append(' }')
+ hf_body.append(' }')
+ hf_body.append(' packetShader->descriptorSetMapping[i].descriptorCount = paramShader->descriptorSetMapping[i].descriptorCount;')
+ hf_body.append(' }')
+ hf_body.append('')
+ hf_body.append(' // constant buffers')
+ hf_body.append(' if (paramShader->linkConstBufferCount > 0 && paramShader->pLinkConstBufferInfo != NULL)')
+ hf_body.append(' {')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(packetShader->pLinkConstBufferInfo), sizeof(XGL_LINK_CONST_BUFFER) * paramShader->linkConstBufferCount, paramShader->pLinkConstBufferInfo);')
+ hf_body.append(' for (i = 0; i < paramShader->linkConstBufferCount; i++)')
+ hf_body.append(' {')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)&(packetShader->pLinkConstBufferInfo[i].pBufferData), packetShader->pLinkConstBufferInfo[i].bufferSize, paramShader->pLinkConstBufferInfo[i].pBufferData);')
+ hf_body.append(' }')
+ hf_body.append(' }')
+ hf_body.append('}')
+ hf_body.append('')
+ hf_body.append('static void finalize_pipeline_shader_address(glv_trace_packet_header* pHeader, const XGL_PIPELINE_SHADER* packetShader)')
+ hf_body.append('{')
+ hf_body.append(' XGL_UINT i, j;')
+ hf_body.append(' // descriptor sets')
+ hf_body.append(' for (i = 0; i < XGL_MAX_DESCRIPTOR_SETS; i++)')
+ hf_body.append(' {')
+ hf_body.append(' for (j = 0; j < packetShader->descriptorSetMapping[i].descriptorCount; j++)')
+ hf_body.append(' {')
+ hf_body.append(' if (packetShader->descriptorSetMapping[i].pDescriptorInfo[j].slotObjectType == XGL_SLOT_NEXT_DESCRIPTOR_SET)')
+ hf_body.append(' {')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(packetShader->descriptorSetMapping[i].pDescriptorInfo[j].pNextLevelSet));')
+ hf_body.append(' }')
+ hf_body.append(' }')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(packetShader->descriptorSetMapping[i].pDescriptorInfo));')
+ hf_body.append(' }')
+ hf_body.append('')
+ hf_body.append(' // constant buffers')
+ hf_body.append(' if (packetShader->linkConstBufferCount > 0 && packetShader->pLinkConstBufferInfo != NULL)')
+ hf_body.append(' {')
+ hf_body.append(' for (i = 0; i < packetShader->linkConstBufferCount; i++)')
+ hf_body.append(' {')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(packetShader->pLinkConstBufferInfo[i].pBufferData));')
+ hf_body.append(' }')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(packetShader->pLinkConstBufferInfo));')
+ hf_body.append(' }')
+ hf_body.append('}')
+ hf_body.append('')
+ hf_body.append('static size_t calculate_pipeline_state_size(const XGL_VOID* pState)')
+ hf_body.append('{')
+ hf_body.append(' const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pNext = pState;')
+ hf_body.append(' size_t totalStateSize = 0;')
+ hf_body.append(' while (pNext)')
+ hf_body.append(' {')
+ hf_body.append(' switch (pNext->sType)')
+ hf_body.append(' {')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO:')
+ hf_body.append(' totalStateSize += sizeof(XGL_PIPELINE_IA_STATE_CREATE_INFO);')
+ hf_body.append(' break;')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_TESS_STATE_CREATE_INFO:')
+ hf_body.append(' totalStateSize += sizeof(XGL_PIPELINE_TESS_STATE_CREATE_INFO);')
+ hf_body.append(' break;')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO:')
+ hf_body.append(' totalStateSize += sizeof(XGL_PIPELINE_RS_STATE_CREATE_INFO);')
+ hf_body.append(' break;')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO:')
+ hf_body.append(' totalStateSize += sizeof(XGL_PIPELINE_DB_STATE_CREATE_INFO);')
+ hf_body.append(' break;')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:')
+ hf_body.append(' totalStateSize += sizeof(XGL_PIPELINE_CB_STATE);')
+ hf_body.append(' break;')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO:')
+ hf_body.append(' {')
+ hf_body.append(' const XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* pShaderStage = (const XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*)pNext;')
+ hf_body.append(' totalStateSize += (sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO) + calculate_pipeline_shader_size(&pShaderStage->shader));')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO:')
+ hf_body.append(' {')
+ hf_body.append(' const XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO* pVi = (const XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pNext;')
+ hf_body.append(' totalStateSize += sizeof(XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO) + pVi->bindingCount * sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION)')
+ hf_body.append(' + pVi->attributeCount * sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION);')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' default:')
+ hf_body.append(' assert(0);')
+ hf_body.append(' }')
+ hf_body.append(' pNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO*)pNext->pNext;')
+ hf_body.append(' }')
+ hf_body.append(' return totalStateSize;')
+ hf_body.append('}')
+ hf_body.append('')
+ hf_body.append('static void add_pipeline_state_to_trace_packet(glv_trace_packet_header* pHeader, XGL_VOID** ppOut, const XGL_VOID* pIn)')
+ hf_body.append('{')
+ hf_body.append(' const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pInNow = pIn;')
+ hf_body.append(' XGL_GRAPHICS_PIPELINE_CREATE_INFO** ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)ppOut;')
+ hf_body.append(' while (pInNow != NULL)')
+ hf_body.append(' {')
+ hf_body.append(' XGL_GRAPHICS_PIPELINE_CREATE_INFO** ppOutNow = ppOutNext;')
+ hf_body.append(' ppOutNext = NULL;')
+ hf_body.append('')
+ hf_body.append(' switch (pInNow->sType)')
+ hf_body.append(' {')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO:')
+ hf_body.append(' {')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_IA_STATE_CREATE_INFO), pInNow);')
+ hf_body.append(' ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_TESS_STATE_CREATE_INFO:')
+ hf_body.append(' {')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_TESS_STATE_CREATE_INFO), pInNow);')
+ hf_body.append(' ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO:')
+ hf_body.append(' {')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_RS_STATE_CREATE_INFO), pInNow);')
+ hf_body.append(' ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO:')
+ hf_body.append(' {')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_DB_STATE_CREATE_INFO), pInNow);')
+ hf_body.append(' ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:')
+ hf_body.append(' {')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_CB_STATE), pInNow);')
+ hf_body.append(' ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO:')
+ hf_body.append(' {')
+ hf_body.append(' XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* pPacket = NULL;')
+ hf_body.append(' XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* pInPacket = NULL;')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO), pInNow);')
+ hf_body.append(' pPacket = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*) *ppOutNow;')
+ hf_body.append(' pInPacket = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*) pInNow;')
+ hf_body.append(' add_pipeline_shader_to_trace_packet(pHeader, &pPacket->shader, &pInPacket->shader);')
+ hf_body.append(' finalize_pipeline_shader_address(pHeader, &pPacket->shader);')
+ hf_body.append(' ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO:')
+ hf_body.append(' {')
+ hf_body.append(' XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO *pPacket = NULL;')
+ hf_body.append(' XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO *pIn = NULL;')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO), pInNow);')
+ hf_body.append(' pPacket = (XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*) *ppOutNow;')
+ hf_body.append(' pIn = (XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*) pInNow;')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pVertexBindingDescriptions, pIn->bindingCount * sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION), pIn->pVertexBindingDescriptions);')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pVertexBindingDescriptions));')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pVertexAttributeDescriptions, pIn->attributeCount * sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION), pIn->pVertexAttributeDescriptions);')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pVertexAttributeDescriptions));')
+ hf_body.append(' ppOutNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO**)&(*ppOutNow)->pNext;')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' default:')
+ hf_body.append(' assert(!"Encountered an unexpected type in pipeline state list");')
+ hf_body.append(' }')
+ hf_body.append(' pInNow = (XGL_GRAPHICS_PIPELINE_CREATE_INFO*)pInNow->pNext;')
+ hf_body.append(' }')
+ hf_body.append(' return;')
+ hf_body.append('}')
+ return "\n".join(hf_body)
+
+
class LayerFuncsSubcommand(Subcommand):
def generate_header(self):
return '#include <xglLayer.h>\n#include "loader.h"'
@@ -811,6 +1499,49 @@ class ObjectTrackerSubcommand(Subcommand):
return "\n\n".join(body)
+class GlaveTraceHeader(Subcommand):
+ def generate_header(self):
+ header_txt = []
+ header_txt.append('#include "glvtrace_xgl_xgl_structs.h"')
+ header_txt.append('#include "glvtrace_xgl_packet_id.h"\n')
+ header_txt.append('void AttachHooks();')
+ header_txt.append('void DetachHooks();')
+ header_txt.append('void InitTracer();\n')
+ return "\n".join(header_txt)
+
+ def generate_body(self):
+ body = [self._generate_trace_func_ptrs(),
+ self._generate_trace_func_protos()]
+
+ return "\n".join(body)
+
+class GlaveTraceC(Subcommand):
+ def generate_header(self):
+ header_txt = []
+ header_txt.append('#include "glv_platform.h"')
+ header_txt.append('#include "glv_common.h"')
+ header_txt.append('#include "glvtrace_xgl_xgl.h"')
+ header_txt.append('#include "glvtrace_xgl_xgldbg.h"')
+ header_txt.append('#include "glvtrace_xgl_xglwsix11ext.h"')
+ header_txt.append('#include "glv_interconnect.h"')
+ header_txt.append('#include "glv_filelike.h"')
+ header_txt.append('#ifdef WIN32')
+ header_txt.append('#include "mhook/mhook-lib/mhook.h"')
+ header_txt.append('#endif')
+ header_txt.append('#include "glv_trace_packet_utils.h"')
+ header_txt.append('#include <stdio.h>\n')
+ return "\n".join(header_txt)
+
+ def generate_body(self):
+ body = [self._generate_func_ptr_assignments(),
+ self._generate_attach_hooks(),
+ self._generate_detach_hooks(),
+ self._generate_init_tracer(),
+ self._generate_helper_funcs(),
+ self._generate_trace_funcs()]
+
+ return "\n".join(body)
+
def main():
subcommands = {
"layer-funcs" : LayerFuncsSubcommand,
@@ -820,6 +1551,8 @@ def main():
"ApiDumpFile" : ApiDumpFileSubcommand,
"ApiDumpNoAddr" : ApiDumpNoAddrSubcommand,
"ObjectTracker" : ObjectTrackerSubcommand,
+ "glave-trace-h" : GlaveTraceHeader,
+ "glave-trace-c" : GlaveTraceC,
}
if len(sys.argv) < 2 or sys.argv[1] not in subcommands: