diff options
| author | Tobin Ehlis <tobin@lunarg.com> | 2015-02-03 14:41:26 -0700 |
|---|---|---|
| committer | Courtney Goeltzenleuchter <courtney@LunarG.com> | 2015-02-04 17:58:11 -0700 |
| commit | bcf484cf4223aad9031fa8ace922ea53a7d81597 (patch) | |
| tree | 79fc80bc0796f52324fbbdb9a9cb2beea070c461 | |
| parent | 08dd2294cf50d9282134bcf968d9f2eb0e3abd67 (diff) | |
| download | usermoji-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-x | glave-generate.py | 335 |
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'] |
