diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index 859a408dc..7d96c5c5c 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -432,3 +432,5 @@ extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_TriggerExceptionHandler(voi extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_LogText(const char *text); extern "C" RENDERDOC_API bool32 RENDERDOC_CC RENDERDOC_GetThumbnail(const char *filename, byte *buf, uint32_t &len); extern "C" RENDERDOC_API const char* RENDERDOC_CC RENDERDOC_GetVersionString(); +extern "C" RENDERDOC_API const char* RENDERDOC_CC RENDERDOC_GetConfigSetting(const char *name); +extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_SetConfigSetting(const char *name, const char *value); diff --git a/renderdoc/core/core.h b/renderdoc/core/core.h index 29ce54599..2ff3f5b97 100644 --- a/renderdoc/core/core.h +++ b/renderdoc/core/core.h @@ -187,6 +187,9 @@ class RenderDoc void SetReplayApp(bool replay) { m_Replay = replay; } bool IsReplayApp() const { return m_Replay; } + 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 SetCaptureOptions(const CaptureOptions &opts); @@ -326,6 +329,8 @@ class RenderDoc Threading::CriticalSection m_ChildLock; vector< pair > m_Children; + map m_ConfigSettings; + map m_DriverNames; map m_ReplayDriverProviders; map m_RemoteDriverProviders; diff --git a/renderdoc/replay/entry_points.cpp b/renderdoc/replay/entry_points.cpp index 151b90b2e..e2ba2b607 100644 --- a/renderdoc/replay/entry_points.cpp +++ b/renderdoc/replay/entry_points.cpp @@ -242,6 +242,18 @@ const char* RENDERDOC_CC RENDERDOC_GetVersionString() return RENDERDOC_VERSION_STRING; } +extern "C" RENDERDOC_API +const char* RENDERDOC_CC RENDERDOC_GetConfigSetting(const char *name) +{ + return RenderDoc::Inst().GetConfigSetting(name).c_str(); +} + +extern "C" RENDERDOC_API +void RENDERDOC_CC RENDERDOC_SetConfigSetting(const char *name, const char *value) +{ + RenderDoc::Inst().SetConfigSetting(name, value); +} + extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_LogText(const char *text) { diff --git a/renderdocui/Code/PersistantConfig.cs b/renderdocui/Code/PersistantConfig.cs index d3a69e819..0013c7fbc 100644 --- a/renderdocui/Code/PersistantConfig.cs +++ b/renderdocui/Code/PersistantConfig.cs @@ -62,6 +62,24 @@ namespace renderdocui.Code public List> PreviouslyUsedHosts = new List>(); + [XmlIgnore] // not directly serializable + public Dictionary ConfigSettings = new Dictionary(); + private List> ConfigSettingsValues = new List>(); + + public void SetConfigSetting(string name, string value) + { + ConfigSettings[name] = value; + StaticExports.SetConfigSetting(name, value); + } + + public string GetConfigSetting(string name) + { + if(ConfigSettings.ContainsKey(name)) + return ConfigSettings[name]; + + return ""; + } + public enum TimeUnit { Seconds = 0, @@ -158,6 +176,10 @@ namespace renderdocui.Code foreach (var kv in ReplayHosts) ReplayHostKeyValues.Add(new SerializableKeyValuePair(kv.Key, kv.Value)); + ConfigSettingsValues.Clear(); + foreach (var kv in ConfigSettings) + ConfigSettingsValues.Add(new SerializableKeyValuePair(kv.Key, kv.Value)); + XmlSerializer xs = new XmlSerializer(this.GetType()); StreamWriter writer = File.CreateText(file); xs.Serialize(writer, this); @@ -182,7 +204,18 @@ namespace renderdocui.Code { if (kv.Key != null && kv.Key.Length > 0 && kv.Value != null) - c.ReplayHosts.Add(kv.Key, kv.Value); + { + c.ReplayHosts.Add(kv.Key, kv.Value); + } + } + + foreach (var kv in c.ConfigSettingsValues) + { + if (kv.Key != null && kv.Key.Length > 0 && + kv.Value != null) + { + c.SetConfigSetting(kv.Key, kv.Value); + } } return c; diff --git a/renderdocui/Interop/StaticExports.cs b/renderdocui/Interop/StaticExports.cs index 2aeb66ee9..6843a8171 100644 --- a/renderdocui/Interop/StaticExports.cs +++ b/renderdocui/Interop/StaticExports.cs @@ -71,6 +71,12 @@ namespace renderdoc [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern IntPtr RENDERDOC_GetLogFile(); + [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] + private static extern IntPtr RENDERDOC_GetConfigSetting(IntPtr name); + + [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] + private static extern void RENDERDOC_SetConfigSetting(IntPtr name, IntPtr value); + [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern bool RENDERDOC_GetThumbnail(IntPtr filename, byte[] outmem, ref UInt32 len); @@ -234,6 +240,28 @@ namespace renderdoc return CustomMarshal.PtrToStringUTF8(RENDERDOC_GetLogFile()); } + public static string GetConfigSetting(string name) + { + IntPtr name_mem = CustomMarshal.MakeUTF8String(name); + + string ret = CustomMarshal.PtrToStringUTF8(RENDERDOC_GetConfigSetting(name_mem)); + + CustomMarshal.Free(name_mem); + + return ret; + } + + public static void SetConfigSetting(string name, string value) + { + IntPtr name_mem = CustomMarshal.MakeUTF8String(name); + IntPtr value_mem = CustomMarshal.MakeUTF8String(value); + + RENDERDOC_SetConfigSetting(name_mem, value_mem); + + CustomMarshal.Free(name_mem); + CustomMarshal.Free(value_mem); + } + public static byte[] GetThumbnail(string filename) { UInt32 len = 0;