diff options
Diffstat (limited to 'src')
41 files changed, 587 insertions, 204 deletions
diff --git a/src/common/telemetry.cpp b/src/common/telemetry.cpp index 200c6489a..16d42facd 100644 --- a/src/common/telemetry.cpp +++ b/src/common/telemetry.cpp @@ -60,6 +60,7 @@ void AppendCPUInfo(FieldCollection& fc) {      fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AES", Common::GetCPUCaps().aes);      fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX", Common::GetCPUCaps().avx);      fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX2", Common::GetCPUCaps().avx2); +    fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX512", Common::GetCPUCaps().avx512);      fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_BMI1", Common::GetCPUCaps().bmi1);      fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_BMI2", Common::GetCPUCaps().bmi2);      fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_FMA", Common::GetCPUCaps().fma); diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp index c9349a6b4..f35dcb498 100644 --- a/src/common/x64/cpu_detect.cpp +++ b/src/common/x64/cpu_detect.cpp @@ -110,6 +110,11 @@ static CPUCaps Detect() {                  caps.bmi1 = true;              if ((cpu_id[1] >> 8) & 1)                  caps.bmi2 = true; +            // Checks for AVX512F, AVX512CD, AVX512VL, AVX512DQ, AVX512BW (Intel Skylake-X/SP) +            if ((cpu_id[1] >> 16) & 1 && (cpu_id[1] >> 28) & 1 && (cpu_id[1] >> 31) & 1 && +                (cpu_id[1] >> 17) & 1 && (cpu_id[1] >> 30) & 1) { +                caps.avx512 = caps.avx2; +            }          }      } diff --git a/src/common/x64/cpu_detect.h b/src/common/x64/cpu_detect.h index 20f2ba234..7606c3f7b 100644 --- a/src/common/x64/cpu_detect.h +++ b/src/common/x64/cpu_detect.h @@ -19,6 +19,7 @@ struct CPUCaps {      bool lzcnt;      bool avx;      bool avx2; +    bool avx512;      bool bmi1;      bool bmi2;      bool fma; diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 47418006b..cb9ced5c9 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -606,11 +606,11 @@ endif()  create_target_directory_groups(core)  target_link_libraries(core PUBLIC common PRIVATE audio_core video_core) -target_link_libraries(core PUBLIC Boost::boost PRIVATE fmt::fmt nlohmann_json::nlohmann_json mbedtls Opus::Opus unicorn) +target_link_libraries(core PUBLIC Boost::boost PRIVATE fmt::fmt nlohmann_json::nlohmann_json mbedtls Opus::Opus unicorn zip)  if (YUZU_ENABLE_BOXCAT)      target_compile_definitions(core PRIVATE -DYUZU_ENABLE_BOXCAT) -    target_link_libraries(core PRIVATE httplib nlohmann_json::nlohmann_json zip) +    target_link_libraries(core PRIVATE httplib nlohmann_json::nlohmann_json)  endif()  if (ENABLE_WEB_SERVICE) diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 19d798dc7..4c8663d03 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -62,7 +62,7 @@ public:          case Dynarmic::A32::Exception::Breakpoint:              break;          } -        LOG_CRITICAL(HW_GPU, "ExceptionRaised(exception = {}, pc = {:08X}, code = {:08X})", +        LOG_CRITICAL(Core_ARM, "ExceptionRaised(exception = {}, pc = {:08X}, code = {:08X})",                       static_cast<std::size_t>(exception), pc, MemoryReadCode(pc));          UNIMPLEMENTED();      } diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 337b97be9..5f5e36d94 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -98,8 +98,8 @@ public:              }              [[fallthrough]];          default: -            ASSERT_MSG(false, "ExceptionRaised(exception = {}, pc = {:X})", -                       static_cast<std::size_t>(exception), pc); +            ASSERT_MSG(false, "ExceptionRaised(exception = {}, pc = {:08X}, code = {:08X})", +                       static_cast<std::size_t>(exception), pc, MemoryReadCode(pc));          }      } diff --git a/src/core/file_sys/system_archive/mii_model.cpp b/src/core/file_sys/system_archive/mii_model.cpp index 6a9add87c..61bb67945 100644 --- a/src/core/file_sys/system_archive/mii_model.cpp +++ b/src/core/file_sys/system_archive/mii_model.cpp @@ -40,7 +40,7 @@ VirtualDir MiiModel() {      out->AddFile(std::make_shared<ArrayVfsFile<MiiModelData::SHAPE_MID.size()>>(          MiiModelData::SHAPE_MID, "ShapeMid.dat")); -    return std::move(out); +    return out;  }  } // namespace FileSys::SystemArchive diff --git a/src/core/file_sys/system_archive/shared_font.cpp b/src/core/file_sys/system_archive/shared_font.cpp index 2c05eb42e..c5cdf7d9b 100644 --- a/src/core/file_sys/system_archive/shared_font.cpp +++ b/src/core/file_sys/system_archive/shared_font.cpp @@ -23,7 +23,7 @@ VirtualFile PackBFTTF(const std::array<u8, Size>& data, const std::string& name)      std::vector<u8> bfttf(Size + sizeof(u64)); -    u64 offset = 0; +    size_t offset = 0;      Service::NS::EncryptSharedFont(vec, bfttf, offset);      return std::make_shared<VectorVfsFile>(std::move(bfttf), name);  } diff --git a/src/core/hle/kernel/memory/memory_manager.cpp b/src/core/hle/kernel/memory/memory_manager.cpp index 6b432e1b2..616148190 100644 --- a/src/core/hle/kernel/memory/memory_manager.cpp +++ b/src/core/hle/kernel/memory/memory_manager.cpp @@ -104,7 +104,7 @@ ResultCode MemoryManager::Allocate(PageLinkedList& page_list, std::size_t num_pa      // Ensure that we don't leave anything un-freed      auto group_guard = detail::ScopeExit([&] {          for (const auto& it : page_list.Nodes()) { -            const auto min_num_pages{std::min( +            const auto min_num_pages{std::min<size_t>(                  it.GetNumPages(), (chosen_manager.GetEndAddress() - it.GetAddress()) / PageSize)};              chosen_manager.Free(it.GetAddress(), min_num_pages);          } @@ -165,7 +165,7 @@ ResultCode MemoryManager::Free(PageLinkedList& page_list, std::size_t num_pages,      // Free all of the pages      for (const auto& it : page_list.Nodes()) { -        const auto min_num_pages{std::min( +        const auto min_num_pages{std::min<size_t>(              it.GetNumPages(), (chosen_manager.GetEndAddress() - it.GetAddress()) / PageSize)};          chosen_manager.Free(it.GetAddress(), min_num_pages);      } diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index 630a8b048..94d8c1fc6 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -44,6 +44,218 @@ static constexpr u32 SanitizeJPEGSize(std::size_t size) {      return static_cast<u32>(std::min(size, max_jpeg_image_size));  } +class IManagerForSystemService final : public ServiceFramework<IManagerForSystemService> { +public: +    explicit IManagerForSystemService(Common::UUID user_id) +        : ServiceFramework("IManagerForSystemService") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "CheckAvailability"}, +            {1, nullptr, "GetAccountId"}, +            {2, nullptr, "EnsureIdTokenCacheAsync"}, +            {3, nullptr, "LoadIdTokenCache"}, +            {100, nullptr, "SetSystemProgramIdentification"}, +            {101, nullptr, "RefreshNotificationTokenAsync"}, // 7.0.0+ +            {110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+ +            {111, nullptr, "InvalidateServiceEntryRequirementCache"}, // 4.0.0+ +            {112, nullptr, "InvalidateTokenCache"}, // 4.0.0 - 6.2.0 +            {113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay"}, // 6.1.0+ +            {120, nullptr, "GetNintendoAccountId"}, +            {121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint"}, // 9.0.0+ +            {130, nullptr, "GetNintendoAccountUserResourceCache"}, +            {131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"}, +            {132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"}, +            {133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+ +            {134, nullptr, "RefreshNintendoAccountVerificationUrlCache"}, // 9.0.0+ +            {135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+ +            {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+ +            {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+ +            {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+ +            {150, nullptr, "CreateAuthorizationRequest"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +// 3.0.0+ +class IFloatingRegistrationRequest final : public ServiceFramework<IFloatingRegistrationRequest> { +public: +    explicit IFloatingRegistrationRequest(Common::UUID user_id) +        : ServiceFramework("IFloatingRegistrationRequest") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "GetSessionId"}, +            {12, nullptr, "GetAccountId"}, +            {13, nullptr, "GetLinkedNintendoAccountId"}, +            {14, nullptr, "GetNickname"}, +            {15, nullptr, "GetProfileImage"}, +            {21, nullptr, "LoadIdTokenCache"}, +            {100, nullptr, "RegisterUser"}, // [1.0.0-3.0.2] RegisterAsync +            {101, nullptr, "RegisterUserWithUid"}, // [1.0.0-3.0.2] RegisterWithUidAsync +            {102, nullptr, "RegisterNetworkServiceAccountAsync"}, // 4.0.0+ +            {103, nullptr, "RegisterNetworkServiceAccountWithUidAsync"}, // 4.0.0+ +            {110, nullptr, "SetSystemProgramIdentification"}, +            {111, nullptr, "EnsureIdTokenCacheAsync"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class IAdministrator final : public ServiceFramework<IAdministrator> { +public: +    explicit IAdministrator(Common::UUID user_id) : ServiceFramework("IAdministrator") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "CheckAvailability"}, +            {1, nullptr, "GetAccountId"}, +            {2, nullptr, "EnsureIdTokenCacheAsync"}, +            {3, nullptr, "LoadIdTokenCache"}, +            {100, nullptr, "SetSystemProgramIdentification"}, +            {101, nullptr, "RefreshNotificationTokenAsync"}, // 7.0.0+ +            {110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+ +            {111, nullptr, "InvalidateServiceEntryRequirementCache"}, // 4.0.0+ +            {112, nullptr, "InvalidateTokenCache"}, // 4.0.0 - 6.2.0 +            {113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay"}, // 6.1.0+ +            {120, nullptr, "GetNintendoAccountId"}, +            {121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint"}, // 9.0.0+ +            {130, nullptr, "GetNintendoAccountUserResourceCache"}, +            {131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"}, +            {132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"}, +            {133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+ +            {134, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsync"}, // 9.0.0+ +            {135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+ +            {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+ +            {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+ +            {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+ +            {150, nullptr, "CreateAuthorizationRequest"}, +            {200, nullptr, "IsRegistered"}, +            {201, nullptr, "RegisterAsync"}, +            {202, nullptr, "UnregisterAsync"}, +            {203, nullptr, "DeleteRegistrationInfoLocally"}, +            {220, nullptr, "SynchronizeProfileAsync"}, +            {221, nullptr, "UploadProfileAsync"}, +            {222, nullptr, "SynchronizaProfileAsyncIfSecondsElapsed"}, +            {250, nullptr, "IsLinkedWithNintendoAccount"}, +            {251, nullptr, "CreateProcedureToLinkWithNintendoAccount"}, +            {252, nullptr, "ResumeProcedureToLinkWithNintendoAccount"}, +            {255, nullptr, "CreateProcedureToUpdateLinkageStateOfNintendoAccount"}, +            {256, nullptr, "ResumeProcedureToUpdateLinkageStateOfNintendoAccount"}, +            {260, nullptr, "CreateProcedureToLinkNnidWithNintendoAccount"}, // 3.0.0+ +            {261, nullptr, "ResumeProcedureToLinkNnidWithNintendoAccount"}, // 3.0.0+ +            {280, nullptr, "ProxyProcedureToAcquireApplicationAuthorizationForNintendoAccount"}, +            {290, nullptr, "GetRequestForNintendoAccountUserResourceView"}, // 8.0.0+ +            {300, nullptr, "TryRecoverNintendoAccountUserStateAsync"}, // 6.0.0+ +            {400, nullptr, "IsServiceEntryRequirementCacheRefreshRequiredForOnlinePlay"}, // 6.1.0+ +            {401, nullptr, "RefreshServiceEntryRequirementCacheForOnlinePlayAsync"}, // 6.1.0+ +            {900, nullptr, "GetAuthenticationInfoForWin"}, // 9.0.0+ +            {901, nullptr, "ImportAsyncForWin"}, // 9.0.0+ +            {997, nullptr, "DebugUnlinkNintendoAccountAsync"}, +            {998, nullptr, "DebugSetAvailabilityErrorDetail"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class IAuthorizationRequest final : public ServiceFramework<IAuthorizationRequest> { +public: +    explicit IAuthorizationRequest(Common::UUID user_id) +        : ServiceFramework("IAuthorizationRequest") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "GetSessionId"}, +            {10, nullptr, "InvokeWithoutInteractionAsync"}, +            {19, nullptr, "IsAuthorized"}, +            {20, nullptr, "GetAuthorizationCode"}, +            {21, nullptr, "GetIdToken"}, +            {22, nullptr, "GetState"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class IOAuthProcedure final : public ServiceFramework<IOAuthProcedure> { +public: +    explicit IOAuthProcedure(Common::UUID user_id) : ServiceFramework("IOAuthProcedure") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "PrepareAsync"}, +            {1, nullptr, "GetRequest"}, +            {2, nullptr, "ApplyResponse"}, +            {3, nullptr, "ApplyResponseAsync"}, +            {10, nullptr, "Suspend"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +// 3.0.0+ +class IOAuthProcedureForExternalNsa final : public ServiceFramework<IOAuthProcedureForExternalNsa> { +public: +    explicit IOAuthProcedureForExternalNsa(Common::UUID user_id) +        : ServiceFramework("IOAuthProcedureForExternalNsa") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "PrepareAsync"}, +            {1, nullptr, "GetRequest"}, +            {2, nullptr, "ApplyResponse"}, +            {3, nullptr, "ApplyResponseAsync"}, +            {10, nullptr, "Suspend"}, +            {100, nullptr, "GetAccountId"}, +            {101, nullptr, "GetLinkedNintendoAccountId"}, +            {102, nullptr, "GetNickname"}, +            {103, nullptr, "GetProfileImage"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class IOAuthProcedureForNintendoAccountLinkage final +    : public ServiceFramework<IOAuthProcedureForNintendoAccountLinkage> { +public: +    explicit IOAuthProcedureForNintendoAccountLinkage(Common::UUID user_id) +        : ServiceFramework("IOAuthProcedureForNintendoAccountLinkage") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "PrepareAsync"}, +            {1, nullptr, "GetRequest"}, +            {2, nullptr, "ApplyResponse"}, +            {3, nullptr, "ApplyResponseAsync"}, +            {10, nullptr, "Suspend"}, +            {100, nullptr, "GetRequestWithTheme"}, +            {101, nullptr, "IsNetworkServiceAccountReplaced"}, +            {199, nullptr, "GetUrlForIntroductionOfExtraMembership"}, // 2.0.0 - 5.1.0 +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class INotifier final : public ServiceFramework<INotifier> { +public: +    explicit INotifier(Common::UUID user_id) : ServiceFramework("INotifier") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "GetSystemEvent"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; +  class IProfileCommon : public ServiceFramework<IProfileCommon> {  public:      explicit IProfileCommon(const char* name, bool editor_commands, Common::UUID user_id, @@ -226,6 +438,54 @@ public:          : IProfileCommon("IProfileEditor", true, user_id, profile_manager) {}  }; +class IAsyncContext final : public ServiceFramework<IAsyncContext> { +public: +    explicit IAsyncContext(Common::UUID user_id) : ServiceFramework("IAsyncContext") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "GetSystemEvent"}, +            {1, nullptr, "Cancel"}, +            {2, nullptr, "HasDone"}, +            {3, nullptr, "GetResult"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class ISessionObject final : public ServiceFramework<ISessionObject> { +public: +    explicit ISessionObject(Common::UUID user_id) : ServiceFramework("ISessionObject") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {999, nullptr, "Dummy"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class IGuestLoginRequest final : public ServiceFramework<IGuestLoginRequest> { +public: +    explicit IGuestLoginRequest(Common::UUID) : ServiceFramework("IGuestLoginRequest") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "GetSessionId"}, +            {11, nullptr, "Unknown"}, // 1.0.0 - 2.3.0 (the name is blank on Switchbrew) +            {12, nullptr, "GetAccountId"}, +            {13, nullptr, "GetLinkedNintendoAccountId"}, +            {14, nullptr, "GetNickname"}, +            {15, nullptr, "GetProfileImage"}, +            {21, nullptr, "LoadIdTokenCache"}, // 3.0.0+ +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; +  class IManagerForApplication final : public ServiceFramework<IManagerForApplication> {  public:      explicit IManagerForApplication(Common::UUID user_id) @@ -265,6 +525,87 @@ private:      Common::UUID user_id;  }; +// 6.0.0+ +class IAsyncNetworkServiceLicenseKindContext final +    : public ServiceFramework<IAsyncNetworkServiceLicenseKindContext> { +public: +    explicit IAsyncNetworkServiceLicenseKindContext(Common::UUID user_id) +        : ServiceFramework("IAsyncNetworkServiceLicenseKindContext") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "GetSystemEvent"}, +            {1, nullptr, "Cancel"}, +            {2, nullptr, "HasDone"}, +            {3, nullptr, "GetResult"}, +            {4, nullptr, "GetNetworkServiceLicenseKind"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +// 8.0.0+ +class IOAuthProcedureForUserRegistration final +    : public ServiceFramework<IOAuthProcedureForUserRegistration> { +public: +    explicit IOAuthProcedureForUserRegistration(Common::UUID user_id) +        : ServiceFramework("IOAuthProcedureForUserRegistration") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "PrepareAsync"}, +            {1, nullptr, "GetRequest"}, +            {2, nullptr, "ApplyResponse"}, +            {3, nullptr, "ApplyResponseAsync"}, +            {10, nullptr, "Suspend"}, +            {100, nullptr, "GetAccountId"}, +            {101, nullptr, "GetLinkedNintendoAccountId"}, +            {102, nullptr, "GetNickname"}, +            {103, nullptr, "GetProfileImage"}, +            {110, nullptr, "RegisterUserAsync"}, +            {111, nullptr, "GetUid"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class DAUTH_O final : public ServiceFramework<DAUTH_O> { +public: +    explicit DAUTH_O(Common::UUID) : ServiceFramework("dauth:o") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "EnsureAuthenticationTokenCacheAsync"}, // [5.0.0-5.1.0] GeneratePostData +            {1, nullptr, "LoadAuthenticationTokenCache"}, // 6.0.0+ +            {2, nullptr, "InvalidateAuthenticationTokenCache"}, // 6.0.0+ +            {10, nullptr, "EnsureEdgeTokenCacheAsync"}, // 6.0.0+ +            {11, nullptr, "LoadEdgeTokenCache"}, // 6.0.0+ +            {12, nullptr, "InvalidateEdgeTokenCache"}, // 6.0.0+ +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +// 6.0.0+ +class IAsyncResult final : public ServiceFramework<IAsyncResult> { +public: +    explicit IAsyncResult(Common::UUID user_id) : ServiceFramework("IAsyncResult") { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "GetResult"}, +            {1, nullptr, "Cancel"}, +            {2, nullptr, "IsAvailable"}, +            {3, nullptr, "GetSystemEvent"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; +  void Module::Interface::GetUserCount(Kernel::HLERequestContext& ctx) {      LOG_DEBUG(Service_ACC, "called");      IPC::ResponseBuilder rb{ctx, 3}; diff --git a/src/core/hle/service/acc/acc_aa.cpp b/src/core/hle/service/acc/acc_aa.cpp index 3bac6bcd1..51f119b12 100644 --- a/src/core/hle/service/acc/acc_aa.cpp +++ b/src/core/hle/service/acc/acc_aa.cpp @@ -13,8 +13,8 @@ ACC_AA::ACC_AA(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p          {0, nullptr, "EnsureCacheAsync"},          {1, nullptr, "LoadCache"},          {2, nullptr, "GetDeviceAccountId"}, -        {50, nullptr, "RegisterNotificationTokenAsync"}, -        {51, nullptr, "UnregisterNotificationTokenAsync"}, +        {50, nullptr, "RegisterNotificationTokenAsync"},   // 1.0.0 - 6.2.0 +        {51, nullptr, "UnregisterNotificationTokenAsync"}, // 1.0.0 - 6.2.0      };      RegisterHandlers(functions);  } diff --git a/src/core/hle/service/acc/acc_su.cpp b/src/core/hle/service/acc/acc_su.cpp index 2eefc6df5..85620bde3 100644 --- a/src/core/hle/service/acc/acc_su.cpp +++ b/src/core/hle/service/acc/acc_su.cpp @@ -17,28 +17,28 @@ ACC_SU::ACC_SU(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p          {3, &ACC_SU::ListOpenUsers, "ListOpenUsers"},          {4, &ACC_SU::GetLastOpenedUser, "GetLastOpenedUser"},          {5, &ACC_SU::GetProfile, "GetProfile"}, -        {6, nullptr, "GetProfileDigest"}, +        {6, nullptr, "GetProfileDigest"}, // 3.0.0+          {50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},          {51, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, -        {60, nullptr, "ListOpenContextStoredUsers"}, -        {99, nullptr, "DebugActivateOpenContextRetention"}, +        {60, nullptr, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0 +        {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+          {100, nullptr, "GetUserRegistrationNotifier"},          {101, nullptr, "GetUserStateChangeNotifier"},          {102, nullptr, "GetBaasAccountManagerForSystemService"},          {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},          {104, nullptr, "GetProfileUpdateNotifier"}, -        {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, -        {106, nullptr, "GetProfileSyncNotifier"}, +        {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+ +        {106, nullptr, "GetProfileSyncNotifier"}, // 9.0.0+          {110, nullptr, "StoreSaveDataThumbnail"},          {111, nullptr, "ClearSaveDataThumbnail"},          {112, nullptr, "LoadSaveDataThumbnail"}, -        {113, nullptr, "GetSaveDataThumbnailExistence"}, -        {120, nullptr, "ListOpenUsersInApplication"}, -        {130, nullptr, "ActivateOpenContextRetention"}, -        {140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"}, -        {150, nullptr, "AuthenticateApplicationAsync"}, -        {190, nullptr, "GetUserLastOpenedApplication"}, -        {191, nullptr, "ActivateOpenContextHolder"}, +        {113, nullptr, "GetSaveDataThumbnailExistence"}, // 5.0.0+ +        {120, nullptr, "ListOpenUsersInApplication"}, // 10.0.0+ +        {130, nullptr, "ActivateOpenContextRetention"}, // 6.0.0+ +        {140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+ +        {150, nullptr, "AuthenticateApplicationAsync"}, // 10.0.0+ +        {190, nullptr, "GetUserLastOpenedApplication"}, // 1.0.0 - 9.2.0 +        {191, nullptr, "ActivateOpenContextHolder"}, // 7.0.0+          {200, nullptr, "BeginUserRegistration"},          {201, nullptr, "CompleteUserRegistration"},          {202, nullptr, "CancelUserRegistration"}, @@ -46,15 +46,15 @@ ACC_SU::ACC_SU(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p          {204, nullptr, "SetUserPosition"},          {205, &ACC_SU::GetProfileEditor, "GetProfileEditor"},          {206, nullptr, "CompleteUserRegistrationForcibly"}, -        {210, nullptr, "CreateFloatingRegistrationRequest"}, -        {211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"}, -        {212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"}, +        {210, nullptr, "CreateFloatingRegistrationRequest"}, // 3.0.0+ +        {211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"}, // 8.0.0+ +        {212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"}, // 8.0.0+          {230, nullptr, "AuthenticateServiceAsync"},          {250, nullptr, "GetBaasAccountAdministrator"},          {290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"}, -        {291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, +        {291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, // 3.0.0+          {299, nullptr, "SuspendBackgroundDaemon"}, -        {997, nullptr, "DebugInvalidateTokenCacheForUser"}, +        {997, nullptr, "DebugInvalidateTokenCacheForUser"}, // 3.0.0+          {998, nullptr, "DebugSetUserStateClose"},          {999, nullptr, "DebugSetUserStateOpen"},      }; diff --git a/src/core/hle/service/acc/acc_u0.cpp b/src/core/hle/service/acc/acc_u0.cpp index fb4e7e772..49f6e20f1 100644 --- a/src/core/hle/service/acc/acc_u0.cpp +++ b/src/core/hle/service/acc/acc_u0.cpp @@ -17,23 +17,23 @@ ACC_U0::ACC_U0(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p          {3, &ACC_U0::ListOpenUsers, "ListOpenUsers"},          {4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"},          {5, &ACC_U0::GetProfile, "GetProfile"}, -        {6, nullptr, "GetProfileDigest"}, +        {6, nullptr, "GetProfileDigest"}, // 3.0.0+          {50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},          {51, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, -        {60, nullptr, "ListOpenContextStoredUsers"}, -        {99, nullptr, "DebugActivateOpenContextRetention"}, +        {60, nullptr, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0 +        {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+          {100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"},          {101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"},          {102, nullptr, "AuthenticateApplicationAsync"}, -        {103, nullptr, "CheckNetworkServiceAvailabilityAsync"}, +        {103, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+          {110, nullptr, "StoreSaveDataThumbnail"},          {111, nullptr, "ClearSaveDataThumbnail"},          {120, nullptr, "CreateGuestLoginRequest"}, -        {130, nullptr, "LoadOpenContext"}, -        {131, nullptr, "ListOpenContextStoredUsers"}, -        {140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted"}, -        {141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers"}, -        {150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked"}, +        {130, nullptr, "LoadOpenContext"}, // 5.0.0+ +        {131, nullptr, "ListOpenContextStoredUsers"}, // 6.0.0+ +        {140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted"}, // 6.0.0+ +        {141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+ +        {150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked"}, // 6.0.0+      };      // clang-format on diff --git a/src/core/hle/service/acc/acc_u1.cpp b/src/core/hle/service/acc/acc_u1.cpp index 9f29cdc82..f47004f84 100644 --- a/src/core/hle/service/acc/acc_u1.cpp +++ b/src/core/hle/service/acc/acc_u1.cpp @@ -17,28 +17,29 @@ ACC_U1::ACC_U1(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p          {3, &ACC_U1::ListOpenUsers, "ListOpenUsers"},          {4, &ACC_U1::GetLastOpenedUser, "GetLastOpenedUser"},          {5, &ACC_U1::GetProfile, "GetProfile"}, -        {6, nullptr, "GetProfileDigest"}, +        {6, nullptr, "GetProfileDigest"}, // 3.0.0+          {50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},          {51, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, -        {60, nullptr, "ListOpenContextStoredUsers"}, -        {99, nullptr, "DebugActivateOpenContextRetention"}, +        {60, nullptr, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0 +        {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+          {100, nullptr, "GetUserRegistrationNotifier"},          {101, nullptr, "GetUserStateChangeNotifier"},          {102, nullptr, "GetBaasAccountManagerForSystemService"}, -        {103, nullptr, "GetProfileUpdateNotifier"}, -        {104, nullptr, "CheckNetworkServiceAvailabilityAsync"}, -        {105, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, -        {106, nullptr, "GetProfileSyncNotifier"}, +        {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, +        {104, nullptr, "GetProfileUpdateNotifier"}, +        {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+ +        {106, nullptr, "GetProfileSyncNotifier"}, // 9.0.0+          {110, nullptr, "StoreSaveDataThumbnail"},          {111, nullptr, "ClearSaveDataThumbnail"},          {112, nullptr, "LoadSaveDataThumbnail"}, -        {113, nullptr, "GetSaveDataThumbnailExistence"}, -        {130, nullptr, "ActivateOpenContextRetention"}, -        {140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"}, -        {150, nullptr, "AuthenticateApplicationAsync"}, -        {190, nullptr, "GetUserLastOpenedApplication"}, -        {191, nullptr, "ActivateOpenContextHolder"}, -        {997, nullptr, "DebugInvalidateTokenCacheForUser"}, +        {113, nullptr, "GetSaveDataThumbnailExistence"}, // 5.0.0+ +        {120, nullptr, "ListOpenUsersInApplication"}, // 10.0.0+ +        {130, nullptr, "ActivateOpenContextRetention"}, // 6.0.0+ +        {140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+ +        {150, nullptr, "AuthenticateApplicationAsync"}, // 10.0.0+ +        {190, nullptr, "GetUserLastOpenedApplication"}, // 1.0.0 - 9.2.0 +        {191, nullptr, "ActivateOpenContextHolder"}, // 7.0.0+ +        {997, nullptr, "DebugInvalidateTokenCacheForUser"}, // 3.0.0+          {998, nullptr, "DebugSetUserStateClose"},          {999, nullptr, "DebugSetUserStateOpen"},      }; diff --git a/src/core/hle/service/lm/manager.cpp b/src/core/hle/service/lm/manager.cpp index b67081b86..3ee2374e7 100644 --- a/src/core/hle/service/lm/manager.cpp +++ b/src/core/hle/service/lm/manager.cpp @@ -86,7 +86,8 @@ std::string FormatField(Field type, const std::vector<u8>& data) {          return Common::StringFromFixedZeroTerminatedBuffer(              reinterpret_cast<const char*>(data.data()), data.size());      default: -        UNIMPLEMENTED(); +        UNIMPLEMENTED_MSG("Unimplemented field type={}", type); +        return "";      }  } diff --git a/src/input_common/keyboard.cpp b/src/input_common/keyboard.cpp index 078374be5..afb8e6612 100644 --- a/src/input_common/keyboard.cpp +++ b/src/input_common/keyboard.cpp @@ -76,7 +76,7 @@ std::unique_ptr<Input::ButtonDevice> Keyboard::Create(const Common::ParamPackage      int key_code = params.Get("code", 0);      std::unique_ptr<KeyButton> button = std::make_unique<KeyButton>(key_button_list);      key_button_list->AddKeyButton(key_code, button.get()); -    return std::move(button); +    return button;  }  void Keyboard::PressKey(int key_code) { diff --git a/src/input_common/motion_emu.cpp b/src/input_common/motion_emu.cpp index 868251628..d4cdf76a3 100644 --- a/src/input_common/motion_emu.cpp +++ b/src/input_common/motion_emu.cpp @@ -145,7 +145,7 @@ std::unique_ptr<Input::MotionDevice> MotionEmu::Create(const Common::ParamPackag      // Previously created device is disconnected here. Having two motion devices for 3DS is not      // expected.      current_device = device_wrapper->device; -    return std::move(device_wrapper); +    return device_wrapper;  }  void MotionEmu::BeginTilt(int x, int y) { diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 308d8b55f..bae1d527c 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -47,7 +47,7 @@ public:                              bool is_written = false, bool use_fast_cbuf = false) {          std::lock_guard lock{mutex}; -        const auto& memory_manager = system.GPU().MemoryManager(); +        auto& memory_manager = system.GPU().MemoryManager();          const std::optional<VAddr> cpu_addr_opt = memory_manager.GpuToCpuAddress(gpu_addr);          if (!cpu_addr_opt) {              return {GetEmptyBuffer(size), 0}; @@ -59,7 +59,6 @@ public:          constexpr std::size_t max_stream_size = 0x800;          if (use_fast_cbuf || size < max_stream_size) {              if (!is_written && !IsRegionWritten(cpu_addr, cpu_addr + size - 1)) { -                auto& memory_manager = system.GPU().MemoryManager();                  const bool is_granular = memory_manager.IsGranularRange(gpu_addr, size);                  if (use_fast_cbuf) {                      u8* dest; diff --git a/src/video_core/macro/macro_jit_x64.cpp b/src/video_core/macro/macro_jit_x64.cpp index bee34a7c0..30abb66e5 100644 --- a/src/video_core/macro/macro_jit_x64.cpp +++ b/src/video_core/macro/macro_jit_x64.cpp @@ -54,7 +54,7 @@ void MacroJITx64Impl::Compile_ALU(Macro::Opcode opcode) {      const bool is_a_zero = opcode.src_a == 0;      const bool is_b_zero = opcode.src_b == 0;      const bool valid_operation = !is_a_zero && !is_b_zero; -    const bool is_move_operation = !is_a_zero && is_b_zero; +    [[maybe_unused]] const bool is_move_operation = !is_a_zero && is_b_zero;      const bool has_zero_register = is_a_zero || is_b_zero;      const bool no_zero_reg_skip = opcode.alu_operation == Macro::ALUOperation::AddWithCarry ||                                    opcode.alu_operation == Macro::ALUOperation::SubtractWithBorrow; @@ -73,7 +73,6 @@ void MacroJITx64Impl::Compile_ALU(Macro::Opcode opcode) {              src_b = Compile_GetRegister(opcode.src_b, eax);          }      } -    Xbyak::Label skip_carry{};      bool has_emitted = false; @@ -240,10 +239,10 @@ void MacroJITx64Impl::Compile_ExtractInsert(Macro::Opcode opcode) {  }  void MacroJITx64Impl::Compile_ExtractShiftLeftImmediate(Macro::Opcode opcode) { -    auto dst = Compile_GetRegister(opcode.src_a, eax); -    auto src = Compile_GetRegister(opcode.src_b, RESULT); +    const auto dst = Compile_GetRegister(opcode.src_a, ecx); +    const auto src = Compile_GetRegister(opcode.src_b, RESULT); -    shr(src, al); +    shr(src, dst.cvt8());      if (opcode.bf_size != 0 && opcode.bf_size != 31) {          and_(src, opcode.GetBitfieldMask());      } else if (opcode.bf_size == 0) { @@ -259,8 +258,8 @@ void MacroJITx64Impl::Compile_ExtractShiftLeftImmediate(Macro::Opcode opcode) {  }  void MacroJITx64Impl::Compile_ExtractShiftLeftRegister(Macro::Opcode opcode) { -    auto dst = Compile_GetRegister(opcode.src_a, eax); -    auto src = Compile_GetRegister(opcode.src_b, RESULT); +    const auto dst = Compile_GetRegister(opcode.src_a, ecx); +    const auto src = Compile_GetRegister(opcode.src_b, RESULT);      if (opcode.bf_src_bit != 0) {          shr(src, opcode.bf_src_bit); @@ -269,16 +268,9 @@ void MacroJITx64Impl::Compile_ExtractShiftLeftRegister(Macro::Opcode opcode) {      if (opcode.bf_size != 31) {          and_(src, opcode.GetBitfieldMask());      } -    shl(src, al); -    Compile_ProcessResult(opcode.result_operation, opcode.dst); -} +    shl(src, dst.cvt8()); -static u32 Read(Engines::Maxwell3D* maxwell3d, u32 method) { -    return maxwell3d->GetRegisterValue(method); -} - -static void Send(Engines::Maxwell3D* maxwell3d, Macro::MethodAddress method_address, u32 value) { -    maxwell3d->CallMethodFromMME(method_address.address, value); +    Compile_ProcessResult(opcode.result_operation, opcode.dst);  }  void MacroJITx64Impl::Compile_Read(Macro::Opcode opcode) { @@ -298,15 +290,27 @@ void MacroJITx64Impl::Compile_Read(Macro::Opcode opcode) {              sub(result, opcode.immediate * -1);          }      } -    Common::X64::ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); -    mov(Common::X64::ABI_PARAM1, qword[STATE]); -    mov(Common::X64::ABI_PARAM2, RESULT); -    Common::X64::CallFarFunction(*this, &Read); -    Common::X64::ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); -    mov(RESULT, Common::X64::ABI_RETURN.cvt32()); + +    // Equivalent to Engines::Maxwell3D::GetRegisterValue: +    if (optimizer.enable_asserts) { +        Xbyak::Label pass_range_check; +        cmp(RESULT, static_cast<u32>(Engines::Maxwell3D::Regs::NUM_REGS)); +        jb(pass_range_check); +        int3(); +        L(pass_range_check); +    } +    mov(rax, qword[STATE]); +    mov(RESULT, +        dword[rax + offsetof(Engines::Maxwell3D, regs) + +              offsetof(Engines::Maxwell3D::Regs, reg_array) + RESULT.cvt64() * sizeof(u32)]); +      Compile_ProcessResult(opcode.result_operation, opcode.dst);  } +static void Send(Engines::Maxwell3D* maxwell3d, Macro::MethodAddress method_address, u32 value) { +    maxwell3d->CallMethodFromMME(method_address.address, value); +} +  void Tegra::MacroJITx64Impl::Compile_Send(Xbyak::Reg32 value) {      Common::X64::ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0);      mov(Common::X64::ABI_PARAM1, qword[STATE]); @@ -438,6 +442,9 @@ void MacroJITx64Impl::Compile() {      // one if our register isn't "dirty"      optimizer.optimize_for_method_move = true; +    // Enable run-time assertions in JITted code +    optimizer.enable_asserts = false; +      // Check to see if we can skip emitting certain instructions      Optimizer_ScanFlags(); @@ -546,7 +553,7 @@ Xbyak::Reg32 MacroJITx64Impl::Compile_GetRegister(u32 index, Xbyak::Reg32 dst) {  }  void MacroJITx64Impl::Compile_ProcessResult(Macro::ResultOperation operation, u32 reg) { -    auto SetRegister = [=](u32 reg, Xbyak::Reg32 result) { +    const auto SetRegister = [this](u32 reg, const Xbyak::Reg32& result) {          // Register 0 is supposed to always return 0. NOP is implemented as a store to the zero          // register.          if (reg == 0) { @@ -554,7 +561,7 @@ void MacroJITx64Impl::Compile_ProcessResult(Macro::ResultOperation operation, u3          }          mov(dword[STATE + offsetof(JITState, registers) + reg * sizeof(u32)], result);      }; -    auto SetMethodAddress = [=](Xbyak::Reg32 reg) { mov(METHOD_ADDRESS, reg); }; +    const auto SetMethodAddress = [this](const Xbyak::Reg32& reg) { mov(METHOD_ADDRESS, reg); };      switch (operation) {      case Macro::ResultOperation::IgnoreAndFetch: diff --git a/src/video_core/macro/macro_jit_x64.h b/src/video_core/macro/macro_jit_x64.h index 51ec090b8..a180e7428 100644 --- a/src/video_core/macro/macro_jit_x64.h +++ b/src/video_core/macro/macro_jit_x64.h @@ -76,6 +76,7 @@ private:          bool zero_reg_skip{};          bool skip_dummy_addimmediate{};          bool optimize_for_method_move{}; +        bool enable_asserts{};      };      OptimizerState optimizer{}; diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index dbee9f634..ff5505d12 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp @@ -210,10 +210,11 @@ bool MemoryManager::IsBlockContinuous(const GPUVAddr start, const std::size_t si      return range == inner_size;  } -void MemoryManager::ReadBlock(GPUVAddr src_addr, void* dest_buffer, const std::size_t size) const { +void MemoryManager::ReadBlock(GPUVAddr gpu_src_addr, void* dest_buffer, +                              const std::size_t size) const {      std::size_t remaining_size{size}; -    std::size_t page_index{src_addr >> page_bits}; -    std::size_t page_offset{src_addr & page_mask}; +    std::size_t page_index{gpu_src_addr >> page_bits}; +    std::size_t page_offset{gpu_src_addr & page_mask};      auto& memory = system.Memory(); @@ -234,11 +235,11 @@ void MemoryManager::ReadBlock(GPUVAddr src_addr, void* dest_buffer, const std::s      }  } -void MemoryManager::ReadBlockUnsafe(GPUVAddr src_addr, void* dest_buffer, +void MemoryManager::ReadBlockUnsafe(GPUVAddr gpu_src_addr, void* dest_buffer,                                      const std::size_t size) const {      std::size_t remaining_size{size}; -    std::size_t page_index{src_addr >> page_bits}; -    std::size_t page_offset{src_addr & page_mask}; +    std::size_t page_index{gpu_src_addr >> page_bits}; +    std::size_t page_offset{gpu_src_addr & page_mask};      auto& memory = system.Memory(); @@ -259,10 +260,11 @@ void MemoryManager::ReadBlockUnsafe(GPUVAddr src_addr, void* dest_buffer,      }  } -void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, const std::size_t size) { +void MemoryManager::WriteBlock(GPUVAddr gpu_dest_addr, const void* src_buffer, +                               const std::size_t size) {      std::size_t remaining_size{size}; -    std::size_t page_index{dest_addr >> page_bits}; -    std::size_t page_offset{dest_addr & page_mask}; +    std::size_t page_index{gpu_dest_addr >> page_bits}; +    std::size_t page_offset{gpu_dest_addr & page_mask};      auto& memory = system.Memory(); @@ -283,11 +285,11 @@ void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, const      }  } -void MemoryManager::WriteBlockUnsafe(GPUVAddr dest_addr, const void* src_buffer, +void MemoryManager::WriteBlockUnsafe(GPUVAddr gpu_dest_addr, const void* src_buffer,                                       const std::size_t size) {      std::size_t remaining_size{size}; -    std::size_t page_index{dest_addr >> page_bits}; -    std::size_t page_offset{dest_addr & page_mask}; +    std::size_t page_index{gpu_dest_addr >> page_bits}; +    std::size_t page_offset{gpu_dest_addr & page_mask};      auto& memory = system.Memory(); @@ -306,16 +308,18 @@ void MemoryManager::WriteBlockUnsafe(GPUVAddr dest_addr, const void* src_buffer,      }  } -void MemoryManager::CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, const std::size_t size) { +void MemoryManager::CopyBlock(GPUVAddr gpu_dest_addr, GPUVAddr gpu_src_addr, +                              const std::size_t size) {      std::vector<u8> tmp_buffer(size); -    ReadBlock(src_addr, tmp_buffer.data(), size); -    WriteBlock(dest_addr, tmp_buffer.data(), size); +    ReadBlock(gpu_src_addr, tmp_buffer.data(), size); +    WriteBlock(gpu_dest_addr, tmp_buffer.data(), size);  } -void MemoryManager::CopyBlockUnsafe(GPUVAddr dest_addr, GPUVAddr src_addr, const std::size_t size) { +void MemoryManager::CopyBlockUnsafe(GPUVAddr gpu_dest_addr, GPUVAddr gpu_src_addr, +                                    const std::size_t size) {      std::vector<u8> tmp_buffer(size); -    ReadBlockUnsafe(src_addr, tmp_buffer.data(), size); -    WriteBlockUnsafe(dest_addr, tmp_buffer.data(), size); +    ReadBlockUnsafe(gpu_src_addr, tmp_buffer.data(), size); +    WriteBlockUnsafe(gpu_dest_addr, tmp_buffer.data(), size);  }  bool MemoryManager::IsGranularRange(GPUVAddr gpu_addr, std::size_t size) { diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index 0ddd52d5a..87658e87a 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h @@ -79,9 +79,9 @@ public:       * in the Host Memory counterpart. Note: This functions cause Host GPU Memory       * Flushes and Invalidations, respectively to each operation.       */ -    void ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const; -    void WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size); -    void CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size); +    void ReadBlock(GPUVAddr gpu_src_addr, void* dest_buffer, std::size_t size) const; +    void WriteBlock(GPUVAddr gpu_dest_addr, const void* src_buffer, std::size_t size); +    void CopyBlock(GPUVAddr gpu_dest_addr, GPUVAddr gpu_src_addr, std::size_t size);      /**       * ReadBlockUnsafe and WriteBlockUnsafe are special versions of ReadBlock and @@ -93,9 +93,9 @@ public:       * WriteBlockUnsafe instead of WriteBlock since it shouldn't invalidate the texture       * being flushed.       */ -    void ReadBlockUnsafe(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const; -    void WriteBlockUnsafe(GPUVAddr dest_addr, const void* src_buffer, std::size_t size); -    void CopyBlockUnsafe(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size); +    void ReadBlockUnsafe(GPUVAddr gpu_src_addr, void* dest_buffer, std::size_t size) const; +    void WriteBlockUnsafe(GPUVAddr gpu_dest_addr, const void* src_buffer, std::size_t size); +    void CopyBlockUnsafe(GPUVAddr gpu_dest_addr, GPUVAddr gpu_src_addr, std::size_t size);      /**       * IsGranularRange checks if a gpu region can be simply read with a pointer diff --git a/src/video_core/query_cache.h b/src/video_core/query_cache.h index 2f75f8801..e12dab899 100644 --- a/src/video_core/query_cache.h +++ b/src/video_core/query_cache.h @@ -220,8 +220,8 @@ private:              return cache_begin < addr_end && addr_begin < cache_end;          }; -        const u64 page_end = addr_end >> PAGE_SHIFT; -        for (u64 page = addr_begin >> PAGE_SHIFT; page <= page_end; ++page) { +        const u64 page_end = addr_end >> PAGE_BITS; +        for (u64 page = addr_begin >> PAGE_BITS; page <= page_end; ++page) {              const auto& it = cached_queries.find(page);              if (it == std::end(cached_queries)) {                  continue; @@ -242,14 +242,14 @@ private:      /// Registers the passed parameters as cached and returns a pointer to the stored cached query.      CachedQuery* Register(VideoCore::QueryType type, VAddr cpu_addr, u8* host_ptr, bool timestamp) {          rasterizer.UpdatePagesCachedCount(cpu_addr, CachedQuery::SizeInBytes(timestamp), 1); -        const u64 page = static_cast<u64>(cpu_addr) >> PAGE_SHIFT; +        const u64 page = static_cast<u64>(cpu_addr) >> PAGE_BITS;          return &cached_queries[page].emplace_back(static_cast<QueryCache&>(*this), type, cpu_addr,                                                    host_ptr);      }      /// Tries to a get a cached query. Returns nullptr on failure.      CachedQuery* TryGet(VAddr addr) { -        const u64 page = static_cast<u64>(addr) >> PAGE_SHIFT; +        const u64 page = static_cast<u64>(addr) >> PAGE_BITS;          const auto it = cached_queries.find(page);          if (it == std::end(cached_queries)) {              return nullptr; @@ -268,7 +268,7 @@ private:      }      static constexpr std::uintptr_t PAGE_SIZE = 4096; -    static constexpr unsigned PAGE_SHIFT = 12; +    static constexpr unsigned PAGE_BITS = 12;      Core::System& system;      VideoCore::RasterizerInterface& rasterizer; diff --git a/src/video_core/renderer_opengl/gl_arb_decompiler.cpp b/src/video_core/renderer_opengl/gl_arb_decompiler.cpp index 1e96b0310..eb5158407 100644 --- a/src/video_core/renderer_opengl/gl_arb_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_arb_decompiler.cpp @@ -281,14 +281,14 @@ private:      template <const std::string_view& op>      std::string Unary(Operation operation) { -        const std::string temporary = AllocTemporary(); +        std::string temporary = AllocTemporary();          AddLine("{}{} {}, {};", op, Modifiers(operation), temporary, Visit(operation[0]));          return temporary;      }      template <const std::string_view& op>      std::string Binary(Operation operation) { -        const std::string temporary = AllocTemporary(); +        std::string temporary = AllocTemporary();          AddLine("{}{} {}, {}, {};", op, Modifiers(operation), temporary, Visit(operation[0]),                  Visit(operation[1]));          return temporary; @@ -296,7 +296,7 @@ private:      template <const std::string_view& op>      std::string Trinary(Operation operation) { -        const std::string temporary = AllocTemporary(); +        std::string temporary = AllocTemporary();          AddLine("{}{} {}, {}, {}, {};", op, Modifiers(operation), temporary, Visit(operation[0]),                  Visit(operation[1]), Visit(operation[2]));          return temporary; @@ -304,7 +304,7 @@ private:      template <const std::string_view& op, bool unordered>      std::string FloatComparison(Operation operation) { -        const std::string temporary = AllocTemporary(); +        std::string temporary = AllocTemporary();          AddLine("TRUNC.U.CC RC.x, {};", Binary<op>(operation));          AddLine("MOV.S {}, 0;", temporary);          AddLine("MOV.S {} (NE.x), -1;", temporary); @@ -331,7 +331,7 @@ private:      template <const std::string_view& op, bool is_nan>      std::string HalfComparison(Operation operation) { -        const std::string tmp1 = AllocVectorTemporary(); +        std::string tmp1 = AllocVectorTemporary();          const std::string tmp2 = AllocVectorTemporary();          const std::string op_a = Visit(operation[0]);          const std::string op_b = Visit(operation[1]); @@ -367,15 +367,14 @@ private:              AddLine("MOV.F {}.{}, {};", value, Swizzle(i), Visit(meta.values[i]));          } -        const std::string result = coord; -        AddLine("ATOMIM.{}.{} {}.x, {}, {}, image[{}], {};", op, type, result, value, coord, +        AddLine("ATOMIM.{}.{} {}.x, {}, {}, image[{}], {};", op, type, coord, value, coord,                  image_id, ImageType(meta.image.type)); -        return fmt::format("{}.x", result); +        return fmt::format("{}.x", coord);      }      template <const std::string_view& op, const std::string_view& type>      std::string Atomic(Operation operation) { -        const std::string temporary = AllocTemporary(); +        std::string temporary = AllocTemporary();          std::string address;          std::string_view opname;          if (const auto gmem = std::get_if<GmemNode>(&*operation[0])) { @@ -396,7 +395,7 @@ private:      template <char type>      std::string Negate(Operation operation) { -        const std::string temporary = AllocTemporary(); +        std::string temporary = AllocTemporary();          if constexpr (type == 'F') {              AddLine("MOV.F32 {}, -{};", temporary, Visit(operation[0]));          } else { @@ -407,7 +406,7 @@ private:      template <char type>      std::string Absolute(Operation operation) { -        const std::string temporary = AllocTemporary(); +        std::string temporary = AllocTemporary();          AddLine("MOV.{} {}, |{}|;", type, temporary, Visit(operation[0]));          return temporary;      } @@ -1156,20 +1155,20 @@ void ARBDecompiler::VisitAST(const ASTNode& node) {  }  std::string ARBDecompiler::VisitExpression(const Expr& node) { -    const std::string result = AllocTemporary();      if (const auto expr = std::get_if<ExprAnd>(&*node)) { +        std::string result = AllocTemporary();          AddLine("AND.U {}, {}, {};", result, VisitExpression(expr->operand1),                  VisitExpression(expr->operand2));          return result;      }      if (const auto expr = std::get_if<ExprOr>(&*node)) { -        const std::string result = AllocTemporary(); +        std::string result = AllocTemporary();          AddLine("OR.U {}, {}, {};", result, VisitExpression(expr->operand1),                  VisitExpression(expr->operand2));          return result;      }      if (const auto expr = std::get_if<ExprNot>(&*node)) { -        const std::string result = AllocTemporary(); +        std::string result = AllocTemporary();          AddLine("CMP.S {}, {}, 0, -1;", result, VisitExpression(expr->operand1));          return result;      } @@ -1186,7 +1185,7 @@ std::string ARBDecompiler::VisitExpression(const Expr& node) {          return expr->value ? "0xffffffff" : "0";      }      if (const auto expr = std::get_if<ExprGprEqual>(&*node)) { -        const std::string result = AllocTemporary(); +        std::string result = AllocTemporary();          AddLine("SEQ.U {}, R{}.x, {};", result, expr->gpr, expr->value);          return result;      } @@ -1231,13 +1230,13 @@ std::string ARBDecompiler::Visit(const Node& node) {      }      if (const auto immediate = std::get_if<ImmediateNode>(&*node)) { -        const std::string temporary = AllocTemporary(); +        std::string temporary = AllocTemporary();          AddLine("MOV.U {}, {};", temporary, immediate->GetValue());          return temporary;      }      if (const auto predicate = std::get_if<PredicateNode>(&*node)) { -        const std::string temporary = AllocTemporary(); +        std::string temporary = AllocTemporary();          switch (const auto index = predicate->GetIndex(); index) {          case Tegra::Shader::Pred::UnusedIndex:              AddLine("MOV.S {}, -1;", temporary); @@ -1333,13 +1332,13 @@ std::string ARBDecompiler::Visit(const Node& node) {          } else {              offset_string = Visit(offset);          } -        const std::string temporary = AllocTemporary(); +        std::string temporary = AllocTemporary();          AddLine("LDC.F32 {}, cbuf{}[{}];", temporary, cbuf->GetIndex(), offset_string);          return temporary;      }      if (const auto gmem = std::get_if<GmemNode>(&*node)) { -        const std::string temporary = AllocTemporary(); +        std::string temporary = AllocTemporary();          AddLine("SUB.U {}, {}, {};", temporary, Visit(gmem->GetRealAddress()),                  Visit(gmem->GetBaseAddress()));          AddLine("LDB.U32 {}, {}[{}];", temporary, GlobalMemoryName(gmem->GetDescriptor()), @@ -1348,14 +1347,14 @@ std::string ARBDecompiler::Visit(const Node& node) {      }      if (const auto lmem = std::get_if<LmemNode>(&*node)) { -        const std::string temporary = Visit(lmem->GetAddress()); +        std::string temporary = Visit(lmem->GetAddress());          AddLine("SHR.U {}, {}, 2;", temporary, temporary);          AddLine("MOV.U {}, lmem[{}].x;", temporary, temporary);          return temporary;      }      if (const auto smem = std::get_if<SmemNode>(&*node)) { -        const std::string temporary = Visit(smem->GetAddress()); +        std::string temporary = Visit(smem->GetAddress());          AddLine("LDS.U32 {}, shared_mem[{}];", temporary, temporary);          return temporary;      } @@ -1535,7 +1534,7 @@ std::string ARBDecompiler::Assign(Operation operation) {  }  std::string ARBDecompiler::Select(Operation operation) { -    const std::string temporary = AllocTemporary(); +    std::string temporary = AllocTemporary();      AddLine("CMP.S {}, {}, {}, {};", temporary, Visit(operation[0]), Visit(operation[1]),              Visit(operation[2]));      return temporary; @@ -1545,12 +1544,12 @@ std::string ARBDecompiler::FClamp(Operation operation) {      // 1.0f in hex, replace with std::bit_cast on C++20      static constexpr u32 POSITIVE_ONE = 0x3f800000; -    const std::string temporary = AllocTemporary(); +    std::string temporary = AllocTemporary();      const Node& value = operation[0];      const Node& low = operation[1];      const Node& high = operation[2]; -    const auto imm_low = std::get_if<ImmediateNode>(&*low); -    const auto imm_high = std::get_if<ImmediateNode>(&*high); +    const auto* const imm_low = std::get_if<ImmediateNode>(&*low); +    const auto* const imm_high = std::get_if<ImmediateNode>(&*high);      if (imm_low && imm_high && imm_low->GetValue() == 0 && imm_high->GetValue() == POSITIVE_ONE) {          AddLine("MOV.F32.SAT {}, {};", temporary, Visit(value));      } else { @@ -1574,7 +1573,7 @@ std::string ARBDecompiler::FCastHalf1(Operation operation) {  }  std::string ARBDecompiler::FSqrt(Operation operation) { -    const std::string temporary = AllocTemporary(); +    std::string temporary = AllocTemporary();      AddLine("RSQ.F32 {}, {};", temporary, Visit(operation[0]));      AddLine("RCP.F32 {}, {};", temporary, temporary);      return temporary; @@ -1588,7 +1587,7 @@ std::string ARBDecompiler::FSwizzleAdd(Operation operation) {          AddLine("ADD.F {}.x, {}, {};", temporary, Visit(operation[0]), Visit(operation[1]));          return fmt::format("{}.x", temporary);      } -    const std::string lut = AllocVectorTemporary(); +      AddLine("AND.U {}.z, {}.threadid, 3;", temporary, StageInputName(stage));      AddLine("SHL.U {}.z, {}.z, 1;", temporary, temporary);      AddLine("SHR.U {}.z, {}, {}.z;", temporary, Visit(operation[2]), temporary); @@ -1766,21 +1765,21 @@ std::string ARBDecompiler::LogicalAssign(Operation operation) {  }  std::string ARBDecompiler::LogicalPick2(Operation operation) { -    const std::string temporary = AllocTemporary(); +    std::string temporary = AllocTemporary();      const u32 index = std::get<ImmediateNode>(*operation[1]).GetValue();      AddLine("MOV.U {}, {}.{};", temporary, Visit(operation[0]), Swizzle(index));      return temporary;  }  std::string ARBDecompiler::LogicalAnd2(Operation operation) { -    const std::string temporary = AllocTemporary(); +    std::string temporary = AllocTemporary();      const std::string op = Visit(operation[0]);      AddLine("AND.U {}, {}.x, {}.y;", temporary, op, op);      return temporary;  }  std::string ARBDecompiler::FloatOrdered(Operation operation) { -    const std::string temporary = AllocTemporary(); +    std::string temporary = AllocTemporary();      AddLine("MOVC.F32 RC.x, {};", Visit(operation[0]));      AddLine("MOVC.F32 RC.y, {};", Visit(operation[1]));      AddLine("MOV.S {}, -1;", temporary); @@ -1790,7 +1789,7 @@ std::string ARBDecompiler::FloatOrdered(Operation operation) {  }  std::string ARBDecompiler::FloatUnordered(Operation operation) { -    const std::string temporary = AllocTemporary(); +    std::string temporary = AllocTemporary();      AddLine("MOVC.F32 RC.x, {};", Visit(operation[0]));      AddLine("MOVC.F32 RC.y, {};", Visit(operation[1]));      AddLine("MOV.S {}, 0;", temporary); @@ -1800,7 +1799,7 @@ std::string ARBDecompiler::FloatUnordered(Operation operation) {  }  std::string ARBDecompiler::LogicalAddCarry(Operation operation) { -    const std::string temporary = AllocTemporary(); +    std::string temporary = AllocTemporary();      AddLine("ADDC.U RC, {}, {};", Visit(operation[0]), Visit(operation[1]));      AddLine("MOV.S {}, 0;", temporary);      AddLine("IF CF.x;"); diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 59b441943..cd9673d1f 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -13,6 +13,7 @@  #include <fmt/format.h>  #include "common/dynamic_library.h" +#include "common/file_util.h"  #include "common/logging/log.h"  #include "common/telemetry.h"  #include "core/core.h" @@ -76,7 +77,8 @@ Common::DynamicLibrary OpenVulkanLibrary() {      char* libvulkan_env = getenv("LIBVULKAN_PATH");      if (!libvulkan_env || !library.Open(libvulkan_env)) {          // Use the libvulkan.dylib from the application bundle. -        std::string filename = File::GetBundleDirectory() + "/Contents/Frameworks/libvulkan.dylib"; +        const std::string filename = +            FileUtil::GetBundleDirectory() + "/Contents/Frameworks/libvulkan.dylib";          library.Open(filename.c_str());      }  #else diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 184b2238a..29001953c 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -870,7 +870,7 @@ void RasterizerVulkan::BeginTransformFeedback() {      UNIMPLEMENTED_IF(binding.buffer_offset != 0);      const GPUVAddr gpu_addr = binding.Address(); -    const std::size_t size = binding.buffer_size; +    const auto size = static_cast<VkDeviceSize>(binding.buffer_size);      const auto [buffer, offset] = buffer_cache.UploadMemory(gpu_addr, size, 4, true);      scheduler.Record([buffer = buffer, offset = offset, size](vk::CommandBuffer cmdbuf) { @@ -1154,7 +1154,7 @@ void RasterizerVulkan::SetupTexture(const Tegra::Texture::FullTextureInfo& textu      const auto sampler = sampler_cache.GetSampler(texture.tsc);      update_descriptor_queue.AddSampledImage(sampler, image_view); -    const auto image_layout = update_descriptor_queue.GetLastImageLayout(); +    VkImageLayout* const image_layout = update_descriptor_queue.LastImageLayout();      *image_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;      sampled_views.push_back(ImageView{std::move(view), image_layout});  } @@ -1180,7 +1180,7 @@ void RasterizerVulkan::SetupImage(const Tegra::Texture::TICEntry& tic, const Ima          view->GetImageView(tic.x_source, tic.y_source, tic.z_source, tic.w_source);      update_descriptor_queue.AddImage(image_view); -    const auto image_layout = update_descriptor_queue.GetLastImageLayout(); +    VkImageLayout* const image_layout = update_descriptor_queue.LastImageLayout();      *image_layout = VK_IMAGE_LAYOUT_GENERAL;      image_views.push_back(ImageView{std::move(view), image_layout});  } diff --git a/src/video_core/renderer_vulkan/vk_update_descriptor.cpp b/src/video_core/renderer_vulkan/vk_update_descriptor.cpp index 681ecde98..351c048d2 100644 --- a/src/video_core/renderer_vulkan/vk_update_descriptor.cpp +++ b/src/video_core/renderer_vulkan/vk_update_descriptor.cpp @@ -24,35 +24,25 @@ void VKUpdateDescriptorQueue::TickFrame() {  }  void VKUpdateDescriptorQueue::Acquire() { -    entries.clear(); -} +    // Minimum number of entries required. +    // This is the maximum number of entries a single draw call migth use. +    static constexpr std::size_t MIN_ENTRIES = 0x400; -void VKUpdateDescriptorQueue::Send(VkDescriptorUpdateTemplateKHR update_template, -                                   VkDescriptorSet set) { -    if (payload.size() + entries.size() >= payload.max_size()) { +    if (payload.size() + MIN_ENTRIES >= payload.max_size()) {          LOG_WARNING(Render_Vulkan, "Payload overflow, waiting for worker thread");          scheduler.WaitWorker();          payload.clear();      } +    upload_start = &*payload.end(); +} -    // TODO(Rodrigo): Rework to write the payload directly -    const auto payload_start = payload.data() + payload.size(); -    for (const auto& entry : entries) { -        if (const auto image = std::get_if<VkDescriptorImageInfo>(&entry)) { -            payload.push_back(*image); -        } else if (const auto buffer = std::get_if<VkDescriptorBufferInfo>(&entry)) { -            payload.push_back(*buffer); -        } else if (const auto texel = std::get_if<VkBufferView>(&entry)) { -            payload.push_back(*texel); -        } else { -            UNREACHABLE(); -        } -    } - -    scheduler.Record( -        [payload_start, set, update_template, logical = &device.GetLogical()](vk::CommandBuffer) { -            logical->UpdateDescriptorSet(set, update_template, payload_start); -        }); +void VKUpdateDescriptorQueue::Send(VkDescriptorUpdateTemplateKHR update_template, +                                   VkDescriptorSet set) { +    const void* const data = upload_start; +    const vk::Device* const logical = &device.GetLogical(); +    scheduler.Record([data, logical, set, update_template](vk::CommandBuffer) { +        logical->UpdateDescriptorSet(set, update_template, data); +    });  }  } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_update_descriptor.h b/src/video_core/renderer_vulkan/vk_update_descriptor.h index cc7e3dff4..945320c72 100644 --- a/src/video_core/renderer_vulkan/vk_update_descriptor.h +++ b/src/video_core/renderer_vulkan/vk_update_descriptor.h @@ -15,17 +15,13 @@ namespace Vulkan {  class VKDevice;  class VKScheduler; -class DescriptorUpdateEntry { -public: -    explicit DescriptorUpdateEntry() {} - -    DescriptorUpdateEntry(VkDescriptorImageInfo image) : image{image} {} +struct DescriptorUpdateEntry { +    DescriptorUpdateEntry(VkDescriptorImageInfo image_) : image{image_} {} -    DescriptorUpdateEntry(VkDescriptorBufferInfo buffer) : buffer{buffer} {} +    DescriptorUpdateEntry(VkDescriptorBufferInfo buffer_) : buffer{buffer_} {} -    DescriptorUpdateEntry(VkBufferView texel_buffer) : texel_buffer{texel_buffer} {} +    DescriptorUpdateEntry(VkBufferView texel_buffer_) : texel_buffer{texel_buffer_} {} -private:      union {          VkDescriptorImageInfo image;          VkDescriptorBufferInfo buffer; @@ -45,32 +41,34 @@ public:      void Send(VkDescriptorUpdateTemplateKHR update_template, VkDescriptorSet set);      void AddSampledImage(VkSampler sampler, VkImageView image_view) { -        entries.emplace_back(VkDescriptorImageInfo{sampler, image_view, {}}); +        payload.emplace_back(VkDescriptorImageInfo{sampler, image_view, {}});      }      void AddImage(VkImageView image_view) { -        entries.emplace_back(VkDescriptorImageInfo{{}, image_view, {}}); +        payload.emplace_back(VkDescriptorImageInfo{{}, image_view, {}});      }      void AddBuffer(VkBuffer buffer, u64 offset, std::size_t size) { -        entries.emplace_back(VkDescriptorBufferInfo{buffer, offset, size}); +        payload.emplace_back(VkDescriptorBufferInfo{buffer, offset, size});      }      void AddTexelBuffer(VkBufferView texel_buffer) { -        entries.emplace_back(texel_buffer); +        payload.emplace_back(texel_buffer);      } -    VkImageLayout* GetLastImageLayout() { -        return &std::get<VkDescriptorImageInfo>(entries.back()).imageLayout; +    VkImageLayout* LastImageLayout() { +        return &payload.back().image.imageLayout;      } -private: -    using Variant = std::variant<VkDescriptorImageInfo, VkDescriptorBufferInfo, VkBufferView>; +    const VkImageLayout* LastImageLayout() const { +        return &payload.back().image.imageLayout; +    } +private:      const VKDevice& device;      VKScheduler& scheduler; -    boost::container::static_vector<Variant, 0x400> entries; +    const DescriptorUpdateEntry* upload_start = nullptr;      boost::container::static_vector<DescriptorUpdateEntry, 0x10000> payload;  }; diff --git a/src/video_core/renderer_vulkan/wrapper.cpp b/src/video_core/renderer_vulkan/wrapper.cpp index 2ce9b0626..42eff85d3 100644 --- a/src/video_core/renderer_vulkan/wrapper.cpp +++ b/src/video_core/renderer_vulkan/wrapper.cpp @@ -725,8 +725,7 @@ bool PhysicalDevice::GetSurfaceSupportKHR(u32 queue_family_index, VkSurfaceKHR s      return supported == VK_TRUE;  } -VkSurfaceCapabilitiesKHR PhysicalDevice::GetSurfaceCapabilitiesKHR(VkSurfaceKHR surface) const -    noexcept { +VkSurfaceCapabilitiesKHR PhysicalDevice::GetSurfaceCapabilitiesKHR(VkSurfaceKHR surface) const {      VkSurfaceCapabilitiesKHR capabilities;      Check(dld->vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device, surface, &capabilities));      return capabilities; diff --git a/src/video_core/renderer_vulkan/wrapper.h b/src/video_core/renderer_vulkan/wrapper.h index 98937a77a..da42ca88e 100644 --- a/src/video_core/renderer_vulkan/wrapper.h +++ b/src/video_core/renderer_vulkan/wrapper.h @@ -779,7 +779,7 @@ public:      bool GetSurfaceSupportKHR(u32 queue_family_index, VkSurfaceKHR) const; -    VkSurfaceCapabilitiesKHR GetSurfaceCapabilitiesKHR(VkSurfaceKHR) const noexcept; +    VkSurfaceCapabilitiesKHR GetSurfaceCapabilitiesKHR(VkSurfaceKHR) const;      std::vector<VkSurfaceFormatKHR> GetSurfaceFormatsKHR(VkSurfaceKHR) const; diff --git a/src/video_core/shader/memory_util.cpp b/src/video_core/shader/memory_util.cpp index 074f21691..5071c83ca 100644 --- a/src/video_core/shader/memory_util.cpp +++ b/src/video_core/shader/memory_util.cpp @@ -66,12 +66,12 @@ ProgramCode GetShaderCode(Tegra::MemoryManager& memory_manager, GPUVAddr gpu_add  u64 GetUniqueIdentifier(Tegra::Engines::ShaderType shader_type, bool is_a, const ProgramCode& code,                          const ProgramCode& code_b) { -    u64 unique_identifier = boost::hash_value(code); +    size_t unique_identifier = boost::hash_value(code);      if (is_a) {          // VertexA programs include two programs          boost::hash_combine(unique_identifier, boost::hash_value(code_b));      } -    return unique_identifier; +    return static_cast<u64>(unique_identifier);  }  } // namespace VideoCommon::Shader diff --git a/src/video_core/shader_cache.h b/src/video_core/shader_cache.h index a23c23886..2dd270e99 100644 --- a/src/video_core/shader_cache.h +++ b/src/video_core/shader_cache.h @@ -19,7 +19,7 @@ namespace VideoCommon {  template <class T>  class ShaderCache { -    static constexpr u64 PAGE_SHIFT = 14; +    static constexpr u64 PAGE_BITS = 14;      struct Entry {          VAddr addr_start; @@ -87,8 +87,8 @@ protected:          const VAddr addr_end = addr + size;          Entry* const entry = NewEntry(addr, addr_end, data.get()); -        const u64 page_end = addr_end >> PAGE_SHIFT; -        for (u64 page = addr >> PAGE_SHIFT; page <= page_end; ++page) { +        const u64 page_end = addr_end >> PAGE_BITS; +        for (u64 page = addr >> PAGE_BITS; page <= page_end; ++page) {              invalidation_cache[page].push_back(entry);          } @@ -108,8 +108,8 @@ private:      /// @pre invalidation_mutex is locked      void InvalidatePagesInRegion(VAddr addr, std::size_t size) {          const VAddr addr_end = addr + size; -        const u64 page_end = addr_end >> PAGE_SHIFT; -        for (u64 page = addr >> PAGE_SHIFT; page <= page_end; ++page) { +        const u64 page_end = addr_end >> PAGE_BITS; +        for (u64 page = addr >> PAGE_BITS; page <= page_end; ++page) {              const auto it = invalidation_cache.find(page);              if (it == invalidation_cache.end()) {                  continue; diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index b543fc8c0..85075e868 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -1053,7 +1053,7 @@ private:      void DeduceBestBlit(SurfaceParams& src_params, SurfaceParams& dst_params,                          const GPUVAddr src_gpu_addr, const GPUVAddr dst_gpu_addr) {          auto deduced_src = DeduceSurface(src_gpu_addr, src_params); -        auto deduced_dst = DeduceSurface(src_gpu_addr, src_params); +        auto deduced_dst = DeduceSurface(dst_gpu_addr, dst_params);          if (deduced_src.Failed() || deduced_dst.Failed()) {              return;          } diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 8b9404718..75c27e39e 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -208,6 +208,10 @@ if (MSVC)      copy_yuzu_unicorn_deps(yuzu)  endif() +if (NOT APPLE) +    target_compile_definitions(yuzu PRIVATE HAS_OPENGL) +endif() +  if (ENABLE_VULKAN)      target_include_directories(yuzu PRIVATE ../../externals/Vulkan-Headers/include)      target_compile_definitions(yuzu PRIVATE HAS_VULKAN) diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp index 1f5e43043..696da2137 100644 --- a/src/yuzu/bootmanager.cpp +++ b/src/yuzu/bootmanager.cpp @@ -8,13 +8,16 @@  #include <QHBoxLayout>  #include <QKeyEvent>  #include <QMessageBox> -#include <QOffscreenSurface> -#include <QOpenGLContext>  #include <QPainter>  #include <QScreen>  #include <QStringList>  #include <QWindow> +#ifdef HAS_OPENGL +#include <QOffscreenSurface> +#include <QOpenGLContext> +#endif +  #if !defined(WIN32) && HAS_VULKAN  #include <qpa/qplatformnativeinterface.h>  #endif @@ -98,6 +101,7 @@ void EmuThread::run() {  #endif  } +#ifdef HAS_OPENGL  class OpenGLSharedContext : public Core::Frontend::GraphicsContext {  public:      /// Create the original context that should be shared from @@ -183,6 +187,7 @@ private:      std::unique_ptr<QOffscreenSurface> offscreen_surface{};      QSurface* surface;  }; +#endif  class DummyContext : public Core::Frontend::GraphicsContext {}; @@ -473,6 +478,7 @@ void GRenderWindow::resizeEvent(QResizeEvent* event) {  }  std::unique_ptr<Core::Frontend::GraphicsContext> GRenderWindow::CreateSharedContext() const { +#ifdef HAS_OPENGL      if (Settings::values.renderer_backend == Settings::RendererBackend::OpenGL) {          auto c = static_cast<OpenGLSharedContext*>(main_context.get());          // Bind the shared contexts to the main surface in case the backend wants to take over @@ -480,6 +486,7 @@ std::unique_ptr<Core::Frontend::GraphicsContext> GRenderWindow::CreateSharedCont          return std::make_unique<OpenGLSharedContext>(c->GetShareContext(),                                                       child_widget->windowHandle());      } +#endif      return std::make_unique<DummyContext>();  } @@ -560,6 +567,7 @@ void GRenderWindow::OnMinimalClientAreaChangeRequest(std::pair<u32, u32> minimal  }  bool GRenderWindow::InitializeOpenGL() { +#ifdef HAS_OPENGL      // TODO: One of these flags might be interesting: WA_OpaquePaintEvent, WA_NoBackground,      // WA_DontShowOnScreen, WA_DeleteOnClose      auto child = new OpenGLRenderWidget(this); @@ -571,6 +579,11 @@ bool GRenderWindow::InitializeOpenGL() {          std::make_unique<OpenGLSharedContext>(context->GetShareContext(), child->windowHandle()));      return true; +#else +    QMessageBox::warning(this, tr("OpenGL not available!"), +                         tr("yuzu has not been compiled with OpenGL support.")); +    return false; +#endif  }  bool GRenderWindow::InitializeVulkan() { diff --git a/src/yuzu/configuration/configure_service.cpp b/src/yuzu/configuration/configure_service.cpp index 06566e981..0de7a4f0b 100644 --- a/src/yuzu/configuration/configure_service.cpp +++ b/src/yuzu/configuration/configure_service.cpp @@ -68,6 +68,7 @@ void ConfigureService::SetConfiguration() {  }  std::pair<QString, QString> ConfigureService::BCATDownloadEvents() { +#ifdef YUZU_ENABLE_BOXCAT      std::optional<std::string> global;      std::map<std::string, Service::BCAT::EventStatus> map;      const auto res = Service::BCAT::Boxcat::GetStatus(global, map); @@ -105,7 +106,10 @@ std::pair<QString, QString> ConfigureService::BCATDownloadEvents() {                     .arg(QString::fromStdString(key))                     .arg(FormatEventStatusString(value));      } -    return {QStringLiteral("Current Boxcat Events"), std::move(out)}; +    return {tr("Current Boxcat Events"), std::move(out)}; +#else +    return {tr("Current Boxcat Events"), tr("There are currently no events on boxcat.")}; +#endif  }  void ConfigureService::OnBCATImplChanged() { diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 4119d7907..059b96e70 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -217,7 +217,20 @@ GMainWindow::GMainWindow()      LOG_INFO(Frontend, "yuzu Version: {} | {}-{}", yuzu_build_version, Common::g_scm_branch,               Common::g_scm_desc);  #ifdef ARCHITECTURE_x86_64 -    LOG_INFO(Frontend, "Host CPU: {}", Common::GetCPUCaps().cpu_string); +    const auto& caps = Common::GetCPUCaps(); +    std::string cpu_string = caps.cpu_string; +    if (caps.avx || caps.avx2 || caps.avx512) { +        cpu_string += " | AVX"; +        if (caps.avx512) { +            cpu_string += "512"; +        } else if (caps.avx2) { +            cpu_string += '2'; +        } +        if (caps.fma || caps.fma4) { +            cpu_string += " | FMA"; +        } +    } +    LOG_INFO(Frontend, "Host CPU: {}", cpu_string);  #endif      LOG_INFO(Frontend, "Host OS: {}", QSysInfo::prettyProductName().toStdString());      LOG_INFO(Frontend, "Host RAM: {:.2f} GB", diff --git a/src/yuzu/yuzu.rc b/src/yuzu/yuzu.rc index 1b253653f..4a3645a71 100644 --- a/src/yuzu/yuzu.rc +++ b/src/yuzu/yuzu.rc @@ -16,4 +16,4 @@ IDI_ICON1               ICON                    "../../dist/yuzu.ico"  // RT_MANIFEST  // -1                       RT_MANIFEST             "../../dist/yuzu.manifest" +0                       RT_MANIFEST             "../../dist/yuzu.manifest" diff --git a/src/yuzu_cmd/yuzu.rc b/src/yuzu_cmd/yuzu.rc index 7de8ef3d9..0cde75e2f 100644 --- a/src/yuzu_cmd/yuzu.rc +++ b/src/yuzu_cmd/yuzu.rc @@ -14,4 +14,4 @@ YUZU_ICON               ICON                    "../../dist/yuzu.ico"  // RT_MANIFEST  // -1                       RT_MANIFEST             "../../dist/yuzu.manifest" +0                       RT_MANIFEST             "../../dist/yuzu.manifest" diff --git a/src/yuzu_tester/service/yuzutest.cpp b/src/yuzu_tester/service/yuzutest.cpp index 85d3f436b..2d3f6e3a7 100644 --- a/src/yuzu_tester/service/yuzutest.cpp +++ b/src/yuzu_tester/service/yuzutest.cpp @@ -53,7 +53,7 @@ private:          IPC::ResponseBuilder rb{ctx, 3};          rb.Push(RESULT_SUCCESS); -        rb.Push<u32>(write_size); +        rb.Push<u32>(static_cast<u32>(write_size));      }      void StartIndividual(Kernel::HLERequestContext& ctx) { diff --git a/src/yuzu_tester/yuzu.rc b/src/yuzu_tester/yuzu.rc index 7de8ef3d9..0cde75e2f 100644 --- a/src/yuzu_tester/yuzu.rc +++ b/src/yuzu_tester/yuzu.rc @@ -14,4 +14,4 @@ YUZU_ICON               ICON                    "../../dist/yuzu.ico"  // RT_MANIFEST  // -1                       RT_MANIFEST             "../../dist/yuzu.manifest" +0                       RT_MANIFEST             "../../dist/yuzu.manifest"  | 
