From 124fc3517cea5169ed2e60fdb83a6efc802bdfe1 Mon Sep 17 00:00:00 2001 From: pineappleEA Date: Sun, 28 Jan 2024 23:16:18 +0100 Subject: [PATCH] early-access version 4096 --- README.md | 2 +- .../apps/audio_renderer/audio_renderer.cpp | 7 +- .../adsp/apps/audio_renderer/audio_renderer.h | 7 +- .../adsp/apps/audio_renderer/command_buffer.h | 5 ++ .../audio_renderer/command_list_processor.cpp | 7 +- .../audio_renderer/command_list_processor.h | 7 +- src/audio_core/renderer/audio_renderer.cpp | 6 +- src/audio_core/renderer/audio_renderer.h | 6 +- src/audio_core/renderer/system.cpp | 10 ++- src/audio_core/renderer/system.h | 6 +- src/core/hle/service/audio/audren_u.cpp | 16 ++-- src/frontend_common/config.cpp | 26 +++++++ src/frontend_common/config.h | 6 ++ src/yuzu/CMakeLists.txt | 3 + src/yuzu/configuration/configure_audio.h | 2 + src/yuzu/configuration/configure_cpu.h | 2 + src/yuzu/configuration/configure_general.h | 2 + src/yuzu/configuration/configure_graphics.cpp | 5 ++ src/yuzu/configuration/configure_graphics.h | 2 + .../configure_graphics_advanced.h | 2 + .../configuration/configure_linux_tab.cpp | 75 +++++++++++++++++++ src/yuzu/configuration/configure_linux_tab.h | 44 +++++++++++ src/yuzu/configuration/configure_linux_tab.ui | 53 +++++++++++++ .../configuration/configure_motion_touch.h | 1 + .../configuration/configure_mouse_panning.h | 1 + src/yuzu/configuration/configure_per_game.cpp | 6 ++ src/yuzu/configuration/configure_per_game.h | 2 + src/yuzu/configuration/configure_system.h | 2 + 28 files changed, 291 insertions(+), 22 deletions(-) create mode 100755 src/yuzu/configuration/configure_linux_tab.cpp create mode 100755 src/yuzu/configuration/configure_linux_tab.h create mode 100755 src/yuzu/configuration/configure_linux_tab.ui diff --git a/README.md b/README.md index 77958f08a..613c55ba6 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ yuzu emulator early access ============= -This is the source code for early-access 4095. +This is the source code for early-access 4096. ## Legal Notice diff --git a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp index ef301d8b4..7a76c3d0b 100755 --- a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp +++ b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp @@ -89,11 +89,13 @@ u32 AudioRenderer::Receive(Direction dir) { } void AudioRenderer::SetCommandBuffer(s32 session_id, CpuAddr buffer, u64 size, u64 time_limit, - u64 applet_resource_user_id, bool reset) noexcept { + u64 applet_resource_user_id, Kernel::KProcess* process, + bool reset) noexcept { command_buffers[session_id].buffer = buffer; command_buffers[session_id].size = size; command_buffers[session_id].time_limit = time_limit; command_buffers[session_id].applet_resource_user_id = applet_resource_user_id; + command_buffers[session_id].process = process; command_buffers[session_id].reset_buffer = reset; } @@ -173,7 +175,8 @@ void AudioRenderer::Main(std::stop_token stop_token) { // If there are no remaining commands (from the previous list), // this is a new command list, initialize it. if (command_buffer.remaining_command_count == 0) { - command_list_processor.Initialize(system, command_buffer.buffer, + command_list_processor.Initialize(system, *command_buffer.process, + command_buffer.buffer, command_buffer.size, streams[index]); } diff --git a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.h b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.h index 57b89d9fe..875266f27 100755 --- a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.h +++ b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.h @@ -19,6 +19,10 @@ namespace Core { class System; } // namespace Core +namespace Kernel { +class KProcess; +} + namespace AudioCore { namespace Sink { class Sink; @@ -69,7 +73,8 @@ public: u32 Receive(Direction dir); void SetCommandBuffer(s32 session_id, CpuAddr buffer, u64 size, u64 time_limit, - u64 applet_resource_user_id, bool reset) noexcept; + u64 applet_resource_user_id, Kernel::KProcess* process, + bool reset) noexcept; u32 GetRemainCommandCount(s32 session_id) const noexcept; void ClearRemainCommandCount(s32 session_id) noexcept; u64 GetRenderingStartTick(s32 session_id) const noexcept; diff --git a/src/audio_core/adsp/apps/audio_renderer/command_buffer.h b/src/audio_core/adsp/apps/audio_renderer/command_buffer.h index 3fd1b09dc..d6a721f34 100755 --- a/src/audio_core/adsp/apps/audio_renderer/command_buffer.h +++ b/src/audio_core/adsp/apps/audio_renderer/command_buffer.h @@ -6,6 +6,10 @@ #include "audio_core/common/common.h" #include "common/common_types.h" +namespace Kernel { +class KProcess; +} + namespace AudioCore::ADSP::AudioRenderer { struct CommandBuffer { @@ -14,6 +18,7 @@ struct CommandBuffer { u64 size{}; u64 time_limit{}; u64 applet_resource_user_id{}; + Kernel::KProcess* process{}; bool reset_buffer{}; // Set by the DSP u32 remaining_command_count{}; diff --git a/src/audio_core/adsp/apps/audio_renderer/command_list_processor.cpp b/src/audio_core/adsp/apps/audio_renderer/command_list_processor.cpp index 24e4d0496..eef2c0b89 100755 --- a/src/audio_core/adsp/apps/audio_renderer/command_list_processor.cpp +++ b/src/audio_core/adsp/apps/audio_renderer/command_list_processor.cpp @@ -9,14 +9,15 @@ #include "common/settings.h" #include "core/core.h" #include "core/core_timing.h" +#include "core/hle/kernel/k_process.h" #include "core/memory.h" namespace AudioCore::ADSP::AudioRenderer { -void CommandListProcessor::Initialize(Core::System& system_, CpuAddr buffer, u64 size, - Sink::SinkStream* stream_) { +void CommandListProcessor::Initialize(Core::System& system_, Kernel::KProcess& process, + CpuAddr buffer, u64 size, Sink::SinkStream* stream_) { system = &system_; - memory = &system->ApplicationMemory(); + memory = &process.GetMemory(); stream = stream_; header = reinterpret_cast(buffer); commands = reinterpret_cast(buffer + sizeof(Renderer::CommandListHeader)); diff --git a/src/audio_core/adsp/apps/audio_renderer/command_list_processor.h b/src/audio_core/adsp/apps/audio_renderer/command_list_processor.h index 4e5fb793e..944e82505 100755 --- a/src/audio_core/adsp/apps/audio_renderer/command_list_processor.h +++ b/src/audio_core/adsp/apps/audio_renderer/command_list_processor.h @@ -16,6 +16,10 @@ class Memory; class System; } // namespace Core +namespace Kernel { +class KProcess; +} + namespace AudioCore { namespace Sink { class SinkStream; @@ -40,7 +44,8 @@ public: * @param size - The size of the buffer. * @param stream - The stream to be used for sending the samples. */ - void Initialize(Core::System& system, CpuAddr buffer, u64 size, Sink::SinkStream* stream); + void Initialize(Core::System& system, Kernel::KProcess& process, CpuAddr buffer, u64 size, + Sink::SinkStream* stream); /** * Set the maximum processing time for this command list. diff --git a/src/audio_core/renderer/audio_renderer.cpp b/src/audio_core/renderer/audio_renderer.cpp index 22f841455..bf265c83a 100755 --- a/src/audio_core/renderer/audio_renderer.cpp +++ b/src/audio_core/renderer/audio_renderer.cpp @@ -6,6 +6,7 @@ #include "audio_core/renderer/audio_renderer.h" #include "audio_core/renderer/system_manager.h" #include "core/core.h" +#include "core/hle/kernel/k_process.h" #include "core/hle/kernel/k_transfer_memory.h" #include "core/hle/service/audio/errors.h" @@ -17,7 +18,8 @@ Renderer::Renderer(Core::System& system_, Manager& manager_, Kernel::KEvent* ren Result Renderer::Initialize(const AudioRendererParameterInternal& params, Kernel::KTransferMemory* transfer_memory, const u64 transfer_memory_size, const u32 process_handle, - const u64 applet_resource_user_id, const s32 session_id) { + Kernel::KProcess& process, const u64 applet_resource_user_id, + const s32 session_id) { if (params.execution_mode == ExecutionMode::Auto) { if (!manager.AddSystem(system)) { LOG_ERROR(Service_Audio, @@ -28,7 +30,7 @@ Result Renderer::Initialize(const AudioRendererParameterInternal& params, } initialized = true; - system.Initialize(params, transfer_memory, transfer_memory_size, process_handle, + system.Initialize(params, transfer_memory, transfer_memory_size, process_handle, process, applet_resource_user_id, session_id); return ResultSuccess; diff --git a/src/audio_core/renderer/audio_renderer.h b/src/audio_core/renderer/audio_renderer.h index ccc4332db..390e39f1d 100755 --- a/src/audio_core/renderer/audio_renderer.h +++ b/src/audio_core/renderer/audio_renderer.h @@ -14,7 +14,8 @@ class System; namespace Kernel { class KTransferMemory; -} +class KProcess; +} // namespace Kernel namespace AudioCore { struct AudioRendererParameterInternal; @@ -44,7 +45,8 @@ public: */ Result Initialize(const AudioRendererParameterInternal& params, Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, - u32 process_handle, u64 applet_resource_user_id, s32 session_id); + u32 process_handle, Kernel::KProcess& process, u64 applet_resource_user_id, + s32 session_id); /** * Finalize the renderer for shutdown. diff --git a/src/audio_core/renderer/system.cpp b/src/audio_core/renderer/system.cpp index ac1bda39d..c00eea564 100755 --- a/src/audio_core/renderer/system.cpp +++ b/src/audio_core/renderer/system.cpp @@ -32,6 +32,7 @@ #include "core/core.h" #include "core/core_timing.h" #include "core/hle/kernel/k_event.h" +#include "core/hle/kernel/k_process.h" #include "core/hle/kernel/k_transfer_memory.h" #include "core/memory.h" @@ -101,7 +102,8 @@ System::System(Core::System& core_, Kernel::KEvent* adsp_rendered_event_) Result System::Initialize(const AudioRendererParameterInternal& params, Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, - u32 process_handle_, u64 applet_resource_user_id_, s32 session_id_) { + u32 process_handle_, Kernel::KProcess& process_, + u64 applet_resource_user_id_, s32 session_id_) { if (!CheckValidRevision(params.revision)) { return Service::Audio::ResultInvalidRevision; } @@ -117,6 +119,7 @@ Result System::Initialize(const AudioRendererParameterInternal& params, behavior.SetUserLibRevision(params.revision); process_handle = process_handle_; + process = &process_; applet_resource_user_id = applet_resource_user_id_; session_id = session_id_; @@ -129,7 +132,7 @@ Result System::Initialize(const AudioRendererParameterInternal& params, render_device = params.rendering_device; execution_mode = params.execution_mode; - core.ApplicationMemory().ZeroBlock(transfer_memory->GetSourceAddress(), transfer_memory_size); + process->GetMemory().ZeroBlock(transfer_memory->GetSourceAddress(), transfer_memory_size); // Note: We're not actually using the transfer memory because it's a pain to code for. // Allocate the memory normally instead and hope the game doesn't try to read anything back @@ -613,7 +616,8 @@ void System::SendCommandToDsp() { static_cast((time_limit_percent / 100) * 2'880'000.0 * (static_cast(render_time_limit_percent) / 100.0f))}; audio_renderer.SetCommandBuffer(session_id, translated_addr, command_size, time_limit, - applet_resource_user_id, reset_command_buffers); + applet_resource_user_id, process, + reset_command_buffers); reset_command_buffers = false; command_buffer_size = command_size; if (remaining_command_count == 0) { diff --git a/src/audio_core/renderer/system.h b/src/audio_core/renderer/system.h index 4c3afd345..c39086027 100755 --- a/src/audio_core/renderer/system.h +++ b/src/audio_core/renderer/system.h @@ -29,6 +29,7 @@ class System; namespace Kernel { class KEvent; +class KProcess; class KTransferMemory; } // namespace Kernel @@ -80,7 +81,8 @@ public: */ Result Initialize(const AudioRendererParameterInternal& params, Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, - u32 process_handle, u64 applet_resource_user_id, s32 session_id); + u32 process_handle, Kernel::KProcess& process, u64 applet_resource_user_id, + s32 session_id); /** * Finalize the system. @@ -275,6 +277,8 @@ private: Common::Event terminate_event{}; /// Does what locks do std::mutex lock{}; + /// Process this audio render is operating within, used for memory reads/writes. + Kernel::KProcess* process{}; /// Handle for the process for this system, unused u32 process_handle{}; /// Applet resource id for this system, unused diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index 191df61b5..c9c5ca297 100755 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp @@ -35,10 +35,11 @@ public: explicit IAudioRenderer(Core::System& system_, Manager& manager_, AudioCore::AudioRendererParameterInternal& params, Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, - u32 process_handle, u64 applet_resource_user_id, s32 session_id) + u32 process_handle, Kernel::KProcess& process_, + u64 applet_resource_user_id, s32 session_id) : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"}, rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_}, - impl{std::make_unique(system_, manager, rendered_event)} { + impl{std::make_unique(system_, manager, rendered_event)}, process{process_} { // clang-format off static const FunctionInfo functions[] = { {0, &IAudioRenderer::GetSampleRate, "GetSampleRate"}, @@ -59,13 +60,15 @@ public: // clang-format on RegisterHandlers(functions); - impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle, + process.Open(); + impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle, process, applet_resource_user_id, session_id); } ~IAudioRenderer() override { impl->Finalize(); service_context.CloseEvent(rendered_event); + process.Close(); } private: @@ -235,6 +238,7 @@ private: Kernel::KEvent* rendered_event; Manager& manager; std::unique_ptr impl; + Kernel::KProcess& process; Common::ScratchBuffer output_buffer; Common::ScratchBuffer performance_buffer; }; @@ -455,7 +459,7 @@ void AudRenU::OpenAudioRenderer(HLERequestContext& ctx) { return; } - auto process{ctx.GetObjectFromHandle(process_handle)}; + auto process{ctx.GetObjectFromHandle(process_handle).GetPointerUnsafe()}; auto transfer_memory{ctx.GetObjectFromHandle(transfer_memory_handle)}; const auto session_id{impl->GetSessionId()}; @@ -472,7 +476,7 @@ void AudRenU::OpenAudioRenderer(HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 2, 0, 1}; rb.Push(ResultSuccess); rb.PushIpcInterface(system, *impl, params, transfer_memory.GetPointerUnsafe(), - transfer_memory_size, process_handle, + transfer_memory_size, process_handle, *process, applet_resource_user_id, session_id); } @@ -522,7 +526,7 @@ void AudRenU::GetAudioDeviceService(HLERequestContext& ctx) { } void AudRenU::OpenAudioRendererForManualExecution(HLERequestContext& ctx) { - LOG_DEBUG(Service_Audio, "called"); + LOG_ERROR(Service_Audio, "called. Implement me!"); } void AudRenU::GetAudioDeviceServiceWithRevisionInfo(HLERequestContext& ctx) { diff --git a/src/frontend_common/config.cpp b/src/frontend_common/config.cpp index 46277e288..905f35118 100755 --- a/src/frontend_common/config.cpp +++ b/src/frontend_common/config.cpp @@ -298,6 +298,16 @@ void Config::ReadDebuggingValues() { EndGroup(); } +#ifdef __unix__ +void Config::ReadLinuxValues() { + BeginGroup(Settings::TranslateCategory(Settings::Category::Linux)); + + ReadCategory(Settings::Category::Linux); + + EndGroup(); +} +#endif + void Config::ReadServiceValues() { BeginGroup(Settings::TranslateCategory(Settings::Category::Services)); @@ -404,6 +414,9 @@ void Config::ReadValues() { ReadControlValues(); ReadCoreValues(); ReadCpuValues(); +#ifdef __unix__ + ReadLinuxValues(); +#endif ReadRendererValues(); ReadAudioValues(); ReadSystemValues(); @@ -504,6 +517,9 @@ void Config::SaveValues() { SaveControlValues(); SaveCoreValues(); SaveCpuValues(); +#ifdef __unix__ + SaveLinuxValues(); +#endif SaveRendererValues(); SaveAudioValues(); SaveSystemValues(); @@ -578,6 +594,16 @@ void Config::SaveDebuggingValues() { EndGroup(); } +#ifdef __unix__ +void Config::SaveLinuxValues() { + BeginGroup(Settings::TranslateCategory(Settings::Category::Linux)); + + WriteCategory(Settings::Category::Linux); + + EndGroup(); +} +#endif + void Config::SaveNetworkValues() { BeginGroup(Settings::TranslateCategory(Settings::Category::Services)); diff --git a/src/frontend_common/config.h b/src/frontend_common/config.h index 4798d6432..4ecb97044 100755 --- a/src/frontend_common/config.h +++ b/src/frontend_common/config.h @@ -76,6 +76,9 @@ protected: void ReadCoreValues(); void ReadDataStorageValues(); void ReadDebuggingValues(); +#ifdef __unix__ + void ReadLinuxValues(); +#endif void ReadServiceValues(); void ReadDisabledAddOnValues(); void ReadMiscellaneousValues(); @@ -107,6 +110,9 @@ protected: void SaveCoreValues(); void SaveDataStorageValues(); void SaveDebuggingValues(); +#ifdef __unix__ + void SaveLinuxValues(); +#endif void SaveNetworkValues(); void SaveDisabledAddOnValues(); void SaveMiscellaneousValues(); diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 3f5c48e40..ff712d5fd 100755 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -96,6 +96,9 @@ add_executable(yuzu configuration/configure_input_profile_dialog.cpp configuration/configure_input_profile_dialog.h configuration/configure_input_profile_dialog.ui + configuration/configure_linux_tab.cpp + configuration/configure_linux_tab.h + configuration/configure_linux_tab.ui configuration/configure_mouse_panning.cpp configuration/configure_mouse_panning.h configuration/configure_mouse_panning.ui diff --git a/src/yuzu/configuration/configure_audio.h b/src/yuzu/configuration/configure_audio.h index ed3a672e7..8a1bce91a 100755 --- a/src/yuzu/configuration/configure_audio.h +++ b/src/yuzu/configuration/configure_audio.h @@ -24,6 +24,8 @@ class Builder; } class ConfigureAudio : public ConfigurationShared::Tab { + Q_OBJECT + public: explicit ConfigureAudio(const Core::System& system_, std::shared_ptr> group, diff --git a/src/yuzu/configuration/configure_cpu.h b/src/yuzu/configuration/configure_cpu.h index 956f8701e..67ded44a1 100755 --- a/src/yuzu/configuration/configure_cpu.h +++ b/src/yuzu/configuration/configure_cpu.h @@ -24,6 +24,8 @@ class Builder; } class ConfigureCpu : public ConfigurationShared::Tab { + Q_OBJECT + public: explicit ConfigureCpu(const Core::System& system_, std::shared_ptr> group, diff --git a/src/yuzu/configuration/configure_general.h b/src/yuzu/configuration/configure_general.h index 7affacb51..5b0480c75 100755 --- a/src/yuzu/configuration/configure_general.h +++ b/src/yuzu/configuration/configure_general.h @@ -25,6 +25,8 @@ class Builder; } class ConfigureGeneral : public ConfigurationShared::Tab { + Q_OBJECT + public: explicit ConfigureGeneral(const Core::System& system_, std::shared_ptr> group, diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index 193d8868f..866241026 100755 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp @@ -224,6 +224,11 @@ void ConfigureGraphics::PopulateVSyncModeSelection(bool use_setting) { } void ConfigureGraphics::UpdateVsyncSetting() const { + const Settings::RendererBackend backend{GetCurrentGraphicsBackend()}; + if (backend == Settings::RendererBackend::Null) { + return; + } + const auto mode = vsync_mode_combobox_enum_map[vsync_mode_combobox->currentIndex()]; const auto vsync_mode = PresentModeToSetting(mode); Settings::values.vsync_mode.SetValue(vsync_mode); diff --git a/src/yuzu/configuration/configure_graphics.h b/src/yuzu/configuration/configure_graphics.h index ce2c23085..8b278228f 100755 --- a/src/yuzu/configuration/configure_graphics.h +++ b/src/yuzu/configuration/configure_graphics.h @@ -43,6 +43,8 @@ class Builder; } class ConfigureGraphics : public ConfigurationShared::Tab { + Q_OBJECT + public: explicit ConfigureGraphics( const Core::System& system_, std::vector& records, diff --git a/src/yuzu/configuration/configure_graphics_advanced.h b/src/yuzu/configuration/configure_graphics_advanced.h index 00656f2c7..7e6e9b486 100755 --- a/src/yuzu/configuration/configure_graphics_advanced.h +++ b/src/yuzu/configuration/configure_graphics_advanced.h @@ -21,6 +21,8 @@ class Builder; } class ConfigureGraphicsAdvanced : public ConfigurationShared::Tab { + Q_OBJECT + public: explicit ConfigureGraphicsAdvanced( const Core::System& system_, std::shared_ptr> group, diff --git a/src/yuzu/configuration/configure_linux_tab.cpp b/src/yuzu/configuration/configure_linux_tab.cpp new file mode 100755 index 000000000..ab3d18816 --- /dev/null +++ b/src/yuzu/configuration/configure_linux_tab.cpp @@ -0,0 +1,75 @@ +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/settings.h" +#include "core/core.h" +#include "ui_configure_linux_tab.h" +#include "yuzu/configuration/configuration_shared.h" +#include "yuzu/configuration/configure_linux_tab.h" +#include "yuzu/configuration/shared_widget.h" + +ConfigureLinuxTab::ConfigureLinuxTab(const Core::System& system_, + std::shared_ptr> group_, + const ConfigurationShared::Builder& builder, QWidget* parent) + : Tab(group_, parent), ui(std::make_unique()), system{system_} { + ui->setupUi(this); + + Setup(builder); + + SetConfiguration(); +} + +ConfigureLinuxTab::~ConfigureLinuxTab() = default; + +void ConfigureLinuxTab::SetConfiguration() {} +void ConfigureLinuxTab::Setup(const ConfigurationShared::Builder& builder) { + QLayout& linux_layout = *ui->linux_widget->layout(); + + std::map linux_hold{}; + + std::vector settings; + const auto push = [&](Settings::Category category) { + for (const auto setting : Settings::values.linkage.by_category[category]) { + settings.push_back(setting); + } + }; + + push(Settings::Category::Linux); + + for (auto* setting : settings) { + auto* widget = builder.BuildWidget(setting, apply_funcs); + + if (widget == nullptr) { + continue; + } + if (!widget->Valid()) { + widget->deleteLater(); + continue; + } + + linux_hold.insert({setting->Id(), widget}); + } + + for (const auto& [id, widget] : linux_hold) { + linux_layout.addWidget(widget); + } +} + +void ConfigureLinuxTab::ApplyConfiguration() { + const bool is_powered_on = system.IsPoweredOn(); + for (const auto& apply_func : apply_funcs) { + apply_func(is_powered_on); + } +} + +void ConfigureLinuxTab::changeEvent(QEvent* event) { + if (event->type() == QEvent::LanguageChange) { + RetranslateUI(); + } + + QWidget::changeEvent(event); +} + +void ConfigureLinuxTab::RetranslateUI() { + ui->retranslateUi(this); +} diff --git a/src/yuzu/configuration/configure_linux_tab.h b/src/yuzu/configuration/configure_linux_tab.h new file mode 100755 index 000000000..2f402079c --- /dev/null +++ b/src/yuzu/configuration/configure_linux_tab.h @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include + +namespace Core { +class System; +} + +namespace Ui { +class ConfigureLinuxTab; +} + +namespace ConfigurationShared { +class Builder; +} + +class ConfigureLinuxTab : public ConfigurationShared::Tab { + Q_OBJECT + +public: + explicit ConfigureLinuxTab(const Core::System& system_, + std::shared_ptr> group, + const ConfigurationShared::Builder& builder, + QWidget* parent = nullptr); + ~ConfigureLinuxTab() override; + + void ApplyConfiguration() override; + void SetConfiguration() override; + +private: + void changeEvent(QEvent* event) override; + void RetranslateUI(); + + void Setup(const ConfigurationShared::Builder& builder); + + std::unique_ptr ui; + + const Core::System& system; + + std::vector> apply_funcs{}; +}; diff --git a/src/yuzu/configuration/configure_linux_tab.ui b/src/yuzu/configuration/configure_linux_tab.ui new file mode 100755 index 000000000..f8e07f581 --- /dev/null +++ b/src/yuzu/configuration/configure_linux_tab.ui @@ -0,0 +1,53 @@ + + + ConfigureLinuxTab + + + Linux + + + + + + Linux + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + diff --git a/src/yuzu/configuration/configure_motion_touch.h b/src/yuzu/configuration/configure_motion_touch.h index 542398396..9b521485a 100755 --- a/src/yuzu/configuration/configure_motion_touch.h +++ b/src/yuzu/configuration/configure_motion_touch.h @@ -26,6 +26,7 @@ class ConfigureMotionTouch; /// A dialog for touchpad calibration configuration. class CalibrationConfigurationDialog : public QDialog { Q_OBJECT + public: explicit CalibrationConfigurationDialog(QWidget* parent, const std::string& host, u16 port); ~CalibrationConfigurationDialog() override; diff --git a/src/yuzu/configuration/configure_mouse_panning.h b/src/yuzu/configuration/configure_mouse_panning.h index 08c6e1f62..f5e62ee13 100755 --- a/src/yuzu/configuration/configure_mouse_panning.h +++ b/src/yuzu/configuration/configure_mouse_panning.h @@ -16,6 +16,7 @@ class ConfigureMousePanning; class ConfigureMousePanning : public QDialog { Q_OBJECT + public: explicit ConfigureMousePanning(QWidget* parent, InputCommon::InputSubsystem* input_subsystem_, float right_stick_deadzone, float right_stick_range); diff --git a/src/yuzu/configuration/configure_per_game.cpp b/src/yuzu/configuration/configure_per_game.cpp index 5d98af6a3..35a801585 100755 --- a/src/yuzu/configuration/configure_per_game.cpp +++ b/src/yuzu/configuration/configure_per_game.cpp @@ -33,6 +33,7 @@ #include "yuzu/configuration/configure_graphics.h" #include "yuzu/configuration/configure_graphics_advanced.h" #include "yuzu/configuration/configure_input_per_game.h" +#include "yuzu/configuration/configure_linux_tab.h" #include "yuzu/configuration/configure_per_game.h" #include "yuzu/configuration/configure_per_game_addons.h" #include "yuzu/configuration/configure_system.h" @@ -60,6 +61,7 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::st system_, vk_device_records, [&]() { graphics_advanced_tab->ExposeComputeOption(); }, [](Settings::AspectRatio, Settings::ResolutionSetup) {}, tab_group, *builder, this); input_tab = std::make_unique(system_, game_config.get(), this); + linux_tab = std::make_unique(system_, tab_group, *builder, this); system_tab = std::make_unique(system_, tab_group, *builder, this); ui->setupUi(this); @@ -71,6 +73,10 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::st ui->tabWidget->addTab(graphics_advanced_tab.get(), tr("Adv. Graphics")); ui->tabWidget->addTab(audio_tab.get(), tr("Audio")); ui->tabWidget->addTab(input_tab.get(), tr("Input Profiles")); + // Only show Linux tab on Unix +#ifdef __unix__ + ui->tabWidget->addTab(linux_tab.get(), tr("Linux")); +#endif setFocusPolicy(Qt::ClickFocus); setWindowTitle(tr("Properties")); diff --git a/src/yuzu/configuration/configure_per_game.h b/src/yuzu/configuration/configure_per_game.h index 201b6b5be..8919d909c 100755 --- a/src/yuzu/configuration/configure_per_game.h +++ b/src/yuzu/configuration/configure_per_game.h @@ -32,6 +32,7 @@ class ConfigureCpu; class ConfigureGraphics; class ConfigureGraphicsAdvanced; class ConfigureInputPerGame; +class ConfigureLinuxTab; class ConfigureSystem; class QGraphicsScene; @@ -85,5 +86,6 @@ private: std::unique_ptr graphics_advanced_tab; std::unique_ptr graphics_tab; std::unique_ptr input_tab; + std::unique_ptr linux_tab; std::unique_ptr system_tab; }; diff --git a/src/yuzu/configuration/configure_system.h b/src/yuzu/configuration/configure_system.h index 1b4daab1a..813e21155 100755 --- a/src/yuzu/configuration/configure_system.h +++ b/src/yuzu/configuration/configure_system.h @@ -27,6 +27,8 @@ class Builder; } class ConfigureSystem : public ConfigurationShared::Tab { + Q_OBJECT + public: explicit ConfigureSystem(Core::System& system_, std::shared_ptr> group,