diff options
| -rwxr-xr-x | glave-generate.py | 218 |
1 files changed, 185 insertions, 33 deletions
diff --git a/glave-generate.py b/glave-generate.py index 3430342e..8c3e4669 100755 --- a/glave-generate.py +++ b/glave-generate.py @@ -1750,7 +1750,17 @@ class Subcommand(object): cd_body.append('typedef struct _XGLAllocInfo {') cd_body.append(' XGL_GPU_SIZE size;') cd_body.append(' void *pData;') - cd_body.append('} XGLAllocInfo;') + cd_body.append('} XGLAllocInfo;\n') + cd_body.append('class objMemory {') + cd_body.append('public:') + cd_body.append(' objMemory() : m_numAllocations(0), m_pMemReqs(NULL) {}') + cd_body.append(' ~objMemory() { free(m_pMemReqs);}') + cd_body.append(' void setCount(const uint32_t num);') + cd_body.append(' void setReqs(const XGL_MEMORY_REQUIREMENTS *pReqs, const uint32_t num);') + cd_body.append('private:') + cd_body.append(' uint32_t m_numAllocations;') + cd_body.append(' XGL_MEMORY_REQUIREMENTS *m_pMemReqs;') + cd_body.append('};\n') return "\n".join(cd_body) def _generate_replay_func_ptrs(self): @@ -1777,18 +1787,18 @@ class Subcommand(object): txt = ' void add_to_map(%s* pTraceVal, %s* pReplayVal)\n {\n' % (type1, type2) txt += ' assert(pTraceVal != NULL);\n' txt += ' assert(pReplayVal != NULL);\n' - txt += ' %s[*pTraceVal] = *pReplayVal;\n }' % name + txt += ' %s[*pTraceVal] = *pReplayVal;\n }\n' % name return txt def _rm_from_map_decl(self, ty, name): txt = ' void rm_from_map(const %s& key)\n {\n' % (ty) - txt += ' %s.erase(key);\n }' % name + txt += ' %s.erase(key);\n }\n' % name return txt def _remap_decl(self, ty, name): txt = ' %s remap(const %s& value)\n {\n' % (ty, ty) txt += ' std::map<%s, %s>::const_iterator q = %s.find(value);\n' % (ty, ty, name) - txt += ' return (q == %s.end()) ? XGL_NULL_HANDLE : q->second;\n }' % name + txt += ' return (q == %s.end()) ? XGL_NULL_HANDLE : q->second;\n }\n' % name return txt def _generate_replay_class(self): @@ -1831,8 +1841,9 @@ class Subcommand(object): rc_body.append(' };') rc_body.append(' std::vector<struct validationMsg> m_validationMsgs;') rc_body.append(' std::vector<int> m_screenshotFrames;') + # Custom code for memory mapping functions for app writes into mapped memory + rc_body.append(' // memory mapping functions for app writes into mapped memory') rc_body.append(self._map_decl('XGL_GPU_MEMORY', 'XGLAllocInfo', 'm_mapData')) - # Custom code for 1-off memory mapping functions rc_body.append(' void add_entry_to_mapData(XGL_GPU_MEMORY handle, XGL_GPU_SIZE size)') rc_body.append(' {') rc_body.append(' XGLAllocInfo info;') @@ -1880,27 +1891,82 @@ class Subcommand(object): rc_body.append(' memcpy(info.pData, pData, info.size);') rc_body.append(' info.pData = NULL;') rc_body.append(' }\n') - rc_body.append(' /*std::map<XGL_PHYSICAL_GPU, XGL_PHYSICAL_GPU> m_gpus;') - rc_body.append(' void add_to_map(XGL_PHYSICAL_GPU* pTraceGpu, XGL_PHYSICAL_GPU* pReplayGpu)') - rc_body.append(' {') - rc_body.append(' assert(pTraceGpu != NULL);') - rc_body.append(' assert(pReplayGpu != NULL);') - rc_body.append(' m_gpus[*pTraceGpu] = *pReplayGpu;') + rc_body.append(' bool m_adjustForGPU; // true if replay adjusts behavior based on GPU') + # Code for memory objects for handling replay GPU != trace GPU object memory requirements + rc_body.append(' struct imageObj {') + rc_body.append(' objMemory imageMem;') + rc_body.append(' XGL_IMAGE replayImage;') + rc_body.append(' };\n') + rc_body.append(' struct bufferObj {') + rc_body.append(' objMemory bufferMem;') + rc_body.append(' XGL_BUFFER replayBuffer;') + rc_body.append(' };\n') + rc_body.append(' void init_objMemCount(const XGL_BASE_OBJECT& object, const uint32_t &num)\n {') + rc_body.append(' XGL_IMAGE img = static_cast <XGL_IMAGE> (object);') + rc_body.append(' std::map<XGL_IMAGE, struct imageObj>::const_iterator it = m_images.find(img);') + rc_body.append(' if (it != m_images.end())') + rc_body.append(' {') + rc_body.append(' objMemory obj = it->second.imageMem;') + rc_body.append(' obj.setCount(num);') + rc_body.append(' return;') + rc_body.append(' }') + rc_body.append(' XGL_BUFFER buf = static_cast <XGL_BUFFER> (object);') + rc_body.append(' std::map<XGL_BUFFER, struct bufferObj>::const_iterator itb = m_buffers.find(buf);') + rc_body.append(' if (itb != m_buffers.end())') + rc_body.append(' {') + rc_body.append(' objMemory obj = itb->second.bufferMem;') + rc_body.append(' obj.setCount(num);') + rc_body.append(' return;') + rc_body.append(' }') + rc_body.append(' return;') + rc_body.append(' }\n') + rc_body.append(' void init_objMemReqs(const XGL_BASE_OBJECT& object, const XGL_MEMORY_REQUIREMENTS *pMemReqs, const unsigned int num)\n {') + rc_body.append(' XGL_IMAGE img = static_cast <XGL_IMAGE> (object);') + rc_body.append(' std::map<XGL_IMAGE, struct imageObj>::const_iterator it = m_images.find(img);') + rc_body.append(' if (it != m_images.end())') + rc_body.append(' {') + rc_body.append(' objMemory obj = it->second.imageMem;') + rc_body.append(' obj.setReqs(pMemReqs, num);') + rc_body.append(' return;') + rc_body.append(' }') + rc_body.append(' XGL_BUFFER buf = static_cast <XGL_BUFFER> (object);') + rc_body.append(' std::map<XGL_BUFFER, struct bufferObj>::const_iterator itb = m_buffers.find(buf);') + rc_body.append(' if (itb != m_buffers.end())') + rc_body.append(' {') + rc_body.append(' objMemory obj = itb->second.bufferMem;') + rc_body.append(' obj.setReqs(pMemReqs, num);') + rc_body.append(' return;') + rc_body.append(' }') + rc_body.append(' return;') rc_body.append(' }\n') - rc_body.append(' XGL_PHYSICAL_GPU remap(const XGL_PHYSICAL_GPU& gpu)') - rc_body.append(' {') - rc_body.append(' std::map<XGL_PHYSICAL_GPU, XGL_PHYSICAL_GPU>::const_iterator q = m_gpus.find(gpu);') - rc_body.append(' return (q == m_gpus.end()) ? XGL_NULL_HANDLE : q->second;') - rc_body.append(' }*/\n') rc_body.append(' void clear_all_map_handles()\n {') for var in sorted(obj_map_dict): rc_body.append(' %s.clear();' % var) - rc_body.append(' }') + rc_body.append(' }\n') for var in sorted(obj_map_dict): - rc_body.append(self._map_decl(obj_map_dict[var], obj_map_dict[var], var)) - rc_body.append(self._add_to_map_decl(obj_map_dict[var], obj_map_dict[var], var)) - rc_body.append(self._rm_from_map_decl(obj_map_dict[var], var)) - rc_body.append(self._remap_decl(obj_map_dict[var], var)) + if obj_map_dict[var] == 'XGL_IMAGE': + rc_body.append(self._map_decl(obj_map_dict[var], 'struct imageObj', var)) + rc_body.append(self._add_to_map_decl(obj_map_dict[var], 'struct imageObj', var)) + rc_body.append(self._rm_from_map_decl(obj_map_dict[var], var)) + rc_body.append(' XGL_IMAGE remap(const XGL_IMAGE& value)') + rc_body.append(' {') + rc_body.append(' std::map<XGL_IMAGE, struct imageObj>::const_iterator q = m_images.find(value);') + rc_body.append(' return (q == m_images.end()) ? XGL_NULL_HANDLE : q->second.replayImage;') + rc_body.append(' }\n') + elif obj_map_dict[var] == 'XGL_BUFFER': + rc_body.append(self._map_decl(obj_map_dict[var], 'struct bufferObj', var)) + rc_body.append(self._add_to_map_decl(obj_map_dict[var], 'struct bufferObj', var)) + rc_body.append(self._rm_from_map_decl(obj_map_dict[var], var)) + rc_body.append(' XGL_BUFFER remap(const XGL_BUFFER& value)') + rc_body.append(' {') + rc_body.append(' std::map<XGL_BUFFER, struct bufferObj>::const_iterator q = m_buffers.find(value);') + rc_body.append(' return (q == m_buffers.end()) ? XGL_NULL_HANDLE : q->second.replayBuffer;') + rc_body.append(' }\n') + else: + rc_body.append(self._map_decl(obj_map_dict[var], obj_map_dict[var], var)) + rc_body.append(self._add_to_map_decl(obj_map_dict[var], obj_map_dict[var], var)) + rc_body.append(self._rm_from_map_decl(obj_map_dict[var], var)) + rc_body.append(self._remap_decl(obj_map_dict[var], var)) # XGL_DYNAMIC_STATE_OBJECT code state_obj_remap_types = xgl.object_dynamic_state_list rc_body.append(' XGL_DYNAMIC_STATE_OBJECT remap(const XGL_DYNAMIC_STATE_OBJECT& state)\n {') @@ -1912,7 +1978,7 @@ class Subcommand(object): rc_body.append(' void rm_from_map(const XGL_DYNAMIC_STATE_OBJECT& state)\n {') for t in state_obj_remap_types: rc_body.append(' rm_from_map(static_cast <%s> (state));' % t) - rc_body.append(' }') + rc_body.append(' }\n') # OBJECT code rc_body.append(' XGL_OBJECT remap(const XGL_OBJECT& object)\n {') rc_body.append(' XGL_OBJECT obj;') @@ -2191,9 +2257,32 @@ class Subcommand(object): dw_body.append('}\n') dw_body.append('void xglDisplay::process_event()') dw_body.append('{') - dw_body.append('}') + dw_body.append('}\n') return "\n".join(dw_body) + def _generate_replay_objMemory_funcs(self): + rof_body = [] + rof_body.append('void objMemory::setCount(const uint32_t num)') + rof_body.append('{') + rof_body.append(' m_numAllocations = num;') + rof_body.append('}\n') + rof_body.append('void objMemory::setReqs(const XGL_MEMORY_REQUIREMENTS *pReqs, const uint32_t num)') + rof_body.append('{') + rof_body.append(' if (m_numAllocations != num && m_numAllocations != 0)') + rof_body.append(' glv_LogError("objMemory::setReqs, internal mismatch on number of allocations");') + rof_body.append(' if (m_pMemReqs == NULL && pReqs != NULL)') + rof_body.append(' {') + rof_body.append(' m_pMemReqs = (XGL_MEMORY_REQUIREMENTS *) glv_malloc(num * sizeof(XGL_MEMORY_REQUIREMENTS));') + rof_body.append(' if (m_pMemReqs == NULL)') + rof_body.append(' {') + rof_body.append(' glv_LogError("objMemory::setReqs out of memory");') + rof_body.append(' return;') + rof_body.append(' }') + rof_body.append(' memcpy(m_pMemReqs, pReqs, num);') + rof_body.append(' }') + rof_body.append('}\n') + return "\n".join(rof_body) + def _generate_replay_structors(self): rs_body = [] rs_body.append('xglReplay::xglReplay(glvreplay_settings *pReplaySettings)') @@ -2202,6 +2291,7 @@ class Subcommand(object): rs_body.append(' m_display = new xglDisplay();') rs_body.append(' m_pDSDump = NULL;') rs_body.append(' m_pCBDump = NULL;') + rs_body.append(' m_adjustForGPU = false;') rs_body.append(' if (g_pReplaySettings && g_pReplaySettings->screenshotList) {') rs_body.append(' process_screenshot_list(g_pReplaySettings->screenshotList);') rs_body.append(' }') @@ -2557,16 +2647,55 @@ class Subcommand(object): goi_body.append(' pData = glv_malloc(*pPacket->pDataSize);') goi_body.append(' memcpy(pData, pPacket->pData, *pPacket->pDataSize);') goi_body.append(' }') + goi_body.append(' // TODO only search for object once rather than at remap() and init_objMemXXX()') goi_body.append(' replayResult = m_xglFuncs.real_xglGetObjectInfo(remap(pPacket->object), pPacket->infoType, &size, pData);') goi_body.append(' if (replayResult == XGL_SUCCESS)') goi_body.append(' {') goi_body.append(' if (size != *pPacket->pDataSize && pData != NULL)') goi_body.append(' {') goi_body.append(' glv_LogWarn("xglGetObjectInfo returned a differing data size: replay (%d bytes) vs trace (%d bytes)\\n", size, *pPacket->pDataSize);') - goi_body.append(' }') - goi_body.append(' else if (pData != NULL && memcmp(pData, pPacket->pData, size) != 0)') + goi_body.append(' } else if (pData != NULL)') goi_body.append(' {') - goi_body.append(' glv_LogWarn("xglGetObjectInfo returned differing data contents than the trace file contained.\\n");') + goi_body.append(' switch (pPacket->infoType)') + goi_body.append(' {') + goi_body.append(' case XGL_INFO_TYPE_MEMORY_ALLOCATION_COUNT:') + goi_body.append(' {') + goi_body.append(' uint32_t traceCount = *((uint32_t *) pPacket->pData);') + goi_body.append(' uint32_t replayCount = *((uint32_t *) pData);') + goi_body.append(' if (traceCount != replayCount)') + goi_body.append(' glv_LogWarn("xglGetObjectInfo(INFO_TYPE_MEMORY_ALLOCATION_COUNT) mismatch: trace count %u, replay count %u\\n", traceCount, replayCount);') + goi_body.append(' if (m_adjustForGPU)') + goi_body.append(' init_objMemCount(pPacket->object, replayCount);') + goi_body.append(' break;') + goi_body.append(' }') + goi_body.append(' case XGL_INFO_TYPE_MEMORY_REQUIREMENTS:') + goi_body.append(' {') + goi_body.append(' XGL_MEMORY_REQUIREMENTS *traceReqs = (XGL_MEMORY_REQUIREMENTS *) pPacket->pData;') + goi_body.append(' XGL_MEMORY_REQUIREMENTS *replayReqs = (XGL_MEMORY_REQUIREMENTS *) pData;') + goi_body.append(' unsigned int num = size / sizeof(XGL_MEMORY_REQUIREMENTS);') + goi_body.append(' for (unsigned int i = 0; i < num; i++)') + goi_body.append(' {') + goi_body.append(' if (traceReqs->size != replayReqs->size)') + goi_body.append(' glv_LogWarn("xglGetObjectInfo(INFO_TYPE_MEMORY_REQUIREMENTS) mismatch: trace size %u, replay size %u\\n", traceReqs->size, replayReqs->size);') + goi_body.append(' if (traceReqs->alignment != replayReqs->alignment)') + goi_body.append(' glv_LogWarn("xglGetObjectInfo(INFO_TYPE_MEMORY_REQUIREMENTS) mismatch: trace alignment %u, replay aligmnent %u\\n", traceReqs->alignment, replayReqs->alignment);') + goi_body.append(' if (traceReqs->granularity != replayReqs->granularity)') + goi_body.append(' glv_LogWarn("xglGetObjectInfo(INFO_TYPE_MEMORY_REQUIREMENTS) mismatch: trace granularity %u, replay granularity %u\\n", traceReqs->granularity, replayReqs->granularity);') + goi_body.append(' if (traceReqs->memProps != replayReqs->memProps)') + goi_body.append(' glv_LogWarn("xglGetObjectInfo(INFO_TYPE_MEMORY_REQUIREMENTS) mismatch: trace memProps %u, replay memProps %u\\n", traceReqs->memProps, replayReqs->memProps);') + goi_body.append(' if (traceReqs->memType != replayReqs->memType)') + goi_body.append(' glv_LogWarn("xglGetObjectInfo(INFO_TYPE_MEMORY_REQUIREMENTS) mismatch: trace memType %u, replay memType %u\\n", traceReqs->memType, replayReqs->memType);') + goi_body.append(' traceReqs++;') + goi_body.append(' replayReqs++;') + goi_body.append(' }') + goi_body.append(' if (m_adjustForGPU)') + goi_body.append(' init_objMemReqs(pPacket->object, replayReqs - num, num);') + goi_body.append(' break;') + goi_body.append(' }') + goi_body.append(' default:') + goi_body.append(' if (memcmp(pData, pPacket->pData, size) != 0)') + goi_body.append(' glv_LogWarn("xglGetObjectInfo() mismatch on *pData: between trace and replay *pDataSize %u\\n", size);') + goi_body.append(' }') goi_body.append(' }') goi_body.append(' }') goi_body.append(' glv_free(pData);') @@ -2596,6 +2725,26 @@ class Subcommand(object): gfi_body.append(' glv_free(pData);') return "\n".join(gfi_body) + def _gen_replay_create_image(self): + ci_body = [] + ci_body.append(' struct imageObj local_imageObj;') + ci_body.append(' replayResult = m_xglFuncs.real_xglCreateImage(remap(pPacket->device), pPacket->pCreateInfo, &local_imageObj.replayImage);') + ci_body.append(' if (replayResult == XGL_SUCCESS)') + ci_body.append(' {') + ci_body.append(' add_to_map(pPacket->pImage, &local_imageObj);') + ci_body.append(' }') + return "\n".join(ci_body) + + def _gen_replay_create_buffer(self): + cb_body = [] + cb_body.append(' struct bufferObj local_bufferObj;') + cb_body.append(' replayResult = m_xglFuncs.real_xglCreateBuffer(remap(pPacket->device), pPacket->pCreateInfo, &local_bufferObj.replayBuffer);') + cb_body.append(' if (replayResult == XGL_SUCCESS)') + cb_body.append(' {') + cb_body.append(' add_to_map(pPacket->pBuffer, &local_bufferObj);') + cb_body.append(' }') + return "\n".join(cb_body) + def _gen_replay_get_image_subresource_info(self): isi_body = [] isi_body.append(' size_t size = 0;') @@ -3037,19 +3186,19 @@ class Subcommand(object): def _gen_replay_wsi_create_presentable_image(self): cpi_body = [] cpi_body.append('#if defined(PLATFORM_LINUX) || defined(XCB_NVIDIA)') - cpi_body.append(' XGL_IMAGE img;') - cpi_body.append(' XGL_GPU_MEMORY mem;') + cpi_body.append(' struct imageObj local_imgObj;') + cpi_body.append(' XGL_GPU_MEMORY local_mem;') cpi_body.append(' m_display->imageHeight.push_back(pPacket->pCreateInfo->extent.height);') cpi_body.append(' m_display->imageWidth.push_back(pPacket->pCreateInfo->extent.width);') - cpi_body.append(' replayResult = m_xglFuncs.real_xglWsiX11CreatePresentableImage(remap(pPacket->device), pPacket->pCreateInfo, &img, &mem);') + cpi_body.append(' replayResult = m_xglFuncs.real_xglWsiX11CreatePresentableImage(remap(pPacket->device), pPacket->pCreateInfo, &local_imgObj.replayImage, &local_mem);') cpi_body.append(' if (replayResult == XGL_SUCCESS)') cpi_body.append(' {') cpi_body.append(' if (pPacket->pImage != NULL)') - cpi_body.append(' add_to_map(pPacket->pImage, &img);') + cpi_body.append(' add_to_map(pPacket->pImage, &local_imgObj);') cpi_body.append(' if(pPacket->pMem != NULL)') - cpi_body.append(' add_to_map(pPacket->pMem, &mem);') - cpi_body.append(' m_display->imageHandles.push_back(img);') - cpi_body.append(' m_display->imageMemory.push_back(mem);') + cpi_body.append(' add_to_map(pPacket->pMem, &local_mem);') + cpi_body.append(' m_display->imageHandles.push_back(local_imgObj.replayImage);') + cpi_body.append(' m_display->imageMemory.push_back(local_mem);') cpi_body.append(' }') cpi_body.append('#elif defined(WIN32)') cpi_body.append(' //TBD') @@ -3135,6 +3284,8 @@ class Subcommand(object): 'QueueSubmit': self._gen_replay_queue_submit, 'GetObjectInfo': self._gen_replay_get_object_info, 'GetFormatInfo': self._gen_replay_get_format_info, + 'CreateImage': self._gen_replay_create_image, + 'CreateBuffer': self._gen_replay_create_buffer, 'GetImageSubresourceInfo': self._gen_replay_get_image_subresource_info, 'CreateGraphicsPipeline': self._gen_replay_create_graphics_pipeline, 'CreateFramebuffer': self._gen_replay_create_framebuffer, @@ -3596,6 +3747,7 @@ class GlaveReplayC(Subcommand): self._generate_replay_display_init(), self._generate_replay_display_structors(), self._generate_replay_display_window(), + self._generate_replay_objMemory_funcs(), self._generate_replay_structors(), self._generate_replay_init(), self._generate_replay_errors(), |
