early-access version 2161

This commit is contained in:
pineappleEA 2021-10-27 05:22:08 +02:00
parent 9ddc4e31b1
commit 4350036d17
18 changed files with 72 additions and 72 deletions

View file

@ -1,7 +1,7 @@
yuzu emulator early access yuzu emulator early access
============= =============
This is the source code for early-access 2160. This is the source code for early-access 2161.
## Legal Notice ## Legal Notice

View file

@ -170,7 +170,7 @@ void Adapter::UpdateYuzuSettings(std::size_t port) {
if (pads[port].buttons != 0) { if (pads[port].buttons != 0) {
pad_status.button = pads[port].last_button; pad_status.button = pads[port].last_button;
pad_queue.push(pad_status); pad_queue.Push(pad_status);
} }
// Accounting for a threshold here to ensure an intentional press // Accounting for a threshold here to ensure an intentional press
@ -181,7 +181,7 @@ void Adapter::UpdateYuzuSettings(std::size_t port) {
pad_status.axis = static_cast<PadAxes>(i); pad_status.axis = static_cast<PadAxes>(i);
pad_status.axis_value = value; pad_status.axis_value = value;
pad_status.axis_threshold = axis_threshold; pad_status.axis_threshold = axis_threshold;
pad_queue.push(pad_status); pad_queue.Push(pad_status);
} }
} }
} }
@ -478,18 +478,20 @@ bool Adapter::DeviceConnected(std::size_t port) const {
} }
void Adapter::BeginConfiguration() { void Adapter::BeginConfiguration() {
pad_queue.Clear();
configuring = true; configuring = true;
} }
void Adapter::EndConfiguration() { void Adapter::EndConfiguration() {
pad_queue.Clear();
configuring = false; configuring = false;
} }
Common::MPMCQueue<GCPadStatus>& Adapter::GetPadQueue() { Common::SPSCQueue<GCPadStatus>& Adapter::GetPadQueue() {
return pad_queue; return pad_queue;
} }
const Common::MPMCQueue<GCPadStatus>& Adapter::GetPadQueue() const { const Common::SPSCQueue<GCPadStatus>& Adapter::GetPadQueue() const {
return pad_queue; return pad_queue;
} }

View file

@ -8,8 +8,8 @@
#include <mutex> #include <mutex>
#include <thread> #include <thread>
#include <unordered_map> #include <unordered_map>
#include "common/atomic_threadsafe_queue.h"
#include "common/common_types.h" #include "common/common_types.h"
#include "common/threadsafe_queue.h"
#include "input_common/main.h" #include "input_common/main.h"
struct libusb_context; struct libusb_context;
@ -85,8 +85,8 @@ public:
void BeginConfiguration(); void BeginConfiguration();
void EndConfiguration(); void EndConfiguration();
Common::MPMCQueue<GCPadStatus>& GetPadQueue(); Common::SPSCQueue<GCPadStatus>& GetPadQueue();
const Common::MPMCQueue<GCPadStatus>& GetPadQueue() const; const Common::SPSCQueue<GCPadStatus>& GetPadQueue() const;
GCController& GetPadState(std::size_t port); GCController& GetPadState(std::size_t port);
const GCController& GetPadState(std::size_t port) const; const GCController& GetPadState(std::size_t port) const;
@ -145,7 +145,7 @@ private:
libusb_device_handle* usb_adapter_handle = nullptr; libusb_device_handle* usb_adapter_handle = nullptr;
std::array<GCController, 4> pads; std::array<GCController, 4> pads;
Common::MPMCQueue<GCPadStatus> pad_queue{1024}; Common::SPSCQueue<GCPadStatus> pad_queue;
std::thread adapter_input_thread; std::thread adapter_input_thread;
std::thread adapter_scan_thread; std::thread adapter_scan_thread;

View file

@ -7,7 +7,7 @@
#include <mutex> #include <mutex>
#include <utility> #include <utility>
#include "common/assert.h" #include "common/assert.h"
#include "common/atomic_threadsafe_queue.h" #include "common/threadsafe_queue.h"
#include "input_common/gcadapter/gc_adapter.h" #include "input_common/gcadapter/gc_adapter.h"
#include "input_common/gcadapter/gc_poller.h" #include "input_common/gcadapter/gc_poller.h"
@ -103,7 +103,7 @@ Common::ParamPackage GCButtonFactory::GetNextInput() const {
Common::ParamPackage params; Common::ParamPackage params;
GCAdapter::GCPadStatus pad; GCAdapter::GCPadStatus pad;
auto& queue = adapter->GetPadQueue(); auto& queue = adapter->GetPadQueue();
while (queue.try_pop(pad)) { while (queue.Pop(pad)) {
// This while loop will break on the earliest detected button // This while loop will break on the earliest detected button
params.Set("engine", "gcpad"); params.Set("engine", "gcpad");
params.Set("port", static_cast<s32>(pad.port)); params.Set("port", static_cast<s32>(pad.port));
@ -263,7 +263,7 @@ Common::ParamPackage GCAnalogFactory::GetNextInput() {
GCAdapter::GCPadStatus pad; GCAdapter::GCPadStatus pad;
Common::ParamPackage params; Common::ParamPackage params;
auto& queue = adapter->GetPadQueue(); auto& queue = adapter->GetPadQueue();
while (queue.try_pop(pad)) { while (queue.Pop(pad)) {
if (pad.button != GCAdapter::PadButton::Undefined) { if (pad.button != GCAdapter::PadButton::Undefined) {
params.Set("engine", "gcpad"); params.Set("engine", "gcpad");
params.Set("port", static_cast<s32>(pad.port)); params.Set("port", static_cast<s32>(pad.port));

View file

@ -52,7 +52,7 @@ void Mouse::UpdateYuzuSettings() {
return; return;
} }
mouse_queue.push(MouseStatus{ mouse_queue.Push(MouseStatus{
.button = last_button, .button = last_button,
}); });
} }
@ -153,6 +153,7 @@ void Mouse::ReleaseAllButtons() {
void Mouse::BeginConfiguration() { void Mouse::BeginConfiguration() {
buttons = 0; buttons = 0;
last_button = MouseButton::Undefined; last_button = MouseButton::Undefined;
mouse_queue.Clear();
configuring = true; configuring = true;
} }
@ -164,6 +165,7 @@ void Mouse::EndConfiguration() {
info.data.axis = {0, 0}; info.data.axis = {0, 0};
} }
last_button = MouseButton::Undefined; last_button = MouseButton::Undefined;
mouse_queue.Clear();
configuring = false; configuring = false;
} }
@ -203,11 +205,11 @@ bool Mouse::UnlockButton(std::size_t button_) {
return button_state; return button_state;
} }
Common::MPMCQueue<MouseStatus>& Mouse::GetMouseQueue() { Common::SPSCQueue<MouseStatus>& Mouse::GetMouseQueue() {
return mouse_queue; return mouse_queue;
} }
const Common::MPMCQueue<MouseStatus>& Mouse::GetMouseQueue() const { const Common::SPSCQueue<MouseStatus>& Mouse::GetMouseQueue() const {
return mouse_queue; return mouse_queue;
} }

View file

@ -9,8 +9,8 @@
#include <stop_token> #include <stop_token>
#include <thread> #include <thread>
#include "common/atomic_threadsafe_queue.h"
#include "common/common_types.h" #include "common/common_types.h"
#include "common/threadsafe_queue.h"
#include "common/vector_math.h" #include "common/vector_math.h"
#include "core/frontend/input.h" #include "core/frontend/input.h"
#include "input_common/motion_input.h" #include "input_common/motion_input.h"
@ -79,8 +79,8 @@ public:
[[nodiscard]] bool ToggleButton(std::size_t button_); [[nodiscard]] bool ToggleButton(std::size_t button_);
[[nodiscard]] bool UnlockButton(std::size_t button_); [[nodiscard]] bool UnlockButton(std::size_t button_);
[[nodiscard]] Common::MPMCQueue<MouseStatus>& GetMouseQueue(); [[nodiscard]] Common::SPSCQueue<MouseStatus>& GetMouseQueue();
[[nodiscard]] const Common::MPMCQueue<MouseStatus>& GetMouseQueue() const; [[nodiscard]] const Common::SPSCQueue<MouseStatus>& GetMouseQueue() const;
[[nodiscard]] MouseData& GetMouseState(std::size_t button); [[nodiscard]] MouseData& GetMouseState(std::size_t button);
[[nodiscard]] const MouseData& GetMouseState(std::size_t button) const; [[nodiscard]] const MouseData& GetMouseState(std::size_t button) const;
@ -109,7 +109,7 @@ private:
std::jthread update_thread; std::jthread update_thread;
MouseButton last_button{MouseButton::Undefined}; MouseButton last_button{MouseButton::Undefined};
std::array<MouseInfo, 7> mouse_info; std::array<MouseInfo, 7> mouse_info;
Common::MPMCQueue<MouseStatus> mouse_queue{1024}; Common::SPSCQueue<MouseStatus> mouse_queue;
bool configuring{false}; bool configuring{false};
int mouse_panning_timout{}; int mouse_panning_timout{};
}; };

View file

@ -52,7 +52,7 @@ Common::ParamPackage MouseButtonFactory::GetNextInput() const {
MouseInput::MouseStatus pad; MouseInput::MouseStatus pad;
Common::ParamPackage params; Common::ParamPackage params;
auto& queue = mouse_input->GetMouseQueue(); auto& queue = mouse_input->GetMouseQueue();
while (queue.try_pop(pad)) { while (queue.Pop(pad)) {
// This while loop will break on the earliest detected button // This while loop will break on the earliest detected button
if (pad.button != MouseInput::MouseButton::Undefined) { if (pad.button != MouseInput::MouseButton::Undefined) {
params.Set("engine", "mouse"); params.Set("engine", "mouse");
@ -184,7 +184,7 @@ Common::ParamPackage MouseAnalogFactory::GetNextInput() const {
MouseInput::MouseStatus pad; MouseInput::MouseStatus pad;
Common::ParamPackage params; Common::ParamPackage params;
auto& queue = mouse_input->GetMouseQueue(); auto& queue = mouse_input->GetMouseQueue();
while (queue.try_pop(pad)) { while (queue.Pop(pad)) {
// This while loop will break on the earliest detected button // This while loop will break on the earliest detected button
if (pad.button != MouseInput::MouseButton::Undefined) { if (pad.button != MouseInput::MouseButton::Undefined) {
params.Set("engine", "mouse"); params.Set("engine", "mouse");
@ -227,7 +227,7 @@ Common::ParamPackage MouseMotionFactory::GetNextInput() const {
MouseInput::MouseStatus pad; MouseInput::MouseStatus pad;
Common::ParamPackage params; Common::ParamPackage params;
auto& queue = mouse_input->GetMouseQueue(); auto& queue = mouse_input->GetMouseQueue();
while (queue.try_pop(pad)) { while (queue.Pop(pad)) {
// This while loop will break on the earliest detected button // This while loop will break on the earliest detected button
if (pad.button != MouseInput::MouseButton::Undefined) { if (pad.button != MouseInput::MouseButton::Undefined) {
params.Set("engine", "mouse"); params.Set("engine", "mouse");
@ -275,7 +275,7 @@ Common::ParamPackage MouseTouchFactory::GetNextInput() const {
MouseInput::MouseStatus pad; MouseInput::MouseStatus pad;
Common::ParamPackage params; Common::ParamPackage params;
auto& queue = mouse_input->GetMouseQueue(); auto& queue = mouse_input->GetMouseQueue();
while (queue.try_pop(pad)) { while (queue.Pop(pad)) {
// This while loop will break on the earliest detected button // This while loop will break on the earliest detected button
if (pad.button != MouseInput::MouseButton::Undefined) { if (pad.button != MouseInput::MouseButton::Undefined) {
params.Set("engine", "mouse"); params.Set("engine", "mouse");

View file

@ -46,7 +46,7 @@ static int SDLEventWatcher(void* user_data, SDL_Event* event) {
// Don't handle the event if we are configuring // Don't handle the event if we are configuring
if (sdl_state->polling) { if (sdl_state->polling) {
sdl_state->event_queue.push(*event); sdl_state->event_queue.Push(*event);
} else { } else {
sdl_state->HandleGameControllerEvent(*event); sdl_state->HandleGameControllerEvent(*event);
} }
@ -1460,6 +1460,7 @@ public:
explicit SDLPoller(SDLState& state_) : state(state_) {} explicit SDLPoller(SDLState& state_) : state(state_) {}
void Start([[maybe_unused]] const std::string& device_id) override { void Start([[maybe_unused]] const std::string& device_id) override {
state.event_queue.Clear();
state.polling = true; state.polling = true;
} }
@ -1477,7 +1478,7 @@ public:
Common::ParamPackage GetNextInput() override { Common::ParamPackage GetNextInput() override {
SDL_Event event; SDL_Event event;
while (state.event_queue.try_pop(event)) { while (state.event_queue.Pop(event)) {
const auto package = FromEvent(event); const auto package = FromEvent(event);
if (package) { if (package) {
return *package; return *package;
@ -1549,7 +1550,7 @@ public:
Common::ParamPackage GetNextInput() override { Common::ParamPackage GetNextInput() override {
SDL_Event event; SDL_Event event;
while (state.event_queue.try_pop(event)) { while (state.event_queue.Pop(event)) {
const auto package = FromEvent(event); const auto package = FromEvent(event);
if (package) { if (package) {
return *package; return *package;
@ -1591,7 +1592,7 @@ public:
Common::ParamPackage GetNextInput() override { Common::ParamPackage GetNextInput() override {
SDL_Event event; SDL_Event event;
while (state.event_queue.try_pop(event)) { while (state.event_queue.Pop(event)) {
if (event.type != SDL_JOYAXISMOTION) { if (event.type != SDL_JOYAXISMOTION) {
// Check for a button press // Check for a button press
auto button_press = button_poller.FromEvent(event); auto button_press = button_poller.FromEvent(event);

View file

@ -12,8 +12,8 @@
#include <SDL.h> #include <SDL.h>
#include "common/atomic_threadsafe_queue.h"
#include "common/common_types.h" #include "common/common_types.h"
#include "common/threadsafe_queue.h"
#include "input_common/sdl/sdl.h" #include "input_common/sdl/sdl.h"
union SDL_Event; union SDL_Event;
@ -59,7 +59,7 @@ public:
/// Used by the Pollers during config /// Used by the Pollers during config
std::atomic<bool> polling = false; std::atomic<bool> polling = false;
Common::MPMCQueue<SDL_Event> event_queue{1024}; Common::SPSCQueue<SDL_Event> event_queue;
std::vector<Common::ParamPackage> GetInputDevices() override; std::vector<Common::ParamPackage> GetInputDevices() override;

View file

@ -338,7 +338,7 @@ void Client::UpdateYuzuSettings(std::size_t client, std::size_t pad_index,
gyro[0], gyro[1], gyro[2], acc[0], acc[1], acc[2]); gyro[0], gyro[1], gyro[2], acc[0], acc[1], acc[2]);
} }
UDPPadStatus pad{ UDPPadStatus pad{
.host = clients[client].host.c_str(), .host = clients[client].host,
.port = clients[client].port, .port = clients[client].port,
.pad_index = pad_index, .pad_index = pad_index,
}; };
@ -346,12 +346,12 @@ void Client::UpdateYuzuSettings(std::size_t client, std::size_t pad_index,
if (gyro[i] > 5.0f || gyro[i] < -5.0f) { if (gyro[i] > 5.0f || gyro[i] < -5.0f) {
pad.motion = static_cast<PadMotion>(i); pad.motion = static_cast<PadMotion>(i);
pad.motion_value = gyro[i]; pad.motion_value = gyro[i];
pad_queue.push(pad); pad_queue.Push(pad);
} }
if (acc[i] > 1.75f || acc[i] < -1.75f) { if (acc[i] > 1.75f || acc[i] < -1.75f) {
pad.motion = static_cast<PadMotion>(i + 3); pad.motion = static_cast<PadMotion>(i + 3);
pad.motion_value = acc[i]; pad.motion_value = acc[i];
pad_queue.push(pad); pad_queue.Push(pad);
} }
} }
} }
@ -401,10 +401,12 @@ void Client::UpdateTouchInput(Response::TouchPad& touch_pad, std::size_t client,
} }
void Client::BeginConfiguration() { void Client::BeginConfiguration() {
pad_queue.Clear();
configuring = true; configuring = true;
} }
void Client::EndConfiguration() { void Client::EndConfiguration() {
pad_queue.Clear();
configuring = false; configuring = false;
} }
@ -432,11 +434,11 @@ const Input::TouchStatus& Client::GetTouchState() const {
return touch_status; return touch_status;
} }
Common::MPMCQueue<UDPPadStatus>& Client::GetPadQueue() { Common::SPSCQueue<UDPPadStatus>& Client::GetPadQueue() {
return pad_queue; return pad_queue;
} }
const Common::MPMCQueue<UDPPadStatus>& Client::GetPadQueue() const { const Common::SPSCQueue<UDPPadStatus>& Client::GetPadQueue() const {
return pad_queue; return pad_queue;
} }

View file

@ -11,10 +11,10 @@
#include <string> #include <string>
#include <thread> #include <thread>
#include <tuple> #include <tuple>
#include "common/atomic_threadsafe_queue.h"
#include "common/common_types.h" #include "common/common_types.h"
#include "common/param_package.h" #include "common/param_package.h"
#include "common/thread.h" #include "common/thread.h"
#include "common/threadsafe_queue.h"
#include "common/vector_math.h" #include "common/vector_math.h"
#include "core/frontend/input.h" #include "core/frontend/input.h"
#include "input_common/motion_input.h" #include "input_common/motion_input.h"
@ -46,7 +46,7 @@ enum class PadTouch {
}; };
struct UDPPadStatus { struct UDPPadStatus {
const char* host{"127.0.0.1"}; std::string host{"127.0.0.1"};
u16 port{26760}; u16 port{26760};
std::size_t pad_index{}; std::size_t pad_index{};
PadMotion motion{PadMotion::Undefined}; PadMotion motion{PadMotion::Undefined};
@ -85,8 +85,8 @@ public:
bool DeviceConnected(std::size_t pad) const; bool DeviceConnected(std::size_t pad) const;
void ReloadSockets(); void ReloadSockets();
Common::MPMCQueue<UDPPadStatus>& GetPadQueue(); Common::SPSCQueue<UDPPadStatus>& GetPadQueue();
const Common::MPMCQueue<UDPPadStatus>& GetPadQueue() const; const Common::SPSCQueue<UDPPadStatus>& GetPadQueue() const;
DeviceStatus& GetPadState(const std::string& host, u16 port, std::size_t pad); DeviceStatus& GetPadState(const std::string& host, u16 port, std::size_t pad);
const DeviceStatus& GetPadState(const std::string& host, u16 port, std::size_t pad) const; const DeviceStatus& GetPadState(const std::string& host, u16 port, std::size_t pad) const;
@ -146,7 +146,7 @@ private:
static constexpr std::size_t MAX_TOUCH_FINGERS = MAX_UDP_CLIENTS * 2; static constexpr std::size_t MAX_TOUCH_FINGERS = MAX_UDP_CLIENTS * 2;
std::array<PadData, MAX_UDP_CLIENTS * PADS_PER_CLIENT> pads{}; std::array<PadData, MAX_UDP_CLIENTS * PADS_PER_CLIENT> pads{};
std::array<ClientConnection, MAX_UDP_CLIENTS> clients{}; std::array<ClientConnection, MAX_UDP_CLIENTS> clients{};
Common::MPMCQueue<UDPPadStatus> pad_queue{1024}; Common::SPSCQueue<UDPPadStatus> pad_queue{};
Input::TouchStatus touch_status{}; Input::TouchStatus touch_status{};
std::array<std::size_t, MAX_TOUCH_FINGERS> finger_id{}; std::array<std::size_t, MAX_TOUCH_FINGERS> finger_id{};
}; };

View file

@ -59,7 +59,7 @@ Common::ParamPackage UDPMotionFactory::GetNextInput() {
Common::ParamPackage params; Common::ParamPackage params;
CemuhookUDP::UDPPadStatus pad; CemuhookUDP::UDPPadStatus pad;
auto& queue = client->GetPadQueue(); auto& queue = client->GetPadQueue();
while (queue.try_pop(pad)) { while (queue.Pop(pad)) {
if (pad.motion == CemuhookUDP::PadMotion::Undefined || std::abs(pad.motion_value) < 1) { if (pad.motion == CemuhookUDP::PadMotion::Undefined || std::abs(pad.motion_value) < 1) {
continue; continue;
} }

View file

@ -32,10 +32,7 @@ static void RunThread(std::stop_token stop_token, Core::System& system,
VideoCore::RasterizerInterface* const rasterizer = renderer.ReadRasterizer(); VideoCore::RasterizerInterface* const rasterizer = renderer.ReadRasterizer();
while (!stop_token.stop_requested()) { while (!stop_token.stop_requested()) {
CommandDataContainer next; CommandDataContainer next = state.queue.PopWait(stop_token);
if (!state.queue.try_pop(next)) {
continue;
}
if (stop_token.stop_requested()) { if (stop_token.stop_requested()) {
break; break;
} }
@ -122,7 +119,7 @@ u64 ThreadManager::PushCommand(CommandData&& command_data, bool block) {
std::unique_lock lk(state.write_lock); std::unique_lock lk(state.write_lock);
const u64 fence{++state.last_fence}; const u64 fence{++state.last_fence};
state.queue.push(CommandDataContainer(std::move(command_data), fence, block)); state.queue.Push(CommandDataContainer(std::move(command_data), fence, block));
if (block) { if (block) {
state.cv.wait(lk, thread.get_stop_token(), [this, fence] { state.cv.wait(lk, thread.get_stop_token(), [this, fence] {

View file

@ -11,7 +11,7 @@
#include <thread> #include <thread>
#include <variant> #include <variant>
#include "common/atomic_threadsafe_queue.h" #include "common/threadsafe_queue.h"
#include "video_core/framebuffer_config.h" #include "video_core/framebuffer_config.h"
namespace Tegra { namespace Tegra {
@ -97,9 +97,9 @@ struct CommandDataContainer {
/// Struct used to synchronize the GPU thread /// Struct used to synchronize the GPU thread
struct SynchState final { struct SynchState final {
using CommandQueue = Common::MPMCQueue<CommandDataContainer>; using CommandQueue = Common::SPSCQueue<CommandDataContainer, true>;
std::mutex write_lock; std::mutex write_lock;
CommandQueue queue{100000}; CommandQueue queue;
u64 last_fence{}; u64 last_fence{};
std::atomic<u64> signaled_fence{}; std::atomic<u64> signaled_fence{};
std::condition_variable_any cv; std::condition_variable_any cv;

View file

@ -81,8 +81,11 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry,
SetConfiguration(); SetConfiguration();
PopulateSelectionList(); PopulateSelectionList();
connect(ui->tabWidget, &QTabWidget::currentChanged, this, connect(ui->tabWidget, &QTabWidget::currentChanged, this, [this](int index) {
[this]() { debug_tab_tab->SetCurrentIndex(0); }); if (index != -1) {
debug_tab_tab->SetCurrentIndex(0);
}
});
connect(ui_tab.get(), &ConfigureUi::LanguageChanged, this, &ConfigureDialog::OnLanguageChanged); connect(ui_tab.get(), &ConfigureUi::LanguageChanged, this, &ConfigureDialog::OnLanguageChanged);
connect(ui->selectorList, &QListWidget::itemSelectionChanged, this, connect(ui->selectorList, &QListWidget::itemSelectionChanged, this,
&ConfigureDialog::UpdateVisibleTabs); &ConfigureDialog::UpdateVisibleTabs);

View file

@ -66,7 +66,7 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id, const std::str
ui->tabWidget->addTab(system_tab.get(), tr("System")); ui->tabWidget->addTab(system_tab.get(), tr("System"));
ui->tabWidget->addTab(cpu_tab.get(), tr("CPU")); ui->tabWidget->addTab(cpu_tab.get(), tr("CPU"));
ui->tabWidget->addTab(graphics_tab.get(), tr("Graphics")); ui->tabWidget->addTab(graphics_tab.get(), tr("Graphics"));
ui->tabWidget->addTab(graphics_advanced_tab.get(), tr("GraphicsAdvanced")); ui->tabWidget->addTab(graphics_advanced_tab.get(), tr("Adv. Graphics"));
ui->tabWidget->addTab(audio_tab.get(), tr("Audio")); ui->tabWidget->addTab(audio_tab.get(), tr("Audio"));
setFocusPolicy(Qt::ClickFocus); setFocusPolicy(Qt::ClickFocus);

View file

@ -2,14 +2,6 @@
<ui version="4.0"> <ui version="4.0">
<class>ConfigurePerGame</class> <class>ConfigurePerGame</class>
<widget class="QDialog" name="ConfigurePerGame"> <widget class="QDialog" name="ConfigurePerGame">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>900</width>
<height>630</height>
</rect>
</property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>900</width> <width>900</width>

View file

@ -291,6 +291,14 @@ GMainWindow::GMainWindow()
ui->action_Fullscreen->setChecked(false); ui->action_Fullscreen->setChecked(false);
#if defined(HAVE_SDL2) && !defined(_WIN32)
SDL_InitSubSystem(SDL_INIT_VIDEO);
// SDL disables the screen saver by default, and setting the hint
// SDL_HINT_VIDEO_ALLOW_SCREENSAVER doesn't seem to work, so we just enable the screen saver
// for now.
SDL_EnableScreenSaver();
#endif
QStringList args = QApplication::arguments(); QStringList args = QApplication::arguments();
if (args.size() < 2) { if (args.size() < 2) {
@ -361,8 +369,13 @@ GMainWindow::GMainWindow()
GMainWindow::~GMainWindow() { GMainWindow::~GMainWindow() {
// will get automatically deleted otherwise // will get automatically deleted otherwise
if (render_window->parent() == nullptr) if (render_window->parent() == nullptr) {
delete render_window; delete render_window;
}
#if defined(HAVE_SDL2) && !defined(_WIN32)
SDL_QuitSubSystem(SDL_INIT_VIDEO);
#endif
} }
void GMainWindow::RegisterMetaTypes() { void GMainWindow::RegisterMetaTypes() {
@ -1453,14 +1466,6 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t
SelectAndSetCurrentUser(); SelectAndSetCurrentUser();
} }
#if defined(HAVE_SDL2) && !defined(_WIN32)
SDL_InitSubSystem(SDL_INIT_VIDEO);
// SDL disables the screen saver by default, and setting the hint
// SDL_HINT_VIDEO_ALLOW_SCREENSAVER doesn't seem to work, so we just enable the screen saver
// for now.
SDL_EnableScreenSaver();
#endif
if (!LoadROM(filename, program_id, program_index)) if (!LoadROM(filename, program_id, program_index))
return; return;
@ -1553,10 +1558,6 @@ void GMainWindow::ShutdownGame() {
AllowOSSleep(); AllowOSSleep();
#if defined(HAVE_SDL2) && !defined(_WIN32)
SDL_QuitSubSystem(SDL_INIT_VIDEO);
#endif
discord_rpc->Pause(); discord_rpc->Pause();
emu_thread->RequestStop(); emu_thread->RequestStop();