diff --git a/qrenderdoc/Code/CaptureContext.h b/qrenderdoc/Code/CaptureContext.h index 4f95c58c5..8e2eb3522 100644 --- a/qrenderdoc/Code/CaptureContext.h +++ b/qrenderdoc/Code/CaptureContext.h @@ -31,7 +31,7 @@ #include #include #include "Interface/QRDInterface.h" -#include "RenderManager.h" +#include "ReplayManager.h" #if defined(RENDERDOC_PLATFORM_LINUX) #include @@ -87,7 +87,7 @@ public: ////////////////////////////////////////////////////////////////////////////// // Accessors - RenderManager &Renderer() override { return m_Renderer; } + ReplayManager &Replay() override { return m_Renderer; } bool LogLoaded() override { return m_LogLoaded; } bool IsLogLocal() override { return m_LogLocal; } bool LogLoading() override { return m_LoadInProgress; } @@ -181,7 +181,7 @@ public: CommonPipelineState &CurPipelineState() override { return m_CurPipelineState; } PersistantConfig &Config() override { return m_Config; } private: - RenderManager m_Renderer; + ReplayManager m_Renderer; D3D11Pipe::State m_CurD3D11PipelineState; D3D12Pipe::State m_CurD3D12PipelineState; diff --git a/qrenderdoc/Code/Interface/QRDInterface.h b/qrenderdoc/Code/Interface/QRDInterface.h index 6c5d9cf38..59bc99471 100644 --- a/qrenderdoc/Code/Interface/QRDInterface.h +++ b/qrenderdoc/Code/Interface/QRDInterface.h @@ -256,7 +256,7 @@ protected: DECLARE_REFLECTION_STRUCT(ILogViewerForm); -struct IRenderManager +struct IReplayManager { typedef std::function InvokeMethod; typedef std::function &)> DirectoryBrowseMethod; @@ -291,11 +291,11 @@ struct IRenderManager QWidget *window) = 0; protected: - IRenderManager() = default; - ~IRenderManager() = default; + IReplayManager() = default; + ~IReplayManager() = default; }; -DECLARE_REFLECTION_STRUCT(IRenderManager); +DECLARE_REFLECTION_STRUCT(IReplayManager); // should match ToolWindowManager::AreaReferenceType enum class DockReference : int @@ -335,7 +335,7 @@ struct ICaptureContext ////////////////////////////////////////////////////////////////////////////// // Accessors - virtual IRenderManager &Renderer() = 0; + virtual IReplayManager &Replay() = 0; virtual bool LogLoaded() = 0; virtual bool IsLogLocal() = 0; virtual bool LogLoading() = 0; diff --git a/qrenderdoc/Code/RenderManager.cpp b/qrenderdoc/Code/ReplayManager.cpp similarity index 88% rename from qrenderdoc/Code/RenderManager.cpp rename to qrenderdoc/Code/ReplayManager.cpp index 0664eb3a8..f5b2e7a3e 100644 --- a/qrenderdoc/Code/RenderManager.cpp +++ b/qrenderdoc/Code/ReplayManager.cpp @@ -22,24 +22,24 @@ * THE SOFTWARE. ******************************************************************************/ -#include "RenderManager.h" +#include "ReplayManager.h" #include #include #include #include "CaptureContext.h" #include "QRDUtils.h" -RenderManager::RenderManager() +ReplayManager::ReplayManager() { m_Running = false; m_Thread = NULL; } -RenderManager::~RenderManager() +ReplayManager::~ReplayManager() { } -void RenderManager::OpenCapture(const QString &logfile, float *progress) +void ReplayManager::OpenCapture(const QString &logfile, float *progress) { if(m_Running) return; @@ -59,7 +59,7 @@ void RenderManager::OpenCapture(const QString &logfile, float *progress) } } -void RenderManager::DeleteCapture(const QString &logfile, bool local) +void ReplayManager::DeleteCapture(const QString &logfile, bool local) { if(IsRunning()) { @@ -83,7 +83,7 @@ void RenderManager::DeleteCapture(const QString &logfile, bool local) } } -QStringList RenderManager::GetRemoteSupport() +QStringList ReplayManager::GetRemoteSupport() { QStringList ret; @@ -99,7 +99,7 @@ QStringList RenderManager::GetRemoteSupport() return ret; } -void RenderManager::GetHomeFolder(bool synchronous, DirectoryBrowseMethod cb) +void ReplayManager::GetHomeFolder(bool synchronous, DirectoryBrowseMethod cb) { if(!m_Remote) return; @@ -127,7 +127,7 @@ void RenderManager::GetHomeFolder(bool synchronous, DirectoryBrowseMethod cb) cb(home.c_str(), rdctype::array()); } -bool RenderManager::ListFolder(QString path, bool synchronous, DirectoryBrowseMethod cb) +bool ReplayManager::ListFolder(QString path, bool synchronous, DirectoryBrowseMethod cb) { if(!m_Remote) return false; @@ -160,7 +160,7 @@ bool RenderManager::ListFolder(QString path, bool synchronous, DirectoryBrowseMe return true; } -QString RenderManager::CopyCaptureToRemote(const QString &localpath, QWidget *window) +QString ReplayManager::CopyCaptureToRemote(const QString &localpath, QWidget *window) { if(!m_Remote) return ""; @@ -188,13 +188,13 @@ QString RenderManager::CopyCaptureToRemote(const QString &localpath, QWidget *wi thread->start(); } - ShowProgressDialog(window, QApplication::translate("RenderManager", "Transferring..."), + ShowProgressDialog(window, QApplication::translate("ReplayManager", "Transferring..."), [&copied]() { return copied; }, [&progress]() { return progress; }); return remotepath; } -void RenderManager::CopyCaptureFromRemote(const QString &remotepath, const QString &localpath, +void ReplayManager::CopyCaptureFromRemote(const QString &remotepath, const QString &localpath, QWidget *window) { if(!m_Remote) @@ -221,16 +221,16 @@ void RenderManager::CopyCaptureFromRemote(const QString &remotepath, const QStri thread->start(); } - ShowProgressDialog(window, QApplication::translate("RenderManager", "Transferring..."), + ShowProgressDialog(window, QApplication::translate("ReplayManager", "Transferring..."), [&copied]() { return copied; }, [&progress]() { return progress; }); } -bool RenderManager::IsRunning() +bool ReplayManager::IsRunning() { return m_Thread && m_Thread->isRunning() && m_Running; } -void RenderManager::AsyncInvoke(const QString &tag, RenderManager::InvokeMethod m) +void ReplayManager::AsyncInvoke(const QString &tag, ReplayManager::InvokeMethod m) { { QMutexLocker autolock(&m_RenderLock); @@ -255,7 +255,7 @@ void RenderManager::AsyncInvoke(const QString &tag, RenderManager::InvokeMethod PushInvoke(cmd); } -void RenderManager::AsyncInvoke(RenderManager::InvokeMethod m) +void ReplayManager::AsyncInvoke(ReplayManager::InvokeMethod m) { InvokeHandle *cmd = new InvokeHandle(m); cmd->selfdelete = true; @@ -263,7 +263,7 @@ void RenderManager::AsyncInvoke(RenderManager::InvokeMethod m) PushInvoke(cmd); } -void RenderManager::BlockInvoke(RenderManager::InvokeMethod m) +void ReplayManager::BlockInvoke(ReplayManager::InvokeMethod m) { InvokeHandle *cmd = new InvokeHandle(m); @@ -274,7 +274,7 @@ void RenderManager::BlockInvoke(RenderManager::InvokeMethod m) delete cmd; } -void RenderManager::CloseThread() +void ReplayManager::CloseThread() { m_Running = false; @@ -292,7 +292,7 @@ void RenderManager::CloseThread() m_Thread = NULL; } -ReplayStatus RenderManager::ConnectToRemoteServer(RemoteHost *host) +ReplayStatus ReplayManager::ConnectToRemoteServer(RemoteHost *host) { ReplayStatus status = RENDERDOC_CreateRemoteServerConnection(host->Hostname.toUtf8().data(), 0, &m_Remote); @@ -308,7 +308,7 @@ ReplayStatus RenderManager::ConnectToRemoteServer(RemoteHost *host) return status; } -void RenderManager::DisconnectFromRemoteServer() +void ReplayManager::DisconnectFromRemoteServer() { if(m_RemoteHost) m_RemoteHost->Connected = false; @@ -323,7 +323,7 @@ void RenderManager::DisconnectFromRemoteServer() m_Remote = NULL; } -void RenderManager::ShutdownServer() +void ReplayManager::ShutdownServer() { if(m_Remote) { @@ -334,7 +334,7 @@ void RenderManager::ShutdownServer() m_Remote = NULL; } -void RenderManager::PingRemote() +void ReplayManager::PingRemote() { if(!m_Remote) return; @@ -350,7 +350,7 @@ void RenderManager::PingRemote() } } -uint32_t RenderManager::ExecuteAndInject(const QString &exe, const QString &workingDir, +uint32_t ReplayManager::ExecuteAndInject(const QString &exe, const QString &workingDir, const QString &cmdLine, const QList &env, const QString &logfile, CaptureOptions opts) @@ -375,7 +375,7 @@ uint32_t RenderManager::ExecuteAndInject(const QString &exe, const QString &work return ret; } -void RenderManager::PushInvoke(RenderManager::InvokeHandle *cmd) +void ReplayManager::PushInvoke(ReplayManager::InvokeHandle *cmd) { if(m_Thread == NULL || !m_Thread->isRunning() || !m_Running) { @@ -391,7 +391,7 @@ void RenderManager::PushInvoke(RenderManager::InvokeHandle *cmd) m_RenderCondition.wakeAll(); } -void RenderManager::run() +void ReplayManager::run() { IReplayController *renderer = NULL; diff --git a/qrenderdoc/Code/RenderManager.h b/qrenderdoc/Code/ReplayManager.h similarity index 96% rename from qrenderdoc/Code/RenderManager.h rename to qrenderdoc/Code/ReplayManager.h index 62992ebf9..0324a00fa 100644 --- a/qrenderdoc/Code/RenderManager.h +++ b/qrenderdoc/Code/ReplayManager.h @@ -42,13 +42,13 @@ class RemoteHost; // simple helper for the common case of 'we just need to run this on the render thread #define INVOKE_MEMFN(function) \ - m_Ctx.Renderer().AsyncInvoke([this](IReplayController *r) { function(r); }); + m_Ctx.Replay().AsyncInvoke([this](IReplayController *r) { function(r); }); -class RenderManager : public IRenderManager +class ReplayManager : public IReplayManager { public: - RenderManager(); - ~RenderManager(); + ReplayManager(); + ~ReplayManager(); void OpenCapture(const QString &logfile, float *progress); void DeleteCapture(const QString &logfile, bool local); diff --git a/qrenderdoc/Code/pyrenderdoc/qrenderdoc.i b/qrenderdoc/Code/pyrenderdoc/qrenderdoc.i index ad709f515..3b83dbedc 100644 --- a/qrenderdoc/Code/pyrenderdoc/qrenderdoc.i +++ b/qrenderdoc/Code/pyrenderdoc/qrenderdoc.i @@ -26,7 +26,7 @@ CONTAINER_TYPEMAPS(QMap) } // need to ignore the original function and add a helper that releases the python GIL while calling -%ignore IRenderManager::BlockInvoke; +%ignore IReplayManager::BlockInvoke; // ignore these functions as we don't map QVariantMap to/from python %ignore EnvironmentModification::toJSON; @@ -59,9 +59,9 @@ CONTAINER_TYPEMAPS(QMap) %include "Code/Interface/RemoteHost.h" // unignore the function from above -%rename("%s") IRenderManager::BlockInvoke; +%rename("%s") IReplayManager::BlockInvoke; -%extend IRenderManager { +%extend IReplayManager { void BlockInvoke(InvokeMethod m) { Py_BEGIN_ALLOW_THREADS $self->BlockInvoke(m); diff --git a/qrenderdoc/Widgets/CustomPaintWidget.cpp b/qrenderdoc/Widgets/CustomPaintWidget.cpp index a09885f22..7d516f188 100644 --- a/qrenderdoc/Widgets/CustomPaintWidget.cpp +++ b/qrenderdoc/Widgets/CustomPaintWidget.cpp @@ -90,7 +90,7 @@ void CustomPaintWidget::paintEvent(QPaintEvent *e) if(m_Ctx) { if(m_Output != NULL) - m_Ctx->Renderer().AsyncInvoke([this](IReplayController *r) { m_Output->Display(); }); + m_Ctx->Replay().AsyncInvoke([this](IReplayController *r) { m_Output->Display(); }); } else if(m_Dark == m_Light) { diff --git a/qrenderdoc/Windows/APIInspector.cpp b/qrenderdoc/Windows/APIInspector.cpp index 4b07c6c25..16c707893 100644 --- a/qrenderdoc/Windows/APIInspector.cpp +++ b/qrenderdoc/Windows/APIInspector.cpp @@ -97,7 +97,7 @@ void APIInspector::on_apiEvents_itemSelectionChanged() if(ev.callstack.count > 0) { - m_Ctx.Renderer().AsyncInvoke([this, ev](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this, ev](IReplayController *r) { rdctype::array trace = r->GetResolve(ev.callstack); GUIInvoke::call([this, trace]() { addCallstack(trace); }); diff --git a/qrenderdoc/Windows/BufferViewer.cpp b/qrenderdoc/Windows/BufferViewer.cpp index 80fddfcc3..59933522c 100644 --- a/qrenderdoc/Windows/BufferViewer.cpp +++ b/qrenderdoc/Windows/BufferViewer.cpp @@ -1149,7 +1149,7 @@ void BufferViewer::OnLogfileLoaded() WId renderID = ui->render->winId(); - m_Ctx.Renderer().BlockInvoke([renderID, this](IReplayController *r) { + m_Ctx.Replay().BlockInvoke([renderID, this](IReplayController *r) { m_Output = r->CreateOutput(m_Ctx.CurWindowingSystem(), m_Ctx.FillWindowingData(renderID), ReplayOutputType::Mesh); @@ -1223,7 +1223,7 @@ void BufferViewer::OnEventChanged(uint32_t eventID) guessSecondaryColumn(m_ModelGSOut); } - m_Ctx.Renderer().AsyncInvoke([this, vsinHoriz, vsoutHoriz, gsoutHoriz](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this, vsinHoriz, vsoutHoriz, gsoutHoriz](IReplayController *r) { if(m_MeshView) { @@ -2189,7 +2189,7 @@ void BufferViewer::render_clicked(QMouseEvent *e) if((e->buttons() & Qt::RightButton) && m_Output) { - m_Ctx.Renderer().AsyncInvoke("PickVertex", [this, curpos](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke("PickVertex", [this, curpos](IReplayController *r) { uint32_t instanceSelected = 0; uint32_t vertSelected = 0; @@ -2734,7 +2734,7 @@ void BufferViewer::debugVertex() uint32_t index = m_CurView->model()->data(m_CurView->model()->index(idx.row(), 1), Qt::DisplayRole).toUInt(); - m_Ctx.Renderer().AsyncInvoke([this, vertid, index](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this, vertid, index](IReplayController *r) { ShaderDebugTrace *trace = r->DebugVertex(vertid, m_Config.curInstance, index, m_Ctx.CurDrawcall()->instanceOffset, m_Ctx.CurDrawcall()->vertexOffset); diff --git a/qrenderdoc/Windows/ConstantBufferPreviewer.cpp b/qrenderdoc/Windows/ConstantBufferPreviewer.cpp index c01f66bcd..dd1ad608b 100644 --- a/qrenderdoc/Windows/ConstantBufferPreviewer.cpp +++ b/qrenderdoc/Windows/ConstantBufferPreviewer.cpp @@ -110,7 +110,7 @@ void ConstantBufferPreviewer::OnEventChanged(uint32_t eventID) if(!m_formatOverride.empty()) { - m_Ctx.Renderer().AsyncInvoke([this, offs, size](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this, offs, size](IReplayController *r) { rdctype::array data = r->GetBufferData(m_cbuffer, offs, size); rdctype::array vars = applyFormatOverride(data); GUIInvoke::call([this, vars] { setVariables(vars); }); @@ -118,7 +118,7 @@ void ConstantBufferPreviewer::OnEventChanged(uint32_t eventID) } else { - m_Ctx.Renderer().AsyncInvoke([this, entryPoint, offs](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this, entryPoint, offs](IReplayController *r) { rdctype::array vars = r->GetCBufferVariableContents( m_shader, entryPoint.toUtf8().data(), m_slot, m_cbuffer, offs); GUIInvoke::call([this, vars] { setVariables(vars); }); diff --git a/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp b/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp index 8e090d87a..612ca34b5 100644 --- a/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp +++ b/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp @@ -207,7 +207,7 @@ void CaptureDialog::on_exePath_textChanged(const QString &text) { QString path = dir.absolutePath(); - if(!m_Ctx.Renderer().CurrentRemote()) + if(!m_Ctx.Replay().CurrentRemote()) path = QDir::toNativeSeparators(path); // match the path separators from the path @@ -395,7 +395,7 @@ void CaptureDialog::on_exePathBrowse_clicked() QString filename; - if(m_Ctx.Renderer().CurrentRemote()) + if(m_Ctx.Replay().CurrentRemote()) { VirtualFileDialog vfd(m_Ctx, this); RDDialog::show(&vfd); @@ -429,7 +429,7 @@ void CaptureDialog::on_workDirBrowse_clicked() QString dir; - if(m_Ctx.Renderer().CurrentRemote()) + if(m_Ctx.Replay().CurrentRemote()) { VirtualFileDialog vfd(m_Ctx, this); vfd.setDirBrowse(); @@ -602,12 +602,12 @@ void CaptureDialog::SetExecutableFilename(const QString &filename) { QString fn = filename; - if(!m_Ctx.Renderer().CurrentRemote()) + if(!m_Ctx.Replay().CurrentRemote()) fn = QDir::toNativeSeparators(QFileInfo(fn).absoluteFilePath()); ui->exePath->setText(fn); - if(!m_Ctx.Renderer().CurrentRemote()) + if(!m_Ctx.Replay().CurrentRemote()) { m_Ctx.Config().LastCapturePath = QFileInfo(fn).absolutePath(); m_Ctx.Config().LastCaptureExe = QFileInfo(fn).completeBaseName(); @@ -716,7 +716,7 @@ void CaptureDialog::TriggerCapture() QString exe = ui->exePath->text(); // for non-remote captures, check the executable locally - if(!m_Ctx.Renderer().CurrentRemote()) + if(!m_Ctx.Replay().CurrentRemote()) { if(!QFileInfo::exists(exe)) { @@ -729,7 +729,7 @@ void CaptureDialog::TriggerCapture() QString workingDir = ""; // for non-remote captures, check the directory locally - if(m_Ctx.Renderer().CurrentRemote()) + if(m_Ctx.Replay().CurrentRemote()) { workingDir = ui->workDirPath->text(); } diff --git a/qrenderdoc/Windows/Dialogs/EnvironmentEditor.h b/qrenderdoc/Windows/Dialogs/EnvironmentEditor.h index 8c2d6b695..9830de96c 100644 --- a/qrenderdoc/Windows/Dialogs/EnvironmentEditor.h +++ b/qrenderdoc/Windows/Dialogs/EnvironmentEditor.h @@ -25,7 +25,7 @@ #pragma once #include -#include "Code/RenderManager.h" +#include "Code/ReplayManager.h" namespace Ui { diff --git a/qrenderdoc/Windows/Dialogs/LiveCapture.cpp b/qrenderdoc/Windows/Dialogs/LiveCapture.cpp index 11887e4c1..ba0eb4659 100644 --- a/qrenderdoc/Windows/Dialogs/LiveCapture.cpp +++ b/qrenderdoc/Windows/Dialogs/LiveCapture.cpp @@ -305,7 +305,7 @@ void LiveCapture::deleteCapture_triggered() } else { - m_Ctx.Renderer().DeleteCapture(log->path, log->local); + m_Ctx.Replay().DeleteCapture(log->path, log->local); } } } @@ -564,9 +564,9 @@ bool LiveCapture::checkAllowClose() // we either have to save or delete the log. Make sure that if it's remote that we are able // to by having an active connection or replay context on that host. if(suppressRemoteWarning == false && (!m_Connection || !m_Connection->Connected()) && - !log->local && (!m_Ctx.Renderer().CurrentRemote() || - m_Ctx.Renderer().CurrentRemote()->Hostname != m_Hostname || - !m_Ctx.Renderer().CurrentRemote()->Connected)) + !log->local && + (!m_Ctx.Replay().CurrentRemote() || m_Ctx.Replay().CurrentRemote()->Hostname != m_Hostname || + !m_Ctx.Replay().CurrentRemote()->Connected)) { QMessageBox::StandardButton res2 = RDDialog::question( this, tr("No active replay context"), @@ -611,9 +611,9 @@ void LiveCapture::openCapture(CaptureLog *log) { log->opened = true; - if(!log->local && (!m_Ctx.Renderer().CurrentRemote() || - m_Ctx.Renderer().CurrentRemote()->Hostname != m_Hostname || - !m_Ctx.Renderer().CurrentRemote()->Connected)) + if(!log->local && + (!m_Ctx.Replay().CurrentRemote() || m_Ctx.Replay().CurrentRemote()->Hostname != m_Hostname || + !m_Ctx.Replay().CurrentRemote()->Connected)) { RDDialog::critical( this, tr("No active replay context"), @@ -666,9 +666,8 @@ bool LiveCapture::saveCapture(CaptureLog *log) } else { - if(!m_Ctx.Renderer().CurrentRemote() || - m_Ctx.Renderer().CurrentRemote()->Hostname != m_Hostname || - !m_Ctx.Renderer().CurrentRemote()->Connected) + if(!m_Ctx.Replay().CurrentRemote() || m_Ctx.Replay().CurrentRemote()->Hostname != m_Hostname || + !m_Ctx.Replay().CurrentRemote()->Connected) { RDDialog::critical(this, tr("No active replay context"), tr("This capture is on remote host %1 and there is no active replay " @@ -679,7 +678,7 @@ bool LiveCapture::saveCapture(CaptureLog *log) return false; } - m_Ctx.Renderer().CopyCaptureFromRemote(log->path, path, this); + m_Ctx.Replay().CopyCaptureFromRemote(log->path, path, this); if(!QFile::exists(path)) { @@ -688,7 +687,7 @@ bool LiveCapture::saveCapture(CaptureLog *log) return false; } - m_Ctx.Renderer().DeleteCapture(log->path, false); + m_Ctx.Replay().DeleteCapture(log->path, false); } log->saved = true; @@ -723,7 +722,7 @@ void LiveCapture::cleanItems() } else { - m_Ctx.Renderer().DeleteCapture(log->path, log->local); + m_Ctx.Replay().DeleteCapture(log->path, log->local); } } } @@ -877,9 +876,8 @@ void LiveCapture::connectionClosed() // to this machine as a remote context if(!log->local) { - if(!m_Ctx.Renderer().CurrentRemote() || - m_Ctx.Renderer().CurrentRemote()->Hostname != m_Hostname || - !m_Ctx.Renderer().CurrentRemote()->Connected) + if(!m_Ctx.Replay().CurrentRemote() || m_Ctx.Replay().CurrentRemote()->Hostname != m_Hostname || + !m_Ctx.Replay().CurrentRemote()->Connected) return; } diff --git a/qrenderdoc/Windows/Dialogs/RemoteManager.cpp b/qrenderdoc/Windows/Dialogs/RemoteManager.cpp index 7ca9b31c6..9b823c397 100644 --- a/qrenderdoc/Windows/Dialogs/RemoteManager.cpp +++ b/qrenderdoc/Windows/Dialogs/RemoteManager.cpp @@ -598,7 +598,7 @@ void RemoteManager::on_connect_clicked() // shut down if(host->Connected) { - m_Ctx.Renderer().ShutdownServer(); + m_Ctx.Replay().ShutdownServer(); setRemoteServerLive(node, false, false); } else diff --git a/qrenderdoc/Windows/Dialogs/VirtualFileDialog.cpp b/qrenderdoc/Windows/Dialogs/VirtualFileDialog.cpp index 2d203341c..46950dd58 100644 --- a/qrenderdoc/Windows/Dialogs/VirtualFileDialog.cpp +++ b/qrenderdoc/Windows/Dialogs/VirtualFileDialog.cpp @@ -30,7 +30,7 @@ #include #include #include "Code/CaptureContext.h" -#include "Code/RenderManager.h" +#include "Code/ReplayManager.h" #include "Code/Resources.h" #include "ui_VirtualFileDialog.h" @@ -48,7 +48,7 @@ public: FileNameRole, }; - RemoteFileModel(IRenderManager &r, QObject *parent = NULL) + RemoteFileModel(IReplayManager &r, QObject *parent = NULL) : Renderer(r), QAbstractItemModel(parent) { makeIconStates(fileIcon, Pixmaps::page_white_database()); @@ -361,7 +361,7 @@ public: } private: - IRenderManager &Renderer; + IReplayManager &Renderer; QIcon dirIcon[2]; QIcon exeIcon[2]; @@ -556,7 +556,7 @@ VirtualFileDialog::VirtualFileDialog(ICaptureContext &ctx, QWidget *parent) setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - m_Model = new RemoteFileModel(ctx.Renderer(), this); + m_Model = new RemoteFileModel(ctx.Replay(), this); m_DirProxy = new RemoteFileProxy(this); m_DirProxy->setSourceModel(m_Model); diff --git a/qrenderdoc/Windows/EventBrowser.cpp b/qrenderdoc/Windows/EventBrowser.cpp index 728c2c383..53a84c051 100644 --- a/qrenderdoc/Windows/EventBrowser.cpp +++ b/qrenderdoc/Windows/EventBrowser.cpp @@ -261,7 +261,7 @@ void EventBrowser::on_bookmark_clicked() void EventBrowser::on_timeDraws_clicked() { - m_Ctx.Renderer().AsyncInvoke([this](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this](IReplayController *r) { rdctype::array results = r->FetchCounters({GPUCounter::EventGPUDuration}); diff --git a/qrenderdoc/Windows/MainWindow.cpp b/qrenderdoc/Windows/MainWindow.cpp index cce40e036..f357fbfdc 100644 --- a/qrenderdoc/Windows/MainWindow.cpp +++ b/qrenderdoc/Windows/MainWindow.cpp @@ -334,7 +334,7 @@ void MainWindow::OnCaptureTrigger(const QString &exe, const QString &workingDir, LambdaThread *th = new LambdaThread([this, exe, workingDir, cmdLine, env, opts, callback]() { QString logfile = m_Ctx.TempLogFilename(QFileInfo(exe).baseName()); - uint32_t ret = m_Ctx.Renderer().ExecuteAndInject(exe, workingDir, cmdLine, env, logfile, opts); + uint32_t ret = m_Ctx.Replay().ExecuteAndInject(exe, workingDir, cmdLine, env, logfile, opts); GUIInvoke::call([this, exe, ret, callback]() { if(ret == 0) @@ -347,7 +347,7 @@ void MainWindow::OnCaptureTrigger(const QString &exe, const QString &workingDir, } LiveCapture *live = new LiveCapture( - m_Ctx, m_Ctx.Renderer().CurrentRemote() ? m_Ctx.Renderer().CurrentRemote()->Hostname : "", + m_Ctx, m_Ctx.Replay().CurrentRemote() ? m_Ctx.Replay().CurrentRemote()->Hostname : "", ret, this, this); ShowLiveCapture(live); callback(live); @@ -416,7 +416,7 @@ void MainWindow::LoadLogfile(const QString &filename, bool temporary, bool local ReplaySupport support = ReplaySupport::Unsupported; bool remoteReplay = - !local || (m_Ctx.Renderer().CurrentRemote() && m_Ctx.Renderer().CurrentRemote()->Connected); + !local || (m_Ctx.Replay().CurrentRemote() && m_Ctx.Replay().CurrentRemote()->Connected); if(local) { @@ -470,7 +470,7 @@ void MainWindow::LoadLogfile(const QString &filename, bool temporary, bool local } remoteReplay = - (m_Ctx.Renderer().CurrentRemote() && m_Ctx.Renderer().CurrentRemote()->Connected); + (m_Ctx.Replay().CurrentRemote() && m_Ctx.Replay().CurrentRemote()->Connected); if(!remoteReplay) { @@ -500,7 +500,7 @@ void MainWindow::LoadLogfile(const QString &filename, bool temporary, bool local { support = ReplaySupport::Unsupported; - QStringList remoteDrivers = m_Ctx.Renderer().GetRemoteSupport(); + QStringList remoteDrivers = m_Ctx.Replay().GetRemoteSupport(); for(const QString &d : remoteDrivers) { @@ -521,7 +521,7 @@ void MainWindow::LoadLogfile(const QString &filename, bool temporary, bool local QString remoteMessage = tr("This log was captured with %1 and cannot be replayed on %2.\n\n") .arg(driver) - .arg(m_Ctx.Renderer().CurrentRemote()->Hostname); + .arg(m_Ctx.Replay().CurrentRemote()->Hostname); remoteMessage += "Try selecting a different remote context in the status bar."; @@ -545,7 +545,7 @@ void MainWindow::LoadLogfile(const QString &filename, bool temporary, bool local if(remoteReplay && local) { - fileToLoad = m_Ctx.Renderer().CopyCaptureToRemote(filename, this); + fileToLoad = m_Ctx.Replay().CopyCaptureToRemote(filename, this); // deliberately leave local as true so that we keep referring to the locally saved log @@ -641,7 +641,7 @@ bool MainWindow::PromptSaveLog() } else { - m_Ctx.Renderer().CopyCaptureFromRemote(m_Ctx.LogFilename(), saveFilename, this); + m_Ctx.Replay().CopyCaptureFromRemote(m_Ctx.LogFilename(), saveFilename, this); success = QFile::exists(saveFilename); error = tr("File couldn't be transferred from remote host"); @@ -711,7 +711,7 @@ bool MainWindow::PromptCloseLog() CloseLogfile(); if(!deletepath.isEmpty()) - m_Ctx.Renderer().DeleteCapture(deletepath, loglocal); + m_Ctx.Replay().DeleteCapture(deletepath, loglocal); return true; } @@ -735,8 +735,8 @@ void MainWindow::SetTitle(const QString &filename) prefix += " - "; } - if(m_Ctx.Renderer().CurrentRemote()) - prefix += tr("Remote: %1 - ").arg(m_Ctx.Renderer().CurrentRemote()->Hostname); + if(m_Ctx.Replay().CurrentRemote()) + prefix += tr("Remote: %1 - ").arg(m_Ctx.Replay().CurrentRemote()->Hostname); QString text = prefix + "RenderDoc "; @@ -966,18 +966,18 @@ void MainWindow::messageCheck() { if(m_Ctx.LogLoaded()) { - m_Ctx.Renderer().AsyncInvoke([this](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this](IReplayController *r) { rdctype::array msgs = r->GetDebugMessages(); bool disconnected = false; - if(m_Ctx.Renderer().CurrentRemote()) + if(m_Ctx.Replay().CurrentRemote()) { - bool prev = m_Ctx.Renderer().CurrentRemote()->ServerRunning; + bool prev = m_Ctx.Replay().CurrentRemote()->ServerRunning; - m_Ctx.Renderer().PingRemote(); + m_Ctx.Replay().PingRemote(); - if(prev != m_Ctx.Renderer().CurrentRemote()->ServerRunning) + if(prev != m_Ctx.Replay().CurrentRemote()->ServerRunning) disconnected = true; } @@ -992,7 +992,7 @@ void MainWindow::messageCheck() "RenderDoc to reconnect and load the capture again")); } - if(m_Ctx.Renderer().CurrentRemote() && !m_Ctx.Renderer().CurrentRemote()->ServerRunning) + if(m_Ctx.Replay().CurrentRemote() && !m_Ctx.Replay().CurrentRemote()->ServerRunning) contextChooser->setIcon(Icons::cross()); if(!msgs.empty()) @@ -1011,18 +1011,18 @@ void MainWindow::messageCheck() } else if(!m_Ctx.LogLoaded() && !m_Ctx.LogLoading()) { - if(m_Ctx.Renderer().CurrentRemote()) - m_Ctx.Renderer().PingRemote(); + if(m_Ctx.Replay().CurrentRemote()) + m_Ctx.Replay().PingRemote(); GUIInvoke::call([this]() { - if(m_Ctx.Renderer().CurrentRemote() && !m_Ctx.Renderer().CurrentRemote()->ServerRunning) + if(m_Ctx.Replay().CurrentRemote() && !m_Ctx.Replay().CurrentRemote()->ServerRunning) { contextChooser->setIcon(Icons::cross()); contextChooser->setText(tr("Replay Context: %1").arg("Local")); statusText->setText( tr("Remote server disconnected. To attempt to reconnect please select it again.")); - m_Ctx.Renderer().DisconnectFromRemoteServer(); + m_Ctx.Replay().DisconnectFromRemoteServer(); } }); } @@ -1124,7 +1124,7 @@ void MainWindow::switchContext() live->close(); } - m_Ctx.Renderer().DisconnectFromRemoteServer(); + m_Ctx.Replay().DisconnectFromRemoteServer(); if(!host) { @@ -1169,7 +1169,7 @@ void MainWindow::switchContext() if(host->ServerRunning && !host->Busy) { - status = m_Ctx.Renderer().ConnectToRemoteServer(host); + status = m_Ctx.Replay().ConnectToRemoteServer(host); } GUIInvoke::call([this, host, status]() { @@ -1229,7 +1229,7 @@ void MainWindow::OnLogfileLoaded() setLogHasErrors(!m_Ctx.DebugMessages().empty()); - m_Ctx.Renderer().AsyncInvoke([this](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this](IReplayController *r) { bool hasResolver = r->HasCallstacks(); GUIInvoke::call([this, hasResolver]() { @@ -1262,12 +1262,12 @@ void MainWindow::OnLogfileClosed() SetTitle(); // if the remote sever disconnected during log replay, resort back to a 'disconnected' state - if(m_Ctx.Renderer().CurrentRemote() && !m_Ctx.Renderer().CurrentRemote()->ServerRunning) + if(m_Ctx.Replay().CurrentRemote() && !m_Ctx.Replay().CurrentRemote()->ServerRunning) { statusText->setText( tr("Remote server disconnected. To attempt to reconnect please select it again.")); contextChooser->setText(tr("Replay Context: %1").arg("Local")); - m_Ctx.Renderer().DisconnectFromRemoteServer(); + m_Ctx.Replay().DisconnectFromRemoteServer(); } } @@ -1401,11 +1401,11 @@ void MainWindow::on_action_Statistics_Viewer_triggered() void MainWindow::on_action_Resolve_Symbols_triggered() { - m_Ctx.Renderer().AsyncInvoke([this](IReplayController *r) { r->InitResolver(); }); + m_Ctx.Replay().AsyncInvoke([this](IReplayController *r) { r->InitResolver(); }); ShowProgressDialog(this, tr("Please Wait - Resolving Symbols"), [this]() { bool running = true; - m_Ctx.Renderer().BlockInvoke( + m_Ctx.Replay().BlockInvoke( [&running](IReplayController *r) { running = r->HasCallstacks() && !r->InitResolver(); }); return !running; }); diff --git a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp index ffc682cbd..fb5cdaa5d 100644 --- a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp @@ -324,8 +324,8 @@ void PipelineStateViewer::EditShader(ShaderStage shaderType, ResourceId id, // invoke off to the ReplayController to replace the log's shader // with our edited one - ctx->Renderer().AsyncInvoke([ctx, entryFunc, compileSource, shaderType, id, shaderDetails, - viewer](IReplayController *r) { + ctx->Replay().AsyncInvoke([ctx, entryFunc, compileSource, shaderType, id, shaderDetails, + viewer](IReplayController *r) { rdctype::str errs; uint flags = shaderDetails->DebugInfo.compileFlags; @@ -354,7 +354,7 @@ void PipelineStateViewer::EditShader(ShaderStage shaderType, ResourceId id, [id](ICaptureContext *ctx) { // remove the replacement on close (we could make this more sophisticated if there // was a place to control replaced resources/shaders). - ctx->Renderer().AsyncInvoke([ctx, id](IReplayController *r) { + ctx->Replay().AsyncInvoke([ctx, id](IReplayController *r) { r->RemoveReplacement(id); GUIInvoke::call([ctx] { ctx->RefreshStatus(); }); }); diff --git a/qrenderdoc/Windows/PixelHistoryView.cpp b/qrenderdoc/Windows/PixelHistoryView.cpp index b02715e8b..c3bbfe339 100644 --- a/qrenderdoc/Windows/PixelHistoryView.cpp +++ b/qrenderdoc/Windows/PixelHistoryView.cpp @@ -639,7 +639,7 @@ void PixelHistoryView::startDebug(EventTag tag) bool success = false; - m_Ctx.Renderer().BlockInvoke([this, &success, &trace](IReplayController *r) { + m_Ctx.Replay().BlockInvoke([this, &success, &trace](IReplayController *r) { trace = r->DebugPixel((uint32_t)m_Pixel.x(), (uint32_t)m_Pixel.y(), m_Display.sampleIdx, ~0U); }); diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index c962fb709..c1d54699f 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -895,7 +895,7 @@ void TextureViewer::UI_UpdateStatusText() if(m_Output != NULL) { - m_Ctx.Renderer().AsyncInvoke([this](IReplayController *) { m_Output->DisablePixelContext(); }); + m_Ctx.Replay().AsyncInvoke([this](IReplayController *) { m_Output->DisablePixelContext(); }); } // PixelPicked = false; @@ -1285,7 +1285,7 @@ void TextureViewer::UI_OnTextureSelectionChanged(bool newdraw) if(ui->autoFit->isChecked()) AutoFitRange(); - m_Ctx.Renderer().AsyncInvoke([this](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this](IReplayController *r) { RT_UpdateVisualRange(r); RT_UpdateAndDisplay(r); @@ -1901,7 +1901,7 @@ void TextureViewer::InitResourcePreview(ResourcePreview *prev, ResourceId id, Co prev->setResourceName(fullname); WId handle = prev->thumbWinId(); - m_Ctx.Renderer().AsyncInvoke([this, handle, id, typeHint](IReplayController *) { + m_Ctx.Replay().AsyncInvoke([this, handle, id, typeHint](IReplayController *) { m_Output->AddThumbnail(m_Ctx.CurWindowingSystem(), m_Ctx.FillWindowingData(handle), id, typeHint); }); @@ -1920,7 +1920,7 @@ void TextureViewer::InitResourcePreview(ResourcePreview *prev, ResourceId id, Co prev->setResourceName(fullname); WId handle = prev->thumbWinId(); - m_Ctx.Renderer().AsyncInvoke([this, handle](IReplayController *) { + m_Ctx.Replay().AsyncInvoke([this, handle](IReplayController *) { m_Output->AddThumbnail(m_Ctx.CurWindowingSystem(), m_Ctx.FillWindowingData(handle), ResourceId(), CompType::Typeless); }); @@ -1929,7 +1929,7 @@ void TextureViewer::InitResourcePreview(ResourcePreview *prev, ResourceId id, Co { prev->setResourceName(""); WId handle = prev->thumbWinId(); - m_Ctx.Renderer().AsyncInvoke([this, handle](IReplayController *) { + m_Ctx.Replay().AsyncInvoke([this, handle](IReplayController *) { m_Output->AddThumbnail(m_Ctx.CurWindowingSystem(), m_Ctx.FillWindowingData(handle), ResourceId(), CompType::Typeless); }); @@ -1947,7 +1947,7 @@ void TextureViewer::InitResourcePreview(ResourcePreview *prev, ResourceId id, Co prev->setSelected(true); WId handle = prev->thumbWinId(); - m_Ctx.Renderer().AsyncInvoke([this, handle](IReplayController *) { + m_Ctx.Replay().AsyncInvoke([this, handle](IReplayController *) { m_Output->AddThumbnail(m_Ctx.CurWindowingSystem(), m_Ctx.FillWindowingData(handle), ResourceId(), CompType::Typeless); }); @@ -2123,7 +2123,7 @@ void TextureViewer::thumb_clicked(QMouseEvent *e) } else { - m_Ctx.Renderer().AsyncInvoke([this, id](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this, id](IReplayController *r) { rdctype::array usage = r->GetUsage(id); GUIInvoke::call([this, id, usage]() { OpenResourceContextMenu(id, usage); }); @@ -2169,13 +2169,13 @@ void TextureViewer::render_mouseMove(QMouseEvent *e) m_PickedPoint.setX(qBound(0, m_PickedPoint.x(), (int)texptr->width - 1)); m_PickedPoint.setY(qBound(0, m_PickedPoint.y(), (int)texptr->height - 1)); - m_Ctx.Renderer().AsyncInvoke("PickPixelClick", - [this](IReplayController *r) { RT_PickPixelsAndUpdate(r); }); + m_Ctx.Replay().AsyncInvoke("PickPixelClick", + [this](IReplayController *r) { RT_PickPixelsAndUpdate(r); }); } else if(e->buttons() == Qt::NoButton) { - m_Ctx.Renderer().AsyncInvoke("PickPixelHover", - [this](IReplayController *r) { RT_PickHoverAndUpdate(r); }); + m_Ctx.Replay().AsyncInvoke("PickPixelHover", + [this](IReplayController *r) { RT_PickHoverAndUpdate(r); }); } } } @@ -2278,7 +2278,7 @@ void TextureViewer::render_keyPress(QKeyEvent *e) qBound(0, m_PickedPoint.y(), (int)texptr->height - 1)); e->accept(); - m_Ctx.Renderer().AsyncInvoke([this](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this](IReplayController *r) { RT_PickPixelsAndUpdate(r); RT_UpdateAndDisplay(r); }); @@ -2470,7 +2470,7 @@ void TextureViewer::OnLogfileLoaded() m_TexDisplay.lightBackgroundColor = FloatVector(lightBack.redF(), lightBack.greenF(), lightBack.blueF(), 1.0f); - m_Ctx.Renderer().BlockInvoke([renderID, contextID, this](IReplayController *r) { + m_Ctx.Replay().BlockInvoke([renderID, contextID, this](IReplayController *r) { m_Output = r->CreateOutput(m_Ctx.CurWindowingSystem(), m_Ctx.FillWindowingData(renderID), ReplayOutputType::Texture); @@ -2970,7 +2970,7 @@ void TextureViewer::AutoFitRange() if(!m_Ctx.LogLoaded() || GetCurrentTexture() == NULL || m_Output == NULL) return; - m_Ctx.Renderer().AsyncInvoke([this](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this](IReplayController *r) { PixelValue min, max; std::tie(min, max) = m_Output->GetMinMax(); @@ -3241,7 +3241,7 @@ void TextureViewer::on_saveTex_clicked() if(m_TexDisplay.CustomShader != ResourceId()) { ResourceId id; - m_Ctx.Renderer().BlockInvoke( + m_Ctx.Replay().BlockInvoke( [this, &id](IReplayController *r) { id = m_Output->GetCustomShaderTexID(); }); if(id != ResourceId()) @@ -3258,7 +3258,7 @@ void TextureViewer::on_saveTex_clicked() bool ret = false; QString fn = saveDialog.filename(); - m_Ctx.Renderer().BlockInvoke([this, &ret, config, fn](IReplayController *r) { + m_Ctx.Replay().BlockInvoke([this, &ret, config, fn](IReplayController *r) { ret = r->SaveTexture(config, fn.toUtf8().data()); }); @@ -3279,7 +3279,7 @@ void TextureViewer::on_debugPixelContext_clicked() int x = m_PickedPoint.x() >> (int)m_TexDisplay.mip; int y = m_PickedPoint.y() >> (int)m_TexDisplay.mip; - m_Ctx.Renderer().AsyncInvoke([this, x, y](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this, x, y](IReplayController *r) { ShaderDebugTrace *trace = r->DebugPixel((uint32_t)x, (uint32_t)y, m_TexDisplay.sampleIdx, ~0U); if(trace->states.count == 0) @@ -3326,7 +3326,7 @@ void TextureViewer::on_pixelHistory_clicked() // render thread before we insert the long blocking pixel history task LambdaThread *thread = new LambdaThread([this, texptr, x, y, hist]() { QThread::msleep(150); - m_Ctx.Renderer().AsyncInvoke([this, texptr, x, y, hist](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this, texptr, x, y, hist](IReplayController *r) { rdctype::array history = r->PixelHistory(texptr->ID, (uint32_t)x, (int32_t)y, m_TexDisplay.sliceFace, m_TexDisplay.mip, m_TexDisplay.sampleIdx, m_TexDisplay.typeHint); @@ -3402,7 +3402,7 @@ void TextureViewer::reloadCustomShaders(const QString &filter) QList shaders = m_CustomShaders.values(); - m_Ctx.Renderer().AsyncInvoke([shaders](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([shaders](IReplayController *r) { for(ResourceId s : shaders) r->FreeCustomShader(s); }); @@ -3423,7 +3423,7 @@ void TextureViewer::reloadCustomShaders(const QString &filter) return; ResourceId freed = m_CustomShaders[key]; - m_Ctx.Renderer().AsyncInvoke([freed](IReplayController *r) { r->FreeCustomShader(freed); }); + m_Ctx.Replay().AsyncInvoke([freed](IReplayController *r) { r->FreeCustomShader(freed); }); m_CustomShaders.remove(key); @@ -3469,7 +3469,7 @@ void TextureViewer::reloadCustomShaders(const QString &filter) m_CustomShaders[key] = ResourceId(); m_CustomShadersBusy.push_back(key); - m_Ctx.Renderer().AsyncInvoke([this, fn, key, source](IReplayController *r) { + m_Ctx.Replay().AsyncInvoke([this, fn, key, source](IReplayController *r) { rdctype::str errors; ResourceId id; diff --git a/qrenderdoc/qrenderdoc.pro b/qrenderdoc/qrenderdoc.pro index 15bc6f926..6c9f59703 100644 --- a/qrenderdoc/qrenderdoc.pro +++ b/qrenderdoc/qrenderdoc.pro @@ -149,7 +149,7 @@ win32 { SOURCES += Code/qrenderdoc.cpp \ Code/qprocessinfo.cpp \ - Code/RenderManager.cpp \ + Code/ReplayManager.cpp \ Code/CaptureContext.cpp \ Code/ScintillaSyntax.cpp \ Code/QRDUtils.cpp \ @@ -205,7 +205,7 @@ SOURCES += Code/qrenderdoc.cpp \ Windows/Dialogs/TipsDialog.cpp HEADERS += Code/CaptureContext.h \ Code/qprocessinfo.h \ - Code/RenderManager.h \ + Code/ReplayManager.h \ Code/ScintillaSyntax.h \ Code/QRDUtils.h \ Code/Resources.h \ diff --git a/qrenderdoc/qrenderdoc_local.vcxproj b/qrenderdoc/qrenderdoc_local.vcxproj index b67c19edb..f553df3db 100644 --- a/qrenderdoc/qrenderdoc_local.vcxproj +++ b/qrenderdoc/qrenderdoc_local.vcxproj @@ -731,7 +731,7 @@ - + @@ -906,7 +906,7 @@ MOC %(Filename).h $(IntDir)generated\moc_%(Filename).cpp - + %(Fullpath);$(ProjectDir)3rdparty\qt\$(Platform)\bin\moc.exe;%(AdditionalInputs) diff --git a/qrenderdoc/qrenderdoc_local.vcxproj.filters b/qrenderdoc/qrenderdoc_local.vcxproj.filters index 22762f82a..065aebe56 100644 --- a/qrenderdoc/qrenderdoc_local.vcxproj.filters +++ b/qrenderdoc/qrenderdoc_local.vcxproj.filters @@ -99,9 +99,6 @@ Windows - - Code - Widgets @@ -576,14 +573,14 @@ Code\Interface + + Code + 3rdparty\FlowLayout - - Code - Code @@ -881,6 +878,9 @@ Code\pyrenderdoc + + Code +