diff --git a/qrenderdoc/Code/Interface/PersistantConfig.cpp b/qrenderdoc/Code/Interface/PersistantConfig.cpp index fbcfb8ee7..0c8838474 100644 --- a/qrenderdoc/Code/Interface/PersistantConfig.cpp +++ b/qrenderdoc/Code/Interface/PersistantConfig.cpp @@ -666,3 +666,32 @@ BugReport::operator QVariant() const return map; } + +ReplayOptions::ReplayOptions(const QVariant &var) +{ + QVariantMap map = var.toMap(); + + if(map.contains(lit("apiValidation"))) + apiValidation = map[lit("apiValidation")].toBool(); + if(map.contains(lit("forceGPUVendor"))) + forceGPUVendor = (GPUVendor)map[lit("forceGPUVendor")].toUInt(); + if(map.contains(lit("forceGPUDeviceID"))) + forceGPUDeviceID = map[lit("forceGPUDeviceID")].toUInt(); + if(map.contains(lit("forceGPUDriverName"))) + forceGPUDriverName = map[lit("forceGPUDriverName")].toString(); + if(map.contains(lit("optimisation"))) + optimisation = (ReplayOptimisationLevel)map[lit("optimisation")].toUInt(); +} + +ReplayOptions::operator QVariant() const +{ + QVariantMap map; + + map[lit("apiValidation")] = apiValidation; + map[lit("forceGPUVendor")] = (uint32_t)forceGPUVendor; + map[lit("forceGPUDeviceID")] = forceGPUDeviceID; + map[lit("forceGPUDriverName")] = forceGPUDriverName; + map[lit("optimisation")] = (uint32_t)optimisation; + + return map; +} diff --git a/qrenderdoc/Code/Interface/PersistantConfig.h b/qrenderdoc/Code/Interface/PersistantConfig.h index 9c0330457..6838c9584 100644 --- a/qrenderdoc/Code/Interface/PersistantConfig.h +++ b/qrenderdoc/Code/Interface/PersistantConfig.h @@ -294,6 +294,8 @@ DECLARE_REFLECTION_STRUCT(BugReport); \ CONFIG_SETTING_VAL(public, QString, rdcstr, DefaultCaptureSaveDirectory, "") \ \ + CONFIG_SETTING(public, QVariant, ReplayOptions, DefaultReplayOptions) \ + \ CONFIG_SETTING_VAL(public, bool, bool, TextureViewer_ResetRange, false) \ \ CONFIG_SETTING_VAL(public, bool, bool, TextureViewer_PerTexSettings, true) \ @@ -491,6 +493,11 @@ For more information about some of these settings that are user-facing see The default path to save captures in, when browsing to save a temporary capture somewhere. +.. data:: DefaultReplayOptions + + A :class:`ReplayOptions` containing the configured default replay options to use in most scenarios + when no specific options are given. + .. data:: TextureViewer_ResetRange ``True`` if the :class:`TextureViewer` should reset the visible range when a new texture is diff --git a/qrenderdoc/Styles/RDStyle/RDStyle.cpp b/qrenderdoc/Styles/RDStyle/RDStyle.cpp index 5032722dd..d7ac9791c 100644 --- a/qrenderdoc/Styles/RDStyle/RDStyle.cpp +++ b/qrenderdoc/Styles/RDStyle/RDStyle.cpp @@ -717,6 +717,10 @@ QSize RDStyle::sizeFromContents(ContentsType type, const QStyleOption *opt, cons const QStyleOptionMenuItem *menuitem = qstyleoption_cast(opt); + // add more room for items with shortcuts + if(menuitem->text.contains(QLatin1Char('\t'))) + ret.setWidth(ret.width() + 4 * Constants::MenuBarMargin); + // add room for an icon if(menuitem->maxIconWidth) ret.setWidth(ret.width() + Constants::MenuBarMargin + menuitem->maxIconWidth); diff --git a/qrenderdoc/Widgets/ReplayOptionsSelector.cpp b/qrenderdoc/Widgets/ReplayOptionsSelector.cpp new file mode 100644 index 000000000..aaf08a6a1 --- /dev/null +++ b/qrenderdoc/Widgets/ReplayOptionsSelector.cpp @@ -0,0 +1,218 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2016-2019 Baldur Karlsson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ + +#include "ReplayOptionsSelector.h" +#include "Code/QRDUtils.h" +#include "ui_ReplayOptionsSelector.h" + +ReplayOptionsSelector::ReplayOptionsSelector(ICaptureContext &ctx, bool actions, QWidget *parent) + : m_Ctx(ctx), QWidget(parent), ui(new Ui::ReplayOptionsSelector) +{ + ui->setupUi(this); + + if(!actions) + { + ui->captureFileFrame->hide(); + ui->buttonsFrame->hide(); + } + + QObject::connect(ui->open, &QPushButton::clicked, this, &ReplayOptionsSelector::opened); + QObject::connect(ui->cancel, &QPushButton::clicked, this, &ReplayOptionsSelector::canceled); + + // try to use the remote capture access to enumerate remote GPUs, but if it's not available open a + // local capture access + ICaptureFile *dummy = RENDERDOC_OpenCaptureFile(); + ICaptureAccess *capture = m_Ctx.Replay().GetCaptureAccess(); + + if(!capture) + capture = dummy; + + // fetch available GPUs + m_GPUs = capture->GetAvailableGPUs(); + + dummy->Shutdown(); + + // this is always available + ui->gpuOverride->addItem(tr("Default GPU selection")); + + for(const GPUDevice &dev : m_GPUs) + { + QString apis; + for(size_t i = 0; i < dev.apis.size(); i++) + { + apis += ToQStr(dev.apis[i]); + if(i + 1 < dev.apis.size()) + apis += lit(", "); + } + + QString vendor = ToQStr(dev.vendor); + QString name = dev.name; + + // if the name already contains the vendor, don't display it twice + if(name.contains(vendor, Qt::CaseInsensitive)) + ui->gpuOverride->addItem(QFormatStr("%1 [%2]").arg(name).arg(apis)); + else + ui->gpuOverride->addItem(QFormatStr("%1 %2 [%3]").arg(vendor).arg(name).arg(apis)); + } + + for(ReplayOptimisationLevel level : values()) + ui->replayOptimisation->addItem(ToQStr(level)); + + // set default options + { + const ReplayOptions &opts = m_Ctx.Config().DefaultReplayOptions; + + ui->replayAPIValidation->setChecked(opts.apiValidation); + ui->replayOptimisation->setCurrentIndex((int)opts.optimisation); + + int bestIndex = -1; + + if(opts.forceGPUVendor == GPUVendor::Unknown && opts.forceGPUDeviceID == 0 && + opts.forceGPUDriverName.empty()) + { + // no forcing active + bestIndex = -1; + } + else + { + // if the options are trying to force a GPU, pick the closest one we can find and use it + bestIndex = 0; + + for(int i = 0; i < m_GPUs.count(); i++) + { + // if this is a closer vendor match than the current best, use it + if(opts.forceGPUVendor == m_GPUs[i].vendor && opts.forceGPUVendor != m_GPUs[bestIndex].vendor) + { + bestIndex = i; + continue; + } + else if(m_GPUs[i].vendor != opts.forceGPUVendor) + { + continue; + } + + // if this is a closer device match, use it + if(opts.forceGPUDeviceID == m_GPUs[i].deviceID && + opts.forceGPUDeviceID != m_GPUs[bestIndex].deviceID) + { + bestIndex = i; + continue; + } + else if(m_GPUs[i].deviceID != opts.forceGPUDeviceID) + { + continue; + } + + // if this is a closer driver match, use it + if(opts.forceGPUDriverName == m_GPUs[i].driver && + opts.forceGPUDriverName != m_GPUs[bestIndex].driver) + { + bestIndex = i; + continue; + } + } + } + + if(bestIndex >= 0 && bestIndex < m_GPUs.count()) + ui->gpuOverride->setCurrentIndex(bestIndex + 1); + else + ui->gpuOverride->setCurrentIndex(0); + } + + // add recent capture files as options in the dropdown + for(rdcstr file : m_Ctx.Config().RecentCaptureFiles) + ui->captureFile->insertItem(0, file); + + // default to the last opened file + ui->captureFile->setCurrentIndex(0); +} + +ReplayOptionsSelector::~ReplayOptionsSelector() +{ + delete ui; +} + +QString ReplayOptionsSelector::filename() +{ + return ui->captureFile->currentText(); +} + +ReplayOptions ReplayOptionsSelector::options() +{ + ReplayOptions opts; + + opts.apiValidation = ui->replayAPIValidation->isChecked(); + opts.optimisation = (ReplayOptimisationLevel)ui->replayOptimisation->currentIndex(); + + int gpuChoice = ui->gpuOverride->currentIndex(); + if(gpuChoice > 0 && gpuChoice - 1 < m_GPUs.count()) + { + const GPUDevice &gpu = m_GPUs[gpuChoice - 1]; + opts.forceGPUVendor = gpu.vendor; + opts.forceGPUDeviceID = gpu.deviceID; + opts.forceGPUDriverName = gpu.driver; + } + + return opts; +} + +void ReplayOptionsSelector::on_saveDefaults_clicked() +{ + m_Ctx.Config().DefaultReplayOptions = options(); + + m_Ctx.Config().Save(); +} + +void ReplayOptionsSelector::on_captureFileBrowse_clicked() +{ + QString initDir; + + QFileInfo f(ui->captureFile->currentText()); + QDir dir = f.dir(); + if(f.isAbsolute() && dir.exists()) + { + initDir = dir.absolutePath(); + } + else if(!m_Ctx.Config().LastCaptureFilePath.isEmpty()) + { + initDir = m_Ctx.Config().LastCaptureFilePath; + } + + QString filename = RDDialog::getOpenFileName(this, tr("Select capture to open"), initDir, + tr("Capture Files (*.rdc);;All Files (*)")); + + if(!filename.isEmpty()) + ui->captureFile->setCurrentText(filename); +} + +void ReplayOptionsSelector::keyPressEvent(QKeyEvent *e) +{ + if(e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) + { + opened(); + return; + } + + QWidget::keyPressEvent(e); +} diff --git a/qrenderdoc/Widgets/ReplayOptionsSelector.h b/qrenderdoc/Widgets/ReplayOptionsSelector.h new file mode 100644 index 000000000..c01168144 --- /dev/null +++ b/qrenderdoc/Widgets/ReplayOptionsSelector.h @@ -0,0 +1,61 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2016-2019 Baldur Karlsson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ + +#pragma once + +#include +#include "Code/Interface/QRDInterface.h" + +namespace Ui +{ +class ReplayOptionsSelector; +} + +class ReplayOptionsSelector : public QWidget +{ + Q_OBJECT + +public: + explicit ReplayOptionsSelector(ICaptureContext &ctx, bool actions, QWidget *parent = 0); + ~ReplayOptionsSelector(); + + QString filename(); + ReplayOptions options(); + +signals: + void canceled(); + void opened(); + +private slots: + // automatic slots + void on_saveDefaults_clicked(); + void on_captureFileBrowse_clicked(); + +private: + void keyPressEvent(QKeyEvent *e); + Ui::ReplayOptionsSelector *ui; + + ICaptureContext &m_Ctx; + rdcarray m_GPUs; +}; diff --git a/qrenderdoc/Widgets/ReplayOptionsSelector.ui b/qrenderdoc/Widgets/ReplayOptionsSelector.ui new file mode 100644 index 000000000..4f50d6a8d --- /dev/null +++ b/qrenderdoc/Widgets/ReplayOptionsSelector.ui @@ -0,0 +1,191 @@ + + + ReplayOptionsSelector + + + + 0 + 0 + 680 + 268 + + + + + 0 + 0 + + + + + 0 + 0 + + + + Form + + + + + + + 0 + 0 + + + + Use API Validation on replay: + + + + + + + + + + + + + + + 0 + 0 + + + + GPU Selection Override: + + + + + + + + + + + 0 + 0 + + + + Replay optimisation level: + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Capture File: + + + + + + + + 0 + 0 + + + + true + + + QComboBox::NoInsert + + + QComboBox::AdjustToMinimumContentsLength + + + 30 + + + + + + + ... + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Save Defaults + + + + + + + Open + + + + + + + Cancel + + + + + + + + + + + diff --git a/qrenderdoc/Windows/Dialogs/LiveCapture.cpp b/qrenderdoc/Windows/Dialogs/LiveCapture.cpp index 010eb8627..602f7a9a6 100644 --- a/qrenderdoc/Windows/Dialogs/LiveCapture.cpp +++ b/qrenderdoc/Windows/Dialogs/LiveCapture.cpp @@ -760,7 +760,7 @@ void LiveCapture::openCapture(Capture *cap) return; } - m_Main->LoadCapture(cap->path, ReplayOptions(), !cap->saved, cap->local); + m_Main->LoadCapture(cap->path, m_Ctx.Config().DefaultReplayOptions, !cap->saved, cap->local); } bool LiveCapture::saveCapture(Capture *cap, QString path) diff --git a/qrenderdoc/Windows/Dialogs/SettingsDialog.cpp b/qrenderdoc/Windows/Dialogs/SettingsDialog.cpp index 8b98176d7..0cde56238 100644 --- a/qrenderdoc/Windows/Dialogs/SettingsDialog.cpp +++ b/qrenderdoc/Windows/Dialogs/SettingsDialog.cpp @@ -30,6 +30,7 @@ #include "Code/QRDUtils.h" #include "Styles/StyleData.h" #include "Widgets/OrderedListEditor.h" +#include "Widgets/ReplayOptionsSelector.h" #include "CaptureDialog.h" #include "ui_SettingsDialog.h" @@ -38,6 +39,10 @@ SettingsDialog::SettingsDialog(ICaptureContext &ctx, QWidget *parent) { ui->setupUi(this); + m_ReplayOptions = new ReplayOptionsSelector(m_Ctx, false, this); + + ui->replayOptionsLayout->insertWidget(0, m_ReplayOptions); + QString styleChooseTooltip = ui->UIStyle->toolTip(); for(int i = 0; i < StyleData::numAvailable; i++) @@ -192,6 +197,9 @@ SettingsDialog::SettingsDialog(ICaptureContext &ctx, QWidget *parent) SettingsDialog::~SettingsDialog() { + m_Ctx.Config().DefaultReplayOptions = m_ReplayOptions->options(); + m_Ctx.Config().Save(); + delete ui; } diff --git a/qrenderdoc/Windows/Dialogs/SettingsDialog.h b/qrenderdoc/Windows/Dialogs/SettingsDialog.h index a9f7a77dd..6146c10ad 100644 --- a/qrenderdoc/Windows/Dialogs/SettingsDialog.h +++ b/qrenderdoc/Windows/Dialogs/SettingsDialog.h @@ -34,6 +34,7 @@ class SettingsDialog; class QTableWidgetItem; class QListWidgetItem; struct ShaderProcessingTool; +class ReplayOptionsSelector; struct ICaptureContext; @@ -119,6 +120,8 @@ private: void addProcessor(const ShaderProcessingTool &disasm); bool editTool(int existing, ShaderProcessingTool &disasm); + ReplayOptionsSelector *m_ReplayOptions; + ICaptureContext &m_Ctx; bool m_Init = false; }; diff --git a/qrenderdoc/Windows/Dialogs/SettingsDialog.ui b/qrenderdoc/Windows/Dialogs/SettingsDialog.ui index d39895f70..3d3ee6739 100644 --- a/qrenderdoc/Windows/Dialogs/SettingsDialog.ui +++ b/qrenderdoc/Windows/Dialogs/SettingsDialog.ui @@ -551,6 +551,35 @@ After interop is enabled you will need to reload any capture. + + + Replay + + + + + + Default Replay Options + + + + + + Qt::Vertical + + + + 20 + 414 + + + + + + + + + Texture Viewer diff --git a/qrenderdoc/Windows/MainWindow.cpp b/qrenderdoc/Windows/MainWindow.cpp index 10ac5c884..6dc0d7994 100644 --- a/qrenderdoc/Windows/MainWindow.cpp +++ b/qrenderdoc/Windows/MainWindow.cpp @@ -39,6 +39,7 @@ #include "Code/QRDUtils.h" #include "Code/Resources.h" #include "Widgets/Extended/RDLabel.h" +#include "Widgets/ReplayOptionsSelector.h" #include "Windows/Dialogs/AboutDialog.h" #include "Windows/Dialogs/CaptureDialog.h" #include "Windows/Dialogs/CrashDialog.h" @@ -445,6 +446,42 @@ void MainWindow::on_action_Open_Capture_triggered() LoadFromFilename(filename, false); } +void MainWindow::on_action_Open_Capture_with_Options_triggered() +{ + if(!PromptCloseCapture()) + return; + + ReplayOptionsSelector *replayOptions = new ReplayOptionsSelector(m_Ctx, true, this); + + QDialog openWithOptions; + openWithOptions.setWindowFlags(openWithOptions.windowFlags() & ~Qt::WindowContextHelpButtonHint); + openWithOptions.setWindowIcon(windowIcon()); + openWithOptions.setWindowTitle(tr("Open Capture with Options")); + openWithOptions.setSizeGripEnabled(false); + openWithOptions.setModal(true); + + QVBoxLayout l; + l.addWidget(replayOptions); + l.setMargin(3); + l.setSizeConstraint(QLayout::SetFixedSize); + + openWithOptions.setLayout(&l); + + QObject::connect(replayOptions, &ReplayOptionsSelector::canceled, &openWithOptions, + &QDialog::reject); + QObject::connect(replayOptions, &ReplayOptionsSelector::opened, &openWithOptions, &QDialog::accept); + + if(RDDialog::show(&openWithOptions) != QDialog::Accepted) + return; + + QString filename = replayOptions->filename(); + + if(filename.isEmpty()) + return; + + LoadCapture(filename, replayOptions->options(), false, true); +} + void MainWindow::importCapture(const CaptureFileFormat &fmt) { if(!PromptCloseCapture()) @@ -487,7 +524,7 @@ void MainWindow::LoadFromFilename(const QString &filename, bool temporary) if(ext == lit("rdc")) { - LoadCapture(filename, ReplayOptions(), temporary, true); + LoadCapture(filename, m_Ctx.Config().DefaultReplayOptions, temporary, true); } else if(ext == lit("cap")) { @@ -500,7 +537,7 @@ void MainWindow::LoadFromFilename(const QString &filename, bool temporary) else { // not a recognised filetype, see if we can load it anyway - LoadCapture(filename, ReplayOptions(), temporary, true); + LoadCapture(filename, m_Ctx.Config().DefaultReplayOptions, temporary, true); } } @@ -1507,7 +1544,7 @@ void MainWindow::recentCaptureFile(const QString &filename) { if(QFileInfo::exists(filename)) { - LoadCapture(filename, ReplayOptions(), false, true); + LoadCapture(filename, m_Ctx.Config().DefaultReplayOptions, false, true); } else { diff --git a/qrenderdoc/Windows/MainWindow.h b/qrenderdoc/Windows/MainWindow.h index 2de863256..34d2ebe51 100644 --- a/qrenderdoc/Windows/MainWindow.h +++ b/qrenderdoc/Windows/MainWindow.h @@ -117,6 +117,7 @@ private slots: void on_action_Exit_triggered(); void on_action_About_triggered(); void on_action_Open_Capture_triggered(); + void on_action_Open_Capture_with_Options_triggered(); void on_action_Save_Capture_Inplace_triggered(); void on_action_Save_Capture_As_triggered(); void on_action_Close_Capture_triggered(); diff --git a/qrenderdoc/Windows/MainWindow.ui b/qrenderdoc/Windows/MainWindow.ui index 0904e5b3f..2d0826bc6 100644 --- a/qrenderdoc/Windows/MainWindow.ui +++ b/qrenderdoc/Windows/MainWindow.ui @@ -102,6 +102,7 @@ + @@ -506,6 +507,14 @@ Dia&gnostic Log + + + Open Capture with Options + + + Ctrl+Shift+O + + diff --git a/qrenderdoc/qrenderdoc.pro b/qrenderdoc/qrenderdoc.pro index c151d3cce..334d1d1b9 100644 --- a/qrenderdoc/qrenderdoc.pro +++ b/qrenderdoc/qrenderdoc.pro @@ -196,6 +196,7 @@ SOURCES += Code/qrenderdoc.cpp \ Widgets/CustomPaintWidget.cpp \ Widgets/ResourcePreview.cpp \ Widgets/ThumbnailStrip.cpp \ + Widgets/ReplayOptionsSelector.cpp \ Widgets/TextureGoto.cpp \ Widgets/RangeHistogram.cpp \ Widgets/CollapseGroupBox.cpp \ @@ -273,6 +274,7 @@ HEADERS += Code/CaptureContext.h \ Widgets/CustomPaintWidget.h \ Widgets/ResourcePreview.h \ Widgets/ThumbnailStrip.h \ + Widgets/ReplayOptionsSelector.h \ Widgets/TextureGoto.h \ Widgets/RangeHistogram.h \ Widgets/CollapseGroupBox.h \ @@ -324,6 +326,7 @@ FORMS += Windows/Dialogs/AboutDialog.ui \ Windows/TextureViewer.ui \ Widgets/ResourcePreview.ui \ Widgets/ThumbnailStrip.ui \ + Widgets/ReplayOptionsSelector.ui \ Windows/Dialogs/TextureSaveDialog.ui \ Windows/Dialogs/CaptureDialog.ui \ Windows/Dialogs/LiveCapture.ui \ diff --git a/qrenderdoc/qrenderdoc_local.vcxproj b/qrenderdoc/qrenderdoc_local.vcxproj index 547391f6d..b5de61ded 100644 --- a/qrenderdoc/qrenderdoc_local.vcxproj +++ b/qrenderdoc/qrenderdoc_local.vcxproj @@ -663,6 +663,7 @@ + @@ -707,6 +708,7 @@ + @@ -956,6 +958,7 @@ + @@ -1120,6 +1123,12 @@ MOC %(Filename).h $(IntDir)generated\moc_%(Filename).cpp + + %(Fullpath);$(ProjectDir)3rdparty\qt\$(Platform)\bin\moc.exe;%(AdditionalInputs) + "$(ProjectDir)3rdparty\qt\$(Platform)\bin\moc.exe" -DUNICODE -DWIN32 -DWIN64 -D_WIN32 -D_WIN64 -DRENDERDOC_PLATFORM_WIN32 -DSCINTILLA_QT=1 -DSCI_LEXER=1 -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1900 -I"$(ProjectDir)." -I"$(SolutionDir)\renderdoc\api\replay" -I"$(ProjectDir)3rdparty\qt\$(Platform)\mkspecs/win32-msvc2015" -I"$(ProjectDir)3rdparty\qt\include" -I"$(ProjectDir)3rdparty\qt\include\QtWidgets" -I"$(ProjectDir)3rdparty\qt\include\QtGui" -I"$(ProjectDir)3rdparty\qt\include\QtCore" "%(Fullpath)" -o "$(IntDir)generated\moc_%(Filename).cpp" + MOC %(Filename).h + $(IntDir)generated\moc_%(Filename).cpp + %(Fullpath);$(ProjectDir)3rdparty\qt\$(Platform)\bin\moc.exe;%(AdditionalInputs) "$(ProjectDir)3rdparty\qt\$(Platform)\bin\moc.exe" -DUNICODE -DWIN32 -DWIN64 -D_WIN32 -D_WIN64 -DRENDERDOC_PLATFORM_WIN32 -DSCINTILLA_QT=1 -DSCI_LEXER=1 -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1900 -I"$(ProjectDir)." -I"$(SolutionDir)\renderdoc\api\replay" -I"$(ProjectDir)3rdparty\qt\$(Platform)\mkspecs/win32-msvc2015" -I"$(ProjectDir)3rdparty\qt\include" -I"$(ProjectDir)3rdparty\qt\include\QtWidgets" -I"$(ProjectDir)3rdparty\qt\include\QtGui" -I"$(ProjectDir)3rdparty\qt\include\QtCore" "%(Fullpath)" -o "$(IntDir)generated\moc_%(Filename).cpp" @@ -1384,6 +1393,12 @@ UIC %(Filename).ui $(IntDir)generated\ui_%(Filename).h + + %(Fullpath);$(ProjectDir)3rdparty\qt\$(Platform)\bin\uic.exe;%(AdditionalInputs) + "$(ProjectDir)3rdparty\qt\$(Platform)\bin\uic.exe" "%(Fullpath)" -o "$(IntDir)generated\ui_%(Filename).h" + UIC %(Filename).ui + $(IntDir)generated\ui_%(Filename).h + %(Fullpath);$(ProjectDir)3rdparty\qt\$(Platform)\bin\uic.exe;%(AdditionalInputs) "$(ProjectDir)3rdparty\qt\$(Platform)\bin\uic.exe" "%(Fullpath)" -o "$(IntDir)generated\ui_%(Filename).h" diff --git a/qrenderdoc/qrenderdoc_local.vcxproj.filters b/qrenderdoc/qrenderdoc_local.vcxproj.filters index 4020e3fc1..0149a492c 100644 --- a/qrenderdoc/qrenderdoc_local.vcxproj.filters +++ b/qrenderdoc/qrenderdoc_local.vcxproj.filters @@ -723,6 +723,12 @@ Generated Files + + Widgets + + + Generated Files + @@ -1079,6 +1085,9 @@ Generated Files + + Generated Files + @@ -1466,6 +1475,10 @@ Windows + + Widgets + +