From f8b3fd3e1ed812b0dcec8049100972ef5b56caff Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 3 Aug 2016 16:29:34 +0200 Subject: [PATCH] Update renderdoccmd for new remote server code, add daemonise for server --- renderdoccmd/renderdoccmd.cpp | 39 ++++++++++++++++++--------- renderdoccmd/renderdoccmd.h | 1 + renderdoccmd/renderdoccmd_android.cpp | 4 +++ renderdoccmd/renderdoccmd_apple.cpp | 4 +++ renderdoccmd/renderdoccmd_linux.cpp | 7 +++++ renderdoccmd/renderdoccmd_win32.cpp | 5 ++++ 6 files changed, 48 insertions(+), 12 deletions(-) diff --git a/renderdoccmd/renderdoccmd.cpp b/renderdoccmd/renderdoccmd.cpp index 6f06c94c4..055eb1e5c 100644 --- a/renderdoccmd/renderdoccmd.cpp +++ b/renderdoccmd/renderdoccmd.cpp @@ -390,6 +390,7 @@ struct RemoteServerCommand : public Command { virtual void AddOptions(cmdline::parser &parser) { + parser.add("daemon", 'd', "Go into the background."); parser.add( "host", 'h', "The interface to listen on. By default listens on all interfaces", false, ""); parser.add("port", 'p', "The port to listen on.", false, @@ -409,6 +410,12 @@ struct RemoteServerCommand : public Command std::cerr << "Spawning a replay host listening on " << (host.empty() ? "*" : host) << ":" << port << "..." << std::endl; + if(parser.exist("daemon")) + { + std::cerr << "Detaching." << std::endl; + Daemonise(); + } + usingKillSignal = true; RENDERDOC_BecomeRemoteServer(host.empty() ? NULL : host.c_str(), port, &killSignal); @@ -449,44 +456,52 @@ struct ReplayCommand : public Command string filename = parser.rest()[0]; - float progress = 0.0f; - RemoteRenderer *remote = NULL; - ReplayRenderer *renderer = NULL; - if(parser.exist("remote-host")) { std::cout << "Replaying '" << filename << "' on " << parser.get("remote-host") << ":" << parser.get("remote-port") << "." << std::endl; - ReplayCreateStatus status = RENDERDOC_CreateRemoteReplayConnection( + RemoteServer *remote = NULL; + ReplayCreateStatus status = RENDERDOC_CreateRemoteServerConnection( parser.get("remote-host").c_str(), parser.get("remote-port"), &remote); if(remote == NULL || status != eReplayCreate_Success) { std::cerr << "Error: Couldn't connect to " << parser.get("remote-host") << ":" << parser.get("remote-port") << "." << std::endl; - std::cerr << " Have you run renderdoccmd replayhost ?" << std::endl; + std::cerr << " Have you run renderdoccmd remoteserver on '" + << parser.get("remote-host") << "'?" << std::endl; return 1; } + std::cerr << "Copying capture file to remote server" << std::endl; + float progress = 0.0f; + rdctype::str remotePath = remote->CopyCapture(filename.c_str(), &progress); ReplayRenderer *renderer = NULL; - status = RemoteRenderer_CreateProxyRenderer(remote, 0, filename.c_str(), &progress, &renderer); + status = remote->OpenCapture(~0U, remotePath.elems, &progress, &renderer); if(status == eReplayCreate_Success) + { DisplayRendererPreview(renderer, parser.get("width"), parser.get("height")); - else - std::cerr << "Couldn't load and replay '" << filename << "'." << std::endl; - ReplayRenderer_Shutdown(renderer); - remote->Shutdown(); + remote->CloseCapture(renderer); + } + else + { + std::cerr << "Couldn't load and replay '" << filename << "'." << std::endl; + } + + remote->ShutdownConnection(); } else { std::cout << "Replaying '" << filename << "' locally.." << std::endl; + float progress = 0.0f; + ReplayRenderer *renderer = NULL; ReplayCreateStatus status = RENDERDOC_CreateReplayRenderer(filename.c_str(), &progress, &renderer); @@ -496,7 +511,7 @@ struct ReplayCommand : public Command else std::cerr << "Couldn't load and replay '" << filename << "'." << std::endl; - ReplayRenderer_Shutdown(renderer); + renderer->Shutdown(); } return 0; } diff --git a/renderdoccmd/renderdoccmd.h b/renderdoccmd/renderdoccmd.h index 2214cf502..e5d657397 100644 --- a/renderdoccmd/renderdoccmd.h +++ b/renderdoccmd/renderdoccmd.h @@ -61,3 +61,4 @@ void readCapOpts(const std::string &str, CaptureOptions *opts); // these must be defined in platform .cpps void DisplayRendererPreview(ReplayRenderer *renderer, TextureDisplay &displayCfg, uint32_t width, uint32_t height); +void Daemonise(); diff --git a/renderdoccmd/renderdoccmd_android.cpp b/renderdoccmd/renderdoccmd_android.cpp index fe9ec8699..1a75e97df 100644 --- a/renderdoccmd/renderdoccmd_android.cpp +++ b/renderdoccmd/renderdoccmd_android.cpp @@ -42,6 +42,10 @@ using std::string; struct android_app *android_state; +void Daemonise() +{ +} + void DisplayRendererPreview(ReplayRenderer *renderer, TextureDisplay &displayCfg, uint32_t width, uint32_t height) { diff --git a/renderdoccmd/renderdoccmd_apple.cpp b/renderdoccmd/renderdoccmd_apple.cpp index 1b45ca55b..550cc5430 100644 --- a/renderdoccmd/renderdoccmd_apple.cpp +++ b/renderdoccmd/renderdoccmd_apple.cpp @@ -31,6 +31,10 @@ using std::string; +void Daemonise() +{ +} + void DisplayRendererPreview(ReplayRenderer *renderer, TextureDisplay &displayCfg, uint32_t width, uint32_t height) { diff --git a/renderdoccmd/renderdoccmd_linux.cpp b/renderdoccmd/renderdoccmd_linux.cpp index 27fb5880c..8c0ddf4e6 100644 --- a/renderdoccmd/renderdoccmd_linux.cpp +++ b/renderdoccmd/renderdoccmd_linux.cpp @@ -38,6 +38,12 @@ using std::string; +void Daemonise() +{ + // don't change dir, but close stdin/stdou + daemon(1, 0); +} + void DisplayRendererPreview(ReplayRenderer *renderer, TextureDisplay &displayCfg, uint32_t width, uint32_t height) { @@ -214,6 +220,7 @@ int main(int argc, char *argv[]) glXWaitGL(); signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); // do any linux-specific setup here diff --git a/renderdoccmd/renderdoccmd_win32.cpp b/renderdoccmd/renderdoccmd_win32.cpp index 8336b737e..05e13e09e 100644 --- a/renderdoccmd/renderdoccmd_win32.cpp +++ b/renderdoccmd/renderdoccmd_win32.cpp @@ -228,6 +228,11 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) return DefWindowProc(hwnd, msg, wParam, lParam); } +void Daemonise() +{ + // nothing really to do, windows version of renderdoccmd is already 'detached' +} + void DisplayRendererPreview(ReplayRenderer *renderer, TextureDisplay &displayCfg, uint32_t width, uint32_t height) {