From cc04496dd1493d189efc3187f3a5d6990b3e4c24 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 3 Aug 2016 12:26:55 +0200 Subject: [PATCH] Remote server returns the remote path of any copied capture --- renderdoc/api/replay/renderdoc_replay.h | 5 ++- renderdoc/core/remote_server.cpp | 52 +++++++++++++++++-------- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index 6dd369d04..cddd03661 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -485,7 +485,7 @@ struct IRemoteServer const char *logfile, const CaptureOptions *opts) = 0; virtual void TakeOwnershipCapture(const char *filename) = 0; - virtual void CopyCapture(const char *filename, float *progress) = 0; + virtual rdctype::str CopyCapture(const char *filename, float *progress) = 0; virtual ReplayCreateStatus OpenCapture(uint32_t proxyid, const char *logfile, float *progress, ReplayRenderer **rend) = 0; @@ -521,7 +521,8 @@ extern "C" RENDERDOC_API void RENDERDOC_CC RemoteServer_TakeOwnershipCapture(Rem const char *filename); extern "C" RENDERDOC_API void RENDERDOC_CC RemoteServer_CopyCapture(RemoteServer *remote, const char *filename, - float *progress); + float *progress, + rdctype::str *remotepath); extern "C" RENDERDOC_API ReplayCreateStatus RENDERDOC_CC RemoteServer_OpenCapture(RemoteServer *remote, uint32_t proxyid, const char *logfile, diff --git a/renderdoc/core/remote_server.cpp b/renderdoc/core/remote_server.cpp index e3e54556e..c85352566 100644 --- a/renderdoc/core/remote_server.cpp +++ b/renderdoc/core/remote_server.cpp @@ -230,6 +230,7 @@ void RenderDoc::BecomeRemoteServer(const char *listenhost, uint16_t port, volati if(killReplay) break; + RemoteServerPacket sendType = eRemoteServer_Noop; sendSer.Rewind(); Threading::Sleep(4); @@ -251,6 +252,8 @@ void RenderDoc::BecomeRemoteServer(const char *listenhost, uint16_t port, volati { map drivers = RenderDoc::Inst().GetRemoteDrivers(); + sendType = eRemoteServer_RemoteDriverList; + uint32_t count = (uint32_t)drivers.size(); sendSer.Serialise("", count); @@ -260,8 +263,6 @@ void RenderDoc::BecomeRemoteServer(const char *listenhost, uint16_t port, volati sendSer.Serialise("", driver); sendSer.Serialise("", (*it).second); } - - type = eRemoteServer_RemoteDriverList; } else if(type == eRemoteServer_CopyCapture) { @@ -288,6 +289,9 @@ void RenderDoc::BecomeRemoteServer(const char *listenhost, uint16_t port, volati tempFiles.push_back(cap_file); SAFE_DELETE(fileRecv); + + sendType = eRemoteServer_CopyCapture; + sendSer.Serialise("path", cap_file); } else if(type == eRemoteServer_TakeOwnershipCapture) { @@ -341,7 +345,7 @@ void RenderDoc::BecomeRemoteServer(const char *listenhost, uint16_t port, volati Threading::JoinThread(ticker); Threading::CloseThread(ticker); - type = eRemoteServer_LogOpened; + sendType = eRemoteServer_LogOpened; proxy = new ProxySerialiser(client, driver); } @@ -349,10 +353,9 @@ void RenderDoc::BecomeRemoteServer(const char *listenhost, uint16_t port, volati { RDCERR("File needs driver for %s which isn't supported!", driverName.c_str()); + sendType = eRemoteServer_LogOpened; ReplayCreateStatus status = eReplayCreate_APIUnsupported; sendSer.Serialise("status", status); - - type = eRemoteServer_LogOpened; } } else if(type == eRemoteServer_CloseLog) @@ -362,8 +365,6 @@ void RenderDoc::BecomeRemoteServer(const char *listenhost, uint16_t port, volati driver = NULL; SAFE_DELETE(proxy); - - type = eRemoteServer_Noop; } else if(type == eRemoteServer_ExecuteAndInject) { @@ -378,9 +379,8 @@ void RenderDoc::BecomeRemoteServer(const char *listenhost, uint16_t port, volati uint32_t ident = Process::LaunchAndInjectIntoProcess( app.c_str(), workingDir.c_str(), cmdLine.c_str(), logfile.c_str(), &opts, false); + sendType = eRemoteServer_ExecuteAndInject; sendSer.Serialise("ident", ident); - - type = eRemoteServer_ExecuteAndInject; } else if((int)type >= eReplayProxy_First && proxy) { @@ -394,7 +394,7 @@ void RenderDoc::BecomeRemoteServer(const char *listenhost, uint16_t port, volati SAFE_DELETE(recvser); - if(type != eRemoteServer_Noop && !SendPacket(client, type, sendSer)) + if(type != eRemoteServer_Noop && !SendPacket(client, sendType, sendSer)) { RDCERR("Network error sending supported driver list"); break; @@ -523,7 +523,7 @@ public: return ident; } - void CopyCapture(const char *filename, float *progress) + rdctype::str CopyCapture(const char *filename, float *progress) { Serialiser sendData("", Serialiser::WRITING, false); Send(eRemoteServer_CopyCapture, sendData); @@ -537,8 +537,21 @@ public: if(!SendChunkedFile(m_Socket, eRemoteServer_CopyCapture, filename, sendData, progress)) { SAFE_DELETE(m_Socket); - return; + return ""; } + + RemoteServerPacket type = eRemoteServer_Noop; + Serialiser *ser = NULL; + Get(type, &ser); + + if(type == eRemoteServer_CopyCapture && ser) + { + string remotepath; + ser->Serialise("path", remotepath); + return remotepath; + } + + return ""; } void TakeOwnershipCapture(const char *filename) @@ -558,7 +571,7 @@ public: string logfile = filename; - if(proxyid >= m_Proxies.size()) + if(proxyid != ~0U && proxyid >= m_Proxies.size()) { RDCERR("Invalid proxy driver id %d specified for remote renderer", proxyid); return eReplayCreate_InternalError; @@ -568,7 +581,9 @@ public: if(progress == NULL) progress = &dummy; - RDCDriver proxydrivertype = m_Proxies[proxyid].first; + // if the proxy id is ~0U, then we just don't care so let RenderDoc pick the most + // appropriate supported proxy for the current platform. + RDCDriver proxydrivertype = proxyid == ~0U ? RDC_Unknown : m_Proxies[proxyid].first; Serialiser sendData("", Serialiser::WRITING, false); sendData.Serialise("logfile", logfile); @@ -692,14 +707,17 @@ RemoteServer_ExecuteAndInject(RemoteServer *remote, const char *app, const char extern "C" RENDERDOC_API void RENDERDOC_CC RemoteServer_TakeOwnershipCapture(RemoteServer *remote, const char *filename) { - return remote->TakeOwnershipCapture(filename); + remote->TakeOwnershipCapture(filename); } extern "C" RENDERDOC_API void RENDERDOC_CC RemoteServer_CopyCapture(RemoteServer *remote, const char *filename, - float *progress) + float *progress, + rdctype::str *remotepath) { - return remote->CopyCapture(filename, progress); + rdctype::str path = remote->CopyCapture(filename, progress); + if(remotepath) + *remotepath = path; } extern "C" RENDERDOC_API ReplayCreateStatus RENDERDOC_CC