aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobin Ehlis <tobin@lunarg.com>2015-02-03 14:41:26 -0700
committerCourtney Goeltzenleuchter <courtney@LunarG.com>2015-02-04 17:58:11 -0700
commitbcf484cf4223aad9031fa8ace922ea53a7d81597 (patch)
tree79fc80bc0796f52324fbbdb9a9cb2beea070c461
parent08dd2294cf50d9282134bcf968d9f2eb0e3abd67 (diff)
downloadusermoji-bcf484cf4223aad9031fa8ace922ea53a7d81597.tar.xz
glave: Glave updated for resource binding model
In glave trace and replay, account for the fact that CreateDescriptorSetLayout and UpdateDescriptors both take chains of structs.
-rwxr-xr-xglave-generate.py335
1 files changed, 265 insertions, 70 deletions
diff --git a/glave-generate.py b/glave-generate.py
index cd3eaac3..e909566a 100755
--- a/glave-generate.py
+++ b/glave-generate.py
@@ -401,24 +401,26 @@ class Subcommand(object):
if in_data_size:
func_body.append(' size_t dataSizeIn = (pDataSize == NULL) ? 0 : *pDataSize;')
func_body.append(' struct_xgl%s* pPacket = NULL;' % proto.name)
- # TODO : DescriptorUpdates and CreateSetLayout need to handle saving chain of structs
# TODO: handle xglGetXXX where pDataSize is not a valid input
# functions that have non-standard sequence of packet creation and calling real function
# NOTE: Anytime we call the function first, need to add custom code for correctly tracking API call time
if 'CreateInstance' == proto.name:
+ func_body.append(' uint64_t startTime;')
func_body.append(' glv_platform_thread_once(&gInitOnce, InitTracer);')
func_body.append(' SEND_ENTRYPOINT_ID(xgl%s);' % proto.name)
func_body.append(' if (real_xglCreateInstance == xglCreateInstance)')
func_body.append(' {')
func_body.append(' glv_platform_get_next_lib_sym((void **) &real_xglCreateInstance,"xglCreateInstance");')
func_body.append(' }')
+ func_body.append(' startTime = glv_get_time();')
+ func_body.append(' %sreal_xgl%s;' % (return_txt, proto.c_call()))
func_body.append(' CREATE_TRACE_PACKET(xgl%s, sizeof(XGL_INSTANCE) + calc_size_XGL_APPLICATION_INFO(pAppInfo) + ((pAllocCb == NULL) ? 0 :sizeof(XGL_ALLOC_CALLBACKS)));' % (proto.name))
+ func_body.append(' pHeader->entrypoint_begin_time = startTime;')
func_body.append(' if (isHooked == FALSE) {')
func_body.append(' AttachHooks();')
func_body.append(' AttachHooks_xgldbg();')
func_body.append(' AttachHooks_xglwsix11ext();')
func_body.append(' }')
- func_body.append(' %sreal_xgl%s;' % (return_txt, proto.c_call()))
elif 'EnumerateGpus' == proto.name:
func_body.append(' uint64_t startTime;')
func_body.append(' SEND_ENTRYPOINT_ID(xgl%s);' % proto.name)
@@ -445,7 +447,7 @@ class Subcommand(object):
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));')
func_body.append(' pHeader->entrypoint_begin_time = startTime;')
- elif proto.name in ['CreateShader', 'CreateFramebuffer', 'CreateRenderPass', 'BeginCommandBuffer', 'AllocMemory', 'CreateGraphicsPipeline', 'CreateComputePipeline']:
+ elif proto.name in ['CreateShader', 'CreateFramebuffer', 'CreateRenderPass', 'BeginCommandBuffer', 'AllocMemory', 'CreateGraphicsPipeline', 'CreateComputePipeline', 'UpdateDescriptors', 'CreateDescriptorSetLayout']:
# these are regular case as far as sequence of tracing but custom sizes
func_body.append(' size_t customSize;')
if 'CreateShader' == proto.name:
@@ -454,6 +456,13 @@ class Subcommand(object):
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);')
+ elif 'UpdateDescriptors' == proto.name:
+ func_body.append(' customSize = calculate_update_descriptors_size(pUpdateChain);')
+ func_body.append(' CREATE_TRACE_PACKET(xglUpdateDescriptors, sizeof(XGL_DESCRIPTOR_SET) + customSize);')
+ elif 'CreateDescriptorSetLayout' == proto.name:
+ func_body.append(' customSize = calculate_create_ds_layout_size(pSetLayoutInfoList);')
+ # NOTE : Just allocating enough packet size to account for largest array of uints
+ func_body.append(' CREATE_TRACE_PACKET(xglCreateDescriptorSetLayout, sizeof(XGL_DEVICE) + sizeof(XGL_FLAGS) + XGL_SHADER_STAGE_COMPUTE * sizeof(uint32_t) + 2 * sizeof(XGL_DESCRIPTOR_SET_LAYOUT) + customSize);')
elif 'CreateFramebuffer' == proto.name:
func_body.append(' int dsSize = (pCreateInfo != NULL && pCreateInfo->pDepthStencilAttachment != NULL) ? sizeof(XGL_DEPTH_STENCIL_BIND_INFO) : 0;')
func_body.append(' int colorCount = (pCreateInfo != NULL && pCreateInfo->pColorAttachments != NULL) ? pCreateInfo->colorAttachmentCount : 0;')
@@ -533,7 +542,7 @@ class Subcommand(object):
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('*').replace('const ', ''), proto.params[idx].name))
# Some custom add_* and finalize_* function calls for Create* API calls
- if proto.name in ['CreateShader', 'CreateFramebuffer', 'CreateRenderPass', 'BeginCommandBuffer', 'AllocMemory', 'CreateGraphicsPipeline', 'CreateComputePipeline']:
+ if proto.name in ['CreateShader', 'CreateFramebuffer', 'CreateRenderPass', 'BeginCommandBuffer', 'AllocMemory', 'UpdateDescriptors', 'CreateDescriptorSetLayout', '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));')
@@ -555,6 +564,10 @@ class Subcommand(object):
func_body.append(' add_alloc_memory_to_trace_packet(pHeader, (void**)&(pPacket->pAllocInfo->pNext), pAllocInfo->pNext);')
elif 'CreateGraphicsPipeline' == proto.name:
func_body.append(' add_pipeline_state_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo->pNext), pCreateInfo->pNext);')
+ elif 'UpdateDescriptors' == proto.name:
+ func_body.append(' add_update_descriptors_to_trace_packet(pHeader, (void**)&(pPacket->pUpdateChain), pUpdateChain);')
+ elif 'CreateDescriptorSetLayout' == proto.name:
+ func_body.append(' add_create_ds_layout_to_trace_packet(pHeader, (void**)&(pPacket->pSetLayoutInfoList->pNext), pSetLayoutInfoList->pNext);')
else:
func_body.append(' add_pipeline_state_to_trace_packet(pHeader, (void**)&(pPacket->pCreateInfo->pNext), pCreateInfo->pNext);')
func_body.append(' add_pipeline_shader_to_trace_packet(pHeader, (XGL_PIPELINE_SHADER*)&pPacket->pCreateInfo->cs, &pCreateInfo->cs);')
@@ -638,7 +651,6 @@ class Subcommand(object):
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 {')
@@ -785,66 +797,6 @@ class Subcommand(object):
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;')
@@ -996,6 +948,147 @@ class Subcommand(object):
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;')
+ hf_body.append(' XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO** ppOutNext = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO**)ppOut;')
+ hf_body.append(' while (pInNow != NULL)')
+ hf_body.append(' {')
+ hf_body.append(' XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO** ppOutNow = ppOutNext;')
+ hf_body.append(' ppOutNext = NULL;')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO), pInNow);')
+ hf_body.append(' ppOutNext = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO**)&(*ppOutNow)->pNext;')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)(ppOutNow));')
+ hf_body.append(' pInNow = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pInNow->pNext;')
+ hf_body.append(' }')
+ 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));')
+ 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));')
+ 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;')
+ hf_body.append(' XGL_UPDATE_SAMPLERS** ppOutNext = (XGL_UPDATE_SAMPLERS**)ppOut;')
+ hf_body.append(' while (pInNow != NULL)')
+ hf_body.append(' {')
+ hf_body.append(' XGL_UPDATE_SAMPLERS** ppOutNow = ppOutNext;')
+ hf_body.append(' ppOutNext = NULL;')
+ hf_body.append(' switch (pInNow->sType)')
+ hf_body.append(' {')
+ hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:')
+ hf_body.append(' {')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_UPDATE_SAMPLERS), pInNow);')
+ hf_body.append(' XGL_UPDATE_SAMPLERS* pPacket = (XGL_UPDATE_SAMPLERS*)ppOutNow;')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pSamplers, ((XGL_UPDATE_SAMPLERS*)pInNow)->count * sizeof(XGL_SAMPLER), ((XGL_UPDATE_SAMPLERS*)pInNow)->pSamplers);')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pSamplers));')
+ hf_body.append(' ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*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_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(' glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES), pInNow);')
+ hf_body.append(' XGL_UPDATE_SAMPLER_TEXTURES* pPacket = (XGL_UPDATE_SAMPLER_TEXTURES*)ppOutNow;')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pSamplerImageViews, ((XGL_UPDATE_SAMPLER_TEXTURES*)pInNow)->count * sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO), ((XGL_UPDATE_SAMPLER_TEXTURES*)pInNow)->pSamplerImageViews);')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pSamplerImageViews));')
+ # TODO : This is still broken. How to update the original XGL_SAMPLER_IMAGE_VIEW_INFO struct ptrs to have correct address for newly added XGL_IMAGE_VIEW_ATTACH_INFO blocks below?
+ hf_body.append(' uint32_t i;')
+ hf_body.append(' for (i = 0; i < ((XGL_UPDATE_SAMPLER_TEXTURES*)pInNow)->count; i++) {')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pSamplerImageViews[i], sizeof(XGL_IMAGE_VIEW_ATTACH_INFO), &((XGL_UPDATE_SAMPLER_TEXTURES*)pInNow)->pSamplerImageViews[i]);')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pSamplerImageViews[i]));')
+ hf_body.append(' }')
+ hf_body.append(' ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*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_UPDATE_IMAGES:')
+ hf_body.append(' {')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_UPDATE_IMAGES), pInNow);')
+ hf_body.append(' XGL_UPDATE_IMAGES* pPacket = (XGL_UPDATE_IMAGES*)ppOutNow;')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pImageViews, ((XGL_UPDATE_IMAGES*)pInNow)->count * sizeof(XGL_IMAGE_VIEW_ATTACH_INFO), ((XGL_UPDATE_IMAGES*)pInNow)->pImageViews);')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pImageViews));')
+ hf_body.append(' ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*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_UPDATE_BUFFERS:')
+ hf_body.append(' {')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_UPDATE_BUFFERS), pInNow);')
+ hf_body.append(' XGL_UPDATE_BUFFERS* pPacket = (XGL_UPDATE_BUFFERS*)ppOutNow;')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void **) &pPacket->pBufferViews, ((XGL_UPDATE_BUFFERS*)pInNow)->count * sizeof(XGL_BUFFER_VIEW_ATTACH_INFO), ((XGL_UPDATE_BUFFERS*)pInNow)->pBufferViews);')
+ hf_body.append(' glv_finalize_buffer_address(pHeader, (void**)&(pPacket->pBufferViews));')
+ hf_body.append(' ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*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_UPDATE_AS_COPY:')
+ hf_body.append(' {')
+ hf_body.append(' glv_add_buffer_to_trace_packet(pHeader, (void**)(ppOutNow), sizeof(XGL_UPDATE_AS_COPY), pInNow);')
+ hf_body.append(' ppOutNext = (XGL_UPDATE_SAMPLERS**)&(*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(0);')
+ hf_body.append(' }')
+ hf_body.append(' pInNow = (XGL_UPDATE_SAMPLERS*)pInNow->pNext;')
+ hf_body.append(' }')
+ 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;')
@@ -1048,7 +1141,6 @@ class Subcommand(object):
hf_body.append('')
hf_body.append(' switch (pInNow->sType)')
hf_body.append(' {')
- # TODO : FINISH THIS LOOP AND DELETE CODE BELOW IT
for pipe_state in pipe_state_list:
hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_%s:' % pipe_state)
hf_body.append(' {')
@@ -2404,10 +2496,113 @@ class Subcommand(object):
def _gen_replay_update_descriptors(self):
ud_body = []
# TODO : Add code here to read chain of update structs
+ # We have to remap handles internal to the structures so make complete local copy of update chain
+ # and remap all of the handles inside of the update structs
+ ud_body.append(' XGL_UPDATE_SAMPLERS* pUpdateChain = (XGL_UPDATE_SAMPLERS*)pPacket->pUpdateChain;')
+ ud_body.append(' void* pLocalUpdateChain = NULL;')
+ ud_body.append(' void* pLocalUpdateChainHEAD = NULL;')
+ ud_body.append(' size_t blockSize = 0;')
+ ud_body.append(' while (pUpdateChain) {')
+ ud_body.append(' switch(pUpdateChain->sType)')
+ ud_body.append(' {')
+ ud_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:')
+ ud_body.append(' blockSize = sizeof(XGL_UPDATE_SAMPLERS) + ((XGL_UPDATE_SAMPLERS*)pUpdateChain)->count * sizeof(XGL_SAMPLER);')
+ ud_body.append(' pLocalUpdateChain = (void*)malloc(blockSize);')
+ ud_body.append(' memcpy(pLocalUpdateChain, pUpdateChain, blockSize);')
+ ud_body.append(' for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->count; i++) {')
+ ud_body.append(' XGL_SAMPLER localSampler = remap(((XGL_UPDATE_SAMPLERS*)pUpdateChain)->pSamplers[i]);')
+ ud_body.append(' memcpy((void*)&((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->pSamplers[i], &localSampler, sizeof(XGL_SAMPLER));')
+ ud_body.append(' }')
+ ud_body.append(' break;')
+ ud_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:')
+ ud_body.append(' blockSize = sizeof(XGL_UPDATE_SAMPLER_TEXTURES) + ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateChain)->count * (sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO) + sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));')
+ ud_body.append(' pLocalUpdateChain = malloc(blockSize);')
+ ud_body.append(' memcpy(pLocalUpdateChain, pUpdateChain, blockSize);')
+ ud_body.append(' for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLER_TEXTURES*)pLocalUpdateChain)->count; i++) {')
+ ud_body.append(' XGL_SAMPLER localSampler = remap(((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateChain)->pSamplerImageViews[i].pSampler);')
+ ud_body.append(' memcpy((void*)&((XGL_UPDATE_SAMPLER_TEXTURES*)pLocalUpdateChain)->pSamplerImageViews[i].pSampler, &localSampler, sizeof(XGL_SAMPLER));')
+ ud_body.append(' XGL_IMAGE_VIEW_ATTACH_INFO* pLocalImageView = (XGL_IMAGE_VIEW_ATTACH_INFO*)malloc(sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));')
+ ud_body.append(' memcpy((void*)&((XGL_UPDATE_SAMPLER_TEXTURES*)pLocalUpdateChain)->pSamplerImageViews[i].pImageView, &pLocalImageView, sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));')
+ ud_body.append(' memcpy((void*)((XGL_UPDATE_SAMPLER_TEXTURES*)pLocalUpdateChain)->pSamplerImageViews[i].pImageView, (void*)((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateChain)->pSamplerImageViews[i].pImageView, sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));')
+ ud_body.append(' XGL_IMAGE_VIEW localView = remap(((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateChain)->pSamplerImageViews[i].pImageView->view);')
+ ud_body.append(' memcpy((void*)&((XGL_UPDATE_SAMPLER_TEXTURES*)pLocalUpdateChain)->pSamplerImageViews[i].pImageView->view, &localView, sizeof(XGL_IMAGE_VIEW));')
+ ud_body.append(' }')
+ ud_body.append(' break;')
+ ud_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:')
+ ud_body.append(' blockSize = sizeof(XGL_UPDATE_IMAGES) + (((XGL_UPDATE_IMAGES*)pUpdateChain)->count * sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));')
+ ud_body.append(' pLocalUpdateChain = malloc(blockSize);')
+ ud_body.append(' memcpy(pLocalUpdateChain, pUpdateChain, blockSize);')
+ ud_body.append(' for (uint32_t i = 0; i < ((XGL_UPDATE_IMAGES*)pLocalUpdateChain)->count; i++) {')
+ ud_body.append(' XGL_IMAGE_VIEW localView = remap(((XGL_UPDATE_IMAGES*)pUpdateChain)->pImageViews[i]->view);')
+ ud_body.append(' memcpy((void*)&((XGL_UPDATE_IMAGES*)pLocalUpdateChain)->pImageViews[i]->view, &localView, sizeof(XGL_IMAGE_VIEW));')
+ ud_body.append(' }')
+ ud_body.append(' break;')
+ ud_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:')
+ ud_body.append(' blockSize = sizeof(XGL_UPDATE_BUFFERS) + (((XGL_UPDATE_BUFFERS*)pUpdateChain)->count * sizeof(XGL_BUFFER_VIEW_ATTACH_INFO));')
+ ud_body.append(' pLocalUpdateChain = malloc(blockSize);')
+ ud_body.append(' memcpy(pLocalUpdateChain, pUpdateChain, blockSize);')
+ ud_body.append(' for (uint32_t i = 0; i < ((XGL_UPDATE_BUFFERS*)pLocalUpdateChain)->count; i++) {')
+ ud_body.append(' XGL_BUFFER_VIEW localView = remap(((XGL_UPDATE_BUFFERS*)pUpdateChain)->pBufferViews[i]->view);')
+ ud_body.append(' memcpy((void*)&((XGL_UPDATE_BUFFERS*)pLocalUpdateChain)->pBufferViews[i]->view, &localView, sizeof(XGL_BUFFER_VIEW));')
+ ud_body.append(' }')
+ ud_body.append(' break;')
+ ud_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:')
+ ud_body.append(' blockSize += sizeof(XGL_UPDATE_AS_COPY);')
+ ud_body.append(' pLocalUpdateChain = malloc(blockSize);')
+ ud_body.append(' memcpy(pLocalUpdateChain, pUpdateChain, blockSize);')
+ ud_body.append(' ((XGL_UPDATE_AS_COPY*)pLocalUpdateChain)->descriptorSet = remap(((XGL_UPDATE_AS_COPY*)pUpdateChain)->descriptorSet);')
+ ud_body.append(' break;')
+ ud_body.append(' default:')
+ ud_body.append(' // TODO : Flag error here')
+ ud_body.append(' break;')
+ ud_body.append(' }')
+ ud_body.append(' if (NULL == pLocalUpdateChainHEAD) {')
+ ud_body.append(' pLocalUpdateChainHEAD = pLocalUpdateChain;')
+ ud_body.append(' }')
+ ud_body.append(' pUpdateChain = (XGL_UPDATE_SAMPLERS*)pUpdateChain->pNext;')
+ ud_body.append(' pLocalUpdateChain = (void*)((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->pNext;')
+ ud_body.append(' }')
+ ud_body.append(' m_xglFuncs.real_xglUpdateDescriptors(remap(pPacket->descriptorSet), pLocalUpdateChainHEAD);')
+ ud_body.append(' pLocalUpdateChain = (XGL_UPDATE_SAMPLERS*)pLocalUpdateChainHEAD;')
+ ud_body.append(' XGL_UPDATE_SAMPLERS* pFreeMe = NULL;')
+ ud_body.append(' while (pLocalUpdateChain) {')
+ ud_body.append(' switch(((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->sType)')
+ ud_body.append(' {')
+ ud_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:')
+ ud_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:')
+ ud_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:')
+ ud_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:')
+ ud_body.append(' pFreeMe = (XGL_UPDATE_SAMPLERS*)pLocalUpdateChain;')
+ ud_body.append(' pLocalUpdateChain = (void*)((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->pNext;')
+ ud_body.append(' free(pFreeMe);')
+ ud_body.append(' break;')
+ ud_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:')
+ ud_body.append(' pFreeMe = (XGL_UPDATE_SAMPLERS*)pLocalUpdateChain;')
+ ud_body.append(' pLocalUpdateChain = (void*)((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->pNext;')
+ ud_body.append(' for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLER_TEXTURES*)pFreeMe)->count; i++) {')
+ ud_body.append(' free((void*)((XGL_UPDATE_SAMPLER_TEXTURES*)pFreeMe)->pSamplerImageViews[i].pImageView);')
+ ud_body.append(' }')
+ ud_body.append(' free(pFreeMe);')
+ ud_body.append(' break;')
+ ud_body.append(' default:')
+ ud_body.append(' // TODO : Flag error here')
+ ud_body.append(' break;')
+ ud_body.append(' }')
+ ud_body.append(' pLocalUpdateChain = (void*)((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->pNext;')
+ ud_body.append(' }')
+ return "\n".join(ud_body)
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
+ cdsl_body.append(' XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO createInfo;')
+ cdsl_body.append(' memcpy(&createInfo, pPacket->pSetLayoutInfoList, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO));')
+ cdsl_body.append(' XGL_DESCRIPTOR_SET_LAYOUT setLayout;')
+ cdsl_body.append(' replayResult = m_xglFuncs.real_xglCreateDescriptorSetLayout(remap(pPacket->device), pPacket->stageFlags, pPacket->pSetBindPoints, remap(pPacket->priorSetLayout), &createInfo, &setLayout);')
+ cdsl_body.append(' if (replayResult == XGL_SUCCESS)')
+ cdsl_body.append(' {')
+ cdsl_body.append(' add_to_map(pPacket->pSetLayout, &setLayout);')
+ cdsl_body.append(' }')
+ return "\n".join(cdsl_body)
def _gen_replay_create_graphics_pipeline(self):
cgp_body = []
@@ -2648,8 +2843,6 @@ class Subcommand(object):
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,
@@ -2673,7 +2866,9 @@ class Subcommand(object):
'FreeMemory': self._gen_replay_free_memory,
'MapMemory': self._gen_replay_map_memory,
'UnmapMemory': self._gen_replay_unmap_memory,
- 'CmdBindDynamicMemoryView': self._gen_replay_bind_dynamic_memory_view}
+ 'CmdBindDynamicMemoryView': self._gen_replay_bind_dynamic_memory_view,
+ 'UpdateDescriptors': self._gen_replay_update_descriptors,
+ 'CreateDescriptorSetLayout': self._gen_replay_create_descriptor_set_layout}
# 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 = ['EnumerateGpus', 'GetGpuInfo', 'CreateDevice', 'GetExtensionSupport']