diff --git a/renderdocui/Code/Core.cs b/renderdocui/Code/Core.cs index dce73574a..46a7f4e1d 100644 --- a/renderdocui/Code/Core.cs +++ b/renderdocui/Code/Core.cs @@ -451,15 +451,7 @@ namespace renderdocui.Code } } - // loading a local log, no remote replay public void LoadLogfile(string logFile, bool temporary) - { - LoadLogfile(-1, "", logFile, temporary); - } - - // when loading a log while replaying remotely, provide the proxy renderer that will be used - // as well as the hostname to replay on. - public void LoadLogfile(int proxyRenderer, string replayHost, string logFile, bool temporary) { m_LogFile = logFile; @@ -511,7 +503,7 @@ namespace renderdocui.Code thread.Start(); // this function call will block until the log is either loaded, or there's some failure - m_Renderer.Init(proxyRenderer, replayHost, logFile); + m_Renderer.Init(logFile); // if the renderer isn't running, we hit a failure case so display an error message if (!m_Renderer.Running) @@ -520,13 +512,8 @@ namespace renderdocui.Code if (m_Renderer.InitException.Data.Contains("status")) errmsg = ((ReplayCreateStatus)m_Renderer.InitException.Data["status"]).Str(); - if(proxyRenderer >= 0) - MessageBox.Show(String.Format("{0}\nFailed to transfer and replay on remote host {1}: {2}.\n\n" + - "Check diagnostic log in Help menu for more details.", logFile, replayHost, errmsg), - "Error opening log", MessageBoxButtons.OK, MessageBoxIcon.Error); - else - MessageBox.Show(String.Format("{0}\nFailed to open file for replay: {1}.\n\n" + - "Check diagnostic log in Help menu for more details.", logFile, errmsg), + MessageBox.Show(String.Format("{0}\nFailed to open file for replay: {1}.\n\n" + + "Check diagnostic log in Help menu for more details.", logFile, errmsg), "Error opening log", MessageBoxButtons.OK, MessageBoxIcon.Error); progressThread = false; diff --git a/renderdocui/Code/RenderManager.cs b/renderdocui/Code/RenderManager.cs index 68f5b3e42..f0ea1e457 100644 --- a/renderdocui/Code/RenderManager.cs +++ b/renderdocui/Code/RenderManager.cs @@ -61,10 +61,9 @@ namespace renderdocui.Code private AutoResetEvent m_WakeupEvent = new AutoResetEvent(false); private Thread m_Thread; - private int m_ProxyRenderer = -1; - private string m_ReplayHost; private string m_Logfile; private bool m_Running; + private RemoteServer m_Remote; private List m_renderQueue; @@ -78,13 +77,11 @@ namespace renderdocui.Code m_renderQueue = new List(); } - public void Init(int proxyRenderer, string replayHost, string logfile) + public void Init(string logfile) { if(Running) return; - m_ProxyRenderer = proxyRenderer; - m_ReplayHost = replayHost; m_Logfile = logfile; LoadProgress = 0.0f; @@ -104,6 +101,26 @@ namespace renderdocui.Code set { m_Running = value; m_WakeupEvent.Set(); } } + public void ConnectToRemoteServer(string hostname) + { + InitException = null; + + try + { + m_Remote = StaticExports.CreateRemoteServer(hostname, 0); + } + catch (ApplicationException ex) + { + InitException = ex; + } + } + + public void DisconnectFromRemoteServer() + { + if (m_Remote != null) + m_Remote.ShutdownConnection(); + } + public ApplicationException InitException = null; public void CloseThreadSync() @@ -161,16 +178,27 @@ namespace renderdocui.Code //////////////////////////////////////////// // Internals - private void CreateReplayRenderer(ref ReplayRenderer renderer) + private ReplayRenderer CreateReplayRenderer() { - renderer = StaticExports.CreateReplayRenderer(m_Logfile, ref LoadProgress); + if (m_Remote != null) + return m_Remote.OpenCapture(-1, m_Logfile, ref LoadProgress); + else + return StaticExports.CreateReplayRenderer(m_Logfile, ref LoadProgress); + } + + private void DestroyReplayRenderer(ReplayRenderer renderer) + { + if (m_Remote != null) + m_Remote.CloseCapture(renderer); + else + renderer.Shutdown(); } private void RunThread() { try { - ReplayRenderer renderer = StaticExports.CreateReplayRenderer(m_Logfile, ref LoadProgress); + ReplayRenderer renderer = CreateReplayRenderer(); if(renderer != null) { System.Diagnostics.Debug.WriteLine("Renderer created"); @@ -223,7 +251,7 @@ namespace renderdocui.Code m_renderQueue.Clear(); } - renderer.Shutdown(); + DestroyReplayRenderer(renderer); } } catch (ApplicationException ex) diff --git a/renderdocui/Windows/MainWindow.cs b/renderdocui/Windows/MainWindow.cs index 967aa7808..be92ef3f2 100644 --- a/renderdocui/Windows/MainWindow.cs +++ b/renderdocui/Windows/MainWindow.cs @@ -257,6 +257,8 @@ namespace renderdocui.Windows public void OnLogfileClosed() { + contextChooser.Enabled = true; + statusText.Text = ""; statusIcon.Image = null; statusProgress.Visible = false; @@ -342,6 +344,9 @@ namespace renderdocui.Windows public void OnLogfileLoaded() { + // don't allow changing context while log is open + contextChooser.Enabled = false; + LogHasErrors = (m_Core.DebugMessages.Count > 0); m_MessageTick = new System.Threading.Timer(MessageCheck, this as object, 500, System.Threading.Timeout.Infinite); @@ -584,6 +589,9 @@ namespace renderdocui.Windows prefix += " - "; } + if (m_RemoteHost != null) + prefix += String.Format("Remote: {0} - ", m_RemoteHost.Hostname); + Text = prefix + "RenderDoc "; if(OfficialVersion) Text += VersionString; @@ -910,9 +918,13 @@ namespace renderdocui.Windows contextChooser.Image = global::renderdocui.Properties.Resources.house; contextChooser.Text = "Replay Context: Local"; + m_Core.Renderer.DisconnectFromRemoteServer(); + m_RemoteHost = null; statusText.Text = ""; + + SetTitle(); } else { @@ -927,6 +939,8 @@ namespace renderdocui.Windows m_RemoteHost = host; + SetTitle(); + statusText.Text = "Checking remote server status..."; Thread th = Helpers.NewThread(new ThreadStart(() => @@ -964,6 +978,12 @@ namespace renderdocui.Windows } } + if (host.ServerRunning) + { + m_Core.Renderer.DisconnectFromRemoteServer(); + m_Core.Renderer.ConnectToRemoteServer(host.Hostname); + } + this.BeginInvoke(new Action(() => { contextChooser.Image = host.ServerRunning