diff options
37 files changed, 332 insertions, 197 deletions
| diff --git a/src/core/hle/service/audio/audio.cpp b/src/core/hle/service/audio/audio.cpp index 128df7db5..1781bec83 100644 --- a/src/core/hle/service/audio/audio.cpp +++ b/src/core/hle/service/audio/audio.cpp @@ -19,16 +19,16 @@  namespace Service::Audio { -void InstallInterfaces(SM::ServiceManager& service_manager) { +void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) {      std::make_shared<AudCtl>()->InstallAsService(service_manager);      std::make_shared<AudOutA>()->InstallAsService(service_manager); -    std::make_shared<AudOutU>()->InstallAsService(service_manager); +    std::make_shared<AudOutU>(system)->InstallAsService(service_manager);      std::make_shared<AudInA>()->InstallAsService(service_manager);      std::make_shared<AudInU>()->InstallAsService(service_manager);      std::make_shared<AudRecA>()->InstallAsService(service_manager);      std::make_shared<AudRecU>()->InstallAsService(service_manager);      std::make_shared<AudRenA>()->InstallAsService(service_manager); -    std::make_shared<AudRenU>()->InstallAsService(service_manager); +    std::make_shared<AudRenU>(system)->InstallAsService(service_manager);      std::make_shared<CodecCtl>()->InstallAsService(service_manager);      std::make_shared<HwOpus>()->InstallAsService(service_manager); diff --git a/src/core/hle/service/audio/audio.h b/src/core/hle/service/audio/audio.h index f5bd3bf5f..b6d13912e 100644 --- a/src/core/hle/service/audio/audio.h +++ b/src/core/hle/service/audio/audio.h @@ -4,6 +4,10 @@  #pragma once +namespace Core { +class System; +} +  namespace Service::SM {  class ServiceManager;  } @@ -11,6 +15,6 @@ class ServiceManager;  namespace Service::Audio {  /// Registers all Audio services with the specified service manager. -void InstallInterfaces(SM::ServiceManager& service_manager); +void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system);  } // namespace Service::Audio diff --git a/src/core/hle/service/audio/audout_u.cpp b/src/core/hle/service/audio/audout_u.cpp index 7db6eb08d..fb84a8f13 100644 --- a/src/core/hle/service/audio/audout_u.cpp +++ b/src/core/hle/service/audio/audout_u.cpp @@ -40,8 +40,8 @@ enum class AudioState : u32 {  class IAudioOut final : public ServiceFramework<IAudioOut> {  public: -    IAudioOut(AudoutParams audio_params, AudioCore::AudioOut& audio_core, std::string&& device_name, -              std::string&& unique_name) +    IAudioOut(Core::System& system, AudoutParams audio_params, AudioCore::AudioOut& audio_core, +              std::string&& device_name, std::string&& unique_name)          : ServiceFramework("IAudioOut"), audio_core(audio_core),            device_name(std::move(device_name)), audio_params(audio_params) {          // clang-format off @@ -65,7 +65,6 @@ public:          RegisterHandlers(functions);          // This is the event handle used to check if the audio buffer was released -        auto& system = Core::System::GetInstance();          buffer_event = Kernel::WritableEvent::CreateEventPair(              system.Kernel(), Kernel::ResetType::Manual, "IAudioOutBufferReleased"); @@ -212,6 +211,22 @@ private:      Kernel::EventPair buffer_event;  }; +AudOutU::AudOutU(Core::System& system_) : ServiceFramework("audout:u"), system{system_} { +    // clang-format off +    static const FunctionInfo functions[] = { +        {0, &AudOutU::ListAudioOutsImpl, "ListAudioOuts"}, +        {1, &AudOutU::OpenAudioOutImpl, "OpenAudioOut"}, +        {2, &AudOutU::ListAudioOutsImpl, "ListAudioOutsAuto"}, +        {3, &AudOutU::OpenAudioOutImpl, "OpenAudioOutAuto"}, +    }; +    // clang-format on + +    RegisterHandlers(functions); +    audio_core = std::make_unique<AudioCore::AudioOut>(); +} + +AudOutU::~AudOutU() = default; +  void AudOutU::ListAudioOutsImpl(Kernel::HLERequestContext& ctx) {      LOG_DEBUG(Service_Audio, "called"); @@ -248,7 +263,7 @@ void AudOutU::OpenAudioOutImpl(Kernel::HLERequestContext& ctx) {      std::string unique_name{fmt::format("{}-{}", device_name, audio_out_interfaces.size())};      auto audio_out_interface = std::make_shared<IAudioOut>( -        params, *audio_core, std::move(device_name), std::move(unique_name)); +        system, params, *audio_core, std::move(device_name), std::move(unique_name));      IPC::ResponseBuilder rb{ctx, 6, 0, 1};      rb.Push(RESULT_SUCCESS); @@ -256,20 +271,9 @@ void AudOutU::OpenAudioOutImpl(Kernel::HLERequestContext& ctx) {      rb.Push<u32>(params.channel_count);      rb.Push<u32>(static_cast<u32>(AudioCore::Codec::PcmFormat::Int16));      rb.Push<u32>(static_cast<u32>(AudioState::Stopped)); -    rb.PushIpcInterface<Audio::IAudioOut>(audio_out_interface); +    rb.PushIpcInterface<IAudioOut>(audio_out_interface);      audio_out_interfaces.push_back(std::move(audio_out_interface));  } -AudOutU::AudOutU() : ServiceFramework("audout:u") { -    static const FunctionInfo functions[] = {{0, &AudOutU::ListAudioOutsImpl, "ListAudioOuts"}, -                                             {1, &AudOutU::OpenAudioOutImpl, "OpenAudioOut"}, -                                             {2, &AudOutU::ListAudioOutsImpl, "ListAudioOutsAuto"}, -                                             {3, &AudOutU::OpenAudioOutImpl, "OpenAudioOutAuto"}}; -    RegisterHandlers(functions); -    audio_core = std::make_unique<AudioCore::AudioOut>(); -} - -AudOutU::~AudOutU() = default; -  } // namespace Service::Audio diff --git a/src/core/hle/service/audio/audout_u.h b/src/core/hle/service/audio/audout_u.h index aed4c43b2..c9f532ccd 100644 --- a/src/core/hle/service/audio/audout_u.h +++ b/src/core/hle/service/audio/audout_u.h @@ -11,6 +11,10 @@ namespace AudioCore {  class AudioOut;  } +namespace Core { +class System; +} +  namespace Kernel {  class HLERequestContext;  } @@ -21,15 +25,17 @@ class IAudioOut;  class AudOutU final : public ServiceFramework<AudOutU> {  public: -    AudOutU(); +    explicit AudOutU(Core::System& system_);      ~AudOutU() override;  private: +    void ListAudioOutsImpl(Kernel::HLERequestContext& ctx); +    void OpenAudioOutImpl(Kernel::HLERequestContext& ctx); +      std::vector<std::shared_ptr<IAudioOut>> audio_out_interfaces;      std::unique_ptr<AudioCore::AudioOut> audio_core; -    void ListAudioOutsImpl(Kernel::HLERequestContext& ctx); -    void OpenAudioOutImpl(Kernel::HLERequestContext& ctx); +    Core::System& system;  };  } // namespace Service::Audio diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index 679299f68..5b0b7f17e 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp @@ -5,6 +5,7 @@  #include <algorithm>  #include <array>  #include <memory> +#include <string_view>  #include "audio_core/audio_renderer.h"  #include "common/alignment.h" @@ -25,7 +26,7 @@ namespace Service::Audio {  class IAudioRenderer final : public ServiceFramework<IAudioRenderer> {  public: -    explicit IAudioRenderer(AudioCore::AudioRendererParameter audren_params, +    explicit IAudioRenderer(Core::System& system, AudioCore::AudioRendererParameter audren_params,                              const std::size_t instance_number)          : ServiceFramework("IAudioRenderer") {          // clang-format off @@ -46,7 +47,6 @@ public:          // clang-format on          RegisterHandlers(functions); -        auto& system = Core::System::GetInstance();          system_event = Kernel::WritableEvent::CreateEventPair(              system.Kernel(), Kernel::ResetType::Manual, "IAudioRenderer:SystemEvent");          renderer = std::make_unique<AudioCore::AudioRenderer>( @@ -160,7 +160,8 @@ private:  class IAudioDevice final : public ServiceFramework<IAudioDevice> {  public: -    IAudioDevice() : ServiceFramework("IAudioDevice") { +    explicit IAudioDevice(Core::System& system, u32_le revision_num) +        : ServiceFramework("IAudioDevice"), revision{revision_num} {          static const FunctionInfo functions[] = {              {0, &IAudioDevice::ListAudioDeviceName, "ListAudioDeviceName"},              {1, &IAudioDevice::SetAudioDeviceOutputVolume, "SetAudioDeviceOutputVolume"}, @@ -178,7 +179,7 @@ public:          };          RegisterHandlers(functions); -        auto& kernel = Core::System::GetInstance().Kernel(); +        auto& kernel = system.Kernel();          buffer_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Automatic,                                                                "IAudioOutBufferReleasedEvent"); @@ -189,15 +190,47 @@ public:      }  private: +    using AudioDeviceName = std::array<char, 256>; +    static constexpr std::array<std::string_view, 4> audio_device_names{{ +        "AudioStereoJackOutput", +        "AudioBuiltInSpeakerOutput", +        "AudioTvOutput", +        "AudioUsbDeviceOutput", +    }}; +    enum class DeviceType { +        AHUBHeadphones, +        AHUBSpeakers, +        HDA, +        USBOutput, +    }; +      void ListAudioDeviceName(Kernel::HLERequestContext& ctx) { -        LOG_WARNING(Service_Audio, "(STUBBED) called"); +        LOG_DEBUG(Service_Audio, "called"); -        constexpr std::array<char, 15> audio_interface{{"AudioInterface"}}; -        ctx.WriteBuffer(audio_interface); +        const bool usb_output_supported = +            IsFeatureSupported(AudioFeatures::AudioUSBDeviceOutput, revision); +        const std::size_t count = ctx.GetWriteBufferSize() / sizeof(AudioDeviceName); + +        std::vector<AudioDeviceName> name_buffer; +        name_buffer.reserve(audio_device_names.size()); + +        for (std::size_t i = 0; i < count && i < audio_device_names.size(); i++) { +            const auto type = static_cast<DeviceType>(i); + +            if (!usb_output_supported && type == DeviceType::USBOutput) { +                continue; +            } + +            const auto& device_name = audio_device_names[i]; +            auto& entry = name_buffer.emplace_back(); +            device_name.copy(entry.data(), device_name.size()); +        } + +        ctx.WriteBuffer(name_buffer);          IPC::ResponseBuilder rb{ctx, 3};          rb.Push(RESULT_SUCCESS); -        rb.Push<u32>(1); +        rb.Push(static_cast<u32>(name_buffer.size()));      }      void SetAudioDeviceOutputVolume(Kernel::HLERequestContext& ctx) { @@ -216,12 +249,16 @@ private:      void GetActiveAudioDeviceName(Kernel::HLERequestContext& ctx) {          LOG_WARNING(Service_Audio, "(STUBBED) called"); -        constexpr std::array<char, 12> audio_interface{{"AudioDevice"}}; -        ctx.WriteBuffer(audio_interface); +        // Currently set to always be TV audio output. +        const auto& device_name = audio_device_names[2]; -        IPC::ResponseBuilder rb{ctx, 3}; +        AudioDeviceName out_device_name{}; +        device_name.copy(out_device_name.data(), device_name.size()); + +        ctx.WriteBuffer(out_device_name); + +        IPC::ResponseBuilder rb{ctx, 2};          rb.Push(RESULT_SUCCESS); -        rb.Push<u32>(1);      }      void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) { @@ -250,12 +287,13 @@ private:          rb.PushCopyObjects(audio_output_device_switch_event.readable);      } +    u32_le revision = 0;      Kernel::EventPair buffer_event;      Kernel::EventPair audio_output_device_switch_event;  }; // namespace Audio -AudRenU::AudRenU() : ServiceFramework("audren:u") { +AudRenU::AudRenU(Core::System& system_) : ServiceFramework("audren:u"), system{system_} {      // clang-format off      static const FunctionInfo functions[] = {          {0, &AudRenU::OpenAudioRenderer, "OpenAudioRenderer"}, @@ -328,7 +366,7 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) {      };      // Calculates the portion of the size related to the mix data (and the sorting thereof). -    const auto calculate_mix_info_size = [this](const AudioCore::AudioRendererParameter& params) { +    const auto calculate_mix_info_size = [](const AudioCore::AudioRendererParameter& params) {          // The size of the mixing info data structure.          constexpr u64 mix_info_size = 0x940; @@ -400,7 +438,7 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) {      // Calculates the part of the size related to the splitter context.      const auto calculate_splitter_context_size = -        [this](const AudioCore::AudioRendererParameter& params) -> u64 { +        [](const AudioCore::AudioRendererParameter& params) -> u64 {          if (!IsFeatureSupported(AudioFeatures::Splitter, params.revision)) {              return 0;          } @@ -447,7 +485,7 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) {      };      // Calculates the part of the size related to performance statistics. -    const auto calculate_perf_size = [this](const AudioCore::AudioRendererParameter& params) { +    const auto calculate_perf_size = [](const AudioCore::AudioRendererParameter& params) {          // Extra size value appended to the end of the calculation.          constexpr u64 appended = 128; @@ -474,78 +512,76 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) {      };      // Calculates the part of the size that relates to the audio command buffer. -    const auto calculate_command_buffer_size = -        [this](const AudioCore::AudioRendererParameter& params) { -            constexpr u64 alignment = (buffer_alignment_size - 1) * 2; +    const auto calculate_command_buffer_size = [](const AudioCore::AudioRendererParameter& params) { +        constexpr u64 alignment = (buffer_alignment_size - 1) * 2; -            if (!IsFeatureSupported(AudioFeatures::VariadicCommandBuffer, params.revision)) { -                constexpr u64 command_buffer_size = 0x18000; +        if (!IsFeatureSupported(AudioFeatures::VariadicCommandBuffer, params.revision)) { +            constexpr u64 command_buffer_size = 0x18000; -                return command_buffer_size + alignment; -            } +            return command_buffer_size + alignment; +        } -            // When the variadic command buffer is supported, this means -            // the command generator for the audio renderer can issue commands -            // that are (as one would expect), variable in size. So what we need to do -            // is determine the maximum possible size for a few command data structures -            // then multiply them by the amount of present commands indicated by the given -            // respective audio parameters. +        // When the variadic command buffer is supported, this means +        // the command generator for the audio renderer can issue commands +        // that are (as one would expect), variable in size. So what we need to do +        // is determine the maximum possible size for a few command data structures +        // then multiply them by the amount of present commands indicated by the given +        // respective audio parameters. -            constexpr u64 max_biquad_filters = 2; -            constexpr u64 max_mix_buffers = 24; +        constexpr u64 max_biquad_filters = 2; +        constexpr u64 max_mix_buffers = 24; -            constexpr u64 biquad_filter_command_size = 0x2C; +        constexpr u64 biquad_filter_command_size = 0x2C; -            constexpr u64 depop_mix_command_size = 0x24; -            constexpr u64 depop_setup_command_size = 0x50; +        constexpr u64 depop_mix_command_size = 0x24; +        constexpr u64 depop_setup_command_size = 0x50; -            constexpr u64 effect_command_max_size = 0x540; +        constexpr u64 effect_command_max_size = 0x540; -            constexpr u64 mix_command_size = 0x1C; -            constexpr u64 mix_ramp_command_size = 0x24; -            constexpr u64 mix_ramp_grouped_command_size = 0x13C; +        constexpr u64 mix_command_size = 0x1C; +        constexpr u64 mix_ramp_command_size = 0x24; +        constexpr u64 mix_ramp_grouped_command_size = 0x13C; -            constexpr u64 perf_command_size = 0x28; +        constexpr u64 perf_command_size = 0x28; -            constexpr u64 sink_command_size = 0x130; +        constexpr u64 sink_command_size = 0x130; -            constexpr u64 submix_command_max_size = -                depop_mix_command_size + (mix_command_size * max_mix_buffers) * max_mix_buffers; +        constexpr u64 submix_command_max_size = +            depop_mix_command_size + (mix_command_size * max_mix_buffers) * max_mix_buffers; -            constexpr u64 volume_command_size = 0x1C; -            constexpr u64 volume_ramp_command_size = 0x20; +        constexpr u64 volume_command_size = 0x1C; +        constexpr u64 volume_ramp_command_size = 0x20; -            constexpr u64 voice_biquad_filter_command_size = -                biquad_filter_command_size * max_biquad_filters; -            constexpr u64 voice_data_command_size = 0x9C; -            const u64 voice_command_max_size = -                (params.splitter_count * depop_setup_command_size) + -                (voice_data_command_size + voice_biquad_filter_command_size + -                 volume_ramp_command_size + mix_ramp_grouped_command_size); +        constexpr u64 voice_biquad_filter_command_size = +            biquad_filter_command_size * max_biquad_filters; +        constexpr u64 voice_data_command_size = 0x9C; +        const u64 voice_command_max_size = +            (params.splitter_count * depop_setup_command_size) + +            (voice_data_command_size + voice_biquad_filter_command_size + volume_ramp_command_size + +             mix_ramp_grouped_command_size); -            // Now calculate the individual elements that comprise the size and add them together. -            const u64 effect_commands_size = params.effect_count * effect_command_max_size; +        // Now calculate the individual elements that comprise the size and add them together. +        const u64 effect_commands_size = params.effect_count * effect_command_max_size; -            const u64 final_mix_commands_size = -                depop_mix_command_size + volume_command_size * max_mix_buffers; +        const u64 final_mix_commands_size = +            depop_mix_command_size + volume_command_size * max_mix_buffers; -            const u64 perf_commands_size = -                perf_command_size * -                (CalculateNumPerformanceEntries(params) + max_perf_detail_entries); +        const u64 perf_commands_size = +            perf_command_size * (CalculateNumPerformanceEntries(params) + max_perf_detail_entries); -            const u64 sink_commands_size = params.sink_count * sink_command_size; +        const u64 sink_commands_size = params.sink_count * sink_command_size; -            const u64 splitter_commands_size = -                params.num_splitter_send_channels * max_mix_buffers * mix_ramp_command_size; +        const u64 splitter_commands_size = +            params.num_splitter_send_channels * max_mix_buffers * mix_ramp_command_size; -            const u64 submix_commands_size = params.submix_count * submix_command_max_size; +        const u64 submix_commands_size = params.submix_count * submix_command_max_size; -            const u64 voice_commands_size = params.voice_count * voice_command_max_size; +        const u64 voice_commands_size = params.voice_count * voice_command_max_size; -            return effect_commands_size + final_mix_commands_size + perf_commands_size + -                   sink_commands_size + splitter_commands_size + submix_commands_size + -                   voice_commands_size + alignment; -        }; +        return effect_commands_size + final_mix_commands_size + perf_commands_size + +               sink_commands_size + splitter_commands_size + submix_commands_size + +               voice_commands_size + alignment; +    };      IPC::RequestParser rp{ctx};      const auto params = rp.PopRaw<AudioCore::AudioRendererParameter>(); @@ -578,12 +614,16 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) {  }  void AudRenU::GetAudioDeviceService(Kernel::HLERequestContext& ctx) { -    LOG_DEBUG(Service_Audio, "called"); +    IPC::RequestParser rp{ctx}; +    const u64 aruid = rp.Pop<u64>(); -    IPC::ResponseBuilder rb{ctx, 2, 0, 1}; +    LOG_DEBUG(Service_Audio, "called. aruid={:016X}", aruid); +    // Revisionless variant of GetAudioDeviceServiceWithRevisionInfo that +    // always assumes the initial release revision (REV1). +    IPC::ResponseBuilder rb{ctx, 2, 0, 1};      rb.Push(RESULT_SUCCESS); -    rb.PushIpcInterface<Audio::IAudioDevice>(); +    rb.PushIpcInterface<IAudioDevice>(system, Common::MakeMagic('R', 'E', 'V', '1'));  }  void AudRenU::OpenAudioRendererAuto(Kernel::HLERequestContext& ctx) { @@ -593,13 +633,19 @@ void AudRenU::OpenAudioRendererAuto(Kernel::HLERequestContext& ctx) {  }  void AudRenU::GetAudioDeviceServiceWithRevisionInfo(Kernel::HLERequestContext& ctx) { -    LOG_WARNING(Service_Audio, "(STUBBED) called"); +    struct Parameters { +        u32 revision; +        u64 aruid; +    }; -    IPC::ResponseBuilder rb{ctx, 2, 0, 1}; +    IPC::RequestParser rp{ctx}; +    const auto [revision, aruid] = rp.PopRaw<Parameters>(); + +    LOG_DEBUG(Service_Audio, "called. revision={:08X}, aruid={:016X}", revision, aruid); +    IPC::ResponseBuilder rb{ctx, 2, 0, 1};      rb.Push(RESULT_SUCCESS); -    rb.PushIpcInterface<Audio::IAudioDevice>(); // TODO(ogniK): Figure out what is different -                                                // based on the current revision +    rb.PushIpcInterface<IAudioDevice>(system, revision);  }  void AudRenU::OpenAudioRendererImpl(Kernel::HLERequestContext& ctx) { @@ -608,14 +654,16 @@ void AudRenU::OpenAudioRendererImpl(Kernel::HLERequestContext& ctx) {      IPC::ResponseBuilder rb{ctx, 2, 0, 1};      rb.Push(RESULT_SUCCESS); -    rb.PushIpcInterface<IAudioRenderer>(params, audren_instance_count++); +    rb.PushIpcInterface<IAudioRenderer>(system, params, audren_instance_count++);  } -bool AudRenU::IsFeatureSupported(AudioFeatures feature, u32_le revision) const { +bool IsFeatureSupported(AudioFeatures feature, u32_le revision) {      // Byte swap      const u32_be version_num = revision - Common::MakeMagic('R', 'E', 'V', '0');      switch (feature) { +    case AudioFeatures::AudioUSBDeviceOutput: +        return version_num >= 4U;      case AudioFeatures::Splitter:          return version_num >= 2U;      case AudioFeatures::PerformanceMetricsVersion2: diff --git a/src/core/hle/service/audio/audren_u.h b/src/core/hle/service/audio/audren_u.h index 49f2733cf..4e0ccc792 100644 --- a/src/core/hle/service/audio/audren_u.h +++ b/src/core/hle/service/audio/audren_u.h @@ -6,6 +6,10 @@  #include "core/hle/service/service.h" +namespace Core { +class System; +} +  namespace Kernel {  class HLERequestContext;  } @@ -14,7 +18,7 @@ namespace Service::Audio {  class AudRenU final : public ServiceFramework<AudRenU> {  public: -    explicit AudRenU(); +    explicit AudRenU(Core::System& system_);      ~AudRenU() override;  private: @@ -26,14 +30,19 @@ private:      void OpenAudioRendererImpl(Kernel::HLERequestContext& ctx); -    enum class AudioFeatures : u32 { -        Splitter, -        PerformanceMetricsVersion2, -        VariadicCommandBuffer, -    }; - -    bool IsFeatureSupported(AudioFeatures feature, u32_le revision) const;      std::size_t audren_instance_count = 0; +    Core::System& system;  }; +// Describes a particular audio feature that may be supported in a particular revision. +enum class AudioFeatures : u32 { +    AudioUSBDeviceOutput, +    Splitter, +    PerformanceMetricsVersion2, +    VariadicCommandBuffer, +}; + +// Tests if a particular audio feature is supported with a given audio revision. +bool IsFeatureSupported(AudioFeatures feature, u32_le revision); +  } // namespace Service::Audio diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 2daa1ae49..3a0f8c3f6 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -206,7 +206,7 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm, Core::System& system) {      AM::InstallInterfaces(*sm, nv_flinger, system);      AOC::InstallInterfaces(*sm);      APM::InstallInterfaces(system); -    Audio::InstallInterfaces(*sm); +    Audio::InstallInterfaces(*sm, system);      BCAT::InstallInterfaces(*sm);      BPC::InstallInterfaces(*sm);      BtDrv::InstallInterfaces(*sm); diff --git a/src/video_core/engines/shader_bytecode.h b/src/video_core/engines/shader_bytecode.h index 8520a0143..aaa1acea9 100644 --- a/src/video_core/engines/shader_bytecode.h +++ b/src/video_core/engines/shader_bytecode.h @@ -560,6 +560,11 @@ union Instruction {      BitField<48, 16, u64> opcode;      union { +        BitField<8, 5, ConditionCode> cc; +        BitField<13, 1, u64> trigger; +    } nop; + +    union {          BitField<8, 8, Register> gpr;          BitField<20, 24, s64> offset;      } gmem; @@ -1018,8 +1023,6 @@ union Instruction {          } f2i;          union { -            BitField<8, 2, Register::Size> src_size; -            BitField<10, 2, Register::Size> dst_size;              BitField<39, 4, u64> rounding;              // H0, H1 extract for F16 missing              BitField<41, 1, u64> selector; // Guessed as some games set it, TODO: reverse this value @@ -1516,6 +1519,7 @@ public:          TMML,   // Texture Mip Map Level          SUST,   // Surface Store          EXIT, +        NOP,          IPA,          OUT_R, // Emit vertex/primitive          ISBERD, @@ -1795,6 +1799,7 @@ private:              INST("110111110110----", Id::TMML_B, Type::Texture, "TMML_B"),              INST("1101111101011---", Id::TMML, Type::Texture, "TMML"),              INST("11101011001-----", Id::SUST, Type::Image, "SUST"), +            INST("0101000010110---", Id::NOP, Type::Trivial, "NOP"),              INST("11100000--------", Id::IPA, Type::Trivial, "IPA"),              INST("1111101111100---", Id::OUT_R, Type::Trivial, "OUT_R"),              INST("1110111111010---", Id::ISBERD, Type::Trivial, "ISBERD"), diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index ffe26b241..d8f722c26 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp @@ -1136,6 +1136,16 @@ private:                                 Type::Float);      } +    std::string FCastHalf0(Operation operation) { +        const std::string op_a = VisitOperand(operation, 0, Type::HalfFloat); +        return fmt::format("({})[0]", op_a); +    } + +    std::string FCastHalf1(Operation operation) { +        const std::string op_a = VisitOperand(operation, 0, Type::HalfFloat); +        return fmt::format("({})[1]", op_a); +    } +      template <Type type>      std::string Min(Operation operation) {          return GenerateBinaryCall(operation, "min", type, type, type); @@ -1292,6 +1302,11 @@ private:          return ApplyPrecise(operation, BitwiseCastResult(clamped, Type::HalfFloat));      } +    std::string HCastFloat(Operation operation) { +        const std::string op_a = VisitOperand(operation, 0, Type::Float); +        return fmt::format("fromHalf2(vec2({}, 0.0f))", op_a); +    } +      std::string HUnpack(Operation operation) {          const std::string operand{VisitOperand(operation, 0, Type::HalfFloat)};          const auto value = [&]() -> std::string { @@ -1732,6 +1747,8 @@ private:          &GLSLDecompiler::Negate<Type::Float>,          &GLSLDecompiler::Absolute<Type::Float>,          &GLSLDecompiler::FClamp, +        &GLSLDecompiler::FCastHalf0, +        &GLSLDecompiler::FCastHalf1,          &GLSLDecompiler::Min<Type::Float>,          &GLSLDecompiler::Max<Type::Float>,          &GLSLDecompiler::FCos, @@ -1792,6 +1809,7 @@ private:          &GLSLDecompiler::Absolute<Type::HalfFloat>,          &GLSLDecompiler::HNegate,          &GLSLDecompiler::HClamp, +        &GLSLDecompiler::HCastFloat,          &GLSLDecompiler::HUnpack,          &GLSLDecompiler::HMergeF32,          &GLSLDecompiler::HMergeH0, diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp index d267712c9..24a591797 100644 --- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp +++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp @@ -735,6 +735,16 @@ private:          return {};      } +    Id FCastHalf0(Operation operation) { +        UNIMPLEMENTED(); +        return {}; +    } + +    Id FCastHalf1(Operation operation) { +        UNIMPLEMENTED(); +        return {}; +    } +      Id HNegate(Operation operation) {          UNIMPLEMENTED();          return {}; @@ -745,6 +755,11 @@ private:          return {};      } +    Id HCastFloat(Operation operation) { +        UNIMPLEMENTED(); +        return {}; +    } +      Id HUnpack(Operation operation) {          UNIMPLEMENTED();          return {}; @@ -1210,6 +1225,8 @@ private:          &SPIRVDecompiler::Unary<&Module::OpFNegate, Type::Float>,          &SPIRVDecompiler::Unary<&Module::OpFAbs, Type::Float>,          &SPIRVDecompiler::Ternary<&Module::OpFClamp, Type::Float>, +        &SPIRVDecompiler::FCastHalf0, +        &SPIRVDecompiler::FCastHalf1,          &SPIRVDecompiler::Binary<&Module::OpFMin, Type::Float>,          &SPIRVDecompiler::Binary<&Module::OpFMax, Type::Float>,          &SPIRVDecompiler::Unary<&Module::OpCos, Type::Float>, @@ -1270,6 +1287,7 @@ private:          &SPIRVDecompiler::Unary<&Module::OpFAbs, Type::HalfFloat>,          &SPIRVDecompiler::HNegate,          &SPIRVDecompiler::HClamp, +        &SPIRVDecompiler::HCastFloat,          &SPIRVDecompiler::HUnpack,          &SPIRVDecompiler::HMergeF32,          &SPIRVDecompiler::HMergeH0, diff --git a/src/video_core/shader/decode/conversion.cpp b/src/video_core/shader/decode/conversion.cpp index 4221f0c58..8973fbefa 100644 --- a/src/video_core/shader/decode/conversion.cpp +++ b/src/video_core/shader/decode/conversion.cpp @@ -57,7 +57,7 @@ u32 ShaderIR::DecodeConversion(NodeBlock& bb, u32 pc) {      case OpCode::Id::I2F_R:      case OpCode::Id::I2F_C:      case OpCode::Id::I2F_IMM: { -        UNIMPLEMENTED_IF(instr.conversion.dst_size != Register::Size::Word); +        UNIMPLEMENTED_IF(instr.conversion.dst_size == Register::Size::Long);          UNIMPLEMENTED_IF(instr.conversion.selector);          UNIMPLEMENTED_IF_MSG(instr.generates_cc,                               "Condition codes generation in I2F is not implemented"); @@ -82,14 +82,19 @@ u32 ShaderIR::DecodeConversion(NodeBlock& bb, u32 pc) {          value = GetOperandAbsNegFloat(value, false, instr.conversion.negate_a);          SetInternalFlagsFromFloat(bb, value, instr.generates_cc); + +        if (instr.conversion.dst_size == Register::Size::Short) { +            value = Operation(OperationCode::HCastFloat, PRECISE, value); +        } +          SetRegister(bb, instr.gpr0, value);          break;      }      case OpCode::Id::F2F_R:      case OpCode::Id::F2F_C:      case OpCode::Id::F2F_IMM: { -        UNIMPLEMENTED_IF(instr.conversion.f2f.dst_size != Register::Size::Word); -        UNIMPLEMENTED_IF(instr.conversion.f2f.src_size != Register::Size::Word); +        UNIMPLEMENTED_IF(instr.conversion.dst_size == Register::Size::Long); +        UNIMPLEMENTED_IF(instr.conversion.src_size == Register::Size::Long);          UNIMPLEMENTED_IF_MSG(instr.generates_cc,                               "Condition codes generation in F2F is not implemented"); @@ -107,6 +112,11 @@ u32 ShaderIR::DecodeConversion(NodeBlock& bb, u32 pc) {              }          }(); +        if (instr.conversion.src_size == Register::Size::Short) { +            // TODO: figure where extract is sey in the encoding +            value = Operation(OperationCode::FCastHalf0, PRECISE, value); +        } +          value = GetOperandAbsNegFloat(value, instr.conversion.abs_a, instr.conversion.negate_a);          value = [&]() { @@ -124,19 +134,24 @@ u32 ShaderIR::DecodeConversion(NodeBlock& bb, u32 pc) {              default:                  UNIMPLEMENTED_MSG("Unimplemented F2F rounding mode {}",                                    static_cast<u32>(instr.conversion.f2f.rounding.Value())); -                return Immediate(0); +                return value;              }          }();          value = GetSaturatedFloat(value, instr.alu.saturate_d);          SetInternalFlagsFromFloat(bb, value, instr.generates_cc); + +        if (instr.conversion.dst_size == Register::Size::Short) { +            value = Operation(OperationCode::HCastFloat, PRECISE, value); +        } +          SetRegister(bb, instr.gpr0, value);          break;      }      case OpCode::Id::F2I_R:      case OpCode::Id::F2I_C:      case OpCode::Id::F2I_IMM: { -        UNIMPLEMENTED_IF(instr.conversion.src_size != Register::Size::Word); +        UNIMPLEMENTED_IF(instr.conversion.src_size == Register::Size::Long);          UNIMPLEMENTED_IF_MSG(instr.generates_cc,                               "Condition codes generation in F2I is not implemented");          Node value = [&]() { @@ -153,6 +168,11 @@ u32 ShaderIR::DecodeConversion(NodeBlock& bb, u32 pc) {              }          }(); +        if (instr.conversion.src_size == Register::Size::Short) { +            // TODO: figure where extract is sey in the encoding +            value = Operation(OperationCode::FCastHalf0, PRECISE, value); +        } +          value = GetOperandAbsNegFloat(value, instr.conversion.abs_a, instr.conversion.negate_a);          value = [&]() { diff --git a/src/video_core/shader/decode/half_set_predicate.cpp b/src/video_core/shader/decode/half_set_predicate.cpp index 7ec353ed1..afea33e5f 100644 --- a/src/video_core/shader/decode/half_set_predicate.cpp +++ b/src/video_core/shader/decode/half_set_predicate.cpp @@ -52,15 +52,15 @@ u32 ShaderIR::DecodeHalfSetPredicate(NodeBlock& bb, u32 pc) {      }      const OperationCode combiner = GetPredicateCombiner(instr.hsetp2.op); -    const Node pred39 = GetPredicate(instr.hsetp2.pred39, instr.hsetp2.neg_pred); +    const Node combined_pred = GetPredicate(instr.hsetp2.pred3, instr.hsetp2.neg_pred);      const auto Write = [&](u64 dest, Node src) { -        SetPredicate(bb, dest, Operation(combiner, std::move(src), pred39)); +        SetPredicate(bb, dest, Operation(combiner, std::move(src), combined_pred));      };      const Node comparison = GetPredicateComparisonHalf(cond, op_a, op_b);      const u64 first = instr.hsetp2.pred0; -    const u64 second = instr.hsetp2.pred3; +    const u64 second = instr.hsetp2.pred39;      if (h_and) {          const Node joined = Operation(OperationCode::LogicalAnd2, comparison);          Write(first, joined); diff --git a/src/video_core/shader/decode/other.cpp b/src/video_core/shader/decode/other.cpp index c0f64d7a0..ac0e764d6 100644 --- a/src/video_core/shader/decode/other.cpp +++ b/src/video_core/shader/decode/other.cpp @@ -22,6 +22,12 @@ u32 ShaderIR::DecodeOther(NodeBlock& bb, u32 pc) {      const auto opcode = OpCode::Decode(instr);      switch (opcode->get().GetId()) { +    case OpCode::Id::NOP: { +        UNIMPLEMENTED_IF(instr.nop.cc != Tegra::Shader::ConditionCode::T); +        UNIMPLEMENTED_IF(instr.nop.trigger != 0); +        // With the previous preconditions, this instruction is a no-operation. +        break; +    }      case OpCode::Id::EXIT: {          const Tegra::Shader::ConditionCode cc = instr.flow_condition_code;          UNIMPLEMENTED_IF_MSG(cc != Tegra::Shader::ConditionCode::T, "EXIT condition code used: {}", diff --git a/src/video_core/shader/node.h b/src/video_core/shader/node.h index 715184d67..5f0852364 100644 --- a/src/video_core/shader/node.h +++ b/src/video_core/shader/node.h @@ -30,6 +30,8 @@ enum class OperationCode {      FNegate,       /// (MetaArithmetic, float a) -> float      FAbsolute,     /// (MetaArithmetic, float a) -> float      FClamp,        /// (MetaArithmetic, float value, float min, float max) -> float +    FCastHalf0,    /// (MetaArithmetic, f16vec2 a) -> float +    FCastHalf1,    /// (MetaArithmetic, f16vec2 a) -> float      FMin,          /// (MetaArithmetic, float a, float b) -> float      FMax,          /// (MetaArithmetic, float a, float b) -> float      FCos,          /// (MetaArithmetic, float a) -> float @@ -83,17 +85,18 @@ enum class OperationCode {      UBitfieldExtract, /// (MetaArithmetic, uint value, int offset, int offset) -> uint      UBitCount,        /// (MetaArithmetic, uint) -> uint -    HAdd,      /// (MetaArithmetic, f16vec2 a, f16vec2 b) -> f16vec2 -    HMul,      /// (MetaArithmetic, f16vec2 a, f16vec2 b) -> f16vec2 -    HFma,      /// (MetaArithmetic, f16vec2 a, f16vec2 b, f16vec2 c) -> f16vec2 -    HAbsolute, /// (f16vec2 a) -> f16vec2 -    HNegate,   /// (f16vec2 a, bool first, bool second) -> f16vec2 -    HClamp,    /// (f16vec2 src, float min, float max) -> f16vec2 -    HUnpack,   /// (Tegra::Shader::HalfType, T value) -> f16vec2 -    HMergeF32, /// (f16vec2 src) -> float -    HMergeH0,  /// (f16vec2 dest, f16vec2 src) -> f16vec2 -    HMergeH1,  /// (f16vec2 dest, f16vec2 src) -> f16vec2 -    HPack2,    /// (float a, float b) -> f16vec2 +    HAdd,       /// (MetaArithmetic, f16vec2 a, f16vec2 b) -> f16vec2 +    HMul,       /// (MetaArithmetic, f16vec2 a, f16vec2 b) -> f16vec2 +    HFma,       /// (MetaArithmetic, f16vec2 a, f16vec2 b, f16vec2 c) -> f16vec2 +    HAbsolute,  /// (f16vec2 a) -> f16vec2 +    HNegate,    /// (f16vec2 a, bool first, bool second) -> f16vec2 +    HClamp,     /// (f16vec2 src, float min, float max) -> f16vec2 +    HCastFloat, /// (MetaArithmetic, float a) -> f16vec2 +    HUnpack,    /// (Tegra::Shader::HalfType, T value) -> f16vec2 +    HMergeF32,  /// (f16vec2 src) -> float +    HMergeH0,   /// (f16vec2 dest, f16vec2 src) -> f16vec2 +    HMergeH1,   /// (f16vec2 dest, f16vec2 src) -> f16vec2 +    HPack2,     /// (float a, float b) -> f16vec2      LogicalAssign, /// (bool& dst, bool src) -> void      LogicalAnd,    /// (bool a, bool b) -> bool diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 3dc0e47d0..f051e17b4 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -1,5 +1,6 @@  set(CMAKE_AUTOMOC ON)  set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON)  set(CMAKE_INCLUDE_CURRENT_DIR ON)  set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMakeModules) @@ -7,6 +8,7 @@ add_executable(yuzu      Info.plist      about_dialog.cpp      about_dialog.h +    aboutdialog.ui      applets/error.cpp      applets/error.h      applets/profile_select.cpp @@ -17,42 +19,59 @@ add_executable(yuzu      applets/web_browser.h      bootmanager.cpp      bootmanager.h +    compatdb.ui      compatibility_list.cpp      compatibility_list.h      configuration/config.cpp      configuration/config.h +    configuration/configure.ui      configuration/configure_audio.cpp      configuration/configure_audio.h +    configuration/configure_audio.ui      configuration/configure_debug.cpp      configuration/configure_debug.h +    configuration/configure_debug.ui      configuration/configure_dialog.cpp      configuration/configure_dialog.h      configuration/configure_gamelist.cpp      configuration/configure_gamelist.h +    configuration/configure_gamelist.ui      configuration/configure_general.cpp      configuration/configure_general.h +    configuration/configure_general.ui      configuration/configure_graphics.cpp      configuration/configure_graphics.h +    configuration/configure_graphics.ui      configuration/configure_hotkeys.cpp      configuration/configure_hotkeys.h +    configuration/configure_hotkeys.ui      configuration/configure_input.cpp      configuration/configure_input.h +    configuration/configure_input.ui      configuration/configure_input_player.cpp      configuration/configure_input_player.h +    configuration/configure_input_player.ui      configuration/configure_input_simple.cpp      configuration/configure_input_simple.h +    configuration/configure_input_simple.ui      configuration/configure_mouse_advanced.cpp      configuration/configure_mouse_advanced.h +    configuration/configure_mouse_advanced.ui +    configuration/configure_per_general.cpp +    configuration/configure_per_general.h +    configuration/configure_per_general.ui      configuration/configure_profile_manager.cpp      configuration/configure_profile_manager.h +    configuration/configure_profile_manager.ui      configuration/configure_system.cpp      configuration/configure_system.h -    configuration/configure_per_general.cpp -    configuration/configure_per_general.h +    configuration/configure_system.ui      configuration/configure_touchscreen_advanced.cpp      configuration/configure_touchscreen_advanced.h +    configuration/configure_touchscreen_advanced.ui      configuration/configure_web.cpp      configuration/configure_web.h +    configuration/configure_web.ui      debugger/graphics/graphics_breakpoint_observer.cpp      debugger/graphics/graphics_breakpoint_observer.h      debugger/graphics/graphics_breakpoints.cpp @@ -72,12 +91,14 @@ add_executable(yuzu      game_list_worker.h      loading_screen.cpp      loading_screen.h +    loading_screen.ui      hotkeys.cpp      hotkeys.h      main.cpp      main.h -    ui_settings.cpp -    ui_settings.h +    main.ui +    uisettings.cpp +    uisettings.h      util/limitable_input_dialog.cpp      util/limitable_input_dialog.h      util/sequence_dialog/sequence_dialog.cpp @@ -89,44 +110,18 @@ add_executable(yuzu      yuzu.rc  ) -set(UIS -    aboutdialog.ui -    configuration/configure.ui -    configuration/configure_audio.ui -    configuration/configure_debug.ui -    configuration/configure_gamelist.ui -    configuration/configure_general.ui -    configuration/configure_graphics.ui -    configuration/configure_hotkeys.ui -    configuration/configure_input.ui -    configuration/configure_input_player.ui -    configuration/configure_input_simple.ui -    configuration/configure_mouse_advanced.ui -    configuration/configure_per_general.ui -    configuration/configure_profile_manager.ui -    configuration/configure_system.ui -    configuration/configure_touchscreen_advanced.ui -    configuration/configure_web.ui -    compatdb.ui -    loading_screen.ui -    main.ui -) -  file(GLOB COMPAT_LIST       ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc       ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json)  file(GLOB_RECURSE ICONS ${PROJECT_SOURCE_DIR}/dist/icons/*)  file(GLOB_RECURSE THEMES ${PROJECT_SOURCE_DIR}/dist/qt_themes/*) -qt5_wrap_ui(UI_HDRS ${UIS})  target_sources(yuzu      PRIVATE          ${COMPAT_LIST}          ${ICONS}          ${THEMES} -        ${UI_HDRS} -        ${UIS}  )  if (APPLE) diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index b7f3fdf75..5d0fb3f9f 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -11,7 +11,7 @@  #include "core/hle/service/hid/controllers/npad.h"  #include "input_common/main.h"  #include "yuzu/configuration/config.h" -#include "yuzu/ui_settings.h" +#include "yuzu/uisettings.h"  Config::Config() {      // TODO: Don't hardcode the path; let the frontend decide where to put the config files. diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp index 9a13bb797..5b7e03056 100644 --- a/src/yuzu/configuration/configure_debug.cpp +++ b/src/yuzu/configuration/configure_debug.cpp @@ -12,13 +12,13 @@  #include "ui_configure_debug.h"  #include "yuzu/configuration/configure_debug.h"  #include "yuzu/debugger/console.h" -#include "yuzu/ui_settings.h" +#include "yuzu/uisettings.h"  ConfigureDebug::ConfigureDebug(QWidget* parent) : QWidget(parent), ui(new Ui::ConfigureDebug) {      ui->setupUi(this);      SetConfiguration(); -    connect(ui->open_log_button, &QPushButton::pressed, []() { +    connect(ui->open_log_button, &QPushButton::clicked, []() {          QString path = QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::LogDir));          QDesktopServices::openUrl(QUrl::fromLocalFile(path));      }); diff --git a/src/yuzu/configuration/configure_gamelist.cpp b/src/yuzu/configuration/configure_gamelist.cpp index d1724ba89..daedbc33e 100644 --- a/src/yuzu/configuration/configure_gamelist.cpp +++ b/src/yuzu/configuration/configure_gamelist.cpp @@ -9,7 +9,7 @@  #include "core/settings.h"  #include "ui_configure_gamelist.h"  #include "yuzu/configuration/configure_gamelist.h" -#include "yuzu/ui_settings.h" +#include "yuzu/uisettings.h"  namespace {  constexpr std::array default_icon_sizes{ diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index 7a6e921cd..75fcbfea3 100644 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp @@ -6,7 +6,7 @@  #include "core/settings.h"  #include "ui_configure_general.h"  #include "yuzu/configuration/configure_general.h" -#include "yuzu/ui_settings.h" +#include "yuzu/uisettings.h"  ConfigureGeneral::ConfigureGeneral(QWidget* parent)      : QWidget(parent), ui(new Ui::ConfigureGeneral) { diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp index 4dd775aab..7613197f2 100644 --- a/src/yuzu/configuration/configure_input.cpp +++ b/src/yuzu/configuration/configure_input.cpp @@ -79,7 +79,7 @@ ConfigureInput::ConfigureInput(QWidget* parent)      LoadConfiguration();      UpdateUIEnabled(); -    connect(ui->restore_defaults_button, &QPushButton::pressed, this, +    connect(ui->restore_defaults_button, &QPushButton::clicked, this,              &ConfigureInput::RestoreDefaults);      for (auto* enabled : players_controller) { @@ -96,20 +96,20 @@ ConfigureInput::ConfigureInput(QWidget* parent)              &ConfigureInput::UpdateUIEnabled);      for (std::size_t i = 0; i < players_configure.size(); ++i) { -        connect(players_configure[i], &QPushButton::pressed, this, +        connect(players_configure[i], &QPushButton::clicked, this,                  [this, i] { CallConfigureDialog<ConfigureInputPlayer>(*this, i, false); });      } -    connect(ui->handheld_configure, &QPushButton::pressed, this, +    connect(ui->handheld_configure, &QPushButton::clicked, this,              [this] { CallConfigureDialog<ConfigureInputPlayer>(*this, 8, false); }); -    connect(ui->debug_configure, &QPushButton::pressed, this, +    connect(ui->debug_configure, &QPushButton::clicked, this,              [this] { CallConfigureDialog<ConfigureInputPlayer>(*this, 9, true); }); -    connect(ui->mouse_advanced, &QPushButton::pressed, this, +    connect(ui->mouse_advanced, &QPushButton::clicked, this,              [this] { CallConfigureDialog<ConfigureMouseAdvanced>(*this); }); -    connect(ui->touchscreen_advanced, &QPushButton::pressed, this, +    connect(ui->touchscreen_advanced, &QPushButton::clicked, this,              [this] { CallConfigureDialog<ConfigureTouchscreenAdvanced>(*this); });  } diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 916baccc1..7b70f307c 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -244,7 +244,7 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i          }          button->setContextMenuPolicy(Qt::CustomContextMenu); -        connect(button, &QPushButton::released, [=] { +        connect(button, &QPushButton::clicked, [=] {              HandleClick(                  button_map[button_id],                  [=](const Common::ParamPackage& params) { buttons_param[button_id] = params; }, @@ -273,7 +273,7 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i              }              analog_button->setContextMenuPolicy(Qt::CustomContextMenu); -            connect(analog_button, &QPushButton::released, [=]() { +            connect(analog_button, &QPushButton::clicked, [=]() {                  HandleClick(analog_map_buttons[analog_id][sub_button_id],                              [=](const Common::ParamPackage& params) {                                  SetAnalogButton(params, analogs_param[analog_id], @@ -300,7 +300,7 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i                              menu_location));                      });          } -        connect(analog_map_stick[analog_id], &QPushButton::released, [=] { +        connect(analog_map_stick[analog_id], &QPushButton::clicked, [=] {              QMessageBox::information(this, tr("Information"),                                       tr("After pressing OK, first move your joystick horizontally, "                                          "and then vertically.")); @@ -311,8 +311,8 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i          });      } -    connect(ui->buttonClearAll, &QPushButton::released, [this] { ClearAll(); }); -    connect(ui->buttonRestoreDefaults, &QPushButton::released, [this] { RestoreDefaults(); }); +    connect(ui->buttonClearAll, &QPushButton::clicked, [this] { ClearAll(); }); +    connect(ui->buttonRestoreDefaults, &QPushButton::clicked, [this] { RestoreDefaults(); });      timeout_timer->setSingleShot(true);      connect(timeout_timer.get(), &QTimer::timeout, [this] { SetPollingResult({}, true); }); diff --git a/src/yuzu/configuration/configure_input_simple.cpp b/src/yuzu/configuration/configure_input_simple.cpp index 864803ea3..ab3a11d30 100644 --- a/src/yuzu/configuration/configure_input_simple.cpp +++ b/src/yuzu/configuration/configure_input_simple.cpp @@ -9,7 +9,7 @@  #include "yuzu/configuration/configure_input.h"  #include "yuzu/configuration/configure_input_player.h"  #include "yuzu/configuration/configure_input_simple.h" -#include "yuzu/ui_settings.h" +#include "yuzu/uisettings.h"  namespace { @@ -101,7 +101,7 @@ ConfigureInputSimple::ConfigureInputSimple(QWidget* parent)      connect(ui->profile_combobox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,              &ConfigureInputSimple::OnSelectProfile); -    connect(ui->profile_configure, &QPushButton::pressed, this, &ConfigureInputSimple::OnConfigure); +    connect(ui->profile_configure, &QPushButton::clicked, this, &ConfigureInputSimple::OnConfigure);      LoadConfiguration();  } diff --git a/src/yuzu/configuration/configure_mouse_advanced.cpp b/src/yuzu/configuration/configure_mouse_advanced.cpp index b7305e653..0a4abe34f 100644 --- a/src/yuzu/configuration/configure_mouse_advanced.cpp +++ b/src/yuzu/configuration/configure_mouse_advanced.cpp @@ -83,7 +83,7 @@ ConfigureMouseAdvanced::ConfigureMouseAdvanced(QWidget* parent)          }          button->setContextMenuPolicy(Qt::CustomContextMenu); -        connect(button, &QPushButton::released, [=] { +        connect(button, &QPushButton::clicked, [=] {              HandleClick(                  button_map[button_id],                  [=](const Common::ParamPackage& params) { buttons_param[button_id] = params; }, @@ -104,8 +104,8 @@ ConfigureMouseAdvanced::ConfigureMouseAdvanced(QWidget* parent)          });      } -    connect(ui->buttonClearAll, &QPushButton::released, [this] { ClearAll(); }); -    connect(ui->buttonRestoreDefaults, &QPushButton::released, [this] { RestoreDefaults(); }); +    connect(ui->buttonClearAll, &QPushButton::clicked, [this] { ClearAll(); }); +    connect(ui->buttonRestoreDefaults, &QPushButton::clicked, [this] { RestoreDefaults(); });      timeout_timer->setSingleShot(true);      connect(timeout_timer.get(), &QTimer::timeout, [this] { SetPollingResult({}, true); }); diff --git a/src/yuzu/configuration/configure_per_general.cpp b/src/yuzu/configuration/configure_per_general.cpp index 90336e235..d7f259f12 100644 --- a/src/yuzu/configuration/configure_per_general.cpp +++ b/src/yuzu/configuration/configure_per_general.cpp @@ -23,7 +23,7 @@  #include "yuzu/configuration/config.h"  #include "yuzu/configuration/configure_input.h"  #include "yuzu/configuration/configure_per_general.h" -#include "yuzu/ui_settings.h" +#include "yuzu/uisettings.h"  #include "yuzu/util/util.h"  ConfigurePerGameGeneral::ConfigurePerGameGeneral(QWidget* parent, u64 title_id) diff --git a/src/yuzu/configuration/configure_profile_manager.cpp b/src/yuzu/configuration/configure_profile_manager.cpp index c90f4cdd8..f53423440 100644 --- a/src/yuzu/configuration/configure_profile_manager.cpp +++ b/src/yuzu/configuration/configure_profile_manager.cpp @@ -108,10 +108,10 @@ ConfigureProfileManager ::ConfigureProfileManager(QWidget* parent)      connect(tree_view, &QTreeView::clicked, this, &ConfigureProfileManager::SelectUser); -    connect(ui->pm_add, &QPushButton::pressed, this, &ConfigureProfileManager::AddUser); -    connect(ui->pm_rename, &QPushButton::pressed, this, &ConfigureProfileManager::RenameUser); -    connect(ui->pm_remove, &QPushButton::pressed, this, &ConfigureProfileManager::DeleteUser); -    connect(ui->pm_set_image, &QPushButton::pressed, this, &ConfigureProfileManager::SetUserImage); +    connect(ui->pm_add, &QPushButton::clicked, this, &ConfigureProfileManager::AddUser); +    connect(ui->pm_rename, &QPushButton::clicked, this, &ConfigureProfileManager::RenameUser); +    connect(ui->pm_remove, &QPushButton::clicked, this, &ConfigureProfileManager::DeleteUser); +    connect(ui->pm_set_image, &QPushButton::clicked, this, &ConfigureProfileManager::SetUserImage);      scene = new QGraphicsScene;      ui->current_user_icon->setScene(scene); diff --git a/src/yuzu/configuration/configure_touchscreen_advanced.cpp b/src/yuzu/configuration/configure_touchscreen_advanced.cpp index 8ced28c75..7d7cc00b7 100644 --- a/src/yuzu/configuration/configure_touchscreen_advanced.cpp +++ b/src/yuzu/configuration/configure_touchscreen_advanced.cpp @@ -11,7 +11,7 @@ ConfigureTouchscreenAdvanced::ConfigureTouchscreenAdvanced(QWidget* parent)      : QDialog(parent), ui(std::make_unique<Ui::ConfigureTouchscreenAdvanced>()) {      ui->setupUi(this); -    connect(ui->restore_defaults_button, &QPushButton::pressed, this, +    connect(ui->restore_defaults_button, &QPushButton::clicked, this,              &ConfigureTouchscreenAdvanced::RestoreDefaults);      LoadConfiguration(); diff --git a/src/yuzu/configuration/configure_web.cpp b/src/yuzu/configuration/configure_web.cpp index 5a70ef168..336b062b3 100644 --- a/src/yuzu/configuration/configure_web.cpp +++ b/src/yuzu/configuration/configure_web.cpp @@ -9,7 +9,7 @@  #include "core/telemetry_session.h"  #include "ui_configure_web.h"  #include "yuzu/configuration/configure_web.h" -#include "yuzu/ui_settings.h" +#include "yuzu/uisettings.h"  ConfigureWeb::ConfigureWeb(QWidget* parent)      : QWidget(parent), ui(std::make_unique<Ui::ConfigureWeb>()) { diff --git a/src/yuzu/debugger/console.cpp b/src/yuzu/debugger/console.cpp index 320898f6a..207ff4d58 100644 --- a/src/yuzu/debugger/console.cpp +++ b/src/yuzu/debugger/console.cpp @@ -10,7 +10,7 @@  #include "common/logging/backend.h"  #include "yuzu/debugger/console.h" -#include "yuzu/ui_settings.h" +#include "yuzu/uisettings.h"  namespace Debugger {  void ToggleConsole() { diff --git a/src/yuzu/discord_impl.cpp b/src/yuzu/discord_impl.cpp index 9d87a41eb..ea0079353 100644 --- a/src/yuzu/discord_impl.cpp +++ b/src/yuzu/discord_impl.cpp @@ -9,7 +9,7 @@  #include "core/core.h"  #include "core/loader/loader.h"  #include "yuzu/discord_impl.h" -#include "yuzu/ui_settings.h" +#include "yuzu/uisettings.h"  namespace DiscordRPC { diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game_list.cpp index 1885587af..d18b96519 100644 --- a/src/yuzu/game_list.cpp +++ b/src/yuzu/game_list.cpp @@ -23,7 +23,7 @@  #include "yuzu/game_list_p.h"  #include "yuzu/game_list_worker.h"  #include "yuzu/main.h" -#include "yuzu/ui_settings.h" +#include "yuzu/uisettings.h"  GameListSearchField::KeyReleaseEater::KeyReleaseEater(GameList* gamelist) : gamelist{gamelist} {} diff --git a/src/yuzu/game_list_p.h b/src/yuzu/game_list_p.h index 0b458ef48..ece534dd6 100644 --- a/src/yuzu/game_list_p.h +++ b/src/yuzu/game_list_p.h @@ -19,7 +19,7 @@  #include "common/common_types.h"  #include "common/logging/log.h"  #include "common/string_util.h" -#include "yuzu/ui_settings.h" +#include "yuzu/uisettings.h"  #include "yuzu/util/util.h"  /** diff --git a/src/yuzu/game_list_worker.cpp b/src/yuzu/game_list_worker.cpp index 4f30e9147..77f358630 100644 --- a/src/yuzu/game_list_worker.cpp +++ b/src/yuzu/game_list_worker.cpp @@ -29,7 +29,7 @@  #include "yuzu/game_list.h"  #include "yuzu/game_list_p.h"  #include "yuzu/game_list_worker.h" -#include "yuzu/ui_settings.h" +#include "yuzu/uisettings.h"  namespace { diff --git a/src/yuzu/hotkeys.cpp b/src/yuzu/hotkeys.cpp index 4582e7f21..d4e97fa16 100644 --- a/src/yuzu/hotkeys.cpp +++ b/src/yuzu/hotkeys.cpp @@ -7,7 +7,7 @@  #include <QTreeWidgetItem>  #include <QtGlobal>  #include "yuzu/hotkeys.h" -#include "yuzu/ui_settings.h" +#include "yuzu/uisettings.h"  HotkeyRegistry::HotkeyRegistry() = default;  HotkeyRegistry::~HotkeyRegistry() = default; diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 381644694..a7c656fdb 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -100,7 +100,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual  #include "yuzu/hotkeys.h"  #include "yuzu/loading_screen.h"  #include "yuzu/main.h" -#include "yuzu/ui_settings.h" +#include "yuzu/uisettings.h"  #ifdef USE_DISCORD_PRESENCE  #include "yuzu/discord_impl.h" diff --git a/src/yuzu/ui_settings.cpp b/src/yuzu/uisettings.cpp index 4bdc302e0..7f7d247a3 100644 --- a/src/yuzu/ui_settings.cpp +++ b/src/yuzu/uisettings.cpp @@ -2,7 +2,7 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. -#include "ui_settings.h" +#include "yuzu/uisettings.h"  namespace UISettings { diff --git a/src/yuzu/ui_settings.h b/src/yuzu/uisettings.h index a62cd6911..a62cd6911 100644 --- a/src/yuzu/ui_settings.h +++ b/src/yuzu/uisettings.h diff --git a/src/yuzu_tester/yuzu.cpp b/src/yuzu_tester/yuzu.cpp index b589c3de3..0ee97aa54 100644 --- a/src/yuzu_tester/yuzu.cpp +++ b/src/yuzu_tester/yuzu.cpp @@ -92,7 +92,6 @@ int main(int argc, char** argv) {      int option_index = 0; -    char* endarg;  #ifdef _WIN32      int argc_w;      auto argv_w = CommandLineToArgvW(GetCommandLineW(), &argc_w); @@ -226,7 +225,7 @@ int main(int argc, char** argv) {      switch (load_result) {      case Core::System::ResultStatus::ErrorGetLoader: -        LOG_CRITICAL(Frontend, "Failed to obtain loader for %s!", filepath.c_str()); +        LOG_CRITICAL(Frontend, "Failed to obtain loader for {}!", filepath);          return -1;      case Core::System::ResultStatus::ErrorLoader:          LOG_CRITICAL(Frontend, "Failed to load ROM!"); | 
