summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorJMC47 <JMC4789@gmail.com>2025-03-23 15:12:28 -0400
committerGitHub <noreply@github.com>2025-03-23 15:12:28 -0400
commit2da255d8cdb2da67123296f5f091f808c696d021 (patch)
tree6cb532eb57ccc7565dac52beaa0901045c6f5c98 /Source
parente93f0de8a4bcf9f201347fba21a12960ffa3c15f (diff)
parente18d98d4fc94830937f6011e15ad1a41a9eeb9dc (diff)
Merge pull request #13311 from iwubcode/dynamic_input_textures_reduce_image_writes
Core / DolphinQt / InputCommon: reduce the number disk writes when using DynamicInputTextures
Diffstat (limited to 'Source')
-rw-r--r--Source/Android/jni/Input/EmulatedController.cpp9
-rw-r--r--Source/Core/Core/Boot/Boot.cpp10
-rw-r--r--Source/Core/Core/ConfigManager.cpp38
-rw-r--r--Source/Core/Core/ConfigManager.h14
-rw-r--r--Source/Core/Core/Core.cpp6
-rw-r--r--Source/Core/Core/HW/GCKeyboard.cpp5
-rw-r--r--Source/Core/Core/HW/GCKeyboard.h1
-rw-r--r--Source/Core/Core/HW/GCPad.cpp5
-rw-r--r--Source/Core/Core/HW/GCPad.h1
-rw-r--r--Source/Core/Core/HW/Wiimote.cpp5
-rw-r--r--Source/Core/Core/HW/Wiimote.h1
-rw-r--r--Source/Core/Core/IOS/ES/ES.cpp1
-rw-r--r--Source/Core/Core/IOS/IOS.cpp2
-rw-r--r--Source/Core/Core/IOS/MIOS.cpp2
-rw-r--r--Source/Core/DolphinQt/Config/Mapping/MappingCommon.cpp2
-rw-r--r--Source/Core/DolphinQt/Config/Mapping/MappingWindow.cpp3
-rw-r--r--Source/Core/InputCommon/DynamicInputTextureManager.cpp28
-rw-r--r--Source/Core/InputCommon/DynamicInputTextures/DITConfiguration.cpp42
-rw-r--r--Source/Core/InputCommon/DynamicInputTextures/DITConfiguration.h15
-rw-r--r--Source/Core/InputCommon/InputConfig.cpp23
-rw-r--r--Source/Core/InputCommon/InputConfig.h1
21 files changed, 155 insertions, 59 deletions
diff --git a/Source/Android/jni/Input/EmulatedController.cpp b/Source/Android/jni/Input/EmulatedController.cpp
index 45f6148f2b..befb6867a2 100644
--- a/Source/Android/jni/Input/EmulatedController.cpp
+++ b/Source/Android/jni/Input/EmulatedController.cpp
@@ -88,8 +88,10 @@ JNIEXPORT void JNICALL
Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_updateSingleControlReference(
JNIEnv* env, jobject obj, jobject control_reference)
{
- return EmulatedControllerFromJava(env, obj)->UpdateSingleControlReference(
- g_controller_interface, ControlReferenceFromJava(env, control_reference));
+ ControllerEmu::EmulatedController* controller = EmulatedControllerFromJava(env, obj);
+ controller->GetConfig()->GenerateControllerTextures();
+ return controller->UpdateSingleControlReference(g_controller_interface,
+ ControlReferenceFromJava(env, control_reference));
}
JNIEXPORT void JNICALL
@@ -100,6 +102,7 @@ Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedContro
controller->LoadDefaults(g_controller_interface);
controller->UpdateReferences(g_controller_interface);
+ controller->GetConfig()->GenerateControllerTextures();
}
JNIEXPORT void JNICALL
@@ -113,6 +116,7 @@ Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedContro
controller->LoadConfig(&section);
controller->UpdateReferences(g_controller_interface);
+ controller->GetConfig()->GenerateControllerTextures();
}
JNIEXPORT void JNICALL
@@ -126,6 +130,7 @@ Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedContro
controller->LoadConfig(ini.GetOrCreateSection("Profile"));
controller->UpdateReferences(g_controller_interface);
+ controller->GetConfig()->GenerateControllerTextures();
}
JNIEXPORT void JNICALL
diff --git a/Source/Core/Core/Boot/Boot.cpp b/Source/Core/Core/Boot/Boot.cpp
index 208c4d34bd..1340d19c84 100644
--- a/Source/Core/Core/Boot/Boot.cpp
+++ b/Source/Core/Core/Boot/Boot.cpp
@@ -550,7 +550,7 @@ bool CBoot::BootUp(Core::System& system, const Core::CPUThreadGuard& guard,
if (!EmulatedBS2(system, guard, system.IsWii(), *volume, riivolution_patches))
return false;
- SConfig::OnNewTitleLoad(guard);
+ SConfig::OnTitleDirectlyBooted(guard);
return true;
}
@@ -601,7 +601,7 @@ bool CBoot::BootUp(Core::System& system, const Core::CPUThreadGuard& guard,
return false;
}
- SConfig::OnNewTitleLoad(guard);
+ SConfig::OnTitleDirectlyBooted(guard);
ppc_state.pc = executable.reader->GetEntryPoint();
@@ -621,7 +621,7 @@ bool CBoot::BootUp(Core::System& system, const Core::CPUThreadGuard& guard,
if (!Boot_WiiWAD(system, wad))
return false;
- SConfig::OnNewTitleLoad(guard);
+ SConfig::OnTitleDirectlyBooted(guard);
return true;
}
@@ -631,7 +631,7 @@ bool CBoot::BootUp(Core::System& system, const Core::CPUThreadGuard& guard,
if (!BootNANDTitle(system, nand_title.id))
return false;
- SConfig::OnNewTitleLoad(guard);
+ SConfig::OnTitleDirectlyBooted(guard);
return true;
}
@@ -657,7 +657,7 @@ bool CBoot::BootUp(Core::System& system, const Core::CPUThreadGuard& guard,
ipl.disc->auto_disc_change_paths);
}
- SConfig::OnNewTitleLoad(guard);
+ SConfig::OnTitleDirectlyBooted(guard);
return true;
}
diff --git a/Source/Core/Core/ConfigManager.cpp b/Source/Core/Core/ConfigManager.cpp
index 5a123c87cd..9101df907a 100644
--- a/Source/Core/Core/ConfigManager.cpp
+++ b/Source/Core/Core/ConfigManager.cpp
@@ -44,8 +44,11 @@
#include "Core/HLE/HLE.h"
#include "Core/HW/DVD/DVDInterface.h"
#include "Core/HW/EXI/EXI_Device.h"
+#include "Core/HW/GCKeyboard.h"
+#include "Core/HW/GCPad.h"
#include "Core/HW/SI/SI.h"
#include "Core/HW/SI/SI_Device.h"
+#include "Core/HW/Wiimote.h"
#include "Core/Host.h"
#include "Core/IOS/ES/ES.h"
#include "Core/IOS/ES/Formats.h"
@@ -239,7 +242,20 @@ void SConfig::SetRunningGameMetadata(const std::string& game_id, const std::stri
DolphinAnalytics::Instance().ReportGameStart();
}
-void SConfig::OnNewTitleLoad(const Core::CPUThreadGuard& guard)
+void SConfig::OnESTitleChanged()
+{
+ auto& system = Core::System::GetInstance();
+ Pad::LoadConfig();
+ Keyboard::LoadConfig();
+ if (system.IsWii() && !Config::Get(Config::MAIN_BLUETOOTH_PASSTHROUGH_ENABLED))
+ {
+ Wiimote::LoadConfig();
+ }
+
+ ReloadTextures(system);
+}
+
+void SConfig::OnTitleDirectlyBooted(const Core::CPUThreadGuard& guard)
{
auto& system = guard.GetSystem();
if (!Core::IsRunningOrStarting(system))
@@ -253,9 +269,27 @@ void SConfig::OnNewTitleLoad(const Core::CPUThreadGuard& guard)
}
CBoot::LoadMapFromFilename(guard, ppc_symbol_db);
HLE::Reload(system);
+
PatchEngine::Reload(system);
- HiresTexture::Update();
WC24PatchEngine::Reload();
+
+ // Note: Wii is handled by ES title change
+ if (!system.IsWii())
+ {
+ ReloadTextures(system);
+ }
+}
+
+void SConfig::ReloadTextures(Core::System& system)
+{
+ Pad::GenerateDynamicInputTextures();
+ Keyboard::GenerateDynamicInputTextures();
+ if (system.IsWii() && !Config::Get(Config::MAIN_BLUETOOTH_PASSTHROUGH_ENABLED))
+ {
+ Wiimote::GenerateDynamicInputTextures();
+ }
+
+ HiresTexture::Update();
}
void SConfig::LoadDefaults()
diff --git a/Source/Core/Core/ConfigManager.h b/Source/Core/Core/ConfigManager.h
index d21b087a51..84be081b64 100644
--- a/Source/Core/Core/ConfigManager.h
+++ b/Source/Core/Core/ConfigManager.h
@@ -73,9 +73,15 @@ struct SConfig
void SetRunningGameMetadata(const DiscIO::Volume& volume, const DiscIO::Partition& partition);
void SetRunningGameMetadata(const IOS::ES::TMDReader& tmd, DiscIO::Platform platform);
void SetRunningGameMetadata(const std::string& game_id);
- // Reloads title-specific map files, patches, custom textures, etc.
- // This should only be called after the new title has been loaded into memory.
- static void OnNewTitleLoad(const Core::CPUThreadGuard& guard);
+
+ // Triggered when Dolphin loads a title directly
+ // Reloads title-specific map files, patches, etc.
+ static void OnTitleDirectlyBooted(const Core::CPUThreadGuard& guard);
+
+ // Direct title change from ES (Wii system)
+ // Wii titles will still hit OnTitleDirectlyBooted
+ // but GC titles will never see this call
+ static void OnESTitleChanged();
void LoadDefaults();
static std::string MakeGameID(std::string_view file_name);
@@ -112,6 +118,8 @@ private:
SConfig();
~SConfig();
+ static void ReloadTextures(Core::System& system);
+
void SetRunningGameMetadata(const std::string& game_id, const std::string& gametdb_id,
u64 title_id, u16 revision, DiscIO::Region region);
diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp
index 6a3ebca94f..4823b1dca2 100644
--- a/Source/Core/Core/Core.cpp
+++ b/Source/Core/Core/Core.cpp
@@ -524,11 +524,7 @@ static void EmuThread(Core::System& system, std::unique_ptr<BootParameters> boot
}
}};
- // Load Wiimotes - only if we are booting in Wii mode
- if (system.IsWii() && !Config::Get(Config::MAIN_BLUETOOTH_PASSTHROUGH_ENABLED))
- {
- Wiimote::LoadConfig();
- }
+ // Wiimote input config is loaded in OnESTitleChanged
FreeLook::LoadInputConfig();
diff --git a/Source/Core/Core/HW/GCKeyboard.cpp b/Source/Core/Core/HW/GCKeyboard.cpp
index 4af090de70..e677e1d6db 100644
--- a/Source/Core/Core/HW/GCKeyboard.cpp
+++ b/Source/Core/Core/HW/GCKeyboard.cpp
@@ -49,6 +49,11 @@ void LoadConfig()
s_config.LoadConfig();
}
+void GenerateDynamicInputTextures()
+{
+ s_config.GenerateControllerTextures();
+}
+
ControllerEmu::ControlGroup* GetGroup(int port, KeyboardGroup group)
{
return static_cast<GCKeyboard*>(s_config.GetController(port))->GetGroup(group);
diff --git a/Source/Core/Core/HW/GCKeyboard.h b/Source/Core/Core/HW/GCKeyboard.h
index c3b0a0492a..79956ed672 100644
--- a/Source/Core/Core/HW/GCKeyboard.h
+++ b/Source/Core/Core/HW/GCKeyboard.h
@@ -19,6 +19,7 @@ namespace Keyboard
void Shutdown();
void Initialize();
void LoadConfig();
+void GenerateDynamicInputTextures();
InputConfig* GetConfig();
ControllerEmu::ControlGroup* GetGroup(int port, KeyboardGroup group);
diff --git a/Source/Core/Core/HW/GCPad.cpp b/Source/Core/Core/HW/GCPad.cpp
index 5450eea0c4..15b5f8b6da 100644
--- a/Source/Core/Core/HW/GCPad.cpp
+++ b/Source/Core/Core/HW/GCPad.cpp
@@ -46,6 +46,11 @@ void LoadConfig()
s_config.LoadConfig();
}
+void GenerateDynamicInputTextures()
+{
+ s_config.GenerateControllerTextures();
+}
+
bool IsInitialized()
{
return !s_config.ControllersNeedToBeCreated();
diff --git a/Source/Core/Core/HW/GCPad.h b/Source/Core/Core/HW/GCPad.h
index f986e9395d..0ed5ff5d54 100644
--- a/Source/Core/Core/HW/GCPad.h
+++ b/Source/Core/Core/HW/GCPad.h
@@ -20,6 +20,7 @@ namespace Pad
void Shutdown();
void Initialize();
void LoadConfig();
+void GenerateDynamicInputTextures();
bool IsInitialized();
InputConfig* GetConfig();
diff --git a/Source/Core/Core/HW/Wiimote.cpp b/Source/Core/Core/HW/Wiimote.cpp
index 4b9e95e34d..b8c138091e 100644
--- a/Source/Core/Core/HW/Wiimote.cpp
+++ b/Source/Core/Core/HW/Wiimote.cpp
@@ -211,6 +211,11 @@ void LoadConfig()
s_last_connect_request_counter.fill(0);
}
+void GenerateDynamicInputTextures()
+{
+ s_config.GenerateControllerTextures();
+}
+
void Resume()
{
WiimoteReal::Resume();
diff --git a/Source/Core/Core/HW/Wiimote.h b/Source/Core/Core/HW/Wiimote.h
index 1acdc3a184..f4b34f479b 100644
--- a/Source/Core/Core/HW/Wiimote.h
+++ b/Source/Core/Core/HW/Wiimote.h
@@ -78,6 +78,7 @@ void Shutdown();
void Initialize(InitializeMode init_mode);
void ResetAllWiimotes();
void LoadConfig();
+void GenerateDynamicInputTextures();
void Resume();
void Pause();
diff --git a/Source/Core/Core/IOS/ES/ES.cpp b/Source/Core/Core/IOS/ES/ES.cpp
index bf388a5b67..adc07d8d39 100644
--- a/Source/Core/Core/IOS/ES/ES.cpp
+++ b/Source/Core/Core/IOS/ES/ES.cpp
@@ -205,6 +205,7 @@ void TitleContext::Update(const ES::TMDReader& tmd_, const ES::TicketReader& tic
if (first_change)
{
SConfig::GetInstance().SetRunningGameMetadata(tmd, platform);
+ SConfig::GetInstance().OnESTitleChanged();
first_change = false;
}
}
diff --git a/Source/Core/Core/IOS/IOS.cpp b/Source/Core/Core/IOS/IOS.cpp
index fbea8dd9d7..4aa3930248 100644
--- a/Source/Core/Core/IOS/IOS.cpp
+++ b/Source/Core/Core/IOS/IOS.cpp
@@ -952,7 +952,7 @@ static void FinishPPCBootstrap(Core::System& system, u64 userdata, s64 cycles_la
ASSERT(Core::IsCPUThread());
Core::CPUThreadGuard guard(system);
- SConfig::OnNewTitleLoad(guard);
+ SConfig::OnTitleDirectlyBooted(guard);
INFO_LOG_FMT(IOS, "Bootstrapping done.");
}
diff --git a/Source/Core/Core/IOS/MIOS.cpp b/Source/Core/Core/IOS/MIOS.cpp
index 7722cebea5..d8829ee5cc 100644
--- a/Source/Core/Core/IOS/MIOS.cpp
+++ b/Source/Core/Core/IOS/MIOS.cpp
@@ -103,7 +103,7 @@ bool Load(Core::System& system)
NOTICE_LOG_FMT(IOS, "IPL ready.");
system.SetIsMIOS(true);
system.GetDVDInterface().UpdateRunningGameMetadata();
- SConfig::OnNewTitleLoad(guard);
+ SConfig::OnTitleDirectlyBooted(guard);
return true;
}
} // namespace IOS::HLE::MIOS
diff --git a/Source/Core/DolphinQt/Config/Mapping/MappingCommon.cpp b/Source/Core/DolphinQt/Config/Mapping/MappingCommon.cpp
index f1220ec29e..fd855d5d14 100644
--- a/Source/Core/DolphinQt/Config/Mapping/MappingCommon.cpp
+++ b/Source/Core/DolphinQt/Config/Mapping/MappingCommon.cpp
@@ -16,6 +16,7 @@
#include "InputCommon/ControllerEmu/ControllerEmu.h"
#include "InputCommon/ControllerInterface/ControllerInterface.h"
#include "InputCommon/ControllerInterface/MappingCommon.h"
+#include "InputCommon/InputConfig.h"
namespace MappingCommon
{
@@ -135,6 +136,7 @@ public:
m_parent->Save();
m_parent->GetController()->UpdateSingleControlReference(g_controller_interface,
control_reference);
+ m_parent->GetController()->GetConfig()->GenerateControllerTextures();
}
void UpdateInputDetectionStartTimer()
diff --git a/Source/Core/DolphinQt/Config/Mapping/MappingWindow.cpp b/Source/Core/DolphinQt/Config/Mapping/MappingWindow.cpp
index d8eb6ec408..aab247dfa0 100644
--- a/Source/Core/DolphinQt/Config/Mapping/MappingWindow.cpp
+++ b/Source/Core/DolphinQt/Config/Mapping/MappingWindow.cpp
@@ -322,6 +322,7 @@ void MappingWindow::OnLoadProfilePressed()
m_controller->LoadConfig(ini.GetOrCreateSection("Profile"));
m_controller->UpdateReferences(g_controller_interface);
+ m_controller->GetConfig()->GenerateControllerTextures();
const auto lock = GetController()->GetStateLock();
emit ConfigChanged();
@@ -561,6 +562,7 @@ void MappingWindow::OnDefaultFieldsPressed()
{
m_controller->LoadDefaults(g_controller_interface);
m_controller->UpdateReferences(g_controller_interface);
+ m_controller->GetConfig()->GenerateControllerTextures();
const auto lock = GetController()->GetStateLock();
emit ConfigChanged();
@@ -578,6 +580,7 @@ void MappingWindow::OnClearFieldsPressed()
m_controller->SetDefaultDevice(default_device);
m_controller->UpdateReferences(g_controller_interface);
+ m_controller->GetConfig()->GenerateControllerTextures();
const auto lock = GetController()->GetStateLock();
emit ConfigChanged();
diff --git a/Source/Core/InputCommon/DynamicInputTextureManager.cpp b/Source/Core/InputCommon/DynamicInputTextureManager.cpp
index fade2c05d4..af5214bd37 100644
--- a/Source/Core/InputCommon/DynamicInputTextureManager.cpp
+++ b/Source/Core/InputCommon/DynamicInputTextureManager.cpp
@@ -12,6 +12,7 @@
#include "Core/Core.h"
#include "InputCommon/DynamicInputTextures/DITConfiguration.h"
+#include "InputCommon/ImageOperations.h"
#include "VideoCommon/HiresTextures.h"
#include "VideoCommon/TextureCacheBase.h"
@@ -42,9 +43,34 @@ void DynamicInputTextureManager::Load()
void DynamicInputTextureManager::GenerateTextures(const Common::IniFile& file,
const std::vector<std::string>& controller_names)
{
+ DynamicInputTextures::OutputDetails output;
for (const auto& configuration : m_configuration)
{
- (void)configuration.GenerateTextures(file, controller_names);
+ configuration.GenerateTextures(file, controller_names, &output);
+ }
+
+ const std::string& game_id = SConfig::GetInstance().GetGameID();
+ for (const auto& [generated_folder_name, images] : output)
+ {
+ const auto hi_res_folder = File::GetUserPath(D_HIRESTEXTURES_IDX) + generated_folder_name;
+
+ if (!File::IsDirectory(hi_res_folder))
+ {
+ File::CreateDir(hi_res_folder);
+ }
+
+ const auto game_id_folder = hi_res_folder + DIR_SEP + "gameids";
+ if (!File::IsDirectory(game_id_folder))
+ {
+ File::CreateDir(game_id_folder);
+ }
+
+ File::CreateEmptyFile(game_id_folder + DIR_SEP + game_id + ".txt");
+
+ for (const auto& [image_name, image] : images)
+ {
+ WriteImage(hi_res_folder + DIR_SEP + image_name, image);
+ }
}
}
} // namespace InputCommon
diff --git a/Source/Core/InputCommon/DynamicInputTextures/DITConfiguration.cpp b/Source/Core/InputCommon/DynamicInputTextures/DITConfiguration.cpp
index 870dbf9bba..cced429e81 100644
--- a/Source/Core/InputCommon/DynamicInputTextures/DITConfiguration.cpp
+++ b/Source/Core/InputCommon/DynamicInputTextures/DITConfiguration.cpp
@@ -10,7 +10,6 @@
#include <picojson.h>
#include "Common/CommonPaths.h"
-#include "Common/FileUtil.h"
#include "Common/IniFile.h"
#include "Common/JsonUtil.h"
#include "Common/Logging/Log.h"
@@ -68,26 +67,30 @@ Configuration::Configuration(const std::string& json_path)
Configuration::~Configuration() = default;
-bool Configuration::GenerateTextures(const Common::IniFile& file,
- const std::vector<std::string>& controller_names) const
+void Configuration::GenerateTextures(const Common::IniFile& file,
+ const std::vector<std::string>& controller_names,
+ OutputDetails* output) const
{
- bool any_dirty = false;
for (const auto& texture_data : m_dynamic_input_textures)
{
- any_dirty |= GenerateTexture(file, controller_names, texture_data);
+ GenerateTexture(file, controller_names, texture_data, output);
}
-
- return any_dirty;
}
-bool Configuration::GenerateTexture(const Common::IniFile& file,
+void Configuration::GenerateTexture(const Common::IniFile& file,
const std::vector<std::string>& controller_names,
- const Data& texture_data) const
+ const Data& texture_data, OutputDetails* output) const
{
// Two copies of the loaded texture
// The first one is used as a fallback if a key or device isn't mapped
// the second one is used as the final image to write to the textures directory
const auto original_image = LoadImage(m_base_path + texture_data.m_image_name);
+ if (!original_image)
+ {
+ ERROR_LOG_FMT(VIDEO, "Failed to load image '{}' needed for dynamic input texture generation",
+ texture_data.m_image_name);
+ return;
+ }
auto image_to_write = original_image;
bool dirty = false;
@@ -179,25 +182,8 @@ bool Configuration::GenerateTexture(const Common::IniFile& file,
if (dirty)
{
- const std::string& game_id = SConfig::GetInstance().GetGameID();
- const auto hi_res_folder =
- File::GetUserPath(D_HIRESTEXTURES_IDX) + texture_data.m_generated_folder_name;
- if (!File::IsDirectory(hi_res_folder))
- {
- File::CreateDir(hi_res_folder);
- }
- WriteImage(hi_res_folder + DIR_SEP + texture_data.m_hires_texture_name, *image_to_write);
-
- const auto game_id_folder = hi_res_folder + DIR_SEP + "gameids";
- if (!File::IsDirectory(game_id_folder))
- {
- File::CreateDir(game_id_folder);
- }
- File::CreateEmptyFile(game_id_folder + DIR_SEP + game_id + ".txt");
-
- return true;
+ (*output)[texture_data.m_generated_folder_name][texture_data.m_hires_texture_name] =
+ std::move(*image_to_write);
}
-
- return false;
}
} // namespace InputCommon::DynamicInputTextures
diff --git a/Source/Core/InputCommon/DynamicInputTextures/DITConfiguration.h b/Source/Core/InputCommon/DynamicInputTextures/DITConfiguration.h
index 145099ea27..68a55c2af4 100644
--- a/Source/Core/InputCommon/DynamicInputTextures/DITConfiguration.h
+++ b/Source/Core/InputCommon/DynamicInputTextures/DITConfiguration.h
@@ -3,11 +3,13 @@
#pragma once
+#include <map>
#include <string>
#include <vector>
#include "Common/CommonTypes.h"
#include "InputCommon/DynamicInputTextures/DITData.h"
+#include "InputCommon/ImageOperations.h"
namespace Common
{
@@ -16,18 +18,21 @@ class IniFile;
namespace InputCommon::DynamicInputTextures
{
+// Output folder name to image name to image data
+using OutputDetails = std::map<std::string, std::map<std::string, ImagePixelData>>;
class Configuration
{
public:
explicit Configuration(const std::string& json_path);
~Configuration();
- bool GenerateTextures(const Common::IniFile& file,
- const std::vector<std::string>& controller_names) const;
+ void GenerateTextures(const Common::IniFile& file,
+ const std::vector<std::string>& controller_names,
+ OutputDetails* output) const;
private:
- bool GenerateTexture(const Common::IniFile& file,
- const std::vector<std::string>& controller_names,
- const Data& texture_data) const;
+ void GenerateTexture(const Common::IniFile& file,
+ const std::vector<std::string>& controller_names, const Data& texture_data,
+ OutputDetails* output) const;
std::vector<Data> m_dynamic_input_textures;
std::string m_base_path;
diff --git a/Source/Core/InputCommon/InputConfig.cpp b/Source/Core/InputCommon/InputConfig.cpp
index ff3f68acd0..2dd39f945b 100644
--- a/Source/Core/InputCommon/InputConfig.cpp
+++ b/Source/Core/InputCommon/InputConfig.cpp
@@ -35,8 +35,6 @@ bool InputConfig::LoadConfig()
static constexpr std::array<std::string_view, MAX_BBMOTES> num = {"1", "2", "3", "4", "BB"};
std::string profile[MAX_BBMOTES];
- m_dynamic_input_tex_config_manager.Load();
-
if (SConfig::GetInstance().GetGameID() != "00000000")
{
const std::string profile_directory = GetUserProfileDirectoryPath();
@@ -102,8 +100,6 @@ bool InputConfig::LoadConfig()
// Next profile
n++;
}
-
- m_dynamic_input_tex_config_manager.GenerateTextures(inifile, controller_names);
return true;
}
else
@@ -139,8 +135,6 @@ void InputConfig::SaveConfig()
controller_names.push_back(controller->GetName());
}
- m_dynamic_input_tex_config_manager.GenerateTextures(inifile, controller_names);
-
inifile.Save(ini_filename);
}
@@ -210,6 +204,8 @@ bool InputConfig::IsControllerControlledByGamepadDevice(int index) const
void InputConfig::GenerateControllerTextures(const Common::IniFile& file)
{
+ m_dynamic_input_tex_config_manager.Load();
+
std::vector<std::string> controller_names;
for (auto& controller : m_controllers)
{
@@ -218,3 +214,18 @@ void InputConfig::GenerateControllerTextures(const Common::IniFile& file)
m_dynamic_input_tex_config_manager.GenerateTextures(file, controller_names);
}
+
+void InputConfig::GenerateControllerTextures()
+{
+ const std::string ini_filename = File::GetUserPath(D_CONFIG_IDX) + m_ini_name + ".ini";
+
+ Common::IniFile inifile;
+ inifile.Load(ini_filename);
+
+ for (auto& controller : m_controllers)
+ {
+ controller->SaveConfig(inifile.GetOrCreateSection(controller->GetName()));
+ }
+
+ GenerateControllerTextures(inifile);
+}
diff --git a/Source/Core/InputCommon/InputConfig.h b/Source/Core/InputCommon/InputConfig.h
index 09b9f6c182..6cd428a8d8 100644
--- a/Source/Core/InputCommon/InputConfig.h
+++ b/Source/Core/InputCommon/InputConfig.h
@@ -55,6 +55,7 @@ public:
void UnregisterHotplugCallback();
void GenerateControllerTextures(const Common::IniFile& file);
+ void GenerateControllerTextures();
private:
ControllerInterface::HotplugCallbackHandle m_hotplug_callback_handle;