Explorar o código

Merge pull request #2032 from bunnei/qt-graphics

Qt graphics configure & V-Sync option
bunnei %!s(int64=10) %!d(string=hai) anos
pai
achega
09063dc5bb

+ 1 - 0
src/citra/config.cpp

@@ -71,6 +71,7 @@ void Config::ReadValues() {
     Settings::values.use_hw_renderer = sdl2_config->GetBoolean("Renderer", "use_hw_renderer", true);
     Settings::values.use_hw_renderer = sdl2_config->GetBoolean("Renderer", "use_hw_renderer", true);
     Settings::values.use_shader_jit = sdl2_config->GetBoolean("Renderer", "use_shader_jit", true);
     Settings::values.use_shader_jit = sdl2_config->GetBoolean("Renderer", "use_shader_jit", true);
     Settings::values.use_scaled_resolution = sdl2_config->GetBoolean("Renderer", "use_scaled_resolution", false);
     Settings::values.use_scaled_resolution = sdl2_config->GetBoolean("Renderer", "use_scaled_resolution", false);
+    Settings::values.use_vsync = sdl2_config->GetBoolean("Renderer", "use_vsync", false);
 
 
     Settings::values.bg_red   = (float)sdl2_config->GetReal("Renderer", "bg_red",   1.0);
     Settings::values.bg_red   = (float)sdl2_config->GetReal("Renderer", "bg_red",   1.0);
     Settings::values.bg_green = (float)sdl2_config->GetReal("Renderer", "bg_green", 1.0);
     Settings::values.bg_green = (float)sdl2_config->GetReal("Renderer", "bg_green", 1.0);

+ 4 - 0
src/citra/default_ini.h

@@ -55,6 +55,10 @@ use_shader_jit =
 # 0 (default): Native, 1: Scaled
 # 0 (default): Native, 1: Scaled
 use_scaled_resolution =
 use_scaled_resolution =
 
 
+# Whether to enable V-Sync (caps the framerate at 60FPS) or not.
+# 0 (default): Off, 1: On
+use_vsync =
+
 # The clear color for the renderer. What shows up on the sides of the bottom screen.
 # The clear color for the renderer. What shows up on the sides of the bottom screen.
 # Must be in range of 0.0-1.0. Defaults to 1.0 for all.
 # Must be in range of 0.0-1.0. Defaults to 1.0 for all.
 bg_red =
 bg_red =

+ 1 - 0
src/citra/emu_window/emu_window_sdl2.cpp

@@ -108,6 +108,7 @@ EmuWindow_SDL2::EmuWindow_SDL2() {
     OnResize();
     OnResize();
     OnMinimalClientAreaChangeRequest(GetActiveConfig().min_client_area_size);
     OnMinimalClientAreaChangeRequest(GetActiveConfig().min_client_area_size);
     SDL_PumpEvents();
     SDL_PumpEvents();
+    SDL_GL_SetSwapInterval(Settings::values.use_vsync);
 
 
     DoneCurrent();
     DoneCurrent();
 }
 }

+ 3 - 0
src/citra_qt/CMakeLists.txt

