glave: Fix issues with trace/replay of descriptor set changes
In particular UpdateDescriptor() trace and replay redone as much was wrong.
CreateDescriptorSetLayout() trace and replay fixes.
CreateDescriptorSetLayoutChain() add custom code for replay.
CmdBindDescriptorSets() add custom code for replay.
diff --git a/tools/glave/scripts/vk_generate.py b/tools/glave/scripts/vk_generate.py
index b2d7f32..b9d85a4 100755
--- a/tools/glave/scripts/vk_generate.py
+++ b/tools/glave/scripts/vk_generate.py
@@ -941,8 +941,11 @@
' glv_LogError("AllocMemory must have AllocInfo stype of XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO.\\n");\n',
' pPacket->header = NULL;\n',
'}']},
- 'UpdateDescriptors' : {'param': 'pUpdateChain', 'txt': ['XGL_UPDATE_SAMPLERS* pNext = (XGL_UPDATE_SAMPLERS*)pPacket->pUpdateChain;\n',
- 'while ((NULL != pNext) && (XGL_NULL_HANDLE != pNext))\n', '{\n',
+ 'UpdateDescriptors' : {'param': 'ppUpdateArray', 'txt': ['size_t i;\n',
+ 'for (i = 0; i < pPacket->updateCount; i++)\n', '{\n',
+ ' XGL_UPDATE_SAMPLERS** ppUpItem = (XGL_UPDATE_SAMPLERS**) &pPacket->ppUpdateArray[i];\n',
+ ' *ppUpItem = (XGL_UPDATE_SAMPLERS *) glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t) pPacket->ppUpdateArray[i]);\n',
+ ' XGL_UPDATE_SAMPLERS* pNext = *ppUpItem;\n',
' switch(pNext->sType)\n', ' {\n',
' case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:\n',
' {\n',
@@ -978,11 +981,6 @@
' *ppNextVoidPtr = (void*)glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pNext->pNext);\n',
' XGL_IMAGE_VIEW_ATTACH_INFO** ppLocalImageView = (XGL_IMAGE_VIEW_ATTACH_INFO**)&pUI->pImageViews;\n',
' *ppLocalImageView = (XGL_IMAGE_VIEW_ATTACH_INFO*) glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pUI->pImageViews);\n',
- ' uint32_t i;\n',
- ' for (i = 0; i < pUI->count; i++) {\n',
- ' XGL_IMAGE_VIEW_ATTACH_INFO** ppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO**)&pUI->pImageViews[i];\n',
- ' *ppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO*) glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pUI->pImageViews[i]);\n',
- ' }\n',
' break;\n',
' }\n',
' case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:\n',
@@ -992,16 +990,11 @@
' *ppNextVoidPtr = (void*)glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pNext->pNext);\n',
' XGL_BUFFER_VIEW_ATTACH_INFO** ppLocalBufferView = (XGL_BUFFER_VIEW_ATTACH_INFO**)&pUB->pBufferViews;\n',
' *ppLocalBufferView = (XGL_BUFFER_VIEW_ATTACH_INFO*) glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pUB->pBufferViews);\n',
- ' uint32_t i;\n',
- ' for (i = 0; i < pUB->count; i++) {\n',
- ' XGL_BUFFER_VIEW_ATTACH_INFO** ppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO**)&pUB->pBufferViews[i];\n',
- ' *ppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO*) glv_trace_packet_interpret_buffer_pointer(pHeader, (intptr_t)pUB->pBufferViews[i]);\n',
- ' }\n',
' break;\n',
' }\n',
' default:\n',
' {\n',
- ' glv_LogError("Encountered an unexpected type in update descriptors pUpdateChain.\\n");\n',
+ ' glv_LogError("Encountered an unexpected type in update descriptors ppUpdateArray.\\n");\n',
' pPacket->header = NULL;\n',
' pNext->pNext = NULL;\n',
' }\n',
@@ -1589,6 +1582,30 @@
cdsl_body.append(' returnValue = manually_handle_xglCreateDescriptorSetLayout(pPacket);')
return "\n".join(cdsl_body)
+ def _gen_replay_create_descriptor_set_layout_chain(self):
+ cdslc_body = []
+ cdslc_body.append(' XGL_DESCRIPTOR_SET_LAYOUT_CHAIN local_pLayoutChain;')
+ cdslc_body.append(' XGL_DESCRIPTOR_SET_LAYOUT *saveSetLayoutArray = (XGL_DESCRIPTOR_SET_LAYOUT *) glv_malloc(pPacket->setLayoutArrayCount * sizeof(XGL_DESCRIPTOR_SET_LAYOUT));')
+ cdslc_body.append(' XGL_DESCRIPTOR_SET_LAYOUT *pSetLayoutOrig = (XGL_DESCRIPTOR_SET_LAYOUT *) pPacket->pSetLayoutArray;')
+ cdslc_body.append(' uint32_t i;')
+ cdslc_body.append(' for (i = 0; i < pPacket->setLayoutArrayCount && pPacket->pSetLayoutArray != NULL; i++)')
+ cdslc_body.append(' {')
+ cdslc_body.append(' saveSetLayoutArray[i] = pPacket->pSetLayoutArray[i];')
+ cdslc_body.append(' *pSetLayoutOrig++ = remap(pPacket->pSetLayoutArray[i]);')
+ cdslc_body.append(' }')
+ cdslc_body.append(' replayResult = m_xglFuncs.real_xglCreateDescriptorSetLayoutChain(remap(pPacket->device), pPacket->setLayoutArrayCount, pPacket->pSetLayoutArray, &local_pLayoutChain);')
+ cdslc_body.append(' pSetLayoutOrig = (XGL_DESCRIPTOR_SET_LAYOUT *) pPacket->pSetLayoutArray;')
+ cdslc_body.append(' for (i = 0; i < pPacket->setLayoutArrayCount && pPacket->pSetLayoutArray != NULL; i++)')
+ cdslc_body.append(' {')
+ cdslc_body.append(' *pSetLayoutOrig++ = saveSetLayoutArray[i];')
+ cdslc_body.append(' }')
+ cdslc_body.append(' if (replayResult == XGL_SUCCESS)')
+ cdslc_body.append(' {')
+ cdslc_body.append(' add_to_map(pPacket->pLayoutChain, &local_pLayoutChain);')
+ cdslc_body.append(' }')
+ cdslc_body.append(' free(saveSetLayoutArray);')
+ return "\n".join(cdslc_body)
+
def _gen_replay_create_graphics_pipeline(self):
cgp_body = []
cgp_body.append(' returnValue = manually_handle_xglCreateGraphicsPipeline(pPacket);')
@@ -1630,6 +1647,28 @@
cwe_body.append(' returnValue = manually_handle_xglCmdWaitEvents(pPacket);')
return "\n".join(cwe_body)
+ def _gen_replay_cmd_bind_descriptor_sets(self):
+ cbds_body = []
+ cbds_body.append(' XGL_DESCRIPTOR_SET *pSaveSets = (XGL_DESCRIPTOR_SET *) glv_malloc(sizeof(XGL_DESCRIPTOR_SET) * pPacket->count);')
+ cbds_body.append(' if (pSaveSets == NULL)')
+ cbds_body.append(' {')
+ cbds_body.append(' glv_LogError("replay of CmdBindDescriptorSets out of memory\\n");')
+ cbds_body.append(' }')
+ cbds_body.append(' for (uint32_t idx = 0; idx < pPacket->count && pPacket->pDescriptorSets != NULL; idx++)')
+ cbds_body.append(' {')
+ cbds_body.append(' XGL_DESCRIPTOR_SET *pSet = (XGL_DESCRIPTOR_SET *) &(pPacket->pDescriptorSets[idx]);')
+ cbds_body.append(' pSaveSets[idx] = pPacket->pDescriptorSets[idx];')
+ cbds_body.append(' *pSet = remap(pPacket->pDescriptorSets[idx]);')
+ cbds_body.append(' }')
+ cbds_body.append(' m_xglFuncs.real_xglCmdBindDescriptorSets(remap(pPacket->cmdBuffer), pPacket->pipelineBindPoint, remap(pPacket->layoutChain), pPacket->layoutChainSlot, pPacket->count, pPacket->pDescriptorSets, pPacket->pUserData);')
+ cbds_body.append(' for (uint32_t idx = 0; idx < pPacket->count && pPacket->pDescriptorSets != NULL; idx++)')
+ cbds_body.append(' {')
+ cbds_body.append(' XGL_DESCRIPTOR_SET *pSet = (XGL_DESCRIPTOR_SET *) &(pPacket->pDescriptorSets[idx]);')
+ cbds_body.append(' *pSet = pSaveSets[idx];')
+ cbds_body.append(' }')
+ cbds_body.append(' glv_free(pSaveSets);')
+ return "\n".join(cbds_body)
+
def _gen_replay_cmd_pipeline_barrier(self):
cpb_body = []
cpb_body.append(' returnValue = manually_handle_xglCmdPipelineBarrier(pPacket);')
@@ -1782,6 +1821,8 @@
'CmdBindDynamicMemoryView': self._gen_replay_bind_dynamic_memory_view,
'UpdateDescriptors': self._gen_replay_update_descriptors,
'CreateDescriptorSetLayout': self._gen_replay_create_descriptor_set_layout,
+ 'CreateDescriptorSetLayoutChain': self._gen_replay_create_descriptor_set_layout_chain,
+ 'CmdBindDescriptorSets': self._gen_replay_cmd_bind_descriptor_sets,
'CmdWaitEvents': self._gen_replay_cmd_wait_events,
'CmdPipelineBarrier': self._gen_replay_cmd_pipeline_barrier}
# TODO : Need to guard CreateInstance with "if (!m_display->m_initedXGL)" check
@@ -1846,6 +1887,7 @@
elif create_func: # Declare local var to store created handle into
rbody.append(' %s local_%s;' % (proto.params[-1].ty.strip('*').replace('const ', ''), proto.params[-1].name))
if 'AllocDescriptorSets' == proto.name:
+ # TODO should malloc and free here rather than fixed size array
rbody.append(' %s local_%s[100];' % (proto.params[-2].ty.strip('*').replace('const ', ''), proto.params[-2].name))
rbody.append(' XGL_DESCRIPTOR_SET_LAYOUT localDescSets[100];')
rbody.append(' assert(pPacket->count <= 100);')
@@ -1854,6 +1896,7 @@
rbody.append(' localDescSets[i] = m_objMapper.remap(pPacket->%s[i]);' % (proto.params[-3].name))
rbody.append(' }')
elif proto.name == 'ClearDescriptorSets':
+ # TODO should malloc and free here rather than fixed size array
rbody.append(' XGL_DESCRIPTOR_SET localDescSets[100];')
rbody.append(' assert(pPacket->count <= 100);')
rbody.append(' for (uint32_t i = 0; i < pPacket->count; i++)')