From f05ff4103ee9e484075fcda662f67393d9dc2f2b Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 1 Nov 2023 01:32:29 +1000 Subject: [PATCH] Misc: Build fixes for Android --- CMakeSettings.json | 28 ------ dep/minizip/src/ioapi.c | 2 +- src/common/file_system.cpp | 14 +-- src/common/log.cpp | 7 +- src/common/memmap.cpp | 2 +- src/core/CMakeLists.txt | 1 + src/core/achievements.cpp | 94 ++++++++++++++++---- src/core/achievements.h | 12 +++ src/core/achievements_private.h | 34 ++++++++ src/core/core.vcxproj | 3 +- src/core/core.vcxproj.filters | 1 + src/core/fullscreen_ui.cpp | 104 ----------------------- src/core/fullscreen_ui.h | 3 + src/core/game_list.cpp | 6 +- src/core/pgxp.cpp | 21 +++-- src/core/settings.h | 6 -- src/core/system.cpp | 4 + src/duckstation-nogui/nogui_host.cpp | 6 +- src/duckstation-qt/qthost.cpp | 4 + src/duckstation-regtest/regtest_host.cpp | 5 ++ src/scmversion/CMakeLists.txt | 2 +- src/util/CMakeLists.txt | 5 +- src/util/gl/context.cpp | 4 + src/util/input_manager.cpp | 2 + src/util/input_manager.h | 3 + src/util/vulkan_device.cpp | 4 + src/util/vulkan_entry_points.inl | 4 + 27 files changed, 197 insertions(+), 184 deletions(-) delete mode 100644 CMakeSettings.json create mode 100644 src/core/achievements_private.h diff --git a/CMakeSettings.json b/CMakeSettings.json deleted file mode 100644 index 8ae35d293..000000000 --- a/CMakeSettings.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "configurations": [ - { - "name": "x64-Debug", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "-v", - "ctestCommandArgs": "", - "variables": [] - }, - { - "name": "x64-Release", - "generator": "Ninja", - "configurationType": "RelWithDebInfo", - "buildRoot": "${projectDir}\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "-v", - "ctestCommandArgs": "", - "inheritEnvironments": [ "msvc_x64_x64" ], - "variables": [] - } - ] -} \ No newline at end of file diff --git a/dep/minizip/src/ioapi.c b/dep/minizip/src/ioapi.c index 7f5c191b2..51af4a7bf 100644 --- a/dep/minizip/src/ioapi.c +++ b/dep/minizip/src/ioapi.c @@ -14,7 +14,7 @@ #define _CRT_SECURE_NO_WARNINGS #endif -#if defined(__APPLE__) || defined(IOAPI_NO_64) +#if defined(__APPLE__) || defined(__ANDROID__) || defined(IOAPI_NO_64) // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions #define FOPEN_FUNC(filename, mode) fopen(filename, mode) #define FTELLO_FUNC(stream) ftello(stream) diff --git a/src/common/file_system.cpp b/src/common/file_system.cpp index 042e4e05c..4a5fc6b0b 100644 --- a/src/common/file_system.cpp +++ b/src/common/file_system.cpp @@ -640,13 +640,6 @@ int FileSystem::OpenFDFile(const char* filename, int flags, int mode, Error* err #endif } -#endif - -FileSystem::ManagedCFilePtr FileSystem::OpenManagedCFile(const char* filename, const char* mode, Error* error) -{ - return ManagedCFilePtr(OpenCFile(filename, mode, error)); -} - std::FILE* FileSystem::OpenSharedCFile(const char* filename, const char* mode, FileShareMode share_mode, Error* error) { #ifdef _WIN32 @@ -687,6 +680,13 @@ std::FILE* FileSystem::OpenSharedCFile(const char* filename, const char* mode, F #endif } +#endif + +FileSystem::ManagedCFilePtr FileSystem::OpenManagedCFile(const char* filename, const char* mode, Error* error) +{ + return ManagedCFilePtr(OpenCFile(filename, mode, error)); +} + FileSystem::ManagedCFilePtr FileSystem::OpenManagedSharedCFile(const char* filename, const char* mode, FileShareMode share_mode, Error* error) { diff --git a/src/common/log.cpp b/src/common/log.cpp index 1e80e7574..4112de451 100644 --- a/src/common/log.cpp +++ b/src/common/log.cpp @@ -293,7 +293,10 @@ void Log::DebugOutputLogCallback(void* pUserParam, const char* channelName, cons FormatLogMessageAndPrintW(channelName, functionName, level, message, false, false, true, [](const std::wstring_view& message) { OutputDebugStringW(message.data()); }); #elif defined(__ANDROID__) - static const int logPriority[LOGLEVEL_COUNT] = { + if (message.empty()) + return; + + static constexpr int logPriority[LOGLEVEL_COUNT] = { ANDROID_LOG_INFO, // NONE ANDROID_LOG_ERROR, // ERROR ANDROID_LOG_WARN, // WARNING @@ -306,7 +309,7 @@ void Log::DebugOutputLogCallback(void* pUserParam, const char* channelName, cons ANDROID_LOG_DEBUG, // TRACE }; - __android_log_write(logPriority[level], channelName, message); + __android_log_print(logPriority[level], channelName, "%.*s", static_cast(message.length()), message.data()); #else #endif } diff --git a/src/common/memmap.cpp b/src/common/memmap.cpp index 28c2e21e7..7ec01256e 100644 --- a/src/common/memmap.cpp +++ b/src/common/memmap.cpp @@ -272,7 +272,7 @@ bool SharedMemoryMappingArea::Unmap(void* map_base, size_t map_size) return true; } -#else +#elif !defined(__ANDROID__) bool MemMap::MemProtect(void* baseaddr, size_t size, PageProtect mode) { diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 04af20c9b..8b49b6f95 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -1,6 +1,7 @@ add_library(core achievements.cpp achievements.h + achievements_private.h analog_controller.cpp analog_controller.h analog_joystick.cpp diff --git a/src/core/achievements.cpp b/src/core/achievements.cpp index f3db8942b..e31e41d81 100644 --- a/src/core/achievements.cpp +++ b/src/core/achievements.cpp @@ -7,6 +7,7 @@ #define IMGUI_DEFINE_MATH_OPERATORS #include "achievements.h" +#include "achievements_private.h" #include "bios.h" #include "bus.h" #include "cpu_core.h" @@ -164,22 +165,18 @@ static void DisplayHardcoreDeferredMessage(); static void DisplayAchievementSummary(); static void UpdateRichPresence(std::unique_lock& lock); -static std::string GetAchievementBadgePath(const rc_client_achievement_t* achievement, int state); -static std::string GetUserBadgePath(const std::string_view& username); -static std::string GetLeaderboardUserBadgePath(const rc_client_leaderboard_entry_t* entry); - -static void DrawAchievement(const rc_client_achievement_t* cheevo); -static void DrawLeaderboardListEntry(const rc_client_leaderboard_t* lboard); -static void DrawLeaderboardEntry(const rc_client_leaderboard_entry_t& entry, bool is_self, float rank_column_width, - float name_column_width, float time_column_width, float column_spacing); -static void OpenLeaderboard(const rc_client_leaderboard_t* lboard); static void LeaderboardFetchNearbyCallback(int result, const char* error_message, rc_client_leaderboard_entry_list_t* list, rc_client_t* client, void* callback_userdata); static void LeaderboardFetchAllCallback(int result, const char* error_message, rc_client_leaderboard_entry_list_t* list, rc_client_t* client, void* callback_userdata); -static void FetchNextLeaderboardEntries(); -static void CloseLeaderboard(); + +#ifndef __ANDROID__ +static void DrawAchievement(const rc_client_achievement_t* cheevo); +static void DrawLeaderboardListEntry(const rc_client_leaderboard_t* lboard); +static void DrawLeaderboardEntry(const rc_client_leaderboard_entry_t& entry, bool is_self, float rank_column_width, + float name_column_width, float time_column_width, float column_spacing); +#endif static bool s_hardcore_mode = false; @@ -228,6 +225,16 @@ std::unique_lock Achievements::GetLock() return std::unique_lock(s_achievements_mutex); } +rc_client_t* Achievements::GetClient() +{ + return s_client; +} + +const rc_client_user_game_summary_t& Achievements::GetGameSummary() +{ + return s_game_summary; +} + std::string Achievements::GetUserAgent() { return fmt::format("DuckStation for {} ({}) {}", TARGET_OS_STR, CPU_ARCH_STR, g_scm_tag_str); @@ -369,6 +376,11 @@ const std::string& Achievements::GetGameTitle() return s_game_title; } +const std::string& Achievements::GetGameIconPath() +{ + return s_game_icon; +} + const std::string& Achievements::GetRichPresenceString() { return s_rich_presence_string; @@ -642,6 +654,15 @@ void Achievements::IdleUpdate() rc_client_idle(s_client); } +bool Achievements::NeedsIdleUpdate() +{ + if (!IsActive()) + return false; + + const auto lock = GetLock(); + return (s_http_downloader && s_http_downloader->HasAnyRequests()); +} + void Achievements::FrameUpdate() { if (!IsActive()) @@ -980,9 +1001,10 @@ void Achievements::DisplayAchievementSummary() std::string summary; if (s_game_summary.num_core_achievements > 0) { - summary = fmt::format(TRANSLATE_FS("Achievements", "You have unlocked {} of {} achievements, and earned {} of {} points."), - s_game_summary.num_unlocked_achievements, s_game_summary.num_core_achievements, - s_game_summary.points_unlocked, s_game_summary.points_core); + summary = fmt::format( + TRANSLATE_FS("Achievements", "You have unlocked {} of {} achievements, and earned {} of {} points."), + s_game_summary.num_unlocked_achievements, s_game_summary.num_core_achievements, s_game_summary.points_unlocked, + s_game_summary.points_core); } else { @@ -1507,7 +1529,8 @@ bool Achievements::DoState(StateWrapper& sw) } } -std::string Achievements::GetAchievementBadgePath(const rc_client_achievement_t* achievement, int state) +std::string Achievements::GetAchievementBadgePath(const rc_client_achievement_t* achievement, int state, + bool download_if_missing) { static constexpr std::array s_achievement_state_strings = { {"inactive", "active", "unlocked", "disabled"}}; @@ -1520,7 +1543,7 @@ std::string Achievements::GetAchievementBadgePath(const rc_client_achievement_t* path = Path::Combine(s_image_directory, TinyString::from_fmt("achievement_{}_{}_{}.png", s_game_id, achievement->id, s_achievement_state_strings[state])); - if (!FileSystem::FileExists(path.c_str())) + if (download_if_missing && !FileSystem::FileExists(path.c_str())) { char buf[512]; const int res = rc_client_achievement_get_image_url(achievement, state, buf, std::size(buf)); @@ -1767,12 +1790,15 @@ bool Achievements::ConfirmHardcoreModeDisable(const char* trigger) void Achievements::ClearUIState() { +#ifndef __ANDROID__ if (FullscreenUI::IsAchievementsWindowOpen() || FullscreenUI::IsLeaderboardsWindowOpen()) FullscreenUI::ReturnToPreviousWindow(); + CloseLeaderboard(); +#endif + s_achievement_badge_paths = {}; - CloseLeaderboard(); s_leaderboard_user_icon_paths = {}; s_leaderboard_entry_lists = {}; if (s_leaderboard_list) @@ -1921,6 +1947,8 @@ void Achievements::DrawGameOverlays() } } +#ifndef __ANDROID__ + void Achievements::DrawPauseMenuOverlays() { using ImGuiFullscreen::g_large_font; @@ -2767,6 +2795,8 @@ void Achievements::DrawLeaderboardListEntry(const rc_client_leaderboard_t* lboar OpenLeaderboard(lboard); } +#endif // __ANDROID__ + void Achievements::OpenLeaderboard(const rc_client_leaderboard_t* lboard) { Log_DevPrintf("Opening leaderboard '%s' (%u)", lboard->title, lboard->id); @@ -2779,6 +2809,36 @@ void Achievements::OpenLeaderboard(const rc_client_leaderboard_t* lboard) s_client, lboard->id, LEADERBOARD_NEARBY_ENTRIES_TO_FETCH, LeaderboardFetchNearbyCallback, nullptr); } +bool Achievements::OpenLeaderboardById(u32 leaderboard_id) +{ + const rc_client_leaderboard_t* lb = rc_client_get_leaderboard_info(s_client, leaderboard_id); + if (!lb) + return false; + + OpenLeaderboard(lb); + return true; +} + +u32 Achievements::GetOpenLeaderboardId() +{ + return s_open_leaderboard ? s_open_leaderboard->id : 0; +} + +bool Achievements::IsShowingAllLeaderboardEntries() +{ + return s_is_showing_all_leaderboard_entries; +} + +const std::vector& Achievements::GetLeaderboardEntryLists() +{ + return s_leaderboard_entry_lists; +} + +const rc_client_leaderboard_entry_list_t* Achievements::GetLeaderboardNearbyEntries() +{ + return s_leaderboard_nearby_entries; +} + void Achievements::LeaderboardFetchNearbyCallback(int result, const char* error_message, rc_client_leaderboard_entry_list_t* list, rc_client_t* client, void* callback_userdata) diff --git a/src/core/achievements.h b/src/core/achievements.h index 51a527fa1..32245d523 100644 --- a/src/core/achievements.h +++ b/src/core/achievements.h @@ -11,6 +11,8 @@ #include #include +struct rc_client_t; + class Error; class StateWrapper; class CDImage; @@ -28,6 +30,9 @@ enum class LoginRequestReason /// Acquires the achievements lock. Must be held when accessing any achievement state from another thread. std::unique_lock GetLock(); +/// Returns the rc_client instance. Should have the lock held. +rc_client_t* GetClient(); + /// Initializes the RetroAchievments client. bool Initialize(); @@ -52,6 +57,9 @@ void FrameUpdate(); /// Called when the system is paused, because FrameUpdate() won't be getting called. void IdleUpdate(); +/// Returns true if idle updates are necessary (e.g. outstanding requests). +bool NeedsIdleUpdate(); + /// Saves/loads state. bool DoState(StateWrapper& sw); @@ -118,6 +126,8 @@ void DrawGameOverlays(); /// Draws ImGui overlays when paused. void DrawPauseMenuOverlays(); +#ifndef __ANDROID__ + /// Queries the achievement list, and if no achievements are available, returns false. bool PrepareAchievementsWindow(); @@ -130,6 +140,8 @@ bool PrepareLeaderboardsWindow(); /// Renders the leaderboard list. void DrawLeaderboardsWindow(); +#endif // __ANDROID__ + #ifdef ENABLE_RAINTEGRATION /// Prevents the internal implementation from being used. Instead, RAIntegration will be /// called into when achievement-related events occur. diff --git a/src/core/achievements_private.h b/src/core/achievements_private.h new file mode 100644 index 000000000..0f5a9d149 --- /dev/null +++ b/src/core/achievements_private.h @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2019-2023 Connor McLaughlin +// SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) + +#pragma once + +#include "achievements.h" + +#include "rc_client.h" + +namespace Achievements { + +/// Returns the rc_client instance. Should have the lock held. +rc_client_t* GetClient(); + +const rc_client_user_game_summary_t& GetGameSummary(); +const std::string& GetGameIconPath(); + +std::string GetAchievementBadgePath(const rc_client_achievement_t* achievement, int state, + bool download_if_missing = true); +std::string GetUserBadgePath(const std::string_view& username); +std::string GetLeaderboardUserBadgePath(const rc_client_leaderboard_entry_t* entry); + +void OpenLeaderboard(const rc_client_leaderboard_t* lboard); +bool OpenLeaderboardById(u32 leaderboard_id); +u32 GetOpenLeaderboardId(); +bool IsShowingAllLeaderboardEntries(); +void FetchNextLeaderboardEntries(); + +const std::vector& GetLeaderboardEntryLists(); +const rc_client_leaderboard_entry_list_t* GetLeaderboardNearbyEntries(); + +void CloseLeaderboard(); + +} // namespace Achievements diff --git a/src/core/core.vcxproj b/src/core/core.vcxproj index 8705acd2f..0add7b900 100644 --- a/src/core/core.vcxproj +++ b/src/core/core.vcxproj @@ -90,6 +90,7 @@ + @@ -229,4 +230,4 @@ - + \ No newline at end of file diff --git a/src/core/core.vcxproj.filters b/src/core/core.vcxproj.filters index 92dfb7abc..d7f0469fd 100644 --- a/src/core/core.vcxproj.filters +++ b/src/core/core.vcxproj.filters @@ -135,5 +135,6 @@ + \ No newline at end of file diff --git a/src/core/fullscreen_ui.cpp b/src/core/fullscreen_ui.cpp index f2bb4fa2d..ef63523cf 100644 --- a/src/core/fullscreen_ui.cpp +++ b/src/core/fullscreen_ui.cpp @@ -6687,110 +6687,6 @@ void FullscreenUI::ProgressCallback::SetCancelled() m_cancelled = true; } -#else - -// "Lightweight" version with only notifications for Android. -namespace FullscreenUI { -static bool s_initialized = false; -static bool s_tried_to_initialize = false; -} // namespace FullscreenUI - -bool FullscreenUI::Initialize() -{ - if (s_initialized) - return true; - - if (s_tried_to_initialize) - return false; - - ImGuiFullscreen::SetTheme(false); - ImGuiFullscreen::UpdateLayoutScale(); - - if (!ImGuiManager::AddFullscreenFontsIfMissing() || !ImGuiFullscreen::Initialize("images/placeholder.png")) - { - ImGuiFullscreen::Shutdown(); - s_tried_to_initialize = true; - return false; - } - - s_initialized = true; - return true; -} - -bool FullscreenUI::IsInitialized() -{ - return s_initialized; -} - -bool FullscreenUI::HasActiveWindow() -{ - return false; -} - -void FullscreenUI::CheckForConfigChanges(const Settings& old_settings) -{ - // noop -} - -void FullscreenUI::OnSystemStarted() -{ - // noop -} - -void FullscreenUI::OnSystemPaused() -{ - // noop -} - -void FullscreenUI::OnSystemResumed() -{ - // noop -} - -void FullscreenUI::OnSystemDestroyed() -{ - // noop -} - -void FullscreenUI::OnRunningGameChanged() -{ - // noop -} - -void FullscreenUI::OpenPauseMenu() -{ - // noop -} - -bool FullscreenUI::OpenAchievementsWindow() -{ - return false; -} - -bool FullscreenUI::OpenLeaderboardsWindow() -{ - return false; -} - -void FullscreenUI::Shutdown() -{ - ImGuiFullscreen::Shutdown(); - s_initialized = false; - s_tried_to_initialize = false; -} - -void FullscreenUI::Render() -{ - if (!s_initialized) - return; - - ImGuiFullscreen::UploadAsyncTextures(); - - ImGuiFullscreen::BeginLayout(); - ImGuiFullscreen::EndLayout(); - ImGuiFullscreen::ResetCloseMenuIfNeeded(); -} - #endif // __ANDROID__ ///////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/core/fullscreen_ui.h b/src/core/fullscreen_ui.h index f3b896341..56e882a45 100644 --- a/src/core/fullscreen_ui.h +++ b/src/core/fullscreen_ui.h @@ -21,6 +21,8 @@ void OnSystemPaused(); void OnSystemResumed(); void OnSystemDestroyed(); void OnRunningGameChanged(); + +#ifndef __ANDROID__ void OpenPauseMenu(); void OpenAchievementsWindow(); bool IsAchievementsWindowOpen(); @@ -28,6 +30,7 @@ void OpenLeaderboardsWindow(); bool IsLeaderboardsWindowOpen(); void ReturnToMainWindow(); void ReturnToPreviousWindow(); +#endif void Shutdown(); void Render(); diff --git a/src/core/game_list.cpp b/src/core/game_list.cpp index 25ab7f7eb..2e279d631 100644 --- a/src/core/game_list.cpp +++ b/src/core/game_list.cpp @@ -628,9 +628,13 @@ void GameList::Refresh(bool invalidate_cache, bool only_cache, ProgressCallback* const std::vector excluded_paths(Host::GetBaseStringListSetting("GameList", "ExcludedPaths")); const std::vector dirs(Host::GetBaseStringListSetting("GameList", "Paths")); - const std::vector recursive_dirs(Host::GetBaseStringListSetting("GameList", "RecursivePaths")); + std::vector recursive_dirs(Host::GetBaseStringListSetting("GameList", "RecursivePaths")); const PlayedTimeMap played_time(LoadPlayedTimeMap(GetPlayedTimeFile())); +#ifdef __ANDROID__ + recursive_dirs.push_back(Path::Combine(EmuFolders::DataRoot, "games")); +#endif + if (!dirs.empty() || !recursive_dirs.empty()) { progress->SetProgressRange(static_cast(dirs.size() + recursive_dirs.size())); diff --git a/src/core/pgxp.cpp b/src/core/pgxp.cpp index 3dfc7a210..826c6f0cd 100644 --- a/src/core/pgxp.cpp +++ b/src/core/pgxp.cpp @@ -125,12 +125,12 @@ ALWAYS_INLINE_RELEASE void MaskValidate(PGXP_value* pV, u32 psxV, u32 mask, u32 ALWAYS_INLINE_RELEASE double f16Sign(double in) { - u32 s = (u32)(in * (double)((u32)1 << 16)); - return ((double)*((s32*)&s)) / (double)((s32)1 << 16); + const s32 s = static_cast(static_cast(in * (USHRT_MAX + 1))); + return static_cast(s) / static_cast(USHRT_MAX + 1); } ALWAYS_INLINE_RELEASE double f16Unsign(double in) { - return (in >= 0) ? in : ((double)in + (double)USHRT_MAX + 1); + return (in >= 0) ? in : (in + (USHRT_MAX + 1)); } ALWAYS_INLINE_RELEASE double f16Overflow(double in) { @@ -599,13 +599,11 @@ void CPU_MOVE(u32 rd_and_rs, u32 rsVal) void CPU_ADDI(u32 instr, u32 rsVal) { // Rt = Rs + Imm (signed) - psx_value tempImm; - PGXP_value ret; - Validate(&CPU_reg[rs(instr)], rsVal); - ret = CPU_reg[rs(instr)]; - tempImm.d = imm(instr); - tempImm.sd = (tempImm.sd << 16) >> 16; // sign extend + PGXP_value ret = CPU_reg[rs(instr)]; + + psx_value tempImm; + tempImm.d = SignExtend32(static_cast(imm(instr))); if (tempImm.d != 0) { @@ -929,6 +927,11 @@ static void CPU_BITWISE(u32 instr, u32 rdVal, u32 rsVal, u32 rtVal) ret.z = CPU_reg[rt(instr)].z; ret.compFlags[2] = CPU_reg[rt(instr)].compFlags[2]; } + else + { + ret.z = 0.0f; + ret.compFlags[2] = 0; + } ret.value = rdVal; CPU_reg[rd(instr)] = ret; diff --git a/src/core/settings.h b/src/core/settings.h index b7d3c78f6..40c02f251 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -405,7 +405,6 @@ struct Settings static const char* GetMultitapModeName(MultitapMode mode); static const char* GetMultitapModeDisplayName(MultitapMode mode); - // Default to D3D11 on Windows as it's more performant and at this point, less buggy. static constexpr GPURenderer DEFAULT_GPU_RENDERER = GPURenderer::Automatic; static constexpr GPUTextureFilter DEFAULT_GPU_TEXTURE_FILTER = GPUTextureFilter::Nearest; static constexpr GPUDownsampleMode DEFAULT_GPU_DOWNSAMPLE_MODE = GPUDownsampleMode::Disabled; @@ -449,12 +448,7 @@ struct Settings static constexpr u8 DEFAULT_CDROM_READAHEAD_SECTORS = 8; -#ifndef __ANDROID__ - // Android still defaults to digital controller for now. static constexpr ControllerType DEFAULT_CONTROLLER_1_TYPE = ControllerType::AnalogController; -#else - static constexpr ControllerType DEFAULT_CONTROLLER_1_TYPE = ControllerType::DigitalController; -#endif static constexpr ControllerType DEFAULT_CONTROLLER_2_TYPE = ControllerType::None; static constexpr MemoryCardType DEFAULT_MEMORY_CARD_1_TYPE = MemoryCardType::PerGameTitle; static constexpr MemoryCardType DEFAULT_MEMORY_CARD_2_TYPE = MemoryCardType::None; diff --git a/src/core/system.cpp b/src/core/system.cpp index be838ae62..d57fd8eaf 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -256,8 +256,10 @@ void System::Internal::ProcessStartup() if (g_settings.achievements_enabled) Achievements::Initialize(); +#ifdef ENABLE_DISCORD_PRESENCE if (g_settings.enable_discord_presence) InitializeDiscordPresence(); +#endif } void System::Internal::ProcessShutdown() @@ -3700,6 +3702,7 @@ void System::CheckForSettingsChanges(const Settings& old_settings) FullscreenUI::CheckForConfigChanges(old_settings); +#ifdef ENABLE_DISCORD_PRESENCE if (g_settings.enable_discord_presence != old_settings.enable_discord_presence) { if (g_settings.enable_discord_presence) @@ -3707,6 +3710,7 @@ void System::CheckForSettingsChanges(const Settings& old_settings) else ShutdownDiscordPresence(); } +#endif if (g_settings.log_level != old_settings.log_level || g_settings.log_filter != old_settings.log_filter || g_settings.log_timestamps != old_settings.log_timestamps || diff --git a/src/duckstation-nogui/nogui_host.cpp b/src/duckstation-nogui/nogui_host.cpp index eff8a73a7..f71e16499 100644 --- a/src/duckstation-nogui/nogui_host.cpp +++ b/src/duckstation-nogui/nogui_host.cpp @@ -95,7 +95,6 @@ static void AsyncOpThreadEntryPoint(std::function callb static std::unique_ptr s_base_settings_interface; static bool s_batch_mode = false; static bool s_is_fullscreen = false; -static bool s_save_state_on_shutdown = false; static bool s_was_paused_by_focus_loss = false; static Threading::Thread s_cpu_thread; @@ -323,6 +322,10 @@ void Host::ReportDebuggerMessage(const std::string_view& message) Log_ErrorPrintf("ReportDebuggerMessage: %.*s", static_cast(message.size()), message.data()); } +void Host::AddFixedInputBindings(SettingsInterface& si) +{ +} + void Host::OnInputDeviceConnected(const std::string_view& identifier, const std::string_view& device_name) { Host::AddKeyedOSDMessage(fmt::format("InputDeviceConnected-{}", identifier), @@ -700,7 +703,6 @@ void Host::ReleaseRenderWindow() void Host::OnSystemStarting() { - s_save_state_on_shutdown = false; s_was_paused_by_focus_loss = false; } diff --git a/src/duckstation-qt/qthost.cpp b/src/duckstation-qt/qthost.cpp index 37bc11674..3eba77e04 100644 --- a/src/duckstation-qt/qthost.cpp +++ b/src/duckstation-qt/qthost.cpp @@ -1424,6 +1424,10 @@ void Host::ReportDebuggerMessage(const std::string_view& message) emit g_emu_thread->debuggerMessageReported(QString::fromUtf8(message)); } +void Host::AddFixedInputBindings(SettingsInterface& si) +{ +} + void Host::OnInputDeviceConnected(const std::string_view& identifier, const std::string_view& device_name) { emit g_emu_thread->onInputDeviceConnected( diff --git a/src/duckstation-regtest/regtest_host.cpp b/src/duckstation-regtest/regtest_host.cpp index 5688d4360..fd5931525 100644 --- a/src/duckstation-regtest/regtest_host.cpp +++ b/src/duckstation-regtest/regtest_host.cpp @@ -355,6 +355,11 @@ std::optional InputManager::ConvertHostKeyboardCodeToString(u32 cod return std::nullopt; } +void Host::AddFixedInputBindings(SettingsInterface& si) +{ + // noop +} + void Host::OnInputDeviceConnected(const std::string_view& identifier, const std::string_view& device_name) { // noop diff --git a/src/scmversion/CMakeLists.txt b/src/scmversion/CMakeLists.txt index 7a5129298..aa5a1fa30 100644 --- a/src/scmversion/CMakeLists.txt +++ b/src/scmversion/CMakeLists.txt @@ -1,5 +1,5 @@ # _scmversion.cpp is a dummy file that will never be created, so the command will always be run -if(WIN32) +if(CMAKE_HOST_SYSTEM MATCHES "Windows") add_custom_command(OUTPUT scmversion.cpp _scmversion.cpp COMMAND cmd /k "${CMAKE_CURRENT_SOURCE_DIR}/gen_scmversion.bat" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index e46cab111..10b0d883e 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -140,10 +140,7 @@ if(ENABLE_OPENGL) ) endif() if(ANDROID) - target_sources(util PRIVATE - gl/context_egl_android.cpp - gl/context_egl_android.h - ) + target_include_directories(util PRIVATE "${CMAKE_SOURCE_DIR}/android/app/src/cpp") endif() endif() diff --git a/src/util/gl/context.cpp b/src/util/gl/context.cpp index 9311f83fc..1a6cddd76 100644 --- a/src/util/gl/context.cpp +++ b/src/util/gl/context.cpp @@ -18,6 +18,8 @@ #include "context_wgl.h" #elif defined(__APPLE__) #include "context_agl.h" +#elif defined(__ANDROID__) +#include "context_egl_android.h" #else #ifdef ENABLE_EGL #ifdef ENABLE_WAYLAND @@ -120,6 +122,8 @@ std::unique_ptr Context::Create(const WindowInfo& wi, const Version context = ContextWGL::Create(wi, versions_to_try, num_versions_to_try); #elif defined(__APPLE__) context = ContextAGL::Create(wi, versions_to_try, num_versions_to_try); +#elif defined(__ANDROID__) + context = ContextEGLAndroid::Create(wi, versions_to_try, num_versions_to_try); #else #if defined(ENABLE_X11) if (wi.type == WindowInfo::Type::X11) diff --git a/src/util/input_manager.cpp b/src/util/input_manager.cpp index 4a22b42fc..4cffbbcbf 100644 --- a/src/util/input_manager.cpp +++ b/src/util/input_manager.cpp @@ -1604,6 +1604,8 @@ void InputManager::ReloadBindings(SettingsInterface& si, SettingsInterface& bind s_pad_vibration_array.clear(); s_pointer_move_callbacks.clear(); + Host::AddFixedInputBindings(binding_si); + // Hotkeys use the base configuration, except if the custom hotkeys option is enabled. const bool use_profile_hotkeys = si.GetBoolValue("ControllerPorts", "UseProfileHotkeyBindings", false); AddHotkeyBindings(use_profile_hotkeys ? binding_si : si); diff --git a/src/util/input_manager.h b/src/util/input_manager.h index cebe41c89..9d68b8de8 100644 --- a/src/util/input_manager.h +++ b/src/util/input_manager.h @@ -351,6 +351,9 @@ void OnInputDeviceDisconnected(const std::string_view& identifier); } // namespace InputManager namespace Host { +/// Adds any fixed bindings from the host. +void AddFixedInputBindings(SettingsInterface& si); + /// Called when a new input device is connected. void OnInputDeviceConnected(const std::string_view& identifier, const std::string_view& device_name); diff --git a/src/util/vulkan_device.cpp b/src/util/vulkan_device.cpp index 9c8d79a71..5f88e86bb 100644 --- a/src/util/vulkan_device.cpp +++ b/src/util/vulkan_device.cpp @@ -220,6 +220,10 @@ bool VulkanDevice::SelectInstanceExtensions(ExtensionList* extension_list, const if (wi.type == WindowInfo::Type::MacOS && !SupportsExtension(VK_EXT_METAL_SURFACE_EXTENSION_NAME, true)) return false; #endif +#if defined(VK_USE_PLATFORM_ANDROID_KHR) + if (wi.type == WindowInfo::Type::Android && !SupportsExtension(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, true)) + return false; +#endif // VK_EXT_debug_utils if (enable_debug_utils && !SupportsExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, false)) diff --git a/src/util/vulkan_entry_points.inl b/src/util/vulkan_entry_points.inl index a586e30f4..9fa2692a6 100644 --- a/src/util/vulkan_entry_points.inl +++ b/src/util/vulkan_entry_points.inl @@ -56,6 +56,10 @@ VULKAN_INSTANCE_ENTRY_POINT(vkCreateWaylandSurfaceKHR, false) VULKAN_INSTANCE_ENTRY_POINT(vkCreateMetalSurfaceEXT, false) #endif +#if defined(VK_USE_PLATFORM_ANDROID_KHR) +VULKAN_INSTANCE_ENTRY_POINT(vkCreateAndroidSurfaceKHR, false) +#endif + // VK_EXT_debug_utils VULKAN_INSTANCE_ENTRY_POINT(vkCmdBeginDebugUtilsLabelEXT, false) VULKAN_INSTANCE_ENTRY_POINT(vkCmdEndDebugUtilsLabelEXT, false)