@@ -22,6 +22,7 @@ set(SRCS
             configure_debug.cpp
             configure_debug.cpp
             configure_dialog.cpp
             configure_dialog.cpp
             configure_general.cpp
             configure_general.cpp
+            configure_graphics.cpp
             configure_system.cpp
             configure_system.cpp
             configure_input.cpp
             configure_input.cpp
             game_list.cpp
             game_list.cpp
@@ -54,6 +55,7 @@ set(HEADERS
             configure_debug.h
             configure_debug.h
             configure_dialog.h
             configure_dialog.h
             configure_general.h
             configure_general.h
+            configure_graphics.h
             configure_system.h
             configure_system.h
             configure_input.h
             configure_input.h
             game_list.h
             game_list.h
@@ -73,6 +75,7 @@ set(UIS
             configure_audio.ui
             configure_audio.ui
             configure_debug.ui
             configure_debug.ui
             configure_general.ui
             configure_general.ui
+            configure_graphics.ui
             configure_system.ui
             configure_system.ui
             configure_input.ui
             configure_input.ui
             hotkeys.ui
             hotkeys.ui

+ 35 - 24
src/citra_qt/bootmanager.cpp

@@ -107,36 +107,13 @@ private:
 };
 };
 
 
 GRenderWindow::GRenderWindow(QWidget* parent, EmuThread* emu_thread) :
 GRenderWindow::GRenderWindow(QWidget* parent, EmuThread* emu_thread) :
-    QWidget(parent), keyboard_id(0), emu_thread(emu_thread) {
+    QWidget(parent), keyboard_id(0), emu_thread(emu_thread), child(nullptr) {
 
 
     std::string window_title = Common::StringFromFormat("Citra | %s-%s", Common::g_scm_branch, Common::g_scm_desc);
     std::string window_title = Common::StringFromFormat("Citra | %s-%s", Common::g_scm_branch, Common::g_scm_desc);
     setWindowTitle(QString::fromStdString(window_title));
     setWindowTitle(QString::fromStdString(window_title));
 
 
     keyboard_id = KeyMap::NewDeviceId();
     keyboard_id = KeyMap::NewDeviceId();
     ReloadSetKeymaps();
     ReloadSetKeymaps();
-
-    // TODO: One of these flags might be interesting: WA_OpaquePaintEvent, WA_NoBackground, WA_DontShowOnScreen, WA_DeleteOnClose
-    QGLFormat fmt;
-    fmt.setVersion(3,3);
-    fmt.setProfile(QGLFormat::CoreProfile);
-    // Requests a forward-compatible context, which is required to get a 3.2+ context on OS X
-    fmt.setOption(QGL::NoDeprecatedFunctions);
-
-    child = new GGLWidgetInternal(fmt, this);
-    QBoxLayout* layout = new QHBoxLayout(this);
-
-    resize(VideoCore::kScreenTopWidth, VideoCore::kScreenTopHeight + VideoCore::kScreenBottomHeight);
-    layout->addWidget(child);
-    layout->setMargin(0);
-    setLayout(layout);
-
-    OnMinimalClientAreaChangeRequest(GetActiveConfig().min_client_area_size);
-
-    OnFramebufferSizeChanged();
-    NotifyClientAreaSizeChanged(std::pair<unsigned,unsigned>(child->width(), child->height()));
-
-    BackupGeometry();
-
 }
 }
 
 
 void GRenderWindow::moveContext()
 void GRenderWindow::moveContext()
@@ -281,6 +258,40 @@ void GRenderWindow::OnClientAreaResized(unsigned width, unsigned height)
     NotifyClientAreaSizeChanged(std::make_pair(width, height));
     NotifyClientAreaSizeChanged(std::make_pair(width, height));
 }
 }
 
 
+void GRenderWindow::InitRenderTarget() {
+    if (child) {
+        delete child;
+    }
+
+    if (layout()) {
+        delete layout();
+    }
+
+    // TODO: One of these flags might be interesting: WA_OpaquePaintEvent, WA_NoBackground, WA_DontShowOnScreen, WA_DeleteOnClose
+    QGLFormat fmt;
+    fmt.setVersion(3, 3);
+    fmt.setProfile(QGLFormat::CoreProfile);
+    fmt.setSwapInterval(Settings::values.use_vsync);
+
+    // Requests a forward-compatible context, which is required to get a 3.2+ context on OS X
+    fmt.setOption(QGL::NoDeprecatedFunctions);
+
+    child = new GGLWidgetInternal(fmt, this);
+    QBoxLayout* layout = new QHBoxLayout(this);
+
+    resize(VideoCore::kScreenTopWidth, VideoCore::kScreenTopHeight + VideoCore::kScreenBottomHeight);
+    layout->addWidget(child);
+    layout->setMargin(0);
+    setLayout(layout);
+
+    OnMinimalClientAreaChangeRequest(GetActiveConfig().min_client_area_size);
+
+    OnFramebufferSizeChanged();
+    NotifyClientAreaSizeChanged(std::pair<unsigned, unsigned>(child->width(), child->height()));
+
+    BackupGeometry();
+}
+
 void GRenderWindow::OnMinimalClientAreaChangeRequest(const std::pair<unsigned,unsigned>& minimal_size) {
 void GRenderWindow::OnMinimalClientAreaChangeRequest(const std::pair<unsigned,unsigned>& minimal_size) {
     setMinimumSize(minimal_size.first, minimal_size.second);
     setMinimumSize(minimal_size.first, minimal_size.second);
 }
 }

+ 2 - 0
src/citra_qt/bootmanager.h

@@ -126,6 +126,8 @@ public:
 
 
     void OnClientAreaResized(unsigned width, unsigned height);
     void OnClientAreaResized(unsigned width, unsigned height);
 
 
+    void InitRenderTarget();
+
 public slots:
 public slots:
     void moveContext();  // overridden
     void moveContext();  // overridden
 
 

+ 2 - 0
src/citra_qt/config.cpp

@@ -48,6 +48,7 @@ void Config::ReadValues() {
     Settings::values.use_hw_renderer = qt_config->value("use_hw_renderer", true).toBool();
     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_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.use_scaled_resolution = qt_config->value("use_scaled_resolution", false).toBool();
+    Settings::values.use_vsync = qt_config->value("use_vsync", false).toBool();
 
 
     Settings::values.bg_red   = qt_config->value("bg_red",   1.0).toFloat();
     Settings::values.bg_red   = qt_config->value("bg_red",   1.0).toFloat();
     Settings::values.bg_green = qt_config->value("bg_green", 1.0).toFloat();
     Settings::values.bg_green = qt_config->value("bg_green", 1.0).toFloat();
@@ -140,6 +141,7 @@ void Config::SaveValues() {
     qt_config->setValue("use_hw_renderer", Settings::values.use_hw_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_shader_jit", Settings::values.use_shader_jit);
     qt_config->setValue("use_scaled_resolution", Settings::values.use_scaled_resolution);
     qt_config->setValue("use_scaled_resolution", Settings::values.use_scaled_resolution);
+    qt_config->setValue("use_vsync", Settings::values.use_vsync);
 
 
     // Cast to double because Qt's written float values are not human-readable
     // Cast to double because Qt's written float values are not human-readable
     qt_config->setValue("bg_red",   (double)Settings::values.bg_red);
     qt_config->setValue("bg_red",   (double)Settings::values.bg_red);

+ 19 - 8
src/citra_qt/configure.ui

@@ -34,11 +34,16 @@
        <string>Input</string>
        <string>Input</string>
       </attribute>
       </attribute>
      </widget>
      </widget>
-      <widget class="ConfigureAudio" name="audioTab">
+      <widget class="ConfigureGraphics" name="graphicsTab">
         <attribute name="title">
         <attribute name="title">
-          <string>Audio</string>
+          <string>Graphics</string>
         </attribute>
         </attribute>
       </widget>
       </widget>
+     <widget class="ConfigureAudio" name="audioTab">
+       <attribute name="title">
+         <string>Audio</string>
+       </attribute>
+     </widget>
      <widget class="ConfigureDebug" name="debugTab">
      <widget class="ConfigureDebug" name="debugTab">
       <attribute name="title">
       <attribute name="title">
        <string>Debug</string>
        <string>Debug</string>
@@ -80,12 +85,18 @@
    <header>configure_debug.h</header>
    <header>configure_debug.h</header>
    <container>1</container>
    <container>1</container>
   </customwidget>
   </customwidget>
-   <customwidget>
-     <class>ConfigureInput</class>
-     <extends>QWidget</extends>
-     <header>configure_input.h</header>
-     <container>1</container>
-   </customwidget>
+  <customwidget>
+   <class>ConfigureInput</class>
+   <extends>QWidget</extends>
+   <header>configure_input.h</header>
+   <container>1</container>
+  </customwidget>
+  <customwidget>
+   <class>ConfigureGraphics</class>
+   <extends>QWidget</extends>
+   <header>configure_graphics.h</header>
+   <container>1</container>
+  </customwidget>
  </customwidgets>
  </customwidgets>
  <resources/>
  <resources/>
  <connections>
  <connections>

+ 2 - 2
src/citra_qt/configure_debug.cpp

@@ -19,13 +19,13 @@ ConfigureDebug::~ConfigureDebug() {
 }
 }
 
 
 void ConfigureDebug::setConfiguration() {
 void ConfigureDebug::setConfiguration() {
-    ui->toogle_gdbstub->setChecked(Settings::values.use_gdbstub);
+    ui->toggle_gdbstub->setChecked(Settings::values.use_gdbstub);
     ui->gdbport_spinbox->setEnabled(Settings::values.use_gdbstub);
     ui->gdbport_spinbox->setEnabled(Settings::values.use_gdbstub);
     ui->gdbport_spinbox->setValue(Settings::values.gdbstub_port);
     ui->gdbport_spinbox->setValue(Settings::values.gdbstub_port);
 }
 }
 
 
 void ConfigureDebug::applyConfiguration() {
 void ConfigureDebug::applyConfiguration() {
-    Settings::values.use_gdbstub = ui->toogle_gdbstub->isChecked();
+    Settings::values.use_gdbstub = ui->toggle_gdbstub->isChecked();
     Settings::values.gdbstub_port = ui->gdbport_spinbox->value();
     Settings::values.gdbstub_port = ui->gdbport_spinbox->value();
     Settings::Apply();
     Settings::Apply();
 }
 }

+ 2 - 2
src/citra_qt/configure_debug.ui

@@ -25,7 +25,7 @@
         <item>
         <item>
          <layout class="QHBoxLayout" name="horizontalLayout_3">
          <layout class="QHBoxLayout" name="horizontalLayout_3">
           <item>
           <item>
-           <widget class="QCheckBox" name="toogle_gdbstub">
+           <widget class="QCheckBox" name="toggle_gdbstub">
             <property name="text">
             <property name="text">
              <string>Enable GDB Stub</string>
              <string>Enable GDB Stub</string>
             </property>
             </property>
@@ -83,7 +83,7 @@
  <resources/>
  <resources/>
  <connections>
  <connections>
   <connection>
   <connection>
-   <sender>toogle_gdbstub</sender>
+   <sender>toggle_gdbstub</sender>
    <signal>toggled(bool)</signal>
    <signal>toggled(bool)</signal>
    <receiver>gdbport_spinbox</receiver>
    <receiver>gdbport_spinbox</receiver>
    <slot>setEnabled(bool)</slot>
    <slot>setEnabled(bool)</slot>

+ 1 - 0
src/citra_qt/configure_dialog.cpp

@@ -31,6 +31,7 @@ void ConfigureDialog::applyConfiguration() {
     ui->generalTab->applyConfiguration();
     ui->generalTab->applyConfiguration();
     ui->systemTab->applyConfiguration();
     ui->systemTab->applyConfiguration();
     ui->inputTab->applyConfiguration();
     ui->inputTab->applyConfiguration();
+    ui->graphicsTab->applyConfiguration();
     ui->audioTab->applyConfiguration();
     ui->audioTab->applyConfiguration();
     ui->debugTab->applyConfiguration();
     ui->debugTab->applyConfiguration();
 }
 }

+ 4 - 10
src/citra_qt/configure_general.cpp

@@ -20,20 +20,14 @@ ConfigureGeneral::~ConfigureGeneral() {
 }
 }
 
 
 void ConfigureGeneral::setConfiguration() {
 void ConfigureGeneral::setConfiguration() {
-    ui->toogle_deepscan->setChecked(UISettings::values.gamedir_deepscan);
-    ui->toogle_check_exit->setChecked(UISettings::values.confirm_before_closing);
+    ui->toggle_deepscan->setChecked(UISettings::values.gamedir_deepscan);
+    ui->toggle_check_exit->setChecked(UISettings::values.confirm_before_closing);
     ui->region_combobox->setCurrentIndex(Settings::values.region_value);
     ui->region_combobox->setCurrentIndex(Settings::values.region_value);
-    ui->toogle_hw_renderer->setChecked(Settings::values.use_hw_renderer);
-    ui->toogle_shader_jit->setChecked(Settings::values.use_shader_jit);
-    ui->toogle_scaled_resolution->setChecked(Settings::values.use_scaled_resolution);
 }
 }
 
 
 void ConfigureGeneral::applyConfiguration() {
 void ConfigureGeneral::applyConfiguration() {
-    UISettings::values.gamedir_deepscan = ui->toogle_deepscan->isChecked();
-    UISettings::values.confirm_before_closing = ui->toogle_check_exit->isChecked();
+    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();
-    Settings::values.use_hw_renderer = ui->toogle_hw_renderer->isChecked();
-    Settings::values.use_shader_jit = ui->toogle_shader_jit->isChecked();
-    Settings::values.use_scaled_resolution = ui->toogle_scaled_resolution->isChecked();
     Settings::Apply();
     Settings::Apply();
 }
 }

+ 2 - 36
src/citra_qt/configure_general.ui

@@ -25,14 +25,14 @@
         <item>
         <item>
          <layout class="QVBoxLayout" name="verticalLayout_2">
          <layout class="QVBoxLayout" name="verticalLayout_2">
           <item>
           <item>
-           <widget class="QCheckBox" name="toogle_deepscan">
+           <widget class="QCheckBox" name="toggle_deepscan">
             <property name="text">
             <property name="text">
              <string>Recursive scan for game folder</string>
              <string>Recursive scan for game folder</string>
             </property>
             </property>
            </widget>
            </widget>
           </item>
           </item>
           <item>
           <item>
-           <widget class="QCheckBox" name="toogle_check_exit">
+           <widget class="QCheckBox" name="toggle_check_exit">
             <property name="text">
             <property name="text">
              <string>Confirm exit while emulation is running</string>
              <string>Confirm exit while emulation is running</string>
             </property>
             </property>
@@ -106,40 +106,6 @@
        </layout>
        </layout>
       </widget>
       </widget>
      </item>
      </item>
-     <item>
-      <widget class="QGroupBox" name="groupBox_2">
-       <property name="title">
-        <string>Performance</string>
-       </property>
-       <layout class="QHBoxLayout" name="horizontalLayout_2">
-        <item>
-         <layout class="QVBoxLayout" name="verticalLayout_3">
-          <item>
-           <widget class="QCheckBox" name="toogle_hw_renderer">
-            <property name="text">
-             <string>Enable hardware renderer</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QCheckBox" name="toogle_shader_jit">
-            <property name="text">
-             <string>Enable shader JIT</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QCheckBox" name="toogle_scaled_resolution">
-            <property name="text">
-             <string>Enable scaled resolution</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </item>
-       </layout>
-      </widget>
-     </item>
      <item>
      <item>
       <widget class="QGroupBox" name="groupBox_3">
       <widget class="QGroupBox" name="groupBox_3">
        <property name="title">
        <property name="title">

+ 37 - 0
src/citra_qt/configure_graphics.cpp

@@ -0,0 +1,37 @@
+// Copyright 2016 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "citra_qt/configure_graphics.h"
+#include "ui_configure_graphics.h"
+
+#include "core/settings.h"
+#include "core/system.h"
+
+ConfigureGraphics::ConfigureGraphics(QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::ConfigureGraphics)
+{
+    ui->setupUi(this);
+    this->setConfiguration();
+
+    ui->toggle_vsync->setEnabled(!System::IsPoweredOn());
+}
+
+ConfigureGraphics::~ConfigureGraphics() {
+}
+
+void ConfigureGraphics::setConfiguration() {
+    ui->toggle_hw_renderer->setChecked(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->toggle_vsync->setChecked(Settings::values.use_vsync);
+}
+
+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.use_vsync = ui->toggle_vsync->isChecked();
+    Settings::Apply();
+}

+ 29 - 0
src/citra_qt/configure_graphics.h

@@ -0,0 +1,29 @@
+// Copyright 2016 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <memory>
+#include <QWidget>
+
+namespace Ui {
+class ConfigureGraphics;
+}
+
+class ConfigureGraphics : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit ConfigureGraphics(QWidget *parent = nullptr);
+    ~ConfigureGraphics();
+
+    void applyConfiguration();
+
+private:
+    void setConfiguration();
+
+private:
+    std::unique_ptr<Ui::ConfigureGraphics> ui;
+};

+ 92 - 0
src/citra_qt/configure_graphics.ui

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ConfigureGraphics</class>
+ <widget class="QWidget" name="ConfigureGraphics">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>300</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout_3">
+     <item>
+      <widget class="QGroupBox" name="groupBox">
+       <property name="title">
+        <string>Graphics</string>
+       </property>
+       <layout class="QVBoxLayout" name="verticalLayout_2">
+         <item>
+           <widget class="QCheckBox" name="toggle_hw_renderer">
+             <property name="text">
+               <string>Enable hardware renderer</string>
+             </property>
+           </widget>
+         </item>
+         <item>
+           <widget class="QCheckBox" name="toggle_shader_jit">
+             <property name="text">
+               <string>Enable shader JIT</string>
+             </property>
+           </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>
+             </property>
+           </widget>
+         </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>toggle_gdbstub</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>gdbport_spinbox</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>84</x>
+     <y>157</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>342</x>
+     <y>158</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>

+ 2 - 0
src/citra_qt/main.cpp

@@ -243,7 +243,9 @@ bool GMainWindow::InitializeSystem() {
     if (emu_thread != nullptr)
     if (emu_thread != nullptr)
         ShutdownGame();
         ShutdownGame();
 
 
+    render_window->InitRenderTarget();
     render_window->MakeCurrent();
     render_window->MakeCurrent();
+
     if (!gladLoadGL()) {
     if (!gladLoadGL()) {
         QMessageBox::critical(this, tr("Error while starting Citra!"),
         QMessageBox::critical(this, tr("Error while starting Citra!"),
                               tr("Failed to initialize the video core!\n\n"
                               tr("Failed to initialize the video core!\n\n"

+ 1 - 0
src/core/settings.h

@@ -72,6 +72,7 @@ struct Values {
     bool use_hw_renderer;
     bool use_hw_renderer;
     bool use_shader_jit;
     bool use_shader_jit;
     bool use_scaled_resolution;
     bool use_scaled_resolution;
+    bool use_vsync;
 
 
     float bg_red;
     float bg_red;
     float bg_green;
     float bg_green;

+ 10 - 0
src/core/system.cpp

@@ -17,6 +17,8 @@
 
 
 namespace System {
 namespace System {
 
 
+static bool is_powered_on{ false };
+
 Result Init(EmuWindow* emu_window) {
 Result Init(EmuWindow* emu_window) {
     Core::Init();
     Core::Init();
     CoreTiming::Init();
     CoreTiming::Init();
@@ -30,9 +32,15 @@ Result Init(EmuWindow* emu_window) {
     AudioCore::Init();
     AudioCore::Init();
     GDBStub::Init();
     GDBStub::Init();
 
 
+    is_powered_on = true;
+
     return Result::Success;
     return Result::Success;
 }
 }
 
 
+bool IsPoweredOn() {
+    return is_powered_on;
+}
+
 void Shutdown() {
 void Shutdown() {
     GDBStub::Shutdown();
     GDBStub::Shutdown();
     AudioCore::Shutdown();
     AudioCore::Shutdown();
@@ -42,6 +50,8 @@ void Shutdown() {
     HW::Shutdown();
     HW::Shutdown();
     CoreTiming::Shutdown();
     CoreTiming::Shutdown();
     Core::Shutdown();
     Core::Shutdown();
+
+    is_powered_on = false;
 }
 }
 
 
 } // namespace
 } // namespace

+ 1 - 0
src/core/system.h

@@ -16,6 +16,7 @@ enum class Result {
 };
 };
 
 
 Result Init(EmuWindow* emu_window);
 Result Init(EmuWindow* emu_window);
+bool IsPoweredOn();
 void Shutdown();
 void Shutdown();
 
 
 }
 }

+ 1 - 0
src/video_core/video_core.cpp

@@ -22,6 +22,7 @@ std::unique_ptr<RendererBase> g_renderer;             ///< Renderer plugin
 std::atomic<bool> g_hw_renderer_enabled;
 std::atomic<bool> g_hw_renderer_enabled;
 std::atomic<bool> g_shader_jit_enabled;
 std::atomic<bool> g_shader_jit_enabled;
 std::atomic<bool> g_scaled_resolution_enabled;
 std::atomic<bool> g_scaled_resolution_enabled;
+std::atomic<bool> g_vsync_enabled;
 
 
 /// Initialize the video core
 /// Initialize the video core
 bool Init(EmuWindow* emu_window) {
 bool Init(EmuWindow* emu_window) {