summaryrefslogtreecommitdiffstats
path: root/src/citra_qt
diff options
context:
space:
mode:
Diffstat (limited to 'src/citra_qt')
-rw-r--r--src/citra_qt/CMakeLists.txt4
-rw-r--r--src/citra_qt/bootmanager.cpp12
-rw-r--r--src/citra_qt/bootmanager.h4
-rw-r--r--src/citra_qt/config.cpp43
-rw-r--r--src/citra_qt/configure_audio.cpp33
-rw-r--r--src/citra_qt/configure_audio.h3
-rw-r--r--src/citra_qt/configure_audio.ui15
-rw-r--r--src/citra_qt/configure_general.cpp6
-rw-r--r--src/citra_qt/configure_general.ui45
-rw-r--r--src/citra_qt/configure_graphics.cpp76
-rw-r--r--src/citra_qt/configure_graphics.ui90
-rw-r--r--src/citra_qt/configure_input.cpp1
-rw-r--r--src/citra_qt/configure_input.ui3
-rw-r--r--src/citra_qt/configure_system.ui3
-rw-r--r--src/citra_qt/debugger/callstack.cpp1
-rw-r--r--src/citra_qt/debugger/graphics/graphics_cmdlists.cpp15
-rw-r--r--src/citra_qt/debugger/graphics/graphics_surface.cpp20
-rw-r--r--src/citra_qt/debugger/graphics/graphics_tracing.cpp4
-rw-r--r--src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp15
-rw-r--r--src/citra_qt/debugger/graphics/graphics_vertex_shader.h3
-rw-r--r--src/citra_qt/debugger/ramview.cpp12
-rw-r--r--src/citra_qt/debugger/ramview.h17
-rw-r--r--src/citra_qt/debugger/wait_tree.cpp9
-rw-r--r--src/citra_qt/main.cpp3
-rw-r--r--src/citra_qt/util/spinbox.cpp7
25 files changed, 326 insertions, 118 deletions
diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt
index 93f1c339d..d4460bf01 100644
--- a/src/citra_qt/CMakeLists.txt
+++ b/src/citra_qt/CMakeLists.txt
@@ -14,7 +14,6 @@ set(SRCS
debugger/graphics/graphics_tracing.cpp
debugger/graphics/graphics_vertex_shader.cpp
debugger/profiler.cpp
- debugger/ramview.cpp
debugger/registers.cpp
debugger/wait_tree.cpp
util/spinbox.cpp
@@ -48,7 +47,6 @@ set(HEADERS
debugger/graphics/graphics_tracing.h
debugger/graphics/graphics_vertex_shader.h
debugger/profiler.h
- debugger/ramview.h
debugger/registers.h
debugger/wait_tree.h
util/spinbox.h
@@ -100,7 +98,7 @@ if (APPLE)
else()
add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS})
endif()
-target_link_libraries(citra-qt core video_core audio_core common qhexedit)
+target_link_libraries(citra-qt core video_core audio_core common)
target_link_libraries(citra-qt ${OPENGL_gl_LIBRARY} ${CITRA_QT_LIBS})
target_link_libraries(citra-qt ${PLATFORM_LIBRARIES} Threads::Threads)
diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index 57fde6caa..948db384d 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -99,7 +99,7 @@ private:
};
GRenderWindow::GRenderWindow(QWidget* parent, EmuThread* emu_thread)
- : QWidget(parent), keyboard_id(0), emu_thread(emu_thread), child(nullptr) {
+ : QWidget(parent), child(nullptr), keyboard_id(0), emu_thread(emu_thread) {
std::string window_title =
Common::StringFromFormat("Citra | %s-%s", Common::g_scm_branch, Common::g_scm_desc);
@@ -191,6 +191,7 @@ qreal GRenderWindow::windowPixelRatio() {
}
void GRenderWindow::closeEvent(QCloseEvent* event) {
+ motion_emu = nullptr;
emit Closed();
QWidget::closeEvent(event);
}
@@ -204,11 +205,13 @@ void GRenderWindow::keyReleaseEvent(QKeyEvent* event) {
}
void GRenderWindow::mousePressEvent(QMouseEvent* event) {
+ auto pos = event->pos();
if (event->button() == Qt::LeftButton) {
- auto pos = event->pos();
qreal pixelRatio = windowPixelRatio();
this->TouchPressed(static_cast<unsigned>(pos.x() * pixelRatio),
static_cast<unsigned>(pos.y() * pixelRatio));
+ } else if (event->button() == Qt::RightButton) {
+ motion_emu->BeginTilt(pos.x(), pos.y());
}
}
@@ -217,11 +220,14 @@ void GRenderWindow::mouseMoveEvent(QMouseEvent* event) {
qreal pixelRatio = windowPixelRatio();
this->TouchMoved(std::max(static_cast<unsigned>(pos.x() * pixelRatio), 0u),
std::max(static_cast<unsigned>(pos.y() * pixelRatio), 0u));
+ motion_emu->Tilt(pos.x(), pos.y());
}
void GRenderWindow::mouseReleaseEvent(QMouseEvent* event) {
if (event->button() == Qt::LeftButton)
this->TouchReleased();
+ else if (event->button() == Qt::RightButton)
+ motion_emu->EndTilt();
}
void GRenderWindow::ReloadSetKeymaps() {
@@ -279,11 +285,13 @@ void GRenderWindow::OnMinimalClientAreaChangeRequest(
}
void GRenderWindow::OnEmulationStarting(EmuThread* emu_thread) {
+ motion_emu = std::make_unique<Motion::MotionEmu>(*this);
this->emu_thread = emu_thread;
child->DisablePainting();
}
void GRenderWindow::OnEmulationStopping() {
+ motion_emu = nullptr;
emu_thread = nullptr;
child->EnablePainting();
}
diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h
index 43015390b..7dac1c480 100644
--- a/src/citra_qt/bootmanager.h
+++ b/src/citra_qt/bootmanager.h
@@ -11,6 +11,7 @@
#include <QThread>
#include "common/thread.h"
#include "core/frontend/emu_window.h"
+#include "core/frontend/motion_emu.h"
class QKeyEvent;
class QScreen;
@@ -156,6 +157,9 @@ private:
EmuThread* emu_thread;
+ /// Motion sensors emulation
+ std::unique_ptr<Motion::MotionEmu> motion_emu;
+
protected:
void showEvent(QShowEvent* event) override;
};
diff --git a/src/citra_qt/config.cpp b/src/citra_qt/config.cpp
index 06a4e9d25..b65f57fdc 100644
--- a/src/citra_qt/config.cpp
+++ b/src/citra_qt/config.cpp
@@ -44,8 +44,7 @@ void Config::ReadValues() {
qt_config->beginGroup("Renderer");
Settings::values.use_hw_renderer = qt_config->value("use_hw_renderer", true).toBool();
Settings::values.use_shader_jit = qt_config->value("use_shader_jit", true).toBool();
- Settings::values.use_scaled_resolution =
- qt_config->value("use_scaled_resolution", false).toBool();
+ Settings::values.resolution_factor = qt_config->value("resolution_factor", 1.0).toFloat();
Settings::values.use_vsync = qt_config->value("use_vsync", false).toBool();
Settings::values.toggle_framelimit = qt_config->value("toggle_framelimit", true).toBool();
@@ -64,6 +63,24 @@ void Config::ReadValues() {
Settings::values.sink_id = qt_config->value("output_engine", "auto").toString().toStdString();
Settings::values.enable_audio_stretching =
qt_config->value("enable_audio_stretching", true).toBool();
+ Settings::values.audio_device_id =
+ qt_config->value("output_device", "auto").toString().toStdString();
+ qt_config->endGroup();
+
+ using namespace Service::CAM;
+ qt_config->beginGroup("Camera");
+ Settings::values.camera_name[OuterRightCamera] =
+ qt_config->value("camera_outer_right_name", "blank").toString().toStdString();
+ Settings::values.camera_config[OuterRightCamera] =
+ qt_config->value("camera_outer_right_config", "").toString().toStdString();
+ Settings::values.camera_name[InnerCamera] =
+ qt_config->value("camera_inner_name", "blank").toString().toStdString();
+ Settings::values.camera_config[InnerCamera] =
+ qt_config->value("camera_inner_config", "").toString().toStdString();
+ Settings::values.camera_name[OuterLeftCamera] =
+ qt_config->value("camera_outer_left_name", "blank").toString().toStdString();
+ Settings::values.camera_config[OuterLeftCamera] =
+ qt_config->value("camera_outer_left_config", "").toString().toStdString();
qt_config->endGroup();
qt_config->beginGroup("Data Storage");
@@ -72,7 +89,8 @@ void Config::ReadValues() {
qt_config->beginGroup("System");
Settings::values.is_new_3ds = qt_config->value("is_new_3ds", false).toBool();
- Settings::values.region_value = qt_config->value("region_value", 1).toInt();
+ Settings::values.region_value =
+ qt_config->value("region_value", Settings::REGION_VALUE_AUTO_SELECT).toInt();
qt_config->endGroup();
qt_config->beginGroup("Miscellaneous");
@@ -151,7 +169,7 @@ void Config::SaveValues() {
qt_config->beginGroup("Renderer");
qt_config->setValue("use_hw_renderer", Settings::values.use_hw_renderer);
qt_config->setValue("use_shader_jit", Settings::values.use_shader_jit);
- qt_config->setValue("use_scaled_resolution", Settings::values.use_scaled_resolution);
+ qt_config->setValue("resolution_factor", (double)Settings::values.resolution_factor);
qt_config->setValue("use_vsync", Settings::values.use_vsync);
qt_config->setValue("toggle_framelimit", Settings::values.toggle_framelimit);
@@ -169,6 +187,23 @@ void Config::SaveValues() {
qt_config->beginGroup("Audio");
qt_config->setValue("output_engine", QString::fromStdString(Settings::values.sink_id));
qt_config->setValue("enable_audio_stretching", Settings::values.enable_audio_stretching);
+ qt_config->setValue("output_device", QString::fromStdString(Settings::values.audio_device_id));
+ qt_config->endGroup();
+
+ using namespace Service::CAM;
+ qt_config->beginGroup("Camera");
+ qt_config->setValue("camera_outer_right_name",
+ QString::fromStdString(Settings::values.camera_name[OuterRightCamera]));
+ qt_config->setValue("camera_outer_right_config",
+ QString::fromStdString(Settings::values.camera_config[OuterRightCamera]));
+ qt_config->setValue("camera_inner_name",
+ QString::fromStdString(Settings::values.camera_name[InnerCamera]));
+ qt_config->setValue("camera_inner_config",
+ QString::fromStdString(Settings::values.camera_config[InnerCamera]));
+ qt_config->setValue("camera_outer_left_name",
+ QString::fromStdString(Settings::values.camera_name[OuterLeftCamera]));
+ qt_config->setValue("camera_outer_left_config",
+ QString::fromStdString(Settings::values.camera_config[OuterLeftCamera]));
qt_config->endGroup();
qt_config->beginGroup("Data Storage");
diff --git a/src/citra_qt/configure_audio.cpp b/src/citra_qt/configure_audio.cpp
index 3cdd4c780..3ddcf9232 100644
--- a/src/citra_qt/configure_audio.cpp
+++ b/src/citra_qt/configure_audio.cpp
@@ -2,6 +2,9 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <memory>
+#include "audio_core/audio_core.h"
+#include "audio_core/sink.h"
#include "audio_core/sink_details.h"
#include "citra_qt/configure_audio.h"
#include "core/settings.h"
@@ -18,6 +21,8 @@ ConfigureAudio::ConfigureAudio(QWidget* parent)
}
this->setConfiguration();
+ connect(ui->output_sink_combo_box, SIGNAL(currentIndexChanged(int)), this,
+ SLOT(updateAudioDevices(int)));
}
ConfigureAudio::~ConfigureAudio() {}
@@ -33,6 +38,19 @@ void ConfigureAudio::setConfiguration() {
ui->output_sink_combo_box->setCurrentIndex(new_sink_index);
ui->toggle_audio_stretching->setChecked(Settings::values.enable_audio_stretching);
+
+ // The device list cannot be pre-populated (nor listed) until the output sink is known.
+ updateAudioDevices(new_sink_index);
+
+ int new_device_index = -1;
+ for (int index = 0; index < ui->audio_device_combo_box->count(); index++) {
+ if (ui->audio_device_combo_box->itemText(index).toStdString() ==
+ Settings::values.audio_device_id) {
+ new_device_index = index;
+ break;
+ }
+ }
+ ui->audio_device_combo_box->setCurrentIndex(new_device_index);
}
void ConfigureAudio::applyConfiguration() {
@@ -40,5 +58,20 @@ void ConfigureAudio::applyConfiguration() {
ui->output_sink_combo_box->itemText(ui->output_sink_combo_box->currentIndex())
.toStdString();
Settings::values.enable_audio_stretching = ui->toggle_audio_stretching->isChecked();
+ Settings::values.audio_device_id =
+ ui->audio_device_combo_box->itemText(ui->audio_device_combo_box->currentIndex())
+ .toStdString();
Settings::Apply();
}
+
+void ConfigureAudio::updateAudioDevices(int sink_index) {
+ ui->audio_device_combo_box->clear();
+ ui->audio_device_combo_box->addItem("auto");
+
+ std::string sink_id = ui->output_sink_combo_box->itemText(sink_index).toStdString();
+ std::vector<std::string> device_list =
+ AudioCore::GetSinkDetails(sink_id).factory()->GetDeviceList();
+ for (const auto& device : device_list) {
+ ui->audio_device_combo_box->addItem(device.c_str());
+ }
+}
diff --git a/src/citra_qt/configure_audio.h b/src/citra_qt/configure_audio.h
index 51df2e27b..8190e694f 100644
--- a/src/citra_qt/configure_audio.h
+++ b/src/citra_qt/configure_audio.h
@@ -20,6 +20,9 @@ public:
void applyConfiguration();
+public slots:
+ void updateAudioDevices(int sink_index);
+
private:
void setConfiguration();
diff --git a/src/citra_qt/configure_audio.ui b/src/citra_qt/configure_audio.ui
index 3e2b4635f..dd870eb61 100644
--- a/src/citra_qt/configure_audio.ui
+++ b/src/citra_qt/configure_audio.ui
@@ -35,6 +35,21 @@
</property>
</widget>
</item>
+ <item>
+ <layout class="QHBoxLayout">
+ <item>
+ <widget class="QLabel">
+ <property name="text">
+ <string>Audio Device:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="audio_device_combo_box">
+ </widget>
+ </item>
+ </layout>
+ </item>
</layout>
</widget>
</item>
diff --git a/src/citra_qt/configure_general.cpp b/src/citra_qt/configure_general.cpp
index 03cd8835b..ac90a6df4 100644
--- a/src/citra_qt/configure_general.cpp
+++ b/src/citra_qt/configure_general.cpp
@@ -23,13 +23,15 @@ void ConfigureGeneral::setConfiguration() {
ui->toggle_deepscan->setChecked(UISettings::values.gamedir_deepscan);
ui->toggle_check_exit->setChecked(UISettings::values.confirm_before_closing);
ui->toggle_cpu_jit->setChecked(Settings::values.use_cpu_jit);
- ui->region_combobox->setCurrentIndex(Settings::values.region_value);
+
+ // The first item is "auto-select" with actual value -1, so plus one here will do the trick
+ ui->region_combobox->setCurrentIndex(Settings::values.region_value + 1);
}
void ConfigureGeneral::applyConfiguration() {
UISettings::values.gamedir_deepscan = ui->toggle_deepscan->isChecked();
UISettings::values.confirm_before_closing = ui->toggle_check_exit->isChecked();
- Settings::values.region_value = ui->region_combobox->currentIndex();
+ Settings::values.region_value = ui->region_combobox->currentIndex() - 1;
Settings::values.use_cpu_jit = ui->toggle_cpu_jit->isChecked();
Settings::Apply();
}
diff --git a/src/citra_qt/configure_general.ui b/src/citra_qt/configure_general.ui
index 81688113f..0f3352a1d 100644
--- a/src/citra_qt/configure_general.ui
+++ b/src/citra_qt/configure_general.ui
@@ -43,26 +43,26 @@
</layout>
</widget>
</item>
- <item>
- <widget class="QGroupBox" name="groupBox_2">
- <property name="title">
- <string>Performance</string>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_7">
- <item>
- <layout class="QVBoxLayout" name="verticalLayout_5">
- <item>
- <widget class="QCheckBox" name="toggle_cpu_jit">
- <property name="text">
- <string>Enable CPU JIT</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>Performance</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_7">
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <item>
+ <widget class="QCheckBox" name="toggle_cpu_jit">
+ <property name="text">
+ <string>Enable CPU JIT</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
<item>
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
@@ -84,6 +84,11 @@
<widget class="QComboBox" name="region_combobox">
<item>
<property name="text">
+ <string>Auto-select</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
<string notr="true">JPN</string>
</property>
</item>
diff --git a/src/citra_qt/configure_graphics.cpp b/src/citra_qt/configure_graphics.cpp
index cea7db388..54f799b47 100644
--- a/src/citra_qt/configure_graphics.cpp
+++ b/src/citra_qt/configure_graphics.cpp
@@ -18,10 +18,81 @@ ConfigureGraphics::ConfigureGraphics(QWidget* parent)
ConfigureGraphics::~ConfigureGraphics() {}
+enum class Resolution : int {
+ Auto,
+ Scale1x,
+ Scale2x,
+ Scale3x,
+ Scale4x,
+ Scale5x,
+ Scale6x,
+ Scale7x,
+ Scale8x,
+ Scale9x,
+ Scale10x,
+};
+
+float ToResolutionFactor(Resolution option) {
+ switch (option) {
+ case Resolution::Auto:
+ return 0.f;
+ case Resolution::Scale1x:
+ return 1.f;
+ case Resolution::Scale2x:
+ return 2.f;
+ case Resolution::Scale3x:
+ return 3.f;
+ case Resolution::Scale4x:
+ return 4.f;
+ case Resolution::Scale5x:
+ return 5.f;
+ case Resolution::Scale6x:
+ return 6.f;
+ case Resolution::Scale7x:
+ return 7.f;
+ case Resolution::Scale8x:
+ return 8.f;
+ case Resolution::Scale9x:
+ return 9.f;
+ case Resolution::Scale10x:
+ return 10.f;
+ }
+ return 0.f;
+}
+
+Resolution FromResolutionFactor(float factor) {
+ if (factor == 0.f) {
+ return Resolution::Auto;
+ } else if (factor == 1.f) {
+ return Resolution::Scale1x;
+ } else if (factor == 2.f) {
+ return Resolution::Scale2x;
+ } else if (factor == 3.f) {
+ return Resolution::Scale3x;
+ } else if (factor == 4.f) {
+ return Resolution::Scale4x;
+ } else if (factor == 5.f) {
+ return Resolution::Scale5x;
+ } else if (factor == 6.f) {
+ return Resolution::Scale6x;
+ } else if (factor == 7.f) {
+ return Resolution::Scale7x;
+ } else if (factor == 8.f) {
+ return Resolution::Scale8x;
+ } else if (factor == 9.f) {
+ return Resolution::Scale9x;
+ } else if (factor == 10.f) {
+ return Resolution::Scale10x;
+ }
+ return Resolution::Auto;
+}
+
void ConfigureGraphics::setConfiguration() {
ui->toggle_hw_renderer->setChecked(Settings::values.use_hw_renderer);
+ ui->resolution_factor_combobox->setEnabled(Settings::values.use_hw_renderer);
ui->toggle_shader_jit->setChecked(Settings::values.use_shader_jit);
- ui->toggle_scaled_resolution->setChecked(Settings::values.use_scaled_resolution);
+ ui->resolution_factor_combobox->setCurrentIndex(
+ static_cast<int>(FromResolutionFactor(Settings::values.resolution_factor)));
ui->toggle_vsync->setChecked(Settings::values.use_vsync);
ui->toggle_framelimit->setChecked(Settings::values.toggle_framelimit);
ui->layout_combobox->setCurrentIndex(static_cast<int>(Settings::values.layout_option));
@@ -31,7 +102,8 @@ void ConfigureGraphics::setConfiguration() {
void ConfigureGraphics::applyConfiguration() {
Settings::values.use_hw_renderer = ui->toggle_hw_renderer->isChecked();
Settings::values.use_shader_jit = ui->toggle_shader_jit->isChecked();
- Settings::values.use_scaled_resolution = ui->toggle_scaled_resolution->isChecked();
+ Settings::values.resolution_factor =
+ ToResolutionFactor(static_cast<Resolution>(ui->resolution_factor_combobox->currentIndex()));
Settings::values.use_vsync = ui->toggle_vsync->isChecked();
Settings::values.toggle_framelimit = ui->toggle_framelimit->isChecked();
Settings::values.layout_option =
diff --git a/src/citra_qt/configure_graphics.ui b/src/citra_qt/configure_graphics.ui
index 964aa0bbd..a091f4c60 100644
--- a/src/citra_qt/configure_graphics.ui
+++ b/src/citra_qt/configure_graphics.ui
@@ -37,13 +37,6 @@
</widget>
</item>
<item>
- <widget class="QCheckBox" name="toggle_scaled_resolution">
- <property name="text">
- <string>Enable scaled resolution</string>
- </property>
- </widget>
- </item>
- <item>
<widget class="QCheckBox" name="toggle_vsync">
<property name="text">
<string>Enable V-Sync</string>
@@ -57,6 +50,76 @@
</property>
</widget>
</item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Internal Resolution:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="resolution_factor_combobox">
+ <item>
+ <property name="text">
+ <string notr="true">Auto (Window Size)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Native (400x240)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">2x Native (800x480)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">3x Native (1200x720)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">4x Native (1600x960)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">5x Native (2000x1200)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">6x Native (2400x1440)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">7x Native (2800x1680)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">8x Native (3200x1920)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">9x Native (3600x2160)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">10x Native (4000x2400)</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </item>
</layout>
</widget>
</item>
@@ -69,9 +132,9 @@
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
- <layout class="QVBoxLayout" name="verticalLayout_2">
+ <layout class="QVBoxLayout" name="verticalLayout_4">
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label1">
<property name="text">
@@ -128,5 +191,12 @@
</layout>
</widget>
<resources/>
- <connections/>
+ <connections>
+ <connection>
+ <sender>toggle_hw_renderer</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>resolution_factor_combobox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ </connections>
</ui>
diff --git a/src/citra_qt/configure_input.cpp b/src/citra_qt/configure_input.cpp
index 3e6803b8a..c29652f32 100644
--- a/src/citra_qt/configure_input.cpp
+++ b/src/citra_qt/configure_input.cpp
@@ -17,7 +17,6 @@ static QString getKeyName(Qt::Key key_code) {
case Qt::Key_Alt:
return QObject::tr("Alt");
case Qt::Key_Meta:
- case -1:
return "";
default:
return QKeySequence(key_code).toString();
diff --git a/src/citra_qt/configure_input.ui b/src/citra_qt/configure_input.ui
index a040d4df4..2760787e5 100644
--- a/src/citra_qt/configure_input.ui
+++ b/src/citra_qt/configure_input.ui
@@ -275,7 +275,6 @@
</layout>
</item>
</layout>
- <zorder></zorder>
</widget>
</item>
<item row="1" column="1">
@@ -521,7 +520,7 @@
<item row="1" column="1">
<layout class="QVBoxLayout" name="verticalLayout_28">
<item>
- <widget class="QLabel" name="label_34">
+ <widget class="QLabel" name="label_36">
<property name="text">
<string>Circle Mod:</string>
</property>
diff --git a/src/citra_qt/configure_system.ui b/src/citra_qt/configure_system.ui
index 6a906b61b..cc54fa37f 100644
--- a/src/citra_qt/configure_system.ui
+++ b/src/citra_qt/configure_system.ui
@@ -129,6 +129,9 @@
</item>
<item row="2" column="1">
<widget class="QComboBox" name="combo_language">
+ <property name="toolTip">
+ <string>Note: this can be overridden when region setting is auto-select</string>
+ </property>
<item>
<property name="text">
<string>Japanese (日本語)</string>
diff --git a/src/citra_qt/debugger/callstack.cpp b/src/citra_qt/debugger/callstack.cpp
index c1db93583..08d2e7a22 100644
--- a/src/citra_qt/debugger/callstack.cpp
+++ b/src/citra_qt/debugger/callstack.cpp
@@ -45,7 +45,6 @@ void CallstackWidget::OnDebugModeEntered() {
if (ARM_Disasm::Decode(insn) == OP_BL) {
std::string name;
// ripped from disasm
- u8 cond = (insn >> 28) & 0xf;
u32 i_offset = insn & 0xffffff;
// Sign-extend the 24-bit offset
if ((i_offset >> 23) & 1)
diff --git a/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp b/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp
index dab529e3a..ee79f0edf 100644
--- a/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp
+++ b/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp
@@ -20,13 +20,14 @@
#include "video_core/debug_utils/debug_utils.h"
#include "video_core/pica.h"
#include "video_core/pica_state.h"
+#include "video_core/texture/texture_decode.h"
namespace {
-QImage LoadTexture(const u8* src, const Pica::DebugUtils::TextureInfo& info) {
+QImage LoadTexture(const u8* src, const Pica::Texture::TextureInfo& info) {
QImage decoded_image(info.width, info.height, QImage::Format_ARGB32);
for (int y = 0; y < info.height; ++y) {
for (int x = 0; x < info.width; ++x) {
- Math::Vec4<u8> color = Pica::DebugUtils::LookupTexture(src, x, y, info, true);
+ Math::Vec4<u8> color = Pica::Texture::LookupTexture(src, x, y, info, true);
decoded_image.setPixel(x, y, qRgba(color.r(), color.g(), color.b(), color.a()));
}
}
@@ -36,9 +37,10 @@ QImage LoadTexture(const u8* src, const Pica::DebugUtils::TextureInfo& info) {
class TextureInfoWidget : public QWidget {
public:
- TextureInfoWidget(const u8* src, const Pica::DebugUtils::TextureInfo& info,
+ TextureInfoWidget(const u8* src, const Pica::Texture::TextureInfo& info,
QWidget* parent = nullptr)
: QWidget(parent) {
+
QLabel* image_widget = new QLabel;
QPixmap image_pixmap = QPixmap::fromImage(LoadTexture(src, info));
image_pixmap = image_pixmap.scaled(200, 100, Qt::KeepAspectRatio, Qt::SmoothTransformation);
@@ -135,11 +137,6 @@ void GPUCommandListWidget::OnCommandDoubleClicked(const QModelIndex& index) {
UNREACHABLE_MSG("Unknown texture command");
}
- const auto texture = Pica::g_state.regs.GetTextures()[texture_index];
- const auto config = texture.config;
- const auto format = texture.format;
- const auto info = Pica::DebugUtils::TextureInfo::FromPicaRegister(config, format);
-
// TODO: Open a surface debugger
}
}
@@ -165,7 +162,7 @@ void GPUCommandListWidget::SetCommandInfo(const QModelIndex& index) {
const auto config = texture.config;
const auto format = texture.format;
- const auto info = Pica::DebugUtils::TextureInfo::FromPicaRegister(config, format);
+ const auto info = Pica::Texture::TextureInfo::FromPicaRegister(config, format);
const u8* src = Memory::GetPhysicalPointer(config.GetPhysicalAddress());
new_info_widget = new TextureInfoWidget(src, info);
}
diff --git a/src/citra_qt/debugger/graphics/graphics_surface.cpp b/src/citra_qt/debugger/graphics/graphics_surface.cpp
index 4efd95d3c..bd82b00d4 100644
--- a/src/citra_qt/debugger/graphics/graphics_surface.cpp
+++ b/src/citra_qt/debugger/graphics/graphics_surface.cpp
@@ -18,6 +18,7 @@
#include "core/memory.h"
#include "video_core/pica.h"
#include "video_core/pica_state.h"
+#include "video_core/texture/texture_decode.h"
#include "video_core/utils.h"
SurfacePicture::SurfacePicture(QWidget* parent, GraphicsSurfaceWidget* surface_widget_)
@@ -512,7 +513,7 @@ void GraphicsSurfaceWidget::OnUpdate() {
}
const auto texture = Pica::g_state.regs.GetTextures()[texture_index];
- auto info = Pica::DebugUtils::TextureInfo::FromPicaRegister(texture.config, texture.format);
+ auto info = Pica::Texture::TextureInfo::FromPicaRegister(texture.config, texture.format);
surface_address = info.physical_address;
surface_width = info.width;
@@ -567,28 +568,27 @@ void GraphicsSurfaceWidget::OnUpdate() {
surface_picture_label->show();
- unsigned nibbles_per_pixel = GraphicsSurfaceWidget::NibblesPerPixel(surface_format);
- unsigned stride = nibbles_per_pixel * surface_width / 2;
-
- // We handle depth formats here because DebugUtils only supports TextureFormats
if (surface_format <= Format::MaxTextureFormat) {
-
// Generate a virtual texture
- Pica::DebugUtils::TextureInfo info;
+ Pica::Texture::TextureInfo info;
info.physical_address = surface_address;
info.width = surface_width;
info.height = surface_height;
info.format = static_cast<Pica::Regs::TextureFormat>(surface_format);
- info.stride = stride;
+ info.SetDefaultStride();
for (unsigned int y = 0; y < surface_height; ++y) {
for (unsigned int x = 0; x < surface_width; ++x) {
- Math::Vec4<u8> color = Pica::DebugUtils::LookupTexture(buffer, x, y, info, true);
+ Math::Vec4<u8> color = Pica::Texture::LookupTexture(buffer, x, y, info, true);
decoded_image.setPixel(x, y, qRgba(color.r(), color.g(), color.b(), color.a()));
}
}
-
} else {
+ // We handle depth formats here because DebugUtils only supports TextureFormats
+
+ // TODO(yuriks): Convert to newer tile-based addressing
+ unsigned nibbles_per_pixel = GraphicsSurfaceWidget::NibblesPerPixel(surface_format);
+ unsigned stride = nibbles_per_pixel * surface_width / 2;
ASSERT_MSG(nibbles_per_pixel >= 2,
"Depth decoder only supports formats with at least one byte per pixel");
diff --git a/src/citra_qt/debugger/graphics/graphics_tracing.cpp b/src/citra_qt/debugger/graphics/graphics_tracing.cpp
index 716ed50b8..17f1c5ce2 100644
--- a/src/citra_qt/debugger/graphics/graphics_tracing.cpp
+++ b/src/citra_qt/debugger/graphics/graphics_tracing.cpp
@@ -71,8 +71,8 @@ void GraphicsTracingWidget::StartRecording() {
std::array<u32, 4 * 16> default_attributes;
for (unsigned i = 0; i < 16; ++i) {
for (unsigned comp = 0; comp < 3; ++comp) {
- default_attributes[4 * i + comp] =
- nihstro::to_float24(Pica::g_state.vs_default_attributes[i][comp].ToFloat32());
+ default_attributes[4 * i + comp] = nihstro::to_float24(
+ Pica::g_state.input_default_attributes.attr[i][comp].ToFloat32());
}
}
diff --git a/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp b/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp
index b75b94ef8..489ec5f21 100644
--- a/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp
+++ b/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp
@@ -18,7 +18,9 @@
#include "citra_qt/util/util.h"
#include "video_core/pica.h"
#include "video_core/pica_state.h"
+#include "video_core/shader/debug_data.h"
#include "video_core/shader/shader.h"
+#include "video_core/shader/shader_interpreter.h"
using nihstro::OpCode;
using nihstro::Instruction;
@@ -276,9 +278,6 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
output << 'b' << instr.flow_control.bool_uniform_id << ' ';
}
- u32 target_addr = instr.flow_control.dest_offset;
- u32 target_addr_else = instr.flow_control.dest_offset;
-
if (opcode_info.subtype & OpCode::Info::HasAlternative) {
output << "else jump to 0x" << std::setw(4) << std::right
<< std::setfill('0') << std::hex
@@ -473,7 +472,6 @@ GraphicsVertexShaderWidget::GraphicsVertexShaderWidget(
}
void GraphicsVertexShaderWidget::OnBreakPointHit(Pica::DebugContext::Event event, void* data) {
- auto input = static_cast<Pica::Shader::InputVertex*>(data);
if (event == Pica::DebugContext::Event::VertexShaderInvocation) {
Reload(true, data);
} else {
@@ -513,7 +511,7 @@ void GraphicsVertexShaderWidget::Reload(bool replace_vertex_data, void* vertex_d
auto& shader_config = Pica::g_state.regs.vs;
for (auto instr : shader_setup.program_code)
info.code.push_back({instr});
- int num_attributes = Pica::g_state.regs.vertex_attributes.GetNumTotalAttributes();
+ int num_attributes = shader_config.max_input_attribute_index + 1;
for (auto pattern : shader_setup.swizzle_data)
info.swizzle_info.push_back({pattern});
@@ -522,12 +520,13 @@ void GraphicsVertexShaderWidget::Reload(bool replace_vertex_data, void* vertex_d
info.labels.insert({entry_point, "main"});
// Generate debug information
- debug_data = Pica::g_state.vs.ProduceDebugInfo(input_vertex, num_attributes, shader_config,
- shader_setup);
+ Pica::Shader::InterpreterEngine shader_engine;
+ shader_engine.SetupBatch(shader_setup, entry_point);
+ debug_data = shader_engine.ProduceDebugInfo(shader_setup, input_vertex, shader_config);
// Reload widget state
for (int attr = 0; attr < num_attributes; ++attr) {
- unsigned source_attr = shader_config.input_register_map.GetRegisterForAttribute(attr);
+ unsigned source_attr = shader_config.GetRegisterForAttribute(attr);
input_data_mapping[attr]->setText(QString("-> v%1").arg(source_attr));
input_data_container[attr]->setVisible(true);
}
diff --git a/src/citra_qt/debugger/graphics/graphics_vertex_shader.h b/src/citra_qt/debugger/graphics/graphics_vertex_shader.h
index bedea0bed..c249a2ff8 100644
--- a/src/citra_qt/debugger/graphics/graphics_vertex_shader.h
+++ b/src/citra_qt/debugger/graphics/graphics_vertex_shader.h
@@ -8,6 +8,7 @@
#include <QTreeView>
#include "citra_qt/debugger/graphics/graphics_breakpoint_observer.h"
#include "nihstro/parser_shbin.h"
+#include "video_core/shader/debug_data.h"
#include "video_core/shader/shader.h"
class QLabel;
@@ -81,7 +82,7 @@ private:
nihstro::ShaderInfo info;
Pica::Shader::DebugData<true> debug_data;
- Pica::Shader::InputVertex input_vertex;
+ Pica::Shader::AttributeBuffer input_vertex;
friend class GraphicsVertexShaderModel;
};
diff --git a/src/citra_qt/debugger/ramview.cpp b/src/citra_qt/debugger/ramview.cpp
deleted file mode 100644
index 10a09dda8..000000000
--- a/src/citra_qt/debugger/ramview.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2014 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include "citra_qt/debugger/ramview.h"
-
-GRamView::GRamView(QWidget* parent) : QHexEdit(parent) {}
-
-void GRamView::OnCPUStepped() {
- // TODO: QHexEdit doesn't show vertical scroll bars for > 10MB data streams...
- // setData(QByteArray((const char*)Mem_RAM,sizeof(Mem_RAM)/8));
-}
diff --git a/src/citra_qt/debugger/ramview.h b/src/citra_qt/debugger/ramview.h
deleted file mode 100644
index d01cea93b..000000000
--- a/src/citra_qt/debugger/ramview.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2014 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include "qhexedit.h"
-
-class GRamView : public QHexEdit {
- Q_OBJECT
-
-public:
- explicit GRamView(QWidget* parent = nullptr);
-
-public slots:
- void OnCPUStepped();
-};
diff --git a/src/citra_qt/debugger/wait_tree.cpp b/src/citra_qt/debugger/wait_tree.cpp
index 1d2de5185..b6ecf3819 100644
--- a/src/citra_qt/debugger/wait_tree.cpp
+++ b/src/citra_qt/debugger/wait_tree.cpp
@@ -153,7 +153,8 @@ QString WaitTreeThread::GetText() const {
case THREADSTATUS_WAIT_SLEEP:
status = tr("sleeping");
break;
- case THREADSTATUS_WAIT_SYNCH:
+ case THREADSTATUS_WAIT_SYNCH_ALL:
+ case THREADSTATUS_WAIT_SYNCH_ANY:
status = tr("waiting for objects");
break;
case THREADSTATUS_DORMANT:
@@ -180,7 +181,8 @@ QColor WaitTreeThread::GetColor() const {
return QColor(Qt::GlobalColor::darkRed);
case THREADSTATUS_WAIT_SLEEP:
return QColor(Qt::GlobalColor::darkYellow);
- case THREADSTATUS_WAIT_SYNCH:
+ case THREADSTATUS_WAIT_SYNCH_ALL:
+ case THREADSTATUS_WAIT_SYNCH_ANY:
return QColor(Qt::GlobalColor::red);
case THREADSTATUS_DORMANT:
return QColor(Qt::GlobalColor::darkCyan);
@@ -228,7 +230,8 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeThread::GetChildren() const {
} else {
list.push_back(std::make_unique<WaitTreeMutexList>(thread.held_mutexes));
}
- if (thread.status == THREADSTATUS_WAIT_SYNCH) {
+ if (thread.status == THREADSTATUS_WAIT_SYNCH_ANY ||
+ thread.status == THREADSTATUS_WAIT_SYNCH_ALL) {
list.push_back(std::make_unique<WaitTreeObjectList>(thread.wait_objects,
thread.IsSleepingOnWaitAll()));
}
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index 6d59cf640..f765c0147 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -12,6 +12,7 @@
#include <QFileDialog>
#include <QMessageBox>
#include <QtGui>
+#include <QtWidgets>
#include "citra_qt/bootmanager.h"
#include "citra_qt/config.h"
#include "citra_qt/configure_dialog.h"
@@ -24,7 +25,6 @@
#include "citra_qt/debugger/graphics/graphics_tracing.h"
#include "citra_qt/debugger/graphics/graphics_vertex_shader.h"
#include "citra_qt/debugger/profiler.h"
-#include "citra_qt/debugger/ramview.h"
#include "citra_qt/debugger/registers.h"
#include "citra_qt/debugger/wait_tree.h"
#include "citra_qt/game_list.h"
@@ -46,7 +46,6 @@
#include "core/gdbstub/gdbstub.h"
#include "core/loader/loader.h"
#include "core/settings.h"
-#include "qhexedit.h"
#include "video_core/video_core.h"
#ifdef QT_STATICPLUGIN
diff --git a/src/citra_qt/util/spinbox.cpp b/src/citra_qt/util/spinbox.cpp
index feb0ea1b3..212709007 100644
--- a/src/citra_qt/util/spinbox.cpp
+++ b/src/citra_qt/util/spinbox.cpp
@@ -165,13 +165,6 @@ void CSpinBox::UpdateText() {
// Uppercase digits greater than 9.
mask += ">";
- // The greatest signed 64-bit number has 19 decimal digits.
- // TODO: Could probably make this more generic with some logarithms.
- // For reference, unsigned 64-bit can have up to 20 decimal digits.
- int digits = (num_digits != 0)
- ? num_digits
- : (base == 16) ? 16 : (base == 10) ? 19 : 0xFF; // fallback case...
-
// Match num_digits digits
// Digits irrelevant to the chosen number base are filtered in the validator
mask += QString("H").repeated(std::max(num_digits, 1));