diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index 29ade0cb9..618725292 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -512,9 +512,13 @@ extern "C" RENDERDOC_API RemoteAccess *RENDERDOC_CC RENDERDOC_CreateRemoteAccess const char *host, uint32_t ident, const char *clientName, bool32 forceConnection); extern "C" RENDERDOC_API uint32_t RENDERDOC_CC RENDERDOC_EnumerateRemoteConnections(const char *host, uint32_t nextIdent); + +extern "C" RENDERDOC_API uint32_t RENDERDOC_CC RENDERDOC_DefaultReplayHostPort(); extern "C" RENDERDOC_API ReplayCreateStatus RENDERDOC_CC -RENDERDOC_CreateRemoteReplayConnection(const char *host, RemoteRenderer **rend); -extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_SpawnReplayHost(volatile bool32 *killReplay); +RENDERDOC_CreateRemoteReplayConnection(const char *host, uint32_t port, RemoteRenderer **rend); +extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_SpawnReplayHost(const char *listenhost, + uint32_t port, + volatile bool32 *killReplay); ////////////////////////////////////////////////////////////////////////// // Injection/execution capture functions. diff --git a/renderdoc/core/core.h b/renderdoc/core/core.h index 10bc01253..76237c850 100644 --- a/renderdoc/core/core.h +++ b/renderdoc/core/core.h @@ -191,7 +191,7 @@ public: bool IsReplayApp() const { return m_Replay; } const string &GetConfigSetting(string name) { return m_ConfigSettings[name]; } void SetConfigSetting(string name, string value) { m_ConfigSettings[name] = value; } - void BecomeReplayHost(volatile uint32_t &killReplay); + void BecomeReplayHost(const char *listenhost, uint16_t port, volatile uint32_t &killReplay); void SetCaptureOptions(const CaptureOptions &opts); const CaptureOptions &GetCaptureOptions() const { return m_Options; } diff --git a/renderdoc/core/remote_replay.cpp b/renderdoc/core/remote_replay.cpp index ec806fa21..0c6ed302f 100644 --- a/renderdoc/core/remote_replay.cpp +++ b/renderdoc/core/remote_replay.cpp @@ -70,9 +70,9 @@ static void ProgressTicker(void *d) } } -void RenderDoc::BecomeReplayHost(volatile bool32 &killReplay) +void RenderDoc::BecomeReplayHost(const char *listenhost, uint16_t port, volatile bool32 &killReplay) { - Network::Socket *sock = Network::CreateServerSocket("0.0.0.0", RenderDoc_ReplayNetworkPort, 1); + Network::Socket *sock = Network::CreateServerSocket(listenhost, port, 1); if(sock == NULL) return; @@ -429,7 +429,7 @@ RemoteRenderer_CreateProxyRenderer(RemoteRenderer *remote, uint32_t proxyid, con } extern "C" RENDERDOC_API ReplayCreateStatus RENDERDOC_CC -RENDERDOC_CreateRemoteReplayConnection(const char *host, RemoteRenderer **rend) +RENDERDOC_CreateRemoteReplayConnection(const char *host, uint32_t port, RemoteRenderer **rend) { if(rend == NULL) return eReplayCreate_InternalError; @@ -438,11 +438,14 @@ RENDERDOC_CreateRemoteReplayConnection(const char *host, RemoteRenderer **rend) if(host != NULL && host[0] != '\0') s = host; + if(port == 0) + port = RENDERDOC_DefaultReplayHostPort(); + Network::Socket *sock = NULL; if(s != "-") { - sock = Network::CreateClientSocket(s.c_str(), RenderDoc_ReplayNetworkPort, 3000); + sock = Network::CreateClientSocket(s.c_str(), (uint16_t)port, 3000); if(sock == NULL) return eReplayCreate_NetworkIOFailed; diff --git a/renderdoc/replay/entry_points.cpp b/renderdoc/replay/entry_points.cpp index 2f7006e1f..35f3d4b03 100644 --- a/renderdoc/replay/entry_points.cpp +++ b/renderdoc/replay/entry_points.cpp @@ -454,12 +454,25 @@ extern "C" RENDERDOC_API uint32_t RENDERDOC_CC RENDERDOC_EnumerateRemoteConnecti return ~0U; } -extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_SpawnReplayHost(volatile bool32 *killReplay) +extern "C" RENDERDOC_API uint32_t RENDERDOC_CC RENDERDOC_DefaultReplayHostPort() +{ + return RenderDoc_ReplayNetworkPort; +} + +extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_SpawnReplayHost(const char *listenhost, + uint32_t port, + volatile bool32 *killReplay) { bool32 dummy = false; if(killReplay == NULL) killReplay = &dummy; - RenderDoc::Inst().BecomeReplayHost(*killReplay); + if(listenhost == NULL || listenhost[0] == 0) + listenhost = "0.0.0.0"; + + if(port == 0) + port = RENDERDOC_DefaultReplayHostPort(); + + RenderDoc::Inst().BecomeReplayHost(listenhost, (uint16_t)port, *killReplay); } diff --git a/renderdocui/Code/RenderManager.cs b/renderdocui/Code/RenderManager.cs index 44922dbfa..1b81074f8 100644 --- a/renderdocui/Code/RenderManager.cs +++ b/renderdocui/Code/RenderManager.cs @@ -169,7 +169,7 @@ namespace renderdocui.Code return; } - remote = StaticExports.CreateRemoteReplayConnection(m_ReplayHost); + remote = StaticExports.CreateRemoteReplayConnection(m_ReplayHost, 0); if(remote == null) { diff --git a/renderdocui/Interop/StaticExports.cs b/renderdocui/Interop/StaticExports.cs index 268423302..32d018049 100644 --- a/renderdocui/Interop/StaticExports.cs +++ b/renderdocui/Interop/StaticExports.cs @@ -54,13 +54,13 @@ namespace renderdoc private static extern UInt32 RENDERDOC_EnumerateRemoteConnections(IntPtr host, UInt32 nextIdent); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] - private static extern ReplayCreateStatus RENDERDOC_CreateRemoteReplayConnection(IntPtr host, ref IntPtr outrend); + private static extern ReplayCreateStatus RENDERDOC_CreateRemoteReplayConnection(IntPtr host, UInt32 port, ref IntPtr outrend); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern void RENDERDOC_GetDefaultCaptureOptions(IntPtr outopts); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] - private static extern void RENDERDOC_SpawnReplayHost(ref bool killReplay); + private static extern void RENDERDOC_SpawnReplayHost(IntPtr host, UInt32 port, ref bool killReplay); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern void RENDERDOC_TriggerExceptionHandler(IntPtr exceptionPtrs, bool crashed); @@ -202,13 +202,13 @@ namespace renderdoc CustomMarshal.Free(host_mem); } - public static RemoteRenderer CreateRemoteReplayConnection(string host) + public static RemoteRenderer CreateRemoteReplayConnection(string host, uint port) { IntPtr rendPtr = IntPtr.Zero; IntPtr host_mem = CustomMarshal.MakeUTF8String(host); - ReplayCreateStatus ret = RENDERDOC_CreateRemoteReplayConnection(host_mem, ref rendPtr); + ReplayCreateStatus ret = RENDERDOC_CreateRemoteReplayConnection(host_mem, port, ref rendPtr); CustomMarshal.Free(host_mem); @@ -222,9 +222,13 @@ namespace renderdoc return new RemoteRenderer(rendPtr); } - public static void SpawnReplayHost(ref bool killReplay) + public static void SpawnReplayHost(string host, uint port, ref bool killReplay) { - RENDERDOC_SpawnReplayHost(ref killReplay); + IntPtr host_mem = CustomMarshal.MakeUTF8String(host); + + RENDERDOC_SpawnReplayHost(host_mem, port, ref killReplay); + + CustomMarshal.Free(host_mem); } public static void TriggerExceptionHandler(IntPtr exceptionPtrs, bool crashed) diff --git a/renderdocui/Windows/Dialogs/ReplayHostManager.cs b/renderdocui/Windows/Dialogs/ReplayHostManager.cs index 3e5d453cc..8d28509dd 100644 --- a/renderdocui/Windows/Dialogs/ReplayHostManager.cs +++ b/renderdocui/Windows/Dialogs/ReplayHostManager.cs @@ -62,7 +62,7 @@ namespace renderdocui.Windows.Dialogs string[] proxies = new string[0]; try { - var dummy = StaticExports.CreateRemoteReplayConnection("-"); + var dummy = StaticExports.CreateRemoteReplayConnection("-", 0); proxies = dummy.LocalProxies(); dummy.Shutdown(); } diff --git a/renderdocui/Windows/MainWindow.cs b/renderdocui/Windows/MainWindow.cs index 739493c67..6b0f62640 100644 --- a/renderdocui/Windows/MainWindow.cs +++ b/renderdocui/Windows/MainWindow.cs @@ -673,7 +673,7 @@ namespace renderdocui.Windows string[] drivers = new string[0]; try { - var dummy = StaticExports.CreateRemoteReplayConnection(m_RemoteReplay); + var dummy = StaticExports.CreateRemoteReplayConnection(m_RemoteReplay, 0); drivers = dummy.RemoteSupportedReplays(); dummy.Shutdown(); } @@ -708,7 +708,7 @@ namespace renderdocui.Windows string[] proxies = new string[0]; try { - var dummy = StaticExports.CreateRemoteReplayConnection("-"); + var dummy = StaticExports.CreateRemoteReplayConnection("-", 0); proxies = dummy.LocalProxies(); dummy.Shutdown(); } @@ -1498,7 +1498,7 @@ namespace renderdocui.Windows Thread thread = Helpers.NewThread(new ThreadStart(() => { - StaticExports.SpawnReplayHost(ref killReplay); + StaticExports.SpawnReplayHost("", 0, ref killReplay); })); thread.Start();