glave: Added comments noting glave work still to be done for xgl.h updates
Conflicts:
glave-generate.py
diff --git a/glave-generate.py b/glave-generate.py
index 88d70fe..6b28762 100755
--- a/glave-generate.py
+++ b/glave-generate.py
@@ -344,6 +344,58 @@
#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.
+# TODO : Tracing needs special checks in CreateInstance now
+# Need to call glv_platform_thread_once() and do (isHooked == FALSE) check
+# See example code below from old InitAndEnumerateGpus
+#GLVTRACER_EXPORT XGL_RESULT XGLAPI __HOOKED_xglInitAndEnumerateGpus(
+# const XGL_APPLICATION_INFO* pAppInfo,
+# const XGL_ALLOC_CALLBACKS* pAllocCb,
+# XGL_UINT maxGpus,
+# XGL_UINT* pGpuCount,
+# XGL_PHYSICAL_GPU* pGpus)
+#{
+# glv_trace_packet_header* pHeader;
+# XGL_RESULT result;
+# uint64_t startTime;
+# struct_xglInitAndEnumerateGpus* pPacket;
+#
+# glv_platform_thread_once(&gInitOnce, InitTracer);
+# SEND_ENTRYPOINT_ID(xglInitAndEnumerateGpus);
+# if (real_xglInitAndEnumerateGpus == xglInitAndEnumerateGpus)
+# {
+# glv_platform_get_next_lib_sym((void **) &real_xglInitAndEnumerateGpus,"xglInitAndEnumerateGpus");
+# }
+# startTime = glv_get_time();
+# result = real_xglInitAndEnumerateGpus(pAppInfo, pAllocCb, maxGpus, pGpuCount, pGpus);
+#
+# // since we do not know how many gpus will be found must create trace packet after calling xglInit
+# CREATE_TRACE_PACKET(xglInitAndEnumerateGpus, calc_size_XGL_APPLICATION_INFO(pAppInfo) + ((pAllocCb == NULL) ? 0 :sizeof(XGL_ALLOC_CALLBACKS))
+# + sizeof(XGL_UINT) + ((pGpus && pGpuCount) ? *pGpuCount * sizeof(XGL_PHYSICAL_GPU) : 0));
+# pHeader->entrypoint_begin_time = startTime;
+# if (isHooked == FALSE) {
+# AttachHooks();
+# AttachHooks_xgldbg();
+# AttachHooks_xglwsix11ext();
+# }
+# pPacket = interpret_body_as_xglInitAndEnumerateGpus(pHeader);
+# add_XGL_APPLICATION_INFO_to_packet(pHeader, (XGL_APPLICATION_INFO**)&(pPacket->pAppInfo), pAppInfo);
+# if (pAllocCb) {
+# glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pAllocCb), sizeof(XGL_ALLOC_CALLBACKS), pAllocCb);
+# glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pAllocCb));
+# }
+# glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pGpuCount), sizeof(XGL_UINT), pGpuCount);
+# glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pGpuCount));
+# if (pGpuCount && pGpus)
+# {
+# glv_add_buffer_to_trace_packet(pHeader, (void**)&(pPacket->pGpus), sizeof(XGL_PHYSICAL_GPU) * *pGpuCount, pGpus);
+# glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pGpus));
+# }
+# pPacket->maxGpus = maxGpus;
+# pPacket->result = result;
+# FINISH_TRACE_PACKET();
+# return result;
+#}
+
def _generate_trace_funcs(self):
func_body = []
for proto in self.protos:
@@ -408,6 +460,8 @@
func_body.append(' size_t 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)
+ # TODO : DescriptorUpdates and CreateSetLayout need to handle saving chain of structs
+ # TODO : EnumGpus needs to call function first and then update the returned count of GPUs
if 'EnumerateLayers' == proto.name:
func_body.append(' %sreal_xgl%s;' % (return_txt, proto.c_call()))
func_body.append(' size_t totStringSize = 0;')
@@ -416,6 +470,7 @@
func_body.append(' totStringSize += (pOutLayers[i] != NULL) ? strlen(pOutLayers[i]) + 1: 0;')
func_body.append(' CREATE_TRACE_PACKET(xgl%s, totStringSize + sizeof(size_t));' % (proto.name))
elif 'AllocDescriptorSets' == proto.name:
+ # TODO : Anytime we call the function first, need to add custom code for correctly tracking API call time
func_body.append(' %sreal_xgl%s;' % (return_txt, proto.c_call()))
func_body.append(' size_t customSize = (*pCount <= 0) ? (sizeof(XGL_DESCRIPTOR_SET)) : (*pCount * sizeof(XGL_DESCRIPTOR_SET));')
func_body.append(' CREATE_TRACE_PACKET(xglAllocDescriptorSets, sizeof(XGL_DESCRIPTOR_SET_LAYOUT) + customSize + sizeof(uint32_t));')
@@ -604,6 +659,7 @@
return "\n".join(func_body)
def _generate_helper_funcs(self):
+ # TODO : Need helper funcs to calculate the size of DescriptorUpdate and CreateSetLayout struct chains
hf_body = []
hf_body.append('// Support for shadowing CPU mapped memory')
hf_body.append('typedef struct _XGLAllocInfo {')
@@ -750,8 +806,66 @@
hf_body.append(' }')
hf_body.append('}')
hf_body.append('')
-
-
+ hf_body.append('static size_t calculate_create_ds_layout_size(const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pCreateInfo)')
+ hf_body.append('{')
+ hf_body.append(' size_t update_size = 0;')
+ hf_body.append(' XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pTrav = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCreateInfo;')
+ hf_body.append(' while (pTrav)')
+ hf_body.append(' {')
+ hf_body.append(' update_size += sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO);')
+ hf_body.append(' pTrav = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pTrav->pNext;')
+ hf_body.append(' }')
+ hf_body.append(' return update_size;')
+ hf_body.append('}')
+ hf_body.append('static void add_create_ds_layout_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')
+ hf_body.append('{')
+ hf_body.append(' // TODO : ADD THIS CODE;')
+ hf_body.append('}')
+ hf_body.append('static size_t calculate_ds_update_size(const void* pUpdateChain)')
+ hf_body.append('{')
+ hf_body.append(' size_t update_size = 0;')
+ hf_body.append(' XGL_UPDATE_SAMPLERS* pTrav = (XGL_UPDATE_SAMPLERS*)pUpdateChain;')
+ hf_body.append(' while (pTrav)')
+ hf_body.append(' {')
+ hf_body.append(' switch (pTrav->sType)')
+ hf_body.append(' {')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:')
+ hf_body.append(' {')
+ hf_body.append(' update_size += sizeof(XGL_UPDATE_SAMPLERS);')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:')
+ hf_body.append(' {')
+ hf_body.append(' update_size += sizeof(XGL_UPDATE_SAMPLER_TEXTURES);')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:')
+ hf_body.append(' {')
+ hf_body.append(' update_size += sizeof(XGL_UPDATE_IMAGES);')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:')
+ hf_body.append(' {')
+ hf_body.append(' update_size += sizeof(XGL_UPDATE_BUFFERS);')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:')
+ hf_body.append(' {')
+ hf_body.append(' update_size += sizeof(XGL_UPDATE_AS_COPY);')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' default:')
+ hf_body.append(' glv_LogError("calculate_ds_update_size() bad internal state sType\\n");')
+ hf_body.append(' break;')
+ hf_body.append(' }')
+ hf_body.append(' pTrav = (XGL_UPDATE_SAMPLERS*)pTrav->pNext;')
+ hf_body.append(' }')
+ hf_body.append(' return update_size;')
+ hf_body.append('}')
+ hf_body.append('static void add_ds_update_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')
+ hf_body.append('{')
+ hf_body.append(' // TODO : ADD THIS CODE;')
+ hf_body.append('}')
hf_body.append('static void add_begin_cmdbuf_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')
hf_body.append('{')
hf_body.append(' const XGL_CMD_BUFFER_BEGIN_INFO* pInNow = pIn;')
@@ -777,7 +891,7 @@
hf_body.append(' }')
hf_body.append(' return;')
hf_body.append('}')
-
+ hf_body.append('')
hf_body.append('static size_t calculate_begin_cmdbuf_size(const XGL_CMD_BUFFER_BEGIN_INFO* pNext)')
hf_body.append('{')
hf_body.append(' size_t siz = 0;')
@@ -1959,7 +2073,7 @@
ieg_body.append(' {')
ieg_body.append(' glv_LogInfo("Enumerated %d GPUs in the system\\n", gpuCount);')
ieg_body.append(' }')
- ieg_body.append(' // Do we care about the instance handel? Need to keep from clearing it? Not sure it will be used again...')
+ ieg_body.append(' // Do we care about the instance handle? Need to keep from clearing it? Not sure it will be used again...')
ieg_body.append(' clear_all_map_handles();')
ieg_body.append(' // TODO handle enumeration results in a different order from trace to replay')
ieg_body.append(' for (uint32_t i = 0; i < gpuCount; i++)')
@@ -2233,6 +2347,14 @@
isi_body.append(' glv_free(pData);')
return "\n".join(isi_body)
+ def _gen_replay_update_descriptors(self):
+ ud_body = []
+ # TODO : Add code here to read chain of update structs
+
+ def _gen_replay_create_descriptor_set_layout(self):
+ cdsl_body = []
+ # TODO : Add code here to read in chain of descriptor layout create infos from packet
+
def _gen_replay_create_graphics_pipeline(self):
cgp_body = []
cgp_body.append(' XGL_GRAPHICS_PIPELINE_CREATE_INFO createInfo;')
@@ -2472,6 +2594,8 @@
def _generate_replay(self):
# map protos to custom functions if body is fully custom
+ # TODO : DescriptorUpdates and CreateSetLayout need to handle restoring chain of structs
+ # Should have custom replay code similar to CreateGraphicsPipeline
custom_body_dict = {'EnumerateGpus': self._gen_replay_enum_gpus,
'GetGpuInfo': self._gen_replay_get_gpu_info,
'CreateDevice': self._gen_replay_create_device,
@@ -2496,6 +2620,7 @@
'MapMemory': self._gen_replay_map_memory,
'UnmapMemory': self._gen_replay_unmap_memory,
'CmdBindDynamicMemoryView': self._gen_replay_bind_dynamic_memory_view}
+ # TODO : Need to guard CreateInstance with "if (!m_display->m_initedXGL)" check
# Despite returning a value, don't check these funcs b/c custom code includes check already
custom_check_ret_val = ['InitAndEnumerateGpus', 'GetGpuInfo', 'CreateDevice', 'GetExtensionSupport']
# multi-gpu Open funcs w/ list of local params to create
@@ -2638,7 +2763,7 @@
rbody.append(' if (replayResult == XGL_SUCCESS)')
rbody.append(' {')
rbody.append(' for (uint32_t i = 0; i < local_pCount; i++) {')
- rbody.append(' add_to_map(pPacket->%s, &local_%s[i]);' % (proto.params[-2].name, proto.params[-2].name))
+ rbody.append(' add_to_map(&pPacket->%s[i], &local_%s[i]);' % (proto.params[-2].name, proto.params[-2].name))
rbody.append(' }')
rbody.append(' }')
elif create_func: # save handle mapping if create successful
diff --git a/xgl-layer-generate.py b/xgl-layer-generate.py
index fbc47d7..102a0c0 100755
--- a/xgl-layer-generate.py
+++ b/xgl-layer-generate.py
@@ -331,9 +331,8 @@
sp_param_dict[pindex] = prev_count_name
elif 'pDescriptorSets' == p.name and proto.params[-1].name == 'pCount':
sp_param_dict[pindex] = '*pCount'
- elif xgl_helper.is_type(p.ty.strip('const').strip('*'), 'struct'):
- if 'Wsi' not in proto.name:
- sp_param_dict[pindex] = 'index'
+ elif 'Wsi' not in proto.name and xgl_helper.is_type(p.ty.strip('*').strip('const '), 'struct'):
+ sp_param_dict[pindex] = 'index'
pindex += 1
if p.name.endswith('Count'):
if '*' in p.ty: