aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Barbour <tony@LunarG.com>2015-02-02 13:21:18 -0700
committerTony Barbour <tony@LunarG.com>2015-02-05 12:00:56 -0700
commit1a534da8f2f4d2195a84a42e367eb303278b29a5 (patch)
tree315120f55f7226849ebe4744c6445d19f782863b
parentf971cd825abee5a6617bcd36760b18b7c804da22 (diff)
downloadusermoji-1a534da8f2f4d2195a84a42e367eb303278b29a5.tar.xz
glave:add code to snapshot frames
-rwxr-xr-xglave-generate.py47
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"')