diff options
| author | Tony Barbour <tony@LunarG.com> | 2015-02-02 13:21:18 -0700 |
|---|---|---|
| committer | Tony Barbour <tony@LunarG.com> | 2015-02-05 12:00:56 -0700 |
| commit | 1a534da8f2f4d2195a84a42e367eb303278b29a5 (patch) | |
| tree | 315120f55f7226849ebe4744c6445d19f782863b | |
| parent | f971cd825abee5a6617bcd36760b18b7c804da22 (diff) | |
| download | usermoji-1a534da8f2f4d2195a84a42e367eb303278b29a5.tar.xz | |
glave:add code to snapshot frames
| -rwxr-xr-x | glave-generate.py | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/glave-generate.py b/glave-generate.py index 263fd3d2..671fc7dd 100755 --- a/glave-generate.py +++ b/glave-generate.py @@ -1741,6 +1741,7 @@ class Subcommand(object): cd_body.append('#endif') cd_body.append(' unsigned int m_windowWidth;') cd_body.append(' unsigned int m_windowHeight;') + cd_body.append(' unsigned int m_frameNumber;') cd_body.append('#if 0') cd_body.append(' XGL_DEVICE m_dev[XGL_MAX_PHYSICAL_GPUS];') cd_body.append(' uint32_t m_gpuCount;') @@ -1854,6 +1855,7 @@ class Subcommand(object): rc_body.append(' char msg[256];') rc_body.append(' };') rc_body.append(' std::vector<struct validationMsg> m_validationMsgs;') + rc_body.append(' std::vector<int> m_snapshotFrames;') 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)') @@ -1952,6 +1954,22 @@ class Subcommand(object): rc_body.append(' if ((obj = remap(static_cast <%s> (object))) != XGL_NULL_HANDLE)' % t) rc_body.append(' return obj;') rc_body.append(' return XGL_NULL_HANDLE;\n }') + rc_body.append('void process_snapshot_list(const char *list)') + rc_body.append('{') + rc_body.append(' std::string spec(list), word;') + rc_body.append(' size_t start = 0, comma = 0;\n') + rc_body.append(' while (start < spec.size()) {') + rc_body.append(' comma = spec.find(\',\', start);\n') + rc_body.append(' if (comma == std::string::npos)') + rc_body.append(' word = std::string(spec, start);') + rc_body.append(' else') + rc_body.append(' word = std::string(spec, start, comma - start);\n') + rc_body.append(' if (comma == std::string::npos)') + rc_body.append(' break;\n') + rc_body.append(' start = comma + 1;\n') + rc_body.append(' m_snapshotFrames.push_back(atoi(word.c_str()));') + rc_body.append(' }') + rc_body.append('}') rc_body.append('};') return "\n".join(rc_body) @@ -2203,6 +2221,7 @@ class Subcommand(object): rs_body.append('xglReplay::xglReplay()') rs_body.append('{') rs_body.append(' m_display = new xglDisplay();') + rs_body.append(' process_snapshot_list(g_replaySettings.snapshotList);') rs_body.append('}\n') rs_body.append('xglReplay::~xglReplay()') rs_body.append('{') @@ -2925,6 +2944,8 @@ class Subcommand(object): cpi_body = [] cpi_body.append(' XGL_IMAGE img;') cpi_body.append(' XGL_GPU_MEMORY mem;') + cpi_body.append(' imageHeight = pPacket->pCreateInfo->extent.height;') + cpi_body.append(' imageWidth = pPacket->pCreateInfo->extent.width;') cpi_body.append(' replayResult = m_xglFuncs.real_xglWsiX11CreatePresentableImage(remap(pPacket->device), pPacket->pCreateInfo, &img, &mem);') cpi_body.append(' if (replayResult == XGL_SUCCESS)') cpi_body.append(' {') @@ -2932,17 +2953,35 @@ class Subcommand(object): cpi_body.append(' add_to_map(pPacket->pImage, &img);') cpi_body.append(' if(pPacket->pMem != NULL)') cpi_body.append(' add_to_map(pPacket->pMem, &mem);') + cpi_body.append(' imageHandles.push_back(img);') + cpi_body.append(' imageMemory.push_back(mem);') cpi_body.append(' }') return "\n".join(cpi_body) def _gen_replay_wsi_queue_present(self): wqp_body = [] wqp_body.append(' XGL_WSI_X11_PRESENT_INFO pInfo;') + wqp_body.append(' std::vector<int>::iterator it;') wqp_body.append(' memcpy(&pInfo, pPacket->pPresentInfo, sizeof(XGL_WSI_X11_PRESENT_INFO));') wqp_body.append(' pInfo.srcImage = remap(pPacket->pPresentInfo->srcImage);') wqp_body.append(' // use replayers Xcb window') wqp_body.append(' pInfo.destWindow = m_display->m_XcbWindow;') wqp_body.append(' replayResult = m_xglFuncs.real_xglWsiX11QueuePresent(remap(pPacket->queue), &pInfo, remap(pPacket->fence));') + wqp_body.append(' it = std::find(m_snapshotFrames.begin(), m_snapshotFrames.end(), m_display->m_frameNumber);') + wqp_body.append(' if (it != m_snapshotFrames.end())') + wqp_body.append(' {') + wqp_body.append(' for(unsigned int i=0; i<imageHandles.size(); i++)') + wqp_body.append(' {') + wqp_body.append(' if (imageHandles[i] == pInfo.srcImage)') + wqp_body.append(' {') + wqp_body.append(' char frameName[32];') + wqp_body.append(' sprintf(frameName, "%d",m_display->m_frameNumber);') + wqp_body.append(' glvWritePPM(frameName, imageWidth, imageHeight, imageHandles[i], imageMemory[i], &m_xglFuncs);') + wqp_body.append(' break;') + wqp_body.append(' }') + wqp_body.append(' }') + wqp_body.append(' }') + wqp_body.append(' m_display->m_frameNumber++;') return "\n".join(wqp_body) # I don't like making these 3 mem functions 'fully' custom, but just doing it for now to avoid being too cute @@ -3025,6 +3064,9 @@ class Subcommand(object): do_while_dict = {'GetFenceStatus': 'replayResult != pPacket->result && pPacket->result == XGL_SUCCESS', 'GetEventStatus': '(pPacket->result == XGL_EVENT_SET || pPacket->result == XGL_EVENT_RESET) && replayResult != pPacket->result'} rbody = [] rbody.append('#define CHECK_RETURN_VALUE(entrypoint) returnValue = handle_replay_errors(#entrypoint, replayResult, pPacket->result, returnValue);\n') + rbody.append('uint32_t imageWidth, imageHeight;') + rbody.append('std::vector<XGL_IMAGE> imageHandles;') + rbody.append('std::vector<XGL_GPU_MEMORY> imageMemory;') rbody.append('glv_replay::GLV_REPLAY_RESULT xglReplay::replay(glv_trace_packet_header *packet)') rbody.append('{') rbody.append(' glv_replay::GLV_REPLAY_RESULT returnValue = glv_replay::GLV_REPLAY_SUCCESS;') @@ -3372,6 +3414,7 @@ class GlaveReplayHeader(Subcommand): header_txt.append('#include <set>') header_txt.append('#include <map>') header_txt.append('#include <vector>') + header_txt.append('#include <string>') header_txt.append('#include <xcb/xcb.h>\n') header_txt.append('#include "glvreplay_window.h"') header_txt.append('#include "glvreplay_factory.h"') @@ -3393,6 +3436,10 @@ class GlaveReplayC(Subcommand): header_txt = [] header_txt.append('#include "glvreplay_xgl_replay.h"\n') header_txt.append('#include "glvreplay_xgl.h"\n') + 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('extern glvreplay_settings g_replaySettings;') header_txt.append('extern "C" {') header_txt.append('#include "glvtrace_xgl_xgl_structs.h"') header_txt.append('#include "glvtrace_xgl_xgldbg_structs.h"') |
