mirror of
https://gitee.com/openharmony/third_party_vulkan-loader
synced 2024-11-27 17:33:12 +00:00
glave: Replay for UpdateDescriptor handle multiple replays
The local chain copy had embedded pointers into the original chain. So multiple replays/remaps weren't working. Simplify code to just save a queue of the actaul objects that need to be remapped and restore them after making the call to xglUpdateDescriptors().
This commit is contained in:
parent
790d75ac39
commit
9d73baf123
@ -2691,96 +2691,123 @@ 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
|
||||
# We have to remap handles internal to the structures so save the handles prior to remap and then restore
|
||||
# Rather than doing a deep memcpy of the entire struct and fixing any intermediate pointers, do save and restores via STL queue
|
||||
ud_body.append(' XGL_UPDATE_SAMPLERS* pUpdateChain = (XGL_UPDATE_SAMPLERS*)pPacket->pUpdateChain;')
|
||||
ud_body.append(' void* pLocalUpdateChain = NULL;')
|
||||
ud_body.append(' XGL_UPDATE_SAMPLERS* pPrev = NULL;')
|
||||
ud_body.append(' void* pLocalUpdateChainHEAD = NULL;')
|
||||
ud_body.append(' size_t blockSize = 0;')
|
||||
ud_body.append(' std::queue<XGL_SAMPLER> saveSamplers;')
|
||||
ud_body.append(' std::queue<XGL_BUFFER_VIEW> saveBufferViews;')
|
||||
ud_body.append(' std::queue<XGL_IMAGE_VIEW> saveImageViews;')
|
||||
ud_body.append(' std::queue<XGL_DESCRIPTOR_SET> saveDescSets;')
|
||||
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* pLocalSampler = (XGL_SAMPLER*) &((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->pSamplers[i];')
|
||||
ud_body.append(' for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLERS*)pUpdateChain)->count; i++) {')
|
||||
ud_body.append(' XGL_SAMPLER* pLocalSampler = (XGL_SAMPLER*) &((XGL_UPDATE_SAMPLERS*)pUpdateChain)->pSamplers[i];')
|
||||
ud_body.append(' saveSamplers.push(*pLocalSampler);')
|
||||
ud_body.append(' *pLocalSampler = remap(((XGL_UPDATE_SAMPLERS*)pUpdateChain)->pSamplers[i]);')
|
||||
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(' XGL_UPDATE_SAMPLER_TEXTURES *pLocalUST;')
|
||||
ud_body.append(' pLocalUST = (XGL_UPDATE_SAMPLER_TEXTURES *)malloc(blockSize);')
|
||||
ud_body.append(' memcpy(pLocalUST, pUpdateChain, blockSize);')
|
||||
ud_body.append(' for (uint32_t i = 0; i < pLocalUST->count; i++) {')
|
||||
ud_body.append(' XGL_SAMPLER *plocalSampler = (XGL_SAMPLER *) &pLocalUST->pSamplerImageViews[i].pSampler; ')
|
||||
ud_body.append(' *plocalSampler = remap(((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateChain)->pSamplerImageViews[i].pSampler);')
|
||||
ud_body.append(' XGL_IMAGE_VIEW *pLocalView = (XGL_IMAGE_VIEW *)&pLocalUST->pSamplerImageViews[i].pImageView->view; ')
|
||||
ud_body.append(' *pLocalView = remap(((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateChain)->pSamplerImageViews[i].pImageView->view);')
|
||||
ud_body.append(' {')
|
||||
ud_body.append(' XGL_UPDATE_SAMPLER_TEXTURES *pUST = (XGL_UPDATE_SAMPLER_TEXTURES *) pUpdateChain;')
|
||||
ud_body.append(' for (uint32_t i = 0; i < pUST->count; i++) {')
|
||||
ud_body.append(' XGL_SAMPLER *pLocalSampler = (XGL_SAMPLER *) &pUST->pSamplerImageViews[i].pSampler;')
|
||||
ud_body.append(' saveSamplers.push(*pLocalSampler);')
|
||||
ud_body.append(' *pLocalSampler = remap(pUST->pSamplerImageViews[i].pSampler);')
|
||||
ud_body.append(' XGL_IMAGE_VIEW *pLocalView = (XGL_IMAGE_VIEW *) &pUST->pSamplerImageViews[i].pImageView->view;')
|
||||
ud_body.append(' saveImageViews.push(*pLocalView);')
|
||||
ud_body.append(' *pLocalView = remap(pUST->pSamplerImageViews[i].pImageView->view);')
|
||||
ud_body.append(' }')
|
||||
ud_body.append(' pLocalUpdateChain = (void *) pLocalUST;')
|
||||
ud_body.append(' break;')
|
||||
ud_body.append(' }')
|
||||
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*) + 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* pLocalView = (XGL_IMAGE_VIEW*) &((XGL_UPDATE_IMAGES*)pUpdateChain)->pImageViews[i]->view;')
|
||||
ud_body.append(' *pLocalView = remap(((XGL_UPDATE_IMAGES*)pUpdateChain)->pImageViews[i]->view);')
|
||||
ud_body.append(' {')
|
||||
ud_body.append(' XGL_UPDATE_IMAGES *pUI = (XGL_UPDATE_IMAGES*) pUpdateChain;')
|
||||
ud_body.append(' for (uint32_t i = 0; i < pUI->count; i++) {')
|
||||
ud_body.append(' XGL_IMAGE_VIEW* pLocalView = (XGL_IMAGE_VIEW*) &pUI->pImageViews[i]->view;')
|
||||
ud_body.append(' saveImageViews.push(*pLocalView);')
|
||||
ud_body.append(' *pLocalView = remap(pUI->pImageViews[i]->view);')
|
||||
ud_body.append(' }')
|
||||
ud_body.append(' break;')
|
||||
ud_body.append(' }')
|
||||
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*) + 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* pLocalView = (XGL_BUFFER_VIEW*) &((XGL_UPDATE_BUFFERS*)pUpdateChain)->pBufferViews[i]->view;')
|
||||
ud_body.append(' *pLocalView = remap(((XGL_UPDATE_BUFFERS*)pUpdateChain)->pBufferViews[i]->view);')
|
||||
ud_body.append(' {')
|
||||
ud_body.append(' XGL_UPDATE_BUFFERS *pUB = (XGL_UPDATE_BUFFERS *) pUpdateChain;')
|
||||
ud_body.append(' for (uint32_t i = 0; i < pUB->count; i++) {')
|
||||
ud_body.append(' XGL_BUFFER_VIEW* pLocalView = (XGL_BUFFER_VIEW*) &pUB->pBufferViews[i]->view;')
|
||||
ud_body.append(' saveBufferViews.push(*pLocalView);')
|
||||
ud_body.append(' *pLocalView = remap(pUB->pBufferViews[i]->view);')
|
||||
ud_body.append(' }')
|
||||
ud_body.append(' break;')
|
||||
ud_body.append(' }')
|
||||
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(' saveDescSets.push(((XGL_UPDATE_AS_COPY*)pUpdateChain)->descriptorSet);')
|
||||
ud_body.append(' ((XGL_UPDATE_AS_COPY*)pUpdateChain)->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(' assert(0);')
|
||||
ud_body.append(' break;')
|
||||
ud_body.append(' }')
|
||||
ud_body.append(' if (NULL == pLocalUpdateChainHEAD) {')
|
||||
ud_body.append(' pLocalUpdateChainHEAD = pLocalUpdateChain;')
|
||||
ud_body.append(' }')
|
||||
ud_body.append(' if (pPrev) {')
|
||||
ud_body.append(' pPrev->pNext = pLocalUpdateChain;')
|
||||
ud_body.append(' }')
|
||||
ud_body.append(' pPrev = (XGL_UPDATE_SAMPLERS*)pLocalUpdateChain;')
|
||||
ud_body.append(' pUpdateChain = (XGL_UPDATE_SAMPLERS*)pUpdateChain->pNext;')
|
||||
ud_body.append(' pUpdateChain = (XGL_UPDATE_SAMPLERS*) pUpdateChain->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(' m_xglFuncs.real_xglUpdateDescriptors(remap(pPacket->descriptorSet), pPacket->pUpdateChain);')
|
||||
ud_body.append(' pUpdateChain = (XGL_UPDATE_SAMPLERS*) pPacket->pUpdateChain;')
|
||||
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(' 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(' for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLERS*)pUpdateChain)->count; i++) {')
|
||||
ud_body.append(' XGL_SAMPLER* pLocalSampler = (XGL_SAMPLER*) &((XGL_UPDATE_SAMPLERS*)pUpdateChain)->pSamplers[i];')
|
||||
ud_body.append(' *pLocalSampler = saveSamplers.front();')
|
||||
ud_body.append(' saveSamplers.pop();')
|
||||
ud_body.append(' }')
|
||||
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(' free(pFreeMe);')
|
||||
ud_body.append(' {')
|
||||
ud_body.append(' XGL_UPDATE_SAMPLER_TEXTURES *pUST = (XGL_UPDATE_SAMPLER_TEXTURES *) pUpdateChain;')
|
||||
ud_body.append(' for (uint32_t i = 0; i < pUST->count; i++) {')
|
||||
ud_body.append(' XGL_SAMPLER *plocalSampler = (XGL_SAMPLER *) &pUST->pSamplerImageViews[i].pSampler;')
|
||||
ud_body.append(' *plocalSampler = saveSamplers.front();')
|
||||
ud_body.append(' saveSamplers.pop();')
|
||||
ud_body.append(' XGL_IMAGE_VIEW *pLocalView = (XGL_IMAGE_VIEW *) &pUST->pSamplerImageViews[i].pImageView->view;')
|
||||
ud_body.append(' *pLocalView = saveImageViews.front();')
|
||||
ud_body.append(' saveImageViews.pop();')
|
||||
ud_body.append(' }')
|
||||
ud_body.append(' break;')
|
||||
ud_body.append(' }')
|
||||
ud_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:')
|
||||
ud_body.append(' {')
|
||||
ud_body.append(' XGL_UPDATE_IMAGES *pUI = (XGL_UPDATE_IMAGES*) pUpdateChain;')
|
||||
ud_body.append(' for (uint32_t i = 0; i < pUI->count; i++) {')
|
||||
ud_body.append(' XGL_IMAGE_VIEW* pLocalView = (XGL_IMAGE_VIEW*) &pUI->pImageViews[i]->view;')
|
||||
ud_body.append(' *pLocalView = saveImageViews.front();')
|
||||
ud_body.append(' saveImageViews.pop();')
|
||||
ud_body.append(' }')
|
||||
ud_body.append(' break;')
|
||||
ud_body.append(' }')
|
||||
ud_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:')
|
||||
ud_body.append(' {')
|
||||
ud_body.append(' XGL_UPDATE_BUFFERS *pUB = (XGL_UPDATE_BUFFERS *) pUpdateChain;')
|
||||
ud_body.append(' for (uint32_t i = 0; i < pUB->count; i++) {')
|
||||
ud_body.append(' XGL_BUFFER_VIEW* pLocalView = (XGL_BUFFER_VIEW*) &pUB->pBufferViews[i]->view;')
|
||||
ud_body.append(' *pLocalView = saveBufferViews.front();')
|
||||
ud_body.append(' saveBufferViews.pop();')
|
||||
ud_body.append(' }')
|
||||
ud_body.append(' break;')
|
||||
ud_body.append(' }')
|
||||
ud_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:')
|
||||
ud_body.append(' ((XGL_UPDATE_AS_COPY*)pUpdateChain)->descriptorSet = saveDescSets.front();')
|
||||
ud_body.append(' saveDescSets.pop();')
|
||||
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(' default:')
|
||||
ud_body.append(' // TODO : Flag error here')
|
||||
ud_body.append(' pLocalUpdateChain = (void*)((XGL_UPDATE_SAMPLERS*)pLocalUpdateChain)->pNext;')
|
||||
ud_body.append(' assert(0);')
|
||||
ud_body.append(' break;')
|
||||
ud_body.append(' }')
|
||||
ud_body.append(' pUpdateChain = (XGL_UPDATE_SAMPLERS*) pUpdateChain->pNext;')
|
||||
ud_body.append(' }')
|
||||
return "\n".join(ud_body)
|
||||
|
||||
@ -3565,6 +3592,7 @@ class GlaveReplayC(Subcommand):
|
||||
header_txt.append('#include "glvreplay_xgl_write_ppm.h"\n')
|
||||
header_txt.append('#include "glvreplay_main.h"\n')
|
||||
header_txt.append('#include <algorithm>')
|
||||
header_txt.append('#include <queue>')
|
||||
header_txt.append('extern glvreplay_settings *g_pReplaySettings;')
|
||||
header_txt.append('extern "C" {')
|
||||
header_txt.append('#include "glvtrace_xgl_xgl_structs.h"')
|
||||
|
Loading…
Reference in New Issue
Block a user