glave: Add codgen helper for struct size calculation and use for trace packet creation
diff --git a/glave-generate.py b/glave-generate.py
index 64e5310..876c4c2 100755
--- a/glave-generate.py
+++ b/glave-generate.py
@@ -416,14 +416,14 @@
ps = []
skip_list = [] # store params that are already accounted for so we don't count them twice
# Dict of specific params with unique custom sizes
- custom_size_dict = {'xgl_shader_create_info': '((pCreateInfo != NULL) ? pCreateInfo->codeSize : 0) + sizeof(XGL_SHADER_CREATE_INFO)',
- 'xgl_graphics_pipeline_create_info': '(calculate_pipeline_state_size(pCreateInfo->pNext)) + sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO)',
- 'pUpdateChain': 'sizeof(XGL_DESCRIPTOR_SET) + (calculate_update_descriptors_size(pUpdateChain))',
+ custom_size_dict = {'xgl_shader_create_info': 'get_struct_chain_size((void*)pCreateInfo)',
+ 'xgl_graphics_pipeline_create_info': 'get_struct_chain_size((void*)pCreateInfo)',
+ 'pUpdateChain': 'get_struct_chain_size(pUpdateChain)',
'pSetBindPoints': '(XGL_SHADER_STAGE_COMPUTE * sizeof(uint32_t))', # Accounting for largest possible array
- 'xgl_descriptor_set_layout_create_info': '(calculate_create_ds_layout_size(pSetLayoutInfoList))',
- 'xgl_cmd_buffer_begin_info': 'sizeof(XGL_CMD_BUFFER_BEGIN_INFO) + (calculate_begin_cmdbuf_size(pBeginInfo->pNext))',
- 'xgl_memory_alloc_info': 'sizeof(XGL_MEMORY_ALLOC_INFO) + calculate_alloc_memory_size(pAllocInfo->pNext)',
- 'xgl_compute_pipeline_create_info': 'sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO) + calculate_pipeline_state_size(pCreateInfo->pNext)'}
+ 'xgl_descriptor_set_layout_create_info': 'get_struct_chain_size((void*)pSetLayoutInfoList)',
+ 'xgl_cmd_buffer_begin_info': 'get_struct_chain_size((void*)pBeginInfo)',
+ 'xgl_memory_alloc_info': 'get_struct_chain_size((void*)pAllocInfo)',
+ 'xgl_compute_pipeline_create_info': 'get_struct_chain_size((void*)pCreateInfo)'}
for p in params:
#First handle custom cases
if p.ty.strip('*').replace('const ', '').lower() in custom_size_dict:
@@ -950,27 +950,6 @@
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;')
- hf_body.append(' while (pNext != NULL)')
- hf_body.append(' {')
- hf_body.append(' switch (pNext->sType)')
- hf_body.append(' {')
- hf_body.append(' case XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO:')
- hf_body.append(' {')
- hf_body.append(' siz += sizeof(XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO);')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' default:')
- hf_body.append(' glv_LogError("calculate_begin_cmdbuf_size() bad internal state sType\\n");')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' pNext = (XGL_CMD_BUFFER_BEGIN_INFO*)pNext->pNext;')
- hf_body.append(' }')
- hf_body.append(' return siz;')
- hf_body.append('}')
- hf_body.append('')
hf_body.append('static void add_alloc_memory_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')
hf_body.append('{')
hf_body.append(' const XGL_MEMORY_ALLOC_INFO* pInNow = pIn;')
@@ -1004,32 +983,6 @@
hf_body.append(' return;')
hf_body.append('}')
hf_body.append('')
- hf_body.append('static size_t calculate_alloc_memory_size(const XGL_MEMORY_ALLOC_INFO* pNext)')
- hf_body.append('{')
- hf_body.append(' size_t siz = 0;')
- hf_body.append(' while (pNext != NULL)')
- hf_body.append(' {')
- hf_body.append(' switch (pNext->sType)')
- hf_body.append(' {')
- hf_body.append(' case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO:')
- hf_body.append(' {')
- hf_body.append(' siz += sizeof(XGL_MEMORY_ALLOC_BUFFER_INFO);')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO:')
- hf_body.append(' {')
- hf_body.append(' siz += sizeof(XGL_MEMORY_ALLOC_IMAGE_INFO);')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' default:')
- hf_body.append(' glv_LogError("calculate_alloc_memory_size() bad internal state sType\\n");')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' pNext = (XGL_MEMORY_ALLOC_INFO*)pNext->pNext;')
- hf_body.append(' }')
- hf_body.append(' return siz;')
- hf_body.append('}')
- hf_body.append('')
hf_body.append('static size_t calculate_memory_barrier_size(uint32_t mbCount, const void** ppMemBarriers)')
hf_body.append('{')
hf_body.append(' uint32_t i, siz=0;')
@@ -1052,22 +1005,6 @@
hf_body.append(' }')
hf_body.append(' return siz;')
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(' size += sizeof(XGL_PIPELINE_SHADER);')
- hf_body.append(' // constant buffers')
- hf_body.append(' if (shader->linkConstBufferCount > 0 && shader->pLinkConstBufferInfo != NULL)')
- hf_body.append(' {')
- hf_body.append(' uint32_t 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('{')
@@ -1097,18 +1034,6 @@
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('')
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(' const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pInNow = pIn;')
@@ -1125,47 +1050,6 @@
hf_body.append(' return;')
hf_body.append('}')
hf_body.append('')
- hf_body.append('static size_t calculate_update_descriptors_size(const void* pUpdateChain)')
- hf_body.append('{')
- hf_body.append(' const XGL_UPDATE_SAMPLERS* pNext = pUpdateChain;')
- hf_body.append(' size_t totalUpdateSize = 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_UPDATE_SAMPLERS:')
- hf_body.append(' {')
- hf_body.append(' totalUpdateSize += sizeof(XGL_UPDATE_SAMPLERS) + ((XGL_UPDATE_SAMPLERS*)pNext)->count * sizeof(XGL_SAMPLER);')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:')
- hf_body.append(' {')
- hf_body.append(' totalUpdateSize += sizeof(XGL_UPDATE_SAMPLER_TEXTURES) + ((XGL_UPDATE_SAMPLER_TEXTURES*)pNext)->count * (sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO) + sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:')
- hf_body.append(' {')
- hf_body.append(' totalUpdateSize += sizeof(XGL_UPDATE_IMAGES) + (((XGL_UPDATE_IMAGES*)pNext)->count * (sizeof(XGL_IMAGE_VIEW_ATTACH_INFO) + sizeof(XGL_IMAGE_VIEW_ATTACH_INFO*)));')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:')
- hf_body.append(' {')
- hf_body.append(' totalUpdateSize += sizeof(XGL_UPDATE_BUFFERS) + (((XGL_UPDATE_BUFFERS*)pNext)->count * (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) + sizeof(XGL_BUFFER_VIEW_ATTACH_INFO*)));')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:')
- hf_body.append(' {')
- hf_body.append(' totalUpdateSize += sizeof(XGL_UPDATE_AS_COPY);')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' default:')
- hf_body.append(' assert(0);')
- hf_body.append(' }')
- hf_body.append(' pNext = (XGL_UPDATE_SAMPLERS*)pNext->pNext;')
- hf_body.append(' }')
- hf_body.append(' return totalUpdateSize;')
- hf_body.append('}')
- hf_body.append('')
hf_body.append('static void add_update_descriptors_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')
hf_body.append('{')
hf_body.append(' const XGL_UPDATE_SAMPLERS* pInNow = pIn;')
@@ -1248,14 +1132,6 @@
hf_body.append(' return;')
hf_body.append('}')
hf_body.append('')
- hf_body.append('static size_t calculate_pipeline_state_size(const 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(' {')
pipe_state_list = ['IA_STATE_CREATE_INFO',
'TESS_STATE_CREATE_INFO',
'RS_STATE_CREATE_INFO',
@@ -1263,36 +1139,6 @@
'VP_STATE_CREATE_INFO',
'MS_STATE_CREATE_INFO'
]
- for pipe_state in pipe_state_list:
- hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_%s:' % pipe_state)
- hf_body.append(' totalStateSize += sizeof(XGL_PIPELINE_%s);' % pipe_state)
- hf_body.append(' break;')
- hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:')
- hf_body.append(' {')
- hf_body.append(' totalStateSize += (sizeof(XGL_PIPELINE_CB_STATE_CREATE_INFO) + ((XGL_PIPELINE_CB_STATE_CREATE_INFO *) pNext)->attachmentCount * sizeof(XGL_PIPELINE_CB_ATTACHMENT_STATE));')
- 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(' 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, void** ppOut, const void* pIn)')
hf_body.append('{')
hf_body.append(' const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pInNow = pIn;')
@@ -3551,6 +3397,7 @@
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('#include "xgl_struct_size_helper.h"')
header_txt.append('#ifdef WIN32')
header_txt.append('#include "mhook/mhook-lib/mhook.h"')
header_txt.append('#endif')