mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-04 09:00:44 +00:00
Expose replay options to the UI
* The defaults can be configured from the settings menu, and there's a new "Open Capture with Options" menu option to open a capture with different options temporarily.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -717,6 +717,10 @@ QSize RDStyle::sizeFromContents(ContentsType type, const QStyleOption *opt, cons
|
||||
|
||||
const QStyleOptionMenuItem *menuitem = qstyleoption_cast<const QStyleOptionMenuItem *>(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);
|
||||
|
||||
@@ -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<ReplayOptimisationLevel>())
|
||||
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);
|
||||
}
|
||||
@@ -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 <QWidget>
|
||||
#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<GPUDevice> m_GPUs;
|
||||
};
|
||||
@@ -0,0 +1,191 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>ReplayOptionsSelector</class>
|
||||
<widget class="QWidget" name="ReplayOptionsSelector">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>680</width>
|
||||
<height>268</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Use API Validation on replay:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QCheckBox" name="replayAPIValidation">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>GPU Selection Override:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QComboBox" name="gpuOverride"/>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Replay optimisation level:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QComboBox" name="replayOptimisation"/>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QFrame" name="captureFileFrame">
|
||||
<layout class="QHBoxLayout" name="captureFileLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="captureFileLabel">
|
||||
<property name="text">
|
||||
<string>Capture File:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="captureFile">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="editable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="insertPolicy">
|
||||
<enum>QComboBox::NoInsert</enum>
|
||||
</property>
|
||||
<property name="sizeAdjustPolicy">
|
||||
<enum>QComboBox::AdjustToMinimumContentsLength</enum>
|
||||
</property>
|
||||
<property name="minimumContentsLength">
|
||||
<number>30</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="captureFileBrowse">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0" colspan="2">
|
||||
<widget class="QFrame" name="buttonsFrame">
|
||||
<layout class="QHBoxLayout" name="buttonsLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="saveDefaults">
|
||||
<property name="text">
|
||||
<string>Save Defaults</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="open">
|
||||
<property name="text">
|
||||
<string>Open</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="cancel">
|
||||
<property name="text">
|
||||
<string>Cancel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -551,6 +551,35 @@ After interop is enabled you will need to reload any capture.</string>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="replayTab">
|
||||
<attribute name="title">
|
||||
<string>Replay</string>
|
||||
</attribute>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_10">
|
||||
<property name="title">
|
||||
<string>Default Replay Options</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="replayOptionsLayout">
|
||||
<item>
|
||||
<spacer name="verticalSpacer_8">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>414</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="textureTab">
|
||||
<attribute name="title">
|
||||
<string>Texture Viewer</string>
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -102,6 +102,7 @@
|
||||
<addaction name="action_Inject_into_Process"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="action_Open_Capture"/>
|
||||
<addaction name="action_Open_Capture_with_Options"/>
|
||||
<addaction name="action_Save_Capture_Inplace"/>
|
||||
<addaction name="action_Save_Capture_As"/>
|
||||
<addaction name="action_Close_Capture"/>
|
||||
@@ -506,6 +507,14 @@
|
||||
<string>Dia&gnostic Log</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Open_Capture_with_Options">
|
||||
<property name="text">
|
||||
<string>Open Capture with Options</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+Shift+O</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<customwidgets>
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -663,6 +663,7 @@
|
||||
<ClCompile Include="$(IntDir)generated\moc_TextureViewer.cpp" />
|
||||
<ClCompile Include="$(IntDir)generated\moc_TipsDialog.cpp" />
|
||||
<ClCompile Include="$(IntDir)generated\moc_ThumbnailStrip.cpp" />
|
||||
<ClCompile Include="$(IntDir)generated\moc_ReplayOptionsSelector.cpp" />
|
||||
<ClCompile Include="$(IntDir)generated\moc_ToolWindowManager.cpp" />
|
||||
<ClCompile Include="$(IntDir)generated\moc_ToolWindowManagerArea.cpp" />
|
||||
<ClCompile Include="$(IntDir)generated\moc_ToolWindowManagerSplitter.cpp" />
|
||||
@@ -707,6 +708,7 @@
|
||||
<ClCompile Include="Widgets\ResourcePreview.cpp" />
|
||||
<ClCompile Include="Widgets\TextureGoto.cpp" />
|
||||
<ClCompile Include="Widgets\ThumbnailStrip.cpp" />
|
||||
<ClCompile Include="Widgets\ReplayOptionsSelector.cpp" />
|
||||
<ClCompile Include="Widgets\OrderedListEditor.cpp" />
|
||||
<ClCompile Include="Code\CaptureContext.cpp" />
|
||||
<ClCompile Include="Styles\RDStyle\RDStyle.cpp" />
|
||||
@@ -956,6 +958,7 @@
|
||||
<ClInclude Include="$(IntDir)generated\ui_TipsDialog.h" />
|
||||
<ClInclude Include="$(IntDir)generated\ui_TextureViewer.h" />
|
||||
<ClInclude Include="$(IntDir)generated\ui_ThumbnailStrip.h" />
|
||||
<ClInclude Include="$(IntDir)generated\ui_ReplayOptionsSelector.h" />
|
||||
<ClInclude Include="$(IntDir)generated\ui_VirtualFileDialog.h" />
|
||||
<ClInclude Include="$(IntDir)generated\ui_VulkanPipelineStateViewer.h" />
|
||||
<ClInclude Include="Code\RGPInterop.h" />
|
||||
@@ -1120,6 +1123,12 @@
|
||||
<Message>MOC %(Filename).h</Message>
|
||||
<Outputs>$(IntDir)generated\moc_%(Filename).cpp</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="Widgets\ReplayOptionsSelector.h">
|
||||
<AdditionalInputs>%(Fullpath);$(ProjectDir)3rdparty\qt\$(Platform)\bin\moc.exe;%(AdditionalInputs)</AdditionalInputs>
|
||||
<Command>"$(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"</Command>
|
||||
<Message>MOC %(Filename).h</Message>
|
||||
<Outputs>$(IntDir)generated\moc_%(Filename).cpp</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="Widgets\OrderedListEditor.h">
|
||||
<AdditionalInputs>%(Fullpath);$(ProjectDir)3rdparty\qt\$(Platform)\bin\moc.exe;%(AdditionalInputs)</AdditionalInputs>
|
||||
<Command>"$(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"</Command>
|
||||
@@ -1384,6 +1393,12 @@
|
||||
<Message>UIC %(Filename).ui</Message>
|
||||
<Outputs>$(IntDir)generated\ui_%(Filename).h</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="Widgets\ReplayOptionsSelector.ui">
|
||||
<AdditionalInputs>%(Fullpath);$(ProjectDir)3rdparty\qt\$(Platform)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>
|
||||
<Command>"$(ProjectDir)3rdparty\qt\$(Platform)\bin\uic.exe" "%(Fullpath)" -o "$(IntDir)generated\ui_%(Filename).h"</Command>
|
||||
<Message>UIC %(Filename).ui</Message>
|
||||
<Outputs>$(IntDir)generated\ui_%(Filename).h</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="Windows\APIInspector.ui">
|
||||
<AdditionalInputs>%(Fullpath);$(ProjectDir)3rdparty\qt\$(Platform)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>
|
||||
<Command>"$(ProjectDir)3rdparty\qt\$(Platform)\bin\uic.exe" "%(Fullpath)" -o "$(IntDir)generated\ui_%(Filename).h"</Command>
|
||||
|
||||
@@ -723,6 +723,12 @@
|
||||
<ClCompile Include="$(IntDir)generated\moc_LogView.cpp">
|
||||
<Filter>Generated Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Widgets\ReplayOptionsSelector.cpp">
|
||||
<Filter>Widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)generated\moc_ReplayOptionsSelector.cpp">
|
||||
<Filter>Generated Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="3rdparty\flowlayout\FlowLayout.h">
|
||||
@@ -1079,6 +1085,9 @@
|
||||
<ClInclude Include="$(IntDir)generated\ui_LogView.h">
|
||||
<Filter>Generated Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="$(IntDir)generated\ui_ReplayOptionsSelector.h">
|
||||
<Filter>Generated Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Code\pyrenderdoc\pyconversion.h">
|
||||
@@ -1466,6 +1475,10 @@
|
||||
<CustomBuild Include="Windows\LogView.h">
|
||||
<Filter>Windows</Filter>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="Widgets\ReplayOptionsSelector.h">
|
||||
<Filter>Widgets</Filter>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="Widgets\ReplayOptionsSelector.ui" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="Resources\action.png">
|
||||
|
||||
Reference in New Issue
Block a user