diff --git a/renderdoccmd/renderdoccmd.cpp b/renderdoccmd/renderdoccmd.cpp index 252140b4a..efb607d31 100644 --- a/renderdoccmd/renderdoccmd.cpp +++ b/renderdoccmd/renderdoccmd.cpp @@ -56,7 +56,8 @@ rdcarray convertArgs(const std::vector &args) return ret; } -void DisplayRendererPreview(IReplayController *renderer, uint32_t width, uint32_t height) +void DisplayRendererPreview(IReplayController *renderer, uint32_t width, uint32_t height, + uint32_t numLoops) { if(renderer == NULL) return; @@ -100,7 +101,7 @@ void DisplayRendererPreview(IReplayController *renderer, uint32_t width, uint32_ d.resourceId = id; } - DisplayRendererPreview(renderer, d, width, height); + DisplayRendererPreview(renderer, d, width, height, numLoops); } std::map commands; @@ -517,6 +518,8 @@ struct ReplayCommand : public Command parser.set_footer(""); parser.add("width", 'w', "The preview window width.", false, 1280); parser.add("height", 'h', "The preview window height.", false, 720); + parser.add("loops", 'l', "How many times to loop the replay, or 0 for indefinite.", + false, 0); parser.add("remote-host", 0, "Instead of replaying locally, replay on this host over the network.", false); parser.add("remote-port", 0, "If --remote-host is set, use this port.", false, @@ -574,7 +577,7 @@ struct ReplayCommand : public Command if(status == ReplayStatus::Succeeded) { DisplayRendererPreview(renderer, parser.get("width"), - parser.get("height")); + parser.get("height"), parser.get("loops")); remote->CloseCapture(renderer); } @@ -606,7 +609,7 @@ struct ReplayCommand : public Command if(status == ReplayStatus::Succeeded) { DisplayRendererPreview(renderer, parser.get("width"), - parser.get("height")); + parser.get("height"), parser.get("loops")); renderer->Shutdown(); } diff --git a/renderdoccmd/renderdoccmd.h b/renderdoccmd/renderdoccmd.h index d07633b0a..5b29bc0a9 100644 --- a/renderdoccmd/renderdoccmd.h +++ b/renderdoccmd/renderdoccmd.h @@ -56,6 +56,6 @@ void readCapOpts(const std::string &str, CaptureOptions *opts); // these must be defined in platform .cpps void DisplayRendererPreview(IReplayController *renderer, TextureDisplay &displayCfg, uint32_t width, - uint32_t height); + uint32_t height, uint32_t numLoops); WindowingData DisplayRemoteServerPreview(bool active, const rdcarray &systems); void Daemonise(); diff --git a/renderdoccmd/renderdoccmd_android.cpp b/renderdoccmd/renderdoccmd_android.cpp index 5f8073c83..e4634ce47 100644 --- a/renderdoccmd/renderdoccmd_android.cpp +++ b/renderdoccmd/renderdoccmd_android.cpp @@ -343,7 +343,7 @@ WindowingData DisplayRemoteServerPreview(bool active, const rdcarraywindow; @@ -354,11 +354,14 @@ void DisplayRendererPreview(IReplayController *renderer, TextureDisplay &display out->SetTextureDisplay(displayCfg); - for(int i = 0; i < 100; i++) + if(numLoops == 0) + numLoops = 100; + + for(uint32_t i = 0; i < numLoops; i++) { renderer->SetFrameEvent(10000000, true); - ANDROID_LOG("Frame %i", i); + ANDROID_LOG("Frame %u", i); out->Display(); usleep(100000); diff --git a/renderdoccmd/renderdoccmd_apple.cpp b/renderdoccmd/renderdoccmd_apple.cpp index e97cb47cf..507c0fba0 100644 --- a/renderdoccmd/renderdoccmd_apple.cpp +++ b/renderdoccmd/renderdoccmd_apple.cpp @@ -41,7 +41,7 @@ WindowingData DisplayRemoteServerPreview(bool active, const rdcarrayresponse_type & 0x7f) { - case XCB_EXPOSE: - renderer->SetFrameEvent(10000000, true); - out->Display(); - break; + case XCB_EXPOSE: break; case XCB_CLIENT_MESSAGE: if((*(xcb_client_message_event_t *)event).data.data32[0] == (*atom_wm_delete_window).atom) { @@ -456,6 +455,11 @@ void DisplayRendererPreview(IReplayController *renderer, TextureDisplay &display out->Display(); usleep(100000); + + loopCount++; + + if(numLoops > 0 && loopCount == numLoops) + break; } #else std::cerr << "No supporting windowing systems defined at build time (xlib and xcb)" << std::endl; diff --git a/renderdoccmd/renderdoccmd_win32.cpp b/renderdoccmd/renderdoccmd_win32.cpp index c07fbc456..af21efdab 100644 --- a/renderdoccmd/renderdoccmd_win32.cpp +++ b/renderdoccmd/renderdoccmd_win32.cpp @@ -184,7 +184,7 @@ WindowingData DisplayRemoteServerPreview(bool active, const rdcarraySetTextureDisplay(displayCfg); + uint32_t loopCount = 0; + MSG msg; ZeroMemory(&msg, sizeof(msg)); while(true) @@ -225,6 +227,11 @@ void DisplayRendererPreview(IReplayController *renderer, TextureDisplay &display out->Display(); Sleep(40); + + loopCount++; + + if(numLoops > 0 && loopCount == numLoops) + break; } DestroyWindow(wnd);