Merge branch 'master' into rsx-volatile

This commit is contained in:
kd-11 2024-12-29 14:49:32 +03:00 committed by GitHub
commit e4c8a688a4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 314 additions and 248 deletions

View file

@ -1,5 +1,7 @@
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wold-style-cast"
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#pragma GCC diagnostic ignored "-Wmissing-declarations"
#import <Foundation/Foundation.h>
#pragma GCC diagnostic pop

View file

@ -622,7 +622,7 @@ bool spursKernel2SelectWorkload(spu_thread& spu)
void spursKernelDispatchWorkload(spu_thread& spu, u64 widAndPollStatus)
{
const auto ctxt = spu._ptr<SpursKernelContext>(0x100);
auto isKernel2 = ctxt->spurs->flags1 & SF1_32_WORKLOADS ? true : false;
const bool isKernel2 = ctxt->spurs->flags1 & SF1_32_WORKLOADS ? true : false;
auto pollStatus = static_cast<u32>(widAndPollStatus);
auto wid = static_cast<u32>(widAndPollStatus >> 32);
@ -674,7 +674,7 @@ void spursKernelDispatchWorkload(spu_thread& spu, u64 widAndPollStatus)
bool spursKernelWorkloadExit(spu_thread& spu)
{
const auto ctxt = spu._ptr<SpursKernelContext>(0x100);
auto isKernel2 = ctxt->spurs->flags1 & SF1_32_WORKLOADS ? true : false;
const bool isKernel2 = ctxt->spurs->flags1 & SF1_32_WORKLOADS ? true : false;
// Select next workload to run
spu.gpr[3].clear();
@ -701,7 +701,7 @@ bool spursKernelEntry(spu_thread& spu)
ctxt->spuNum = spu.gpr[3]._u32[3];
ctxt->spurs.set(spu.gpr[4]._u64[1]);
auto isKernel2 = ctxt->spurs->flags1 & SF1_32_WORKLOADS ? true : false;
const bool isKernel2 = ctxt->spurs->flags1 & SF1_32_WORKLOADS ? true : false;
// Initialise the SPURS context to its initial values
ctxt->dmaTagId = CELL_SPURS_KERNEL_DMA_TAG_ID;
@ -785,8 +785,8 @@ void spursSysServiceIdleHandler(spu_thread& spu, SpursKernelContext* ctxt)
}
}
bool allSpusIdle = nIdlingSpus == spurs->nSpus ? true : false;
bool exitIfNoWork = spurs->flags1 & SF1_EXIT_IF_NO_WORK ? true : false;
const bool allSpusIdle = nIdlingSpus == spurs->nSpus;
const bool exitIfNoWork = spurs->flags1 & SF1_EXIT_IF_NO_WORK ? true : false;
shouldExit = allSpusIdle && exitIfNoWork;
// Check if any workloads can be scheduled
@ -843,7 +843,7 @@ void spursSysServiceIdleHandler(spu_thread& spu, SpursKernelContext* ctxt)
}
}
bool spuIdling = spurs->spuIdling & (1 << ctxt->spuNum) ? true : false;
const bool spuIdling = spurs->spuIdling & (1 << ctxt->spuNum) ? true : false;
if (foundReadyWorkload && shouldExit == false)
{
spurs->spuIdling &= ~(1 << ctxt->spuNum);

View file

@ -6,6 +6,7 @@
#include "Emu/CPU/CPUThread.h"
#include "Emu/Cell/ErrorCodes.h"
#include "Emu/Cell/timers.hpp"
#include "Emu/Memory/vm_reservation.h"
#include "Emu/IdManager.h"
#include "Emu/IPC.h"
@ -68,11 +69,6 @@ struct ppu_non_sleeping_count_t
u32 onproc_count;
};
namespace vm
{
extern u8 g_reservations[65536 / 128 * 64];
}
// Base class for some kernel objects (shared set of 8192 objects).
struct lv2_obj
{
@ -469,8 +465,12 @@ public:
if (cpu != &g_to_notify)
{
if (cpu >= vm::g_reservations && cpu <= vm::g_reservations + (std::size(vm::g_reservations) - 1))
const auto res_start = vm::reservation_notifier(0).second;
const auto res_end = vm::reservation_notifier(umax).second;
if (cpu >= res_start && cpu <= res_end)
{
// Notify SPU reservation
atomic_wait_engine::notify_all(cpu);
}
else

View file

@ -33,7 +33,7 @@ std::vector<std::pair<u128, id_manager::typeinfo>>& id_manager::get_typeinfo_map
return s_map;
}
id_manager::id_key* idm::allocate_id(std::span<id_manager::id_key> keys, usz& highest_index, u32 type_id, u32 dst_id, u32 base, u32 step, u32 count, bool uses_lowest_id, std::pair<u32, u32> invl_range)
id_manager::id_key* idm::allocate_id(std::span<id_manager::id_key> keys, u32& highest_index, u32 type_id, u32 dst_id, u32 base, u32 step, u32 count, bool uses_lowest_id, std::pair<u32, u32> invl_range)
{
if (dst_id != (base ? 0 : u32{umax}))
{
@ -41,7 +41,7 @@ id_manager::id_key* idm::allocate_id(std::span<id_manager::id_key> keys, usz& hi
const u32 index = id_manager::get_index(dst_id, base, step, count, invl_range);
ensure(index < count);
highest_index = std::max<usz>(highest_index, index + 1);
highest_index = std::max(highest_index, index + 1);
if (keys[index].type() != umax)
{

View file

@ -286,7 +286,7 @@ namespace id_manager
std::array<stx::atomic_ptr<T>, T::id_count> vec_data{};
std::array<stx::shared_ptr<T>, T::id_count> private_copy{};
std::array<id_key, T::id_count> vec_keys{};
usz highest_index = 0;
u32 highest_index = 0;
shared_mutex mutex{}; // TODO: Use this instead of global mutex
@ -330,11 +330,11 @@ namespace id_manager
// Simulate construction semantics (idm::last_id() value)
g_id = id;
const usz object_index = get_index(id, info->base, info->step, info->count, info->invl_range);
const u32 object_index = get_index(id, info->base, info->step, info->count, info->invl_range);
auto& obj = ::at32(vec_data, object_index);
ensure(!obj);
highest_index = std::max<usz>(highest_index, object_index + 1);
highest_index = std::max(highest_index, object_index + 1);
vec_keys[object_index] = id_key(id, static_cast<u32>(static_cast<u64>(type_init_pos >> 64)));
info->load(ar)(&obj);
@ -383,7 +383,7 @@ namespace id_manager
reader_lock lock(g_mutex);
// Save all entries
for (usz i = 0; i < highest_index; i++)
for (u32 i = 0; i < highest_index; i++)
{
private_copy[i] = vec_data[i].load();
}
@ -489,7 +489,7 @@ class idm
}
// Prepare new ID (returns nullptr if out of resources)
static id_manager::id_key* allocate_id(std::span<id_manager::id_key> vec, usz& highest_index, u32 type_id, u32 dst_id, u32 base, u32 step, u32 count, bool uses_lowest_id, std::pair<u32, u32> invl_range);
static id_manager::id_key* allocate_id(std::span<id_manager::id_key> keys, u32& highest_index, u32 type_id, u32 dst_id, u32 base, u32 step, u32 count, bool uses_lowest_id, std::pair<u32, u32> invl_range);
// Get object by internal index if exists (additionally check type if types are not equal)
template <typename T, typename Type>

View file

@ -27,6 +27,10 @@
#elif defined(__APPLE__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wold-style-cast"
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#pragma GCC diagnostic ignored "-Wmissing-declarations"
#pragma GCC diagnostic ignored "-Wnullability-completeness"
#pragma GCC diagnostic ignored "-Wdeprecated-anon-enum-enum-conversion"
#include <ApplicationServices/ApplicationServices.h>
#include <Carbon/Carbon.h>
#pragma GCC diagnostic pop

View file

@ -588,7 +588,10 @@
<ClInclude Include="Emu\IPC_socket.h" />
<ClInclude Include="Emu\localized_string.h" />
<ClInclude Include="Emu\localized_string_id.h" />
<ClInclude Include="Emu\NP\fb_helpers.h" />
<ClInclude Include="Emu\NP\generated\np2_structs_generated.h" />
<ClInclude Include="Emu\NP\np_contexts.h" />
<ClInclude Include="Emu\NP\np_gui_cache.h" />
<ClInclude Include="Emu\NP\np_handler.h" />
<ClInclude Include="Emu\NP\rpcn_countries.h" />
<ClInclude Include="Emu\NP\signaling_handler.h" />

View file

@ -2659,6 +2659,15 @@
<ClInclude Include="Emu\RSX\Core\RSXDriverState.h">
<Filter>Emu\GPU\RSX\Core</Filter>
</ClInclude>
<ClInclude Include="Emu\NP\fb_helpers.h">
<Filter>Emu\NP</Filter>
</ClInclude>
<ClInclude Include="Emu\NP\np_contexts.h">
<Filter>Emu\NP</Filter>
</ClInclude>
<ClInclude Include="Emu\NP\np_gui_cache.h">
<Filter>Emu\NP</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="Emu\RSX\Program\GLSLSnippets\GPUDeswizzle.glsl">

View file

@ -33,7 +33,7 @@
#ifdef _WIN32
#include "module_verifier.hpp"
#include "util/dyn_lib.hpp"
#include <shellapi.h>
// TODO(cjj19970505@live.cn)
// When compiling with WIN32_LEAN_AND_MEAN definition
@ -620,11 +620,26 @@ int main(int argc, char** argv)
std::string argument_str;
for (int i = 0; i < argc; i++)
{
if (i > 0) argument_str += " ";
argument_str += '\'' + std::string(argv[i]) + '\'';
if (i != argc - 1) argument_str += " ";
}
sys_log.notice("argc: %d, argv: %s", argc, argument_str);
#ifdef _WIN32
int n_args = 0;
if (LPWSTR* arg_list = CommandLineToArgvW(GetCommandLineW(), &n_args))
{
std::string utf8_args;
for (int i = 0; i < n_args; i++)
{
if (i > 0) utf8_args += " ";
utf8_args += '\'' + wchar_to_utf8(arg_list[i]) + '\'';
}
sys_log.notice("argv_utf8: %s", utf8_args);
}
#endif
// Before we proceed, run some sanity checks
run_platform_sanity_checks();

View file

@ -2069,6 +2069,7 @@
<None Include="..\buildfiles\msvc\rpcs3_debug.props" />
<None Include="..\buildfiles\msvc\rpcs3_default.props" />
<None Include="..\buildfiles\msvc\rpcs3_release.props" />
<None Include="..\darwin\util\sysinfo_darwin.mm" />
<None Include="..\Utilities\git-version-gen.cmd" />
<None Include="update_helper.sh" />
</ItemGroup>

View file

@ -190,6 +190,9 @@
<Filter Include="Io\Move">
<UniqueIdentifier>{f8a98f7b-dc23-47c0-8a5f-d0b76eaf0df5}</UniqueIdentifier>
</Filter>
<Filter Include="Darwin">
<UniqueIdentifier>{f6b701aa-7f4a-4816-b05f-80d24cb70e13}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
@ -1806,5 +1809,8 @@
<None Include="..\.ci\optimize-mac.sh">
<Filter>CI</Filter>
</None>
<None Include="..\darwin\util\sysinfo_darwin.mm">
<Filter>Darwin</Filter>
</None>
</ItemGroup>
</Project>

View file

@ -13,6 +13,7 @@ enum Category
Home,
Media,
Data,
OS,
Unknown_Cat,
Others,
};
@ -50,5 +51,6 @@ namespace cat
const QStringList psp_games = { cat_psp_game, cat_psp_mini, cat_psp_rema };
const QStringList media = { cat_app_photo, cat_app_video, cat_bc_video, cat_app_music, cat_app_store, cat_app_tv, cat_web_tv };
const QStringList data = { cat_ps3_data, cat_ps2_data, cat_ps3_save, cat_psp_save };
const QStringList others = { cat_network, cat_store_fe, cat_ps3_os };
const QStringList os = { cat_ps3_os };
const QStringList others = { cat_network, cat_store_fe };
}

View file

@ -200,6 +200,7 @@ enum class emu_settings_type
KeyboardType,
EnterButtonAssignment,
EnableHostRoot,
EmptyHdd0Tmp,
LimitCacheSize,
MaximumCacheSize,
ConsoleTimeOffset,
@ -399,6 +400,7 @@ inline static const std::map<emu_settings_type, cfg_location> settings_location
{ emu_settings_type::KeyboardType, { "System", "Keyboard Type"} },
{ emu_settings_type::EnterButtonAssignment, { "System", "Enter button assignment"}},
{ emu_settings_type::EnableHostRoot, { "VFS", "Enable /host_root/"}},
{ emu_settings_type::EmptyHdd0Tmp, { "VFS", "Empty /dev_hdd0/tmp/"}},
{ emu_settings_type::LimitCacheSize, { "VFS", "Limit disk cache size"}},
{ emu_settings_type::MaximumCacheSize, { "VFS", "Disk cache maximum size (MB)"}},
{ emu_settings_type::ConsoleTimeOffset, { "System", "Console time offset (s)"}},

View file

@ -125,6 +125,7 @@ QStringList gui_settings::GetGameListCategoryFilters(bool is_list_mode) const
if (GetCategoryVisibility(Category::Home, is_list_mode)) filterList.append(cat::cat_home);
if (GetCategoryVisibility(Category::Media, is_list_mode)) filterList.append(cat::media);
if (GetCategoryVisibility(Category::Data, is_list_mode)) filterList.append(cat::data);
if (GetCategoryVisibility(Category::OS, is_list_mode)) filterList.append(cat::os);
if (GetCategoryVisibility(Category::Unknown_Cat, is_list_mode)) filterList.append(cat::cat_unknown);
if (GetCategoryVisibility(Category::Others, is_list_mode)) filterList.append(cat::others);
@ -205,7 +206,7 @@ bool gui_settings::GetBootConfirmation(QWidget* parent, const gui_save& gui_save
{
if (Emu.GetStatus(false) != system_state::stopping)
{
ensure(info == Emu.GetEmulationIdentifier(old_status == system_state::stopping ? true : false));
ensure(info == Emu.GetEmulationIdentifier(old_status == system_state::stopping));
return true;
}
@ -344,6 +345,7 @@ gui_save gui_settings::GetGuiSaveForCategory(int cat, bool is_list_mode)
case Category::PSP_Game: return is_list_mode ? gui::cat_psp_game : gui::grid_cat_psp_game;
case Category::Media: return is_list_mode ? gui::cat_audio_video : gui::grid_cat_audio_video;
case Category::Data: return is_list_mode ? gui::cat_game_data : gui::grid_cat_game_data;
case Category::OS: return is_list_mode ? gui::cat_os : gui::grid_cat_os;
case Category::Unknown_Cat: return is_list_mode ? gui::cat_unknown : gui::grid_cat_unknown;
case Category::Others: return is_list_mode ? gui::cat_other : gui::grid_cat_other;
default:

View file

@ -161,6 +161,7 @@ namespace gui
const gui_save cat_home = gui_save(game_list, "categoryVisibleHome", true);
const gui_save cat_audio_video = gui_save(game_list, "categoryVisibleAudioVideo", true);
const gui_save cat_game_data = gui_save(game_list, "categoryVisibleGameData", false);
const gui_save cat_os = gui_save(game_list, "categoryVisibleOS", false);
const gui_save cat_unknown = gui_save(game_list, "categoryVisibleUnknown", true);
const gui_save cat_other = gui_save(game_list, "categoryVisibleOther", true);
@ -172,6 +173,7 @@ namespace gui
const gui_save grid_cat_home = gui_save(game_list, "gridCategoryVisibleHome", true);
const gui_save grid_cat_audio_video = gui_save(game_list, "gridCategoryVisibleAudioVideo", true);
const gui_save grid_cat_game_data = gui_save(game_list, "gridCategoryVisibleGameData", false);
const gui_save grid_cat_os = gui_save(game_list, "gridCategoryVisibleOS", false);
const gui_save grid_cat_unknown = gui_save(game_list, "gridCategoryVisibleUnknown", true);
const gui_save grid_cat_other = gui_save(game_list, "gridCategoryVisibleOther", true);

View file

@ -2391,6 +2391,7 @@ void main_window::UpdateFilterActions()
ui->showCatHomeAct->setChecked(m_gui_settings->GetCategoryVisibility(Category::Home, m_is_list_mode));
ui->showCatAudioVideoAct->setChecked(m_gui_settings->GetCategoryVisibility(Category::Media, m_is_list_mode));
ui->showCatGameDataAct->setChecked(m_gui_settings->GetCategoryVisibility(Category::Data, m_is_list_mode));
ui->showCatOSAct->setChecked(m_gui_settings->GetCategoryVisibility(Category::OS, m_is_list_mode));
ui->showCatUnknownAct->setChecked(m_gui_settings->GetCategoryVisibility(Category::Unknown_Cat, m_is_list_mode));
ui->showCatOtherAct->setChecked(m_gui_settings->GetCategoryVisibility(Category::Others, m_is_list_mode));
}
@ -2551,6 +2552,7 @@ void main_window::CreateActions()
m_category_visible_act_group->addAction(ui->showCatHomeAct);
m_category_visible_act_group->addAction(ui->showCatAudioVideoAct);
m_category_visible_act_group->addAction(ui->showCatGameDataAct);
m_category_visible_act_group->addAction(ui->showCatOSAct);
m_category_visible_act_group->addAction(ui->showCatUnknownAct);
m_category_visible_act_group->addAction(ui->showCatOtherAct);
m_category_visible_act_group->setExclusive(false);
@ -3227,16 +3229,17 @@ void main_window::CreateConnects()
const auto get_cats = [this](QAction* act, int& id) -> QStringList
{
QStringList categories;
if (act == ui->showCatHDDGameAct) { categories += cat::cat_hdd_game; id = Category::HDD_Game; }
else if (act == ui->showCatDiscGameAct) { categories += cat::cat_disc_game; id = Category::Disc_Game; }
else if (act == ui->showCatPS1GamesAct) { categories += cat::cat_ps1_game; id = Category::PS1_Game; }
else if (act == ui->showCatPS2GamesAct) { categories += cat::ps2_games; id = Category::PS2_Game; }
else if (act == ui->showCatPSPGamesAct) { categories += cat::psp_games; id = Category::PSP_Game; }
else if (act == ui->showCatHomeAct) { categories += cat::cat_home; id = Category::Home; }
else if (act == ui->showCatAudioVideoAct) { categories += cat::media; id = Category::Media; }
else if (act == ui->showCatGameDataAct) { categories += cat::data; id = Category::Data; }
else if (act == ui->showCatUnknownAct) { categories += cat::cat_unknown; id = Category::Unknown_Cat; }
else if (act == ui->showCatOtherAct) { categories += cat::others; id = Category::Others; }
if (act == ui->showCatHDDGameAct) { categories.append(cat::cat_hdd_game); id = Category::HDD_Game; }
else if (act == ui->showCatDiscGameAct) { categories.append(cat::cat_disc_game); id = Category::Disc_Game; }
else if (act == ui->showCatPS1GamesAct) { categories.append(cat::cat_ps1_game); id = Category::PS1_Game; }
else if (act == ui->showCatPS2GamesAct) { categories.append(cat::ps2_games); id = Category::PS2_Game; }
else if (act == ui->showCatPSPGamesAct) { categories.append(cat::psp_games); id = Category::PSP_Game; }
else if (act == ui->showCatHomeAct) { categories.append(cat::cat_home); id = Category::Home; }
else if (act == ui->showCatAudioVideoAct) { categories.append(cat::media); id = Category::Media; }
else if (act == ui->showCatGameDataAct) { categories.append(cat::data); id = Category::Data; }
else if (act == ui->showCatOSAct) { categories.append(cat::os); id = Category::OS; }
else if (act == ui->showCatUnknownAct) { categories.append(cat::cat_unknown); id = Category::Unknown_Cat; }
else if (act == ui->showCatOtherAct) { categories.append(cat::others); id = Category::Others; }
else { gui_log.warning("categoryVisibleActGroup: category action not found"); }
return categories;
};
@ -3276,6 +3279,7 @@ void main_window::CreateConnects()
set_cat_count(ui->showCatHomeAct, tr("Home"));
set_cat_count(ui->showCatAudioVideoAct, tr("Audio/Video"));
set_cat_count(ui->showCatGameDataAct, tr("Game Data"));
set_cat_count(ui->showCatOSAct, tr("Operating System"));
set_cat_count(ui->showCatUnknownAct, tr("Unknown"));
set_cat_count(ui->showCatOtherAct, tr("Other"));
});

View file

@ -355,6 +355,7 @@
<addaction name="showCatHomeAct"/>
<addaction name="showCatAudioVideoAct"/>
<addaction name="showCatGameDataAct"/>
<addaction name="showCatOSAct"/>
<addaction name="showCatUnknownAct"/>
<addaction name="showCatOtherAct"/>
</widget>
@ -883,9 +884,6 @@
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>HDD Games</string>
</property>
@ -894,9 +892,6 @@
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Disc Games</string>
</property>
@ -905,9 +900,6 @@
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>PS1 Games</string>
</property>
@ -916,9 +908,6 @@
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>PS2 Games</string>
</property>
@ -927,9 +916,6 @@
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>PSP Games</string>
</property>
@ -938,9 +924,6 @@
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Home</string>
</property>
@ -949,9 +932,6 @@
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Audio/Video</string>
</property>
@ -960,9 +940,6 @@
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Game Data</string>
</property>
@ -971,9 +948,6 @@
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Unknown</string>
</property>
@ -1090,9 +1064,6 @@
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Other</string>
</property>
@ -1402,6 +1373,14 @@
<string>PS Move</string>
</property>
</action>
<action name="showCatOSAct">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Operating System</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>

View file

@ -1428,6 +1428,9 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
m_emu_settings->EnhanceCheckBox(ui->enableHostRoot, emu_settings_type::EnableHostRoot);
SubscribeTooltip(ui->enableHostRoot, tooltips.settings.enable_host_root);
m_emu_settings->EnhanceCheckBox(ui->emptyHdd0Tmp, emu_settings_type::EmptyHdd0Tmp);
SubscribeTooltip(ui->emptyHdd0Tmp, tooltips.settings.empty_hdd0_tmp);
m_emu_settings->EnhanceCheckBox(ui->enableCacheClearing, emu_settings_type::LimitCacheSize);
SubscribeTooltip(ui->gb_DiskCacheClearing, tooltips.settings.limit_cache_size);
if (game)

View file

@ -1900,206 +1900,237 @@
<attribute name="title">
<string>System</string>
</attribute>
<layout class="QVBoxLayout" name="systemTab_layout" stretch="0,0,0,0,1,0">
<layout class="QVBoxLayout" name="systemTab_layout" stretch="0,1,0">
<item>
<layout class="QHBoxLayout" name="systemTabLayout1" stretch="1,1,1">
<layout class="QHBoxLayout" name="systemTabHorizontalLayout" stretch="1,1,1">
<item>
<widget class="QGroupBox" name="gb_sysLang">
<property name="title">
<string>Console Language</string>
</property>
<layout class="QVBoxLayout" name="gb_sysLang_layout">
<item>
<widget class="QComboBox" name="sysLangBox"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_keyboardType">
<property name="title">
<string>Keyboard Type</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_keyboardType">
<item>
<widget class="QComboBox" name="keyboardType"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_homebrew">
<property name="title">
<string>Homebrew</string>
</property>
<layout class="QVBoxLayout" name="gb_homebrew_layout">
<item>
<widget class="QCheckBox" name="enableHostRoot">
<property name="text">
<string>Enable /host_root/</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="systemTabLayout2" stretch="1,1,1">
<item>
<widget class="QGroupBox" name="gb_console_region">
<property name="title">
<string>Console Region</string>
</property>
<layout class="QVBoxLayout" name="gb_console_region_layout">
<item>
<widget class="QComboBox" name="console_region"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_console_time">
<property name="title">
<string>Console Time</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QVBoxLayout" name="systemTabLeftLayout">
<item>
<widget class="QGroupBox" name="gb_sysLang">
<property name="title">
<string>Console Language</string>
</property>
<layout class="QVBoxLayout" name="gb_sysLang_layout">
<item>
<widget class="QDateTimeEdit" name="console_time_edit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>10</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="layoutDirection">
<enum>Qt::LayoutDirection::LeftToRight</enum>
</property>
<property name="wrapping">
<bool>false</bool>
</property>
<property name="frame">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::ButtonSymbols::UpDownArrows</enum>
</property>
<property name="accelerated">
<bool>true</bool>
</property>
<property name="showGroupSeparator" stdset="0">
<bool>false</bool>
</property>
<property name="calendarPopup">
<bool>true</bool>
<widget class="QComboBox" name="sysLangBox"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_console_region">
<property name="title">
<string>Console Region</string>
</property>
<layout class="QVBoxLayout" name="gb_console_region_layout">
<item>
<widget class="QComboBox" name="console_region"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_enterButtonAssignment">
<property name="title">
<string>Enter Button Assignment</string>
</property>
<layout class="QVBoxLayout" name="gb_enterButtonAssignment_layout">
<item>
<widget class="QRadioButton" name="enterButtonAssignCircle">
<property name="text">
<string notr="true">Enter with the Circle button</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="console_time_reset">
<widget class="QRadioButton" name="enterButtonAssignCross">
<property name="text">
<string>Set to Now</string>
<string notr="true">Enter with the Cross button</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_DiskCacheClearing">
<property name="title">
<string>Disk Cache</string>
</property>
<layout class="QVBoxLayout" name="gb_DiskCacheClearing_layout">
<item>
<widget class="QCheckBox" name="enableCacheClearing">
<property name="text">
<string>Clear cache automatically</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="maximumCacheSizeLabel">
<property name="text">
<string>Cache size: 3072 MB</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="maximumCacheSize">
<property name="pageStep">
<number>512</number>
</property>
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TickPosition::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>1024</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="systemTabLeftVerticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QWidget" name="systemTabSpacerWidget2" native="true"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="systemTabLayout3" stretch="1,1,1">
<item>
<widget class="QGroupBox" name="gb_enterButtonAssignment">
<property name="title">
<string>Enter Button Assignment</string>
</property>
<layout class="QVBoxLayout" name="gb_enterButtonAssignment_layout">
<item>
<widget class="QRadioButton" name="enterButtonAssignCircle">
<property name="text">
<string notr="true">Enter with the Circle button</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="enterButtonAssignCross">
<property name="text">
<string notr="true">Enter with the Cross button</string>
</property>
</widget>
</item>
</layout>
</widget>
<layout class="QVBoxLayout" name="systemTabMiddleLayout">
<item>
<widget class="QGroupBox" name="gb_keyboardType">
<property name="title">
<string>Keyboard Type</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_keyboardType">
<item>
<widget class="QComboBox" name="keyboardType"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_console_time">
<property name="title">
<string>Console Time</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QDateTimeEdit" name="console_time_edit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>10</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="layoutDirection">
<enum>Qt::LayoutDirection::LeftToRight</enum>
</property>
<property name="wrapping">
<bool>false</bool>
</property>
<property name="frame">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::ButtonSymbols::UpDownArrows</enum>
</property>
<property name="accelerated">
<bool>true</bool>
</property>
<property name="showGroupSeparator" stdset="0">
<bool>false</bool>
</property>
<property name="calendarPopup">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="console_time_reset">
<property name="text">
<string>Set to Now</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="systemTabMiddleVerticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QWidget" name="systemTabSpacerWidget3" native="true"/>
</item>
<item>
<widget class="QWidget" name="systemTabSpacerWidget4" native="true"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="systemTabLayout4" stretch="1,1,1">
<item>
<widget class="QGroupBox" name="gb_DiskCacheClearing">
<property name="title">
<string>Disk Cache</string>
</property>
<layout class="QVBoxLayout" name="gb_DiskCacheClearing_layout">
<item>
<widget class="QCheckBox" name="enableCacheClearing">
<property name="text">
<string>Clear cache automatically</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="maximumCacheSizeLabel">
<property name="text">
<string>Cache size: 3072 MB</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="maximumCacheSize">
<property name="pageStep">
<number>512</number>
</property>
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TickPosition::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>1024</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="systemTabSpacerWidget5" native="true"/>
</item>
<item>
<widget class="QWidget" name="systemTabSpacerWidget6" native="true"/>
<layout class="QVBoxLayout" name="systemTabRightLayout">
<item>
<widget class="QGroupBox" name="gb_homebrew">
<property name="title">
<string>Homebrew</string>
</property>
<layout class="QVBoxLayout" name="gb_homebrew_layout">
<item>
<widget class="QCheckBox" name="enableHostRoot">
<property name="text">
<string>Enable /host_root/</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="emptyHdd0Tmp">
<property name="text">
<string>Empty /dev_hdd0/tmp/</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="systemTabRightVerticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>

View file

@ -260,7 +260,8 @@ public:
const QString system_language = tr("Some games may fail to boot if the system language is not available in the game itself.\nOther games will switch language automatically to what is selected here.\nIt is recommended leaving this on a language supported by the game.");
const QString keyboard_type = tr("Sets the used keyboard layout.\nCurrently only US, Japanese and German layouts are fully supported at this moment.");
const QString enter_button_assignment = tr("The button used for enter/accept/confirm in system dialogs.\nChange this to use the Circle button instead, which is the default configuration on Japanese systems and in many Japanese games.\nIn these cases having the cross button assigned can often lead to confusion.");
const QString enable_host_root = tr("Required for some Homebrew.\nIf unsure, don't use this option.");
const QString enable_host_root = tr("Required for some Homebrew.\nIf unsure, do not use this option.");
const QString empty_hdd0_tmp = tr("Required for some Homebrew or Game Mods.\nIf unsure, do not use this option");
const QString limit_cache_size = tr("Automatically removes older files from disk cache on boot if it grows larger than the specified value.\nGames can use the cache folder to temporarily store data outside of system memory. It is not used for long-term storage.\n\nThis setting is only available in the global configuration.");
const QString console_time_offset = tr("Sets the time to be used within the console. This will be applied as an offset that tracks wall clock time.\nCan be reset to current wall clock time by clicking \"Set to Now\".");
} settings;