early-access version 3791
This commit is contained in:
parent
a61e0cf970
commit
10e28227cd
15 changed files with 679 additions and 146 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 3790.
|
This is the source code for early-access 3791.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -22,30 +22,6 @@ class Nvnflinger;
|
||||||
|
|
||||||
namespace Service::AM {
|
namespace Service::AM {
|
||||||
|
|
||||||
// This is nn::settings::Language
|
|
||||||
enum SystemLanguage {
|
|
||||||
Japanese = 0,
|
|
||||||
English = 1, // en-US
|
|
||||||
French = 2,
|
|
||||||
German = 3,
|
|
||||||
Italian = 4,
|
|
||||||
Spanish = 5,
|
|
||||||
Chinese = 6,
|
|
||||||
Korean = 7,
|
|
||||||
Dutch = 8,
|
|
||||||
Portuguese = 9,
|
|
||||||
Russian = 10,
|
|
||||||
Taiwanese = 11,
|
|
||||||
BritishEnglish = 12, // en-GB
|
|
||||||
CanadianFrench = 13,
|
|
||||||
LatinAmericanSpanish = 14, // es-419
|
|
||||||
// 4.0.0+
|
|
||||||
SimplifiedChinese = 15,
|
|
||||||
TraditionalChinese = 16,
|
|
||||||
// 10.1.0+
|
|
||||||
BrazilianPortuguese = 17,
|
|
||||||
};
|
|
||||||
|
|
||||||
class AppletMessageQueue {
|
class AppletMessageQueue {
|
||||||
public:
|
public:
|
||||||
// This is nn::am::AppletMessage
|
// This is nn::am::AppletMessage
|
||||||
|
|
|
@ -11,66 +11,6 @@
|
||||||
|
|
||||||
namespace Service::Set {
|
namespace Service::Set {
|
||||||
namespace {
|
namespace {
|
||||||
constexpr std::array<LanguageCode, 18> available_language_codes = {{
|
|
||||||
LanguageCode::JA,
|
|
||||||
LanguageCode::EN_US,
|
|
||||||
LanguageCode::FR,
|
|
||||||
LanguageCode::DE,
|
|
||||||
LanguageCode::IT,
|
|
||||||
LanguageCode::ES,
|
|
||||||
LanguageCode::ZH_CN,
|
|
||||||
LanguageCode::KO,
|
|
||||||
LanguageCode::NL,
|
|
||||||
LanguageCode::PT,
|
|
||||||
LanguageCode::RU,
|
|
||||||
LanguageCode::ZH_TW,
|
|
||||||
LanguageCode::EN_GB,
|
|
||||||
LanguageCode::FR_CA,
|
|
||||||
LanguageCode::ES_419,
|
|
||||||
LanguageCode::ZH_HANS,
|
|
||||||
LanguageCode::ZH_HANT,
|
|
||||||
LanguageCode::PT_BR,
|
|
||||||
}};
|
|
||||||
|
|
||||||
enum class KeyboardLayout : u64 {
|
|
||||||
Japanese = 0,
|
|
||||||
EnglishUs = 1,
|
|
||||||
EnglishUsInternational = 2,
|
|
||||||
EnglishUk = 3,
|
|
||||||
French = 4,
|
|
||||||
FrenchCa = 5,
|
|
||||||
Spanish = 6,
|
|
||||||
SpanishLatin = 7,
|
|
||||||
German = 8,
|
|
||||||
Italian = 9,
|
|
||||||
Portuguese = 10,
|
|
||||||
Russian = 11,
|
|
||||||
Korean = 12,
|
|
||||||
ChineseSimplified = 13,
|
|
||||||
ChineseTraditional = 14,
|
|
||||||
};
|
|
||||||
|
|
||||||
constexpr std::array<std::pair<LanguageCode, KeyboardLayout>, 18> language_to_layout{{
|
|
||||||
{LanguageCode::JA, KeyboardLayout::Japanese},
|
|
||||||
{LanguageCode::EN_US, KeyboardLayout::EnglishUs},
|
|
||||||
{LanguageCode::FR, KeyboardLayout::French},
|
|
||||||
{LanguageCode::DE, KeyboardLayout::German},
|
|
||||||
{LanguageCode::IT, KeyboardLayout::Italian},
|
|
||||||
{LanguageCode::ES, KeyboardLayout::Spanish},
|
|
||||||
{LanguageCode::ZH_CN, KeyboardLayout::ChineseSimplified},
|
|
||||||
{LanguageCode::KO, KeyboardLayout::Korean},
|
|
||||||
{LanguageCode::NL, KeyboardLayout::EnglishUsInternational},
|
|
||||||
{LanguageCode::PT, KeyboardLayout::Portuguese},
|
|
||||||
{LanguageCode::RU, KeyboardLayout::Russian},
|
|
||||||
{LanguageCode::ZH_TW, KeyboardLayout::ChineseTraditional},
|
|
||||||
{LanguageCode::EN_GB, KeyboardLayout::EnglishUk},
|
|
||||||
{LanguageCode::FR_CA, KeyboardLayout::FrenchCa},
|
|
||||||
{LanguageCode::ES_419, KeyboardLayout::SpanishLatin},
|
|
||||||
{LanguageCode::ZH_HANS, KeyboardLayout::ChineseSimplified},
|
|
||||||
{LanguageCode::ZH_HANT, KeyboardLayout::ChineseTraditional},
|
|
||||||
{LanguageCode::PT_BR, KeyboardLayout::Portuguese},
|
|
||||||
}};
|
|
||||||
|
|
||||||
constexpr std::size_t PRE_4_0_0_MAX_ENTRIES = 0xF;
|
constexpr std::size_t PRE_4_0_0_MAX_ENTRIES = 0xF;
|
||||||
constexpr std::size_t POST_4_0_0_MAX_ENTRIES = 0x40;
|
constexpr std::size_t POST_4_0_0_MAX_ENTRIES = 0x40;
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,67 @@ enum class LanguageCode : u64 {
|
||||||
ZH_HANT = 0x00746E61482D687A,
|
ZH_HANT = 0x00746E61482D687A,
|
||||||
PT_BR = 0x00000052422D7470,
|
PT_BR = 0x00000052422D7470,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class KeyboardLayout : u64 {
|
||||||
|
Japanese = 0,
|
||||||
|
EnglishUs = 1,
|
||||||
|
EnglishUsInternational = 2,
|
||||||
|
EnglishUk = 3,
|
||||||
|
French = 4,
|
||||||
|
FrenchCa = 5,
|
||||||
|
Spanish = 6,
|
||||||
|
SpanishLatin = 7,
|
||||||
|
German = 8,
|
||||||
|
Italian = 9,
|
||||||
|
Portuguese = 10,
|
||||||
|
Russian = 11,
|
||||||
|
Korean = 12,
|
||||||
|
ChineseSimplified = 13,
|
||||||
|
ChineseTraditional = 14,
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr std::array<LanguageCode, 18> available_language_codes = {{
|
||||||
|
LanguageCode::JA,
|
||||||
|
LanguageCode::EN_US,
|
||||||
|
LanguageCode::FR,
|
||||||
|
LanguageCode::DE,
|
||||||
|
LanguageCode::IT,
|
||||||
|
LanguageCode::ES,
|
||||||
|
LanguageCode::ZH_CN,
|
||||||
|
LanguageCode::KO,
|
||||||
|
LanguageCode::NL,
|
||||||
|
LanguageCode::PT,
|
||||||
|
LanguageCode::RU,
|
||||||
|
LanguageCode::ZH_TW,
|
||||||
|
LanguageCode::EN_GB,
|
||||||
|
LanguageCode::FR_CA,
|
||||||
|
LanguageCode::ES_419,
|
||||||
|
LanguageCode::ZH_HANS,
|
||||||
|
LanguageCode::ZH_HANT,
|
||||||
|
LanguageCode::PT_BR,
|
||||||
|
}};
|
||||||
|
|
||||||
|
static constexpr std::array<std::pair<LanguageCode, KeyboardLayout>, 18> language_to_layout{{
|
||||||
|
{LanguageCode::JA, KeyboardLayout::Japanese},
|
||||||
|
{LanguageCode::EN_US, KeyboardLayout::EnglishUs},
|
||||||
|
{LanguageCode::FR, KeyboardLayout::French},
|
||||||
|
{LanguageCode::DE, KeyboardLayout::German},
|
||||||
|
{LanguageCode::IT, KeyboardLayout::Italian},
|
||||||
|
{LanguageCode::ES, KeyboardLayout::Spanish},
|
||||||
|
{LanguageCode::ZH_CN, KeyboardLayout::ChineseSimplified},
|
||||||
|
{LanguageCode::KO, KeyboardLayout::Korean},
|
||||||
|
{LanguageCode::NL, KeyboardLayout::EnglishUsInternational},
|
||||||
|
{LanguageCode::PT, KeyboardLayout::Portuguese},
|
||||||
|
{LanguageCode::RU, KeyboardLayout::Russian},
|
||||||
|
{LanguageCode::ZH_TW, KeyboardLayout::ChineseTraditional},
|
||||||
|
{LanguageCode::EN_GB, KeyboardLayout::EnglishUk},
|
||||||
|
{LanguageCode::FR_CA, KeyboardLayout::FrenchCa},
|
||||||
|
{LanguageCode::ES_419, KeyboardLayout::SpanishLatin},
|
||||||
|
{LanguageCode::ZH_HANS, KeyboardLayout::ChineseSimplified},
|
||||||
|
{LanguageCode::ZH_HANT, KeyboardLayout::ChineseTraditional},
|
||||||
|
{LanguageCode::PT_BR, KeyboardLayout::Portuguese},
|
||||||
|
}};
|
||||||
|
|
||||||
LanguageCode GetLanguageCodeFromIndex(std::size_t idx);
|
LanguageCode GetLanguageCodeFromIndex(std::size_t idx);
|
||||||
|
|
||||||
class SET final : public ServiceFramework<SET> {
|
class SET final : public ServiceFramework<SET> {
|
||||||
|
|
|
@ -4,10 +4,12 @@
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
|
#include "common/string_util.h"
|
||||||
#include "core/file_sys/errors.h"
|
#include "core/file_sys/errors.h"
|
||||||
#include "core/file_sys/system_archive/system_version.h"
|
#include "core/file_sys/system_archive/system_version.h"
|
||||||
#include "core/hle/service/filesystem/filesystem.h"
|
#include "core/hle/service/filesystem/filesystem.h"
|
||||||
#include "core/hle/service/ipc_helpers.h"
|
#include "core/hle/service/ipc_helpers.h"
|
||||||
|
#include "core/hle/service/set/set.h"
|
||||||
#include "core/hle/service/set/set_sys.h"
|
#include "core/hle/service/set/set_sys.h"
|
||||||
|
|
||||||
namespace Service::Set {
|
namespace Service::Set {
|
||||||
|
@ -83,21 +85,86 @@ void SET_SYS::GetFirmwareVersion2(HLERequestContext& ctx) {
|
||||||
GetFirmwareVersionImpl(ctx, GetFirmwareVersionType::Version2);
|
GetFirmwareVersionImpl(ctx, GetFirmwareVersionType::Version2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetAccountSettings(HLERequestContext& ctx) {
|
||||||
|
LOG_INFO(Service_SET, "called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushRaw(account_settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::SetAccountSettings(HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
account_settings = rp.PopRaw<AccountSettings>();
|
||||||
|
|
||||||
|
LOG_INFO(Service_SET, "called, account_settings_flags={}", account_settings.flags);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
void SET_SYS::GetColorSetId(HLERequestContext& ctx) {
|
void SET_SYS::GetColorSetId(HLERequestContext& ctx) {
|
||||||
LOG_DEBUG(Service_SET, "called");
|
LOG_DEBUG(Service_SET, "called");
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
rb.PushEnum(color_set);
|
rb.PushEnum(color_set);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SET_SYS::SetColorSetId(HLERequestContext& ctx) {
|
void SET_SYS::SetColorSetId(HLERequestContext& ctx) {
|
||||||
LOG_DEBUG(Service_SET, "called");
|
|
||||||
|
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
color_set = rp.PopEnum<ColorSet>();
|
color_set = rp.PopEnum<ColorSet>();
|
||||||
|
|
||||||
|
LOG_DEBUG(Service_SET, "called, color_set={}", color_set);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetNotificationSettings(HLERequestContext& ctx) {
|
||||||
|
LOG_INFO(Service_SET, "called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 8};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushRaw(notification_settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::SetNotificationSettings(HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
notification_settings = rp.PopRaw<NotificationSettings>();
|
||||||
|
|
||||||
|
LOG_INFO(Service_SET, "called, flags={}, volume={}, head_time={}:{}, tailt_time={}:{}",
|
||||||
|
notification_settings.flags.raw, notification_settings.volume,
|
||||||
|
notification_settings.start_time.hour, notification_settings.start_time.minute,
|
||||||
|
notification_settings.stop_time.hour, notification_settings.stop_time.minute);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetAccountNotificationSettings(HLERequestContext& ctx) {
|
||||||
|
LOG_INFO(Service_SET, "called");
|
||||||
|
|
||||||
|
ctx.WriteBuffer(account_notifications);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push(account_notifications.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::SetAccountNotificationSettings(HLERequestContext& ctx) {
|
||||||
|
const auto elements = ctx.GetReadBufferNumElements<AccountNotificationSettings>();
|
||||||
|
const auto buffer_data = ctx.ReadBuffer();
|
||||||
|
|
||||||
|
LOG_INFO(Service_SET, "called, elements={}", elements);
|
||||||
|
|
||||||
|
account_notifications.resize(elements);
|
||||||
|
for (std::size_t index = 0; index < elements; index++) {
|
||||||
|
const std::size_t start_index = index * sizeof(AccountNotificationSettings);
|
||||||
|
memcpy(account_notifications.data() + start_index, buffer_data.data() + start_index,
|
||||||
|
sizeof(AccountNotificationSettings));
|
||||||
|
}
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
}
|
}
|
||||||
|
@ -177,11 +244,194 @@ void SET_SYS::GetSettingsItemValue(HLERequestContext& ctx) {
|
||||||
rb.Push(response);
|
rb.Push(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SET_SYS::GetDeviceNickName(HLERequestContext& ctx) {
|
void SET_SYS::GetTvSettings(HLERequestContext& ctx) {
|
||||||
LOG_DEBUG(Service_SET, "called");
|
LOG_INFO(Service_SET, "called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 10};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushRaw(tv_settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::SetTvSettings(HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
tv_settings = rp.PopRaw<TvSettings>();
|
||||||
|
|
||||||
|
LOG_INFO(Service_SET,
|
||||||
|
"called, flags={}, cmu_mode={}, constrast_ratio={}, hdmi_content_type={}, "
|
||||||
|
"rgb_range={}, tv_gama={}, tv_resolution={}, tv_underscan={}",
|
||||||
|
tv_settings.flags.raw, tv_settings.cmu_mode, tv_settings.constrast_ratio,
|
||||||
|
tv_settings.hdmi_content_type, tv_settings.rgb_range, tv_settings.tv_gama,
|
||||||
|
tv_settings.tv_resolution, tv_settings.tv_underscan);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetQuestFlag(HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_SET, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushEnum(QuestFlag::Retail);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetPrimaryAlbumStorage(HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_SET, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushEnum(PrimaryAlbumStorage::SdCard);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetSleepSettings(HLERequestContext& ctx) {
|
||||||
|
LOG_INFO(Service_SET, "called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 7};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushRaw(sleep_settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::SetSleepSettings(HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
sleep_settings = rp.PopRaw<SleepSettings>();
|
||||||
|
|
||||||
|
LOG_INFO(Service_SET, "called, flags={}, handheld_sleep_plan={}, console_sleep_plan={}",
|
||||||
|
sleep_settings.flags.raw, sleep_settings.handheld_sleep_plan,
|
||||||
|
sleep_settings.console_sleep_plan);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetInitialLaunchSettings(HLERequestContext& ctx) {
|
||||||
|
LOG_INFO(Service_SET, "called");
|
||||||
|
IPC::ResponseBuilder rb{ctx, 10};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushRaw(launch_settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::SetInitialLaunchSettings(HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
launch_settings = rp.PopRaw<InitialLaunchSettings>();
|
||||||
|
|
||||||
|
LOG_INFO(Service_SET, "called, flags={}, timestamp={}", launch_settings.flags.raw,
|
||||||
|
launch_settings.timestamp.time_point);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetDeviceNickName(HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_SET, "called");
|
||||||
|
|
||||||
ctx.WriteBuffer(::Settings::values.device_name.GetValue());
|
ctx.WriteBuffer(::Settings::values.device_name.GetValue());
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::SetDeviceNickName(HLERequestContext& ctx) {
|
||||||
|
const std::string device_name = Common::StringFromBuffer(ctx.ReadBuffer());
|
||||||
|
|
||||||
|
LOG_INFO(Service_SET, "called, device_name={}", device_name);
|
||||||
|
|
||||||
|
::Settings::values.device_name = device_name;
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetProductModel(HLERequestContext& ctx) {
|
||||||
|
const u32 product_model = 1;
|
||||||
|
|
||||||
|
LOG_WARNING(Service_SET, "(STUBBED) called, product_model={}", product_model);
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push(product_model);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetMiiAuthorId(HLERequestContext& ctx) {
|
||||||
|
const auto author_id = Common::UUID::MakeDefault();
|
||||||
|
|
||||||
|
LOG_WARNING(Service_SET, "(STUBBED) called, author_id={}", author_id.FormattedString());
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 6};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushRaw(author_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetAutoUpdateEnableFlag(HLERequestContext& ctx) {
|
||||||
|
u8 auto_update_flag{};
|
||||||
|
|
||||||
|
LOG_WARNING(Service_SET, "(STUBBED) called, auto_update_flag={}", auto_update_flag);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push(auto_update_flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetBatteryPercentageFlag(HLERequestContext& ctx) {
|
||||||
|
u8 battery_percentage_flag{1};
|
||||||
|
|
||||||
|
LOG_WARNING(Service_SET, "(STUBBED) called, battery_percentage_flag={}",
|
||||||
|
battery_percentage_flag);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push(battery_percentage_flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetErrorReportSharePermission(HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_SET, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushEnum(ErrorReportSharePermission::Denied);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetAppletLaunchFlags(HLERequestContext& ctx) {
|
||||||
|
LOG_INFO(Service_SET, "called, applet_launch_flag={}", applet_launch_flag);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push(applet_launch_flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::SetAppletLaunchFlags(HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
applet_launch_flag = rp.Pop<u32>();
|
||||||
|
|
||||||
|
LOG_INFO(Service_SET, "called, applet_launch_flag={}", applet_launch_flag);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetKeyboardLayout(HLERequestContext& ctx) {
|
||||||
|
const auto language_code =
|
||||||
|
available_language_codes[static_cast<s32>(::Settings::values.language_index.GetValue())];
|
||||||
|
const auto key_code =
|
||||||
|
std::find_if(language_to_layout.cbegin(), language_to_layout.cend(),
|
||||||
|
[=](const auto& element) { return element.first == language_code; });
|
||||||
|
|
||||||
|
KeyboardLayout selected_keyboard_layout = KeyboardLayout::EnglishUs;
|
||||||
|
if (key_code != language_to_layout.end()) {
|
||||||
|
selected_keyboard_layout = key_code->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_INFO(Service_SET, "called, selected_keyboard_layout={}", selected_keyboard_layout);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push(static_cast<u32>(selected_keyboard_layout));
|
||||||
|
}
|
||||||
|
|
||||||
|
void SET_SYS::GetChineseTraditionalInputMethod(HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_SET, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushEnum(ChineseTraditionalInputMethod::Unknown0);
|
||||||
}
|
}
|
||||||
|
|
||||||
SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} {
|
SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} {
|
||||||
|
@ -203,8 +453,8 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} {
|
||||||
{14, nullptr, "SetExternalSteadyClockSourceId"},
|
{14, nullptr, "SetExternalSteadyClockSourceId"},
|
||||||
{15, nullptr, "GetUserSystemClockContext"},
|
{15, nullptr, "GetUserSystemClockContext"},
|
||||||
{16, nullptr, "SetUserSystemClockContext"},
|
{16, nullptr, "SetUserSystemClockContext"},
|
||||||
{17, nullptr, "GetAccountSettings"},
|
{17, &SET_SYS::GetAccountSettings, "GetAccountSettings"},
|
||||||
{18, nullptr, "SetAccountSettings"},
|
{18, &SET_SYS::SetAccountSettings, "SetAccountSettings"},
|
||||||
{19, nullptr, "GetAudioVolume"},
|
{19, nullptr, "GetAudioVolume"},
|
||||||
{20, nullptr, "SetAudioVolume"},
|
{20, nullptr, "SetAudioVolume"},
|
||||||
{21, nullptr, "GetEulaVersions"},
|
{21, nullptr, "GetEulaVersions"},
|
||||||
|
@ -215,23 +465,23 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} {
|
||||||
{26, nullptr, "SetConsoleInformationUploadFlag"},
|
{26, nullptr, "SetConsoleInformationUploadFlag"},
|
||||||
{27, nullptr, "GetAutomaticApplicationDownloadFlag"},
|
{27, nullptr, "GetAutomaticApplicationDownloadFlag"},
|
||||||
{28, nullptr, "SetAutomaticApplicationDownloadFlag"},
|
{28, nullptr, "SetAutomaticApplicationDownloadFlag"},
|
||||||
{29, nullptr, "GetNotificationSettings"},
|
{29, &SET_SYS::GetNotificationSettings, "GetNotificationSettings"},
|
||||||
{30, nullptr, "SetNotificationSettings"},
|
{30, &SET_SYS::SetNotificationSettings, "SetNotificationSettings"},
|
||||||
{31, nullptr, "GetAccountNotificationSettings"},
|
{31, &SET_SYS::GetAccountNotificationSettings, "GetAccountNotificationSettings"},
|
||||||
{32, nullptr, "SetAccountNotificationSettings"},
|
{32, &SET_SYS::SetAccountNotificationSettings, "SetAccountNotificationSettings"},
|
||||||
{35, nullptr, "GetVibrationMasterVolume"},
|
{35, nullptr, "GetVibrationMasterVolume"},
|
||||||
{36, nullptr, "SetVibrationMasterVolume"},
|
{36, nullptr, "SetVibrationMasterVolume"},
|
||||||
{37, &SET_SYS::GetSettingsItemValueSize, "GetSettingsItemValueSize"},
|
{37, &SET_SYS::GetSettingsItemValueSize, "GetSettingsItemValueSize"},
|
||||||
{38, &SET_SYS::GetSettingsItemValue, "GetSettingsItemValue"},
|
{38, &SET_SYS::GetSettingsItemValue, "GetSettingsItemValue"},
|
||||||
{39, nullptr, "GetTvSettings"},
|
{39, &SET_SYS::GetTvSettings, "GetTvSettings"},
|
||||||
{40, nullptr, "SetTvSettings"},
|
{40, &SET_SYS::SetTvSettings, "SetTvSettings"},
|
||||||
{41, nullptr, "GetEdid"},
|
{41, nullptr, "GetEdid"},
|
||||||
{42, nullptr, "SetEdid"},
|
{42, nullptr, "SetEdid"},
|
||||||
{43, nullptr, "GetAudioOutputMode"},
|
{43, nullptr, "GetAudioOutputMode"},
|
||||||
{44, nullptr, "SetAudioOutputMode"},
|
{44, nullptr, "SetAudioOutputMode"},
|
||||||
{45, nullptr, "IsForceMuteOnHeadphoneRemoved"},
|
{45, nullptr, "IsForceMuteOnHeadphoneRemoved"},
|
||||||
{46, nullptr, "SetForceMuteOnHeadphoneRemoved"},
|
{46, nullptr, "SetForceMuteOnHeadphoneRemoved"},
|
||||||
{47, nullptr, "GetQuestFlag"},
|
{47, &SET_SYS::GetQuestFlag, "GetQuestFlag"},
|
||||||
{48, nullptr, "SetQuestFlag"},
|
{48, nullptr, "SetQuestFlag"},
|
||||||
{49, nullptr, "GetDataDeletionSettings"},
|
{49, nullptr, "GetDataDeletionSettings"},
|
||||||
{50, nullptr, "SetDataDeletionSettings"},
|
{50, nullptr, "SetDataDeletionSettings"},
|
||||||
|
@ -247,7 +497,7 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} {
|
||||||
{60, nullptr, "IsUserSystemClockAutomaticCorrectionEnabled"},
|
{60, nullptr, "IsUserSystemClockAutomaticCorrectionEnabled"},
|
||||||
{61, nullptr, "SetUserSystemClockAutomaticCorrectionEnabled"},
|
{61, nullptr, "SetUserSystemClockAutomaticCorrectionEnabled"},
|
||||||
{62, nullptr, "GetDebugModeFlag"},
|
{62, nullptr, "GetDebugModeFlag"},
|
||||||
{63, nullptr, "GetPrimaryAlbumStorage"},
|
{63, &SET_SYS::GetPrimaryAlbumStorage, "GetPrimaryAlbumStorage"},
|
||||||
{64, nullptr, "SetPrimaryAlbumStorage"},
|
{64, nullptr, "SetPrimaryAlbumStorage"},
|
||||||
{65, nullptr, "GetUsb30EnableFlag"},
|
{65, nullptr, "GetUsb30EnableFlag"},
|
||||||
{66, nullptr, "SetUsb30EnableFlag"},
|
{66, nullptr, "SetUsb30EnableFlag"},
|
||||||
|
@ -255,15 +505,15 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} {
|
||||||
{68, nullptr, "GetSerialNumber"},
|
{68, nullptr, "GetSerialNumber"},
|
||||||
{69, nullptr, "GetNfcEnableFlag"},
|
{69, nullptr, "GetNfcEnableFlag"},
|
||||||
{70, nullptr, "SetNfcEnableFlag"},
|
{70, nullptr, "SetNfcEnableFlag"},
|
||||||
{71, nullptr, "GetSleepSettings"},
|
{71, &SET_SYS::GetSleepSettings, "GetSleepSettings"},
|
||||||
{72, nullptr, "SetSleepSettings"},
|
{72, &SET_SYS::SetSleepSettings, "SetSleepSettings"},
|
||||||
{73, nullptr, "GetWirelessLanEnableFlag"},
|
{73, nullptr, "GetWirelessLanEnableFlag"},
|
||||||
{74, nullptr, "SetWirelessLanEnableFlag"},
|
{74, nullptr, "SetWirelessLanEnableFlag"},
|
||||||
{75, nullptr, "GetInitialLaunchSettings"},
|
{75, &SET_SYS::GetInitialLaunchSettings, "GetInitialLaunchSettings"},
|
||||||
{76, nullptr, "SetInitialLaunchSettings"},
|
{76, &SET_SYS::SetInitialLaunchSettings, "SetInitialLaunchSettings"},
|
||||||
{77, &SET_SYS::GetDeviceNickName, "GetDeviceNickName"},
|
{77, &SET_SYS::GetDeviceNickName, "GetDeviceNickName"},
|
||||||
{78, nullptr, "SetDeviceNickName"},
|
{78, &SET_SYS::SetDeviceNickName, "SetDeviceNickName"},
|
||||||
{79, nullptr, "GetProductModel"},
|
{79, &SET_SYS::GetProductModel, "GetProductModel"},
|
||||||
{80, nullptr, "GetLdnChannel"},
|
{80, nullptr, "GetLdnChannel"},
|
||||||
{81, nullptr, "SetLdnChannel"},
|
{81, nullptr, "SetLdnChannel"},
|
||||||
{82, nullptr, "AcquireTelemetryDirtyFlagEventHandle"},
|
{82, nullptr, "AcquireTelemetryDirtyFlagEventHandle"},
|
||||||
|
@ -274,16 +524,16 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} {
|
||||||
{87, nullptr, "SetPtmFuelGaugeParameter"},
|
{87, nullptr, "SetPtmFuelGaugeParameter"},
|
||||||
{88, nullptr, "GetBluetoothEnableFlag"},
|
{88, nullptr, "GetBluetoothEnableFlag"},
|
||||||
{89, nullptr, "SetBluetoothEnableFlag"},
|
{89, nullptr, "SetBluetoothEnableFlag"},
|
||||||
{90, nullptr, "GetMiiAuthorId"},
|
{90, &SET_SYS::GetMiiAuthorId, "GetMiiAuthorId"},
|
||||||
{91, nullptr, "SetShutdownRtcValue"},
|
{91, nullptr, "SetShutdownRtcValue"},
|
||||||
{92, nullptr, "GetShutdownRtcValue"},
|
{92, nullptr, "GetShutdownRtcValue"},
|
||||||
{93, nullptr, "AcquireFatalDirtyFlagEventHandle"},
|
{93, nullptr, "AcquireFatalDirtyFlagEventHandle"},
|
||||||
{94, nullptr, "GetFatalDirtyFlags"},
|
{94, nullptr, "GetFatalDirtyFlags"},
|
||||||
{95, nullptr, "GetAutoUpdateEnableFlag"},
|
{95, &SET_SYS::GetAutoUpdateEnableFlag, "GetAutoUpdateEnableFlag"},
|
||||||
{96, nullptr, "SetAutoUpdateEnableFlag"},
|
{96, nullptr, "SetAutoUpdateEnableFlag"},
|
||||||
{97, nullptr, "GetNxControllerSettings"},
|
{97, nullptr, "GetNxControllerSettings"},
|
||||||
{98, nullptr, "SetNxControllerSettings"},
|
{98, nullptr, "SetNxControllerSettings"},
|
||||||
{99, nullptr, "GetBatteryPercentageFlag"},
|
{99, &SET_SYS::GetBatteryPercentageFlag, "GetBatteryPercentageFlag"},
|
||||||
{100, nullptr, "SetBatteryPercentageFlag"},
|
{100, nullptr, "SetBatteryPercentageFlag"},
|
||||||
{101, nullptr, "GetExternalRtcResetFlag"},
|
{101, nullptr, "GetExternalRtcResetFlag"},
|
||||||
{102, nullptr, "SetExternalRtcResetFlag"},
|
{102, nullptr, "SetExternalRtcResetFlag"},
|
||||||
|
@ -308,10 +558,10 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} {
|
||||||
{121, nullptr, "SetPushNotificationActivityModeOnSleep"},
|
{121, nullptr, "SetPushNotificationActivityModeOnSleep"},
|
||||||
{122, nullptr, "GetServiceDiscoveryControlSettings"},
|
{122, nullptr, "GetServiceDiscoveryControlSettings"},
|
||||||
{123, nullptr, "SetServiceDiscoveryControlSettings"},
|
{123, nullptr, "SetServiceDiscoveryControlSettings"},
|
||||||
{124, nullptr, "GetErrorReportSharePermission"},
|
{124, &SET_SYS::GetErrorReportSharePermission, "GetErrorReportSharePermission"},
|
||||||
{125, nullptr, "SetErrorReportSharePermission"},
|
{125, nullptr, "SetErrorReportSharePermission"},
|
||||||
{126, nullptr, "GetAppletLaunchFlags"},
|
{126, &SET_SYS::GetAppletLaunchFlags, "GetAppletLaunchFlags"},
|
||||||
{127, nullptr, "SetAppletLaunchFlags"},
|
{127, &SET_SYS::SetAppletLaunchFlags, "SetAppletLaunchFlags"},
|
||||||
{128, nullptr, "GetConsoleSixAxisSensorAccelerationBias"},
|
{128, nullptr, "GetConsoleSixAxisSensorAccelerationBias"},
|
||||||
{129, nullptr, "SetConsoleSixAxisSensorAccelerationBias"},
|
{129, nullptr, "SetConsoleSixAxisSensorAccelerationBias"},
|
||||||
{130, nullptr, "GetConsoleSixAxisSensorAngularVelocityBias"},
|
{130, nullptr, "GetConsoleSixAxisSensorAngularVelocityBias"},
|
||||||
|
@ -320,7 +570,7 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} {
|
||||||
{133, nullptr, "SetConsoleSixAxisSensorAccelerationGain"},
|
{133, nullptr, "SetConsoleSixAxisSensorAccelerationGain"},
|
||||||
{134, nullptr, "GetConsoleSixAxisSensorAngularVelocityGain"},
|
{134, nullptr, "GetConsoleSixAxisSensorAngularVelocityGain"},
|
||||||
{135, nullptr, "SetConsoleSixAxisSensorAngularVelocityGain"},
|
{135, nullptr, "SetConsoleSixAxisSensorAngularVelocityGain"},
|
||||||
{136, nullptr, "GetKeyboardLayout"},
|
{136, &SET_SYS::GetKeyboardLayout, "GetKeyboardLayout"},
|
||||||
{137, nullptr, "SetKeyboardLayout"},
|
{137, nullptr, "SetKeyboardLayout"},
|
||||||
{138, nullptr, "GetWebInspectorFlag"},
|
{138, nullptr, "GetWebInspectorFlag"},
|
||||||
{139, nullptr, "GetAllowedSslHosts"},
|
{139, nullptr, "GetAllowedSslHosts"},
|
||||||
|
@ -354,7 +604,7 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} {
|
||||||
{167, nullptr, "SetUsb30DeviceEnableFlag"},
|
{167, nullptr, "SetUsb30DeviceEnableFlag"},
|
||||||
{168, nullptr, "GetThemeId"},
|
{168, nullptr, "GetThemeId"},
|
||||||
{169, nullptr, "SetThemeId"},
|
{169, nullptr, "SetThemeId"},
|
||||||
{170, nullptr, "GetChineseTraditionalInputMethod"},
|
{170, &SET_SYS::GetChineseTraditionalInputMethod, "GetChineseTraditionalInputMethod"},
|
||||||
{171, nullptr, "SetChineseTraditionalInputMethod"},
|
{171, nullptr, "SetChineseTraditionalInputMethod"},
|
||||||
{172, nullptr, "GetPtmCycleCountReliability"},
|
{172, nullptr, "GetPtmCycleCountReliability"},
|
||||||
{173, nullptr, "SetPtmCycleCountReliability"},
|
{173, nullptr, "SetPtmCycleCountReliability"},
|
||||||
|
@ -391,6 +641,10 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} {
|
||||||
{204, nullptr, "SetPanelCrcMode"},
|
{204, nullptr, "SetPanelCrcMode"},
|
||||||
{205, nullptr, "GetNxControllerSettingsEx"},
|
{205, nullptr, "GetNxControllerSettingsEx"},
|
||||||
{206, nullptr, "SetNxControllerSettingsEx"},
|
{206, nullptr, "SetNxControllerSettingsEx"},
|
||||||
|
{207, nullptr, "GetHearingProtectionSafeguardFlag"},
|
||||||
|
{208, nullptr, "SetHearingProtectionSafeguardFlag"},
|
||||||
|
{209, nullptr, "GetHearingProtectionSafeguardRemainingTime"},
|
||||||
|
{210, nullptr, "SetHearingProtectionSafeguardRemainingTime"},
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "common/uuid.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
#include "core/hle/service/time/clock_types.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
class System;
|
class System;
|
||||||
|
@ -23,15 +25,293 @@ private:
|
||||||
BasicBlack = 1,
|
BasicBlack = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
void GetSettingsItemValueSize(HLERequestContext& ctx);
|
/// Indicates the current console is a retail or kiosk unit
|
||||||
void GetSettingsItemValue(HLERequestContext& ctx);
|
enum class QuestFlag : u8 {
|
||||||
|
Retail = 0,
|
||||||
|
Kiosk = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// This is nn::settings::system::TvResolution
|
||||||
|
enum class TvResolution : u32 {
|
||||||
|
Auto,
|
||||||
|
Resolution1080p,
|
||||||
|
Resolution720p,
|
||||||
|
Resolution480p,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// This is nn::settings::system::HdmiContentType
|
||||||
|
enum class HdmiContentType : u32 {
|
||||||
|
None,
|
||||||
|
Graphics,
|
||||||
|
Cinema,
|
||||||
|
Photo,
|
||||||
|
Game,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// This is nn::settings::system::RgbRange
|
||||||
|
enum class RgbRange : u32 {
|
||||||
|
Auto,
|
||||||
|
Full,
|
||||||
|
Limited,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// This is nn::settings::system::CmuMode
|
||||||
|
enum class CmuMode : u32 {
|
||||||
|
None,
|
||||||
|
ColorInvert,
|
||||||
|
HighContrast,
|
||||||
|
GrayScale,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// This is nn::settings::system::PrimaryAlbumStorage
|
||||||
|
enum class PrimaryAlbumStorage : u32 {
|
||||||
|
Nand,
|
||||||
|
SdCard,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// This is nn::settings::system::NotificationVolume
|
||||||
|
enum class NotificationVolume : u32 {
|
||||||
|
Mute,
|
||||||
|
Low,
|
||||||
|
High,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// This is nn::settings::system::ChineseTraditionalInputMethod
|
||||||
|
enum class ChineseTraditionalInputMethod : u32 {
|
||||||
|
Unknown0 = 0,
|
||||||
|
Unknown1 = 1,
|
||||||
|
Unknown2 = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// This is nn::settings::system::ErrorReportSharePermission
|
||||||
|
enum class ErrorReportSharePermission : u32 {
|
||||||
|
NotConfirmed,
|
||||||
|
Granted,
|
||||||
|
Denied,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// This is nn::settings::system::FriendPresenceOverlayPermission
|
||||||
|
enum class FriendPresenceOverlayPermission : u8 {
|
||||||
|
NotConfirmed,
|
||||||
|
NoDisplay,
|
||||||
|
FavoriteFriends,
|
||||||
|
Friends,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// This is nn::settings::system::HandheldSleepPlan
|
||||||
|
enum class HandheldSleepPlan : u32 {
|
||||||
|
Sleep1Min,
|
||||||
|
Sleep3Min,
|
||||||
|
Sleep5Min,
|
||||||
|
Sleep10Min,
|
||||||
|
Sleep30Min,
|
||||||
|
Never,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// This is nn::settings::system::ConsoleSleepPlan
|
||||||
|
enum class ConsoleSleepPlan : u32 {
|
||||||
|
Sleep1Hour,
|
||||||
|
Sleep2Hour,
|
||||||
|
Sleep3Hour,
|
||||||
|
Sleep6Hour,
|
||||||
|
Sleep12Hour,
|
||||||
|
Never,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// This is nn::settings::system::SleepFlag
|
||||||
|
struct SleepFlag {
|
||||||
|
union {
|
||||||
|
u32 raw{};
|
||||||
|
|
||||||
|
BitField<0, 1, u32> SleepsWhilePlayingMedia;
|
||||||
|
BitField<1, 1, u32> WakesAtPowerStateChange;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
static_assert(sizeof(SleepFlag) == 4, "TvFlag is an invalid size");
|
||||||
|
|
||||||
|
/// This is nn::settings::system::TvFlag
|
||||||
|
struct TvFlag {
|
||||||
|
union {
|
||||||
|
u32 raw{};
|
||||||
|
|
||||||
|
BitField<0, 1, u32> Allows4k;
|
||||||
|
BitField<1, 1, u32> Allows3d;
|
||||||
|
BitField<2, 1, u32> AllowsCec;
|
||||||
|
BitField<3, 1, u32> PreventsScreenBurnIn;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
static_assert(sizeof(TvFlag) == 4, "TvFlag is an invalid size");
|
||||||
|
|
||||||
|
/// This is nn::settings::system::InitialLaunchFlag
|
||||||
|
struct InitialLaunchFlag {
|
||||||
|
union {
|
||||||
|
u32 raw{};
|
||||||
|
|
||||||
|
BitField<0, 1, u32> InitialLaunchCompletionFlag;
|
||||||
|
BitField<8, 1, u32> InitialLaunchUserAdditionFlag;
|
||||||
|
BitField<16, 1, u32> InitialLaunchTimestampFlag;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
static_assert(sizeof(InitialLaunchFlag) == 4, "InitialLaunchFlag is an invalid size");
|
||||||
|
|
||||||
|
/// This is nn::settings::system::NotificationFlag
|
||||||
|
struct NotificationFlag {
|
||||||
|
union {
|
||||||
|
u32 raw{};
|
||||||
|
|
||||||
|
BitField<0, 1, u32> RingtoneFlag;
|
||||||
|
BitField<1, 1, u32> DownloadCompletionFlag;
|
||||||
|
BitField<8, 1, u32> EnablesNews;
|
||||||
|
BitField<9, 1, u32> IncomingLampFlag;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
static_assert(sizeof(NotificationFlag) == 4, "NotificationFlag is an invalid size");
|
||||||
|
|
||||||
|
/// This is nn::settings::system::AccountNotificationFlag
|
||||||
|
struct AccountNotificationFlag {
|
||||||
|
union {
|
||||||
|
u32 raw{};
|
||||||
|
|
||||||
|
BitField<0, 1, u32> FriendOnlineFlag;
|
||||||
|
BitField<1, 1, u32> FriendRequestFlag;
|
||||||
|
BitField<8, 1, u32> CoralInvitationFlag;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
static_assert(sizeof(AccountNotificationFlag) == 4,
|
||||||
|
"AccountNotificationFlag is an invalid size");
|
||||||
|
|
||||||
|
/// This is nn::settings::system::TvSettings
|
||||||
|
struct TvSettings {
|
||||||
|
TvFlag flags;
|
||||||
|
TvResolution tv_resolution;
|
||||||
|
HdmiContentType hdmi_content_type;
|
||||||
|
RgbRange rgb_range;
|
||||||
|
CmuMode cmu_mode;
|
||||||
|
u32 tv_underscan;
|
||||||
|
f32 tv_gama;
|
||||||
|
f32 constrast_ratio;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(TvSettings) == 0x20, "TvSettings is an invalid size");
|
||||||
|
|
||||||
|
/// This is nn::settings::system::NotificationTime
|
||||||
|
struct NotificationTime {
|
||||||
|
u32 hour;
|
||||||
|
u32 minute;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(NotificationTime) == 0x8, "NotificationTime is an invalid size");
|
||||||
|
|
||||||
|
/// This is nn::settings::system::NotificationSettings
|
||||||
|
struct NotificationSettings {
|
||||||
|
NotificationFlag flags;
|
||||||
|
NotificationVolume volume;
|
||||||
|
NotificationTime start_time;
|
||||||
|
NotificationTime stop_time;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(NotificationSettings) == 0x18, "NotificationSettings is an invalid size");
|
||||||
|
|
||||||
|
/// This is nn::settings::system::AccountSettings
|
||||||
|
struct AccountSettings {
|
||||||
|
u32 flags;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(AccountSettings) == 0x4, "AccountSettings is an invalid size");
|
||||||
|
|
||||||
|
/// This is nn::settings::system::AccountNotificationSettings
|
||||||
|
struct AccountNotificationSettings {
|
||||||
|
Common::UUID uid;
|
||||||
|
AccountNotificationFlag flags;
|
||||||
|
FriendPresenceOverlayPermission friend_presence_permission;
|
||||||
|
FriendPresenceOverlayPermission friend_invitation_permission;
|
||||||
|
INSERT_PADDING_BYTES(0x2);
|
||||||
|
};
|
||||||
|
static_assert(sizeof(AccountNotificationSettings) == 0x18,
|
||||||
|
"AccountNotificationSettings is an invalid size");
|
||||||
|
|
||||||
|
/// This is nn::settings::system::InitialLaunchSettings
|
||||||
|
struct SleepSettings {
|
||||||
|
SleepFlag flags;
|
||||||
|
HandheldSleepPlan handheld_sleep_plan;
|
||||||
|
ConsoleSleepPlan console_sleep_plan;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(SleepSettings) == 0xc, "SleepSettings is incorrect size");
|
||||||
|
|
||||||
|
/// This is nn::settings::system::InitialLaunchSettings
|
||||||
|
struct InitialLaunchSettings {
|
||||||
|
InitialLaunchFlag flags;
|
||||||
|
INSERT_PADDING_BYTES(0x4);
|
||||||
|
Time::Clock::SteadyClockTimePoint timestamp;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(InitialLaunchSettings) == 0x20, "InitialLaunchSettings is incorrect size");
|
||||||
|
|
||||||
void GetFirmwareVersion(HLERequestContext& ctx);
|
void GetFirmwareVersion(HLERequestContext& ctx);
|
||||||
void GetFirmwareVersion2(HLERequestContext& ctx);
|
void GetFirmwareVersion2(HLERequestContext& ctx);
|
||||||
|
void GetAccountSettings(HLERequestContext& ctx);
|
||||||
|
void SetAccountSettings(HLERequestContext& ctx);
|
||||||
void GetColorSetId(HLERequestContext& ctx);
|
void GetColorSetId(HLERequestContext& ctx);
|
||||||
void SetColorSetId(HLERequestContext& ctx);
|
void SetColorSetId(HLERequestContext& ctx);
|
||||||
|
void GetNotificationSettings(HLERequestContext& ctx);
|
||||||
|
void SetNotificationSettings(HLERequestContext& ctx);
|
||||||
|
void GetAccountNotificationSettings(HLERequestContext& ctx);
|
||||||
|
void SetAccountNotificationSettings(HLERequestContext& ctx);
|
||||||
|
void GetSettingsItemValueSize(HLERequestContext& ctx);
|
||||||
|
void GetSettingsItemValue(HLERequestContext& ctx);
|
||||||
|
void GetTvSettings(HLERequestContext& ctx);
|
||||||
|
void SetTvSettings(HLERequestContext& ctx);
|
||||||
|
void GetQuestFlag(HLERequestContext& ctx);
|
||||||
|
void GetPrimaryAlbumStorage(HLERequestContext& ctx);
|
||||||
|
void GetSleepSettings(HLERequestContext& ctx);
|
||||||
|
void SetSleepSettings(HLERequestContext& ctx);
|
||||||
|
void GetInitialLaunchSettings(HLERequestContext& ctx);
|
||||||
|
void SetInitialLaunchSettings(HLERequestContext& ctx);
|
||||||
void GetDeviceNickName(HLERequestContext& ctx);
|
void GetDeviceNickName(HLERequestContext& ctx);
|
||||||
|
void SetDeviceNickName(HLERequestContext& ctx);
|
||||||
|
void GetProductModel(HLERequestContext& ctx);
|
||||||
|
void GetMiiAuthorId(HLERequestContext& ctx);
|
||||||
|
void GetAutoUpdateEnableFlag(HLERequestContext& ctx);
|
||||||
|
void GetBatteryPercentageFlag(HLERequestContext& ctx);
|
||||||
|
void GetErrorReportSharePermission(HLERequestContext& ctx);
|
||||||
|
void GetAppletLaunchFlags(HLERequestContext& ctx);
|
||||||
|
void SetAppletLaunchFlags(HLERequestContext& ctx);
|
||||||
|
void GetKeyboardLayout(HLERequestContext& ctx);
|
||||||
|
void GetChineseTraditionalInputMethod(HLERequestContext& ctx);
|
||||||
|
|
||||||
|
AccountSettings account_settings{
|
||||||
|
.flags = {},
|
||||||
|
};
|
||||||
|
|
||||||
ColorSet color_set = ColorSet::BasicWhite;
|
ColorSet color_set = ColorSet::BasicWhite;
|
||||||
|
|
||||||
|
NotificationSettings notification_settings{
|
||||||
|
.flags = {0x300},
|
||||||
|
.volume = NotificationVolume::High,
|
||||||
|
.start_time = {.hour = 9, .minute = 0},
|
||||||
|
.stop_time = {.hour = 21, .minute = 0},
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<AccountNotificationSettings> account_notifications{};
|
||||||
|
|
||||||
|
TvSettings tv_settings{
|
||||||
|
.flags = {0xc},
|
||||||
|
.tv_resolution = TvResolution::Auto,
|
||||||
|
.hdmi_content_type = HdmiContentType::Game,
|
||||||
|
.rgb_range = RgbRange::Auto,
|
||||||
|
.cmu_mode = CmuMode::None,
|
||||||
|
.tv_underscan = {},
|
||||||
|
.tv_gama = 1.0f,
|
||||||
|
.constrast_ratio = 0.5f,
|
||||||
|
};
|
||||||
|
|
||||||
|
InitialLaunchSettings launch_settings{
|
||||||
|
.flags = {0x10001},
|
||||||
|
.timestamp = {},
|
||||||
|
};
|
||||||
|
|
||||||
|
SleepSettings sleep_settings{
|
||||||
|
.flags = {0x3},
|
||||||
|
.handheld_sleep_plan = HandheldSleepPlan::Sleep10Min,
|
||||||
|
.console_sleep_plan = ConsoleSleepPlan::Sleep1Hour,
|
||||||
|
};
|
||||||
|
|
||||||
|
u32 applet_launch_flag{};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::Set
|
} // namespace Service::Set
|
||||||
|
|
|
@ -39,7 +39,7 @@ public:
|
||||||
[[nodiscard]] virtual std::optional<ReplaceConstant> GetReplaceConstBuffer(u32 bank,
|
[[nodiscard]] virtual std::optional<ReplaceConstant> GetReplaceConstBuffer(u32 bank,
|
||||||
u32 offset) = 0;
|
u32 offset) = 0;
|
||||||
|
|
||||||
virtual void Dump(u64 hash) = 0;
|
virtual void Dump(u64 pipeline_hash, u64 shader_hash) = 0;
|
||||||
|
|
||||||
[[nodiscard]] const ProgramHeader& SPH() const noexcept {
|
[[nodiscard]] const ProgramHeader& SPH() const noexcept {
|
||||||
return sph;
|
return sph;
|
||||||
|
|
|
@ -445,7 +445,8 @@ std::unique_ptr<GraphicsPipeline> ShaderCache::CreateGraphicsPipeline(
|
||||||
ShaderContext::ShaderPools& pools, const GraphicsPipelineKey& key,
|
ShaderContext::ShaderPools& pools, const GraphicsPipelineKey& key,
|
||||||
std::span<Shader::Environment* const> envs, bool use_shader_workers,
|
std::span<Shader::Environment* const> envs, bool use_shader_workers,
|
||||||
bool force_context_flush) try {
|
bool force_context_flush) try {
|
||||||
LOG_INFO(Render_OpenGL, "0x{:016x}", key.Hash());
|
auto hash = key.Hash();
|
||||||
|
LOG_INFO(Render_OpenGL, "0x{:016x}", hash);
|
||||||
size_t env_index{};
|
size_t env_index{};
|
||||||
u32 total_storage_buffers{};
|
u32 total_storage_buffers{};
|
||||||
std::array<Shader::IR::Program, Maxwell::MaxShaderProgram> programs;
|
std::array<Shader::IR::Program, Maxwell::MaxShaderProgram> programs;
|
||||||
|
@ -474,7 +475,7 @@ std::unique_ptr<GraphicsPipeline> ShaderCache::CreateGraphicsPipeline(
|
||||||
Shader::Maxwell::Flow::CFG cfg(env, pools.flow_block, cfg_offset, index == 0);
|
Shader::Maxwell::Flow::CFG cfg(env, pools.flow_block, cfg_offset, index == 0);
|
||||||
|
|
||||||
if (Settings::values.dump_shaders) {
|
if (Settings::values.dump_shaders) {
|
||||||
env.Dump(key.unique_hashes[index]);
|
env.Dump(hash, key.unique_hashes[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!uses_vertex_a || index != 1) {
|
if (!uses_vertex_a || index != 1) {
|
||||||
|
@ -566,12 +567,13 @@ std::unique_ptr<ComputePipeline> ShaderCache::CreateComputePipeline(
|
||||||
std::unique_ptr<ComputePipeline> ShaderCache::CreateComputePipeline(
|
std::unique_ptr<ComputePipeline> ShaderCache::CreateComputePipeline(
|
||||||
ShaderContext::ShaderPools& pools, const ComputePipelineKey& key, Shader::Environment& env,
|
ShaderContext::ShaderPools& pools, const ComputePipelineKey& key, Shader::Environment& env,
|
||||||
bool force_context_flush) try {
|
bool force_context_flush) try {
|
||||||
LOG_INFO(Render_OpenGL, "0x{:016x}", key.Hash());
|
auto hash = key.Hash();
|
||||||
|
LOG_INFO(Render_OpenGL, "0x{:016x}", hash);
|
||||||
|
|
||||||
Shader::Maxwell::Flow::CFG cfg{env, pools.flow_block, env.StartAddress()};
|
Shader::Maxwell::Flow::CFG cfg{env, pools.flow_block, env.StartAddress()};
|
||||||
|
|
||||||
if (Settings::values.dump_shaders) {
|
if (Settings::values.dump_shaders) {
|
||||||
env.Dump(key.Hash());
|
env.Dump(hash, key.unique_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto program{TranslateProgram(pools.inst, pools.block, env, cfg, host_info)};
|
auto program{TranslateProgram(pools.inst, pools.block, env, cfg, host_info)};
|
||||||
|
|
|
@ -584,7 +584,8 @@ std::unique_ptr<GraphicsPipeline> PipelineCache::CreateGraphicsPipeline(
|
||||||
ShaderPools& pools, const GraphicsPipelineCacheKey& key,
|
ShaderPools& pools, const GraphicsPipelineCacheKey& key,
|
||||||
std::span<Shader::Environment* const> envs, PipelineStatistics* statistics,
|
std::span<Shader::Environment* const> envs, PipelineStatistics* statistics,
|
||||||
bool build_in_parallel) try {
|
bool build_in_parallel) try {
|
||||||
LOG_INFO(Render_Vulkan, "0x{:016x}", key.Hash());
|
auto hash = key.Hash();
|
||||||
|
LOG_INFO(Render_Vulkan, "0x{:016x}", hash);
|
||||||
size_t env_index{0};
|
size_t env_index{0};
|
||||||
std::array<Shader::IR::Program, Maxwell::MaxShaderProgram> programs;
|
std::array<Shader::IR::Program, Maxwell::MaxShaderProgram> programs;
|
||||||
const bool uses_vertex_a{key.unique_hashes[0] != 0};
|
const bool uses_vertex_a{key.unique_hashes[0] != 0};
|
||||||
|
@ -611,7 +612,7 @@ std::unique_ptr<GraphicsPipeline> PipelineCache::CreateGraphicsPipeline(
|
||||||
const u32 cfg_offset{static_cast<u32>(env.StartAddress() + sizeof(Shader::ProgramHeader))};
|
const u32 cfg_offset{static_cast<u32>(env.StartAddress() + sizeof(Shader::ProgramHeader))};
|
||||||
Shader::Maxwell::Flow::CFG cfg(env, pools.flow_block, cfg_offset, index == 0);
|
Shader::Maxwell::Flow::CFG cfg(env, pools.flow_block, cfg_offset, index == 0);
|
||||||
if (Settings::values.dump_shaders) {
|
if (Settings::values.dump_shaders) {
|
||||||
env.Dump(key.unique_hashes[index]);
|
env.Dump(hash, key.unique_hashes[index]);
|
||||||
}
|
}
|
||||||
if (!uses_vertex_a || index != 1) {
|
if (!uses_vertex_a || index != 1) {
|
||||||
// Normal path
|
// Normal path
|
||||||
|
@ -712,18 +713,19 @@ std::unique_ptr<ComputePipeline> PipelineCache::CreateComputePipeline(
|
||||||
std::unique_ptr<ComputePipeline> PipelineCache::CreateComputePipeline(
|
std::unique_ptr<ComputePipeline> PipelineCache::CreateComputePipeline(
|
||||||
ShaderPools& pools, const ComputePipelineCacheKey& key, Shader::Environment& env,
|
ShaderPools& pools, const ComputePipelineCacheKey& key, Shader::Environment& env,
|
||||||
PipelineStatistics* statistics, bool build_in_parallel) try {
|
PipelineStatistics* statistics, bool build_in_parallel) try {
|
||||||
|
auto hash = key.Hash();
|
||||||
if (device.HasBrokenCompute()) {
|
if (device.HasBrokenCompute()) {
|
||||||
LOG_ERROR(Render_Vulkan, "Skipping 0x{:016x}", key.Hash());
|
LOG_ERROR(Render_Vulkan, "Skipping 0x{:016x}", hash);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO(Render_Vulkan, "0x{:016x}", key.Hash());
|
LOG_INFO(Render_Vulkan, "0x{:016x}", hash);
|
||||||
|
|
||||||
Shader::Maxwell::Flow::CFG cfg{env, pools.flow_block, env.StartAddress()};
|
Shader::Maxwell::Flow::CFG cfg{env, pools.flow_block, env.StartAddress()};
|
||||||
|
|
||||||
// Dump it before error.
|
// Dump it before error.
|
||||||
if (Settings::values.dump_shaders) {
|
if (Settings::values.dump_shaders) {
|
||||||
env.Dump(key.Hash());
|
env.Dump(hash, key.unique_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto program{TranslateProgram(pools.inst, pools.block, env, cfg, host_info)};
|
auto program{TranslateProgram(pools.inst, pools.block, env, cfg, host_info)};
|
||||||
|
|
|
@ -51,6 +51,11 @@ bool ShaderCache::RefreshStages(std::array<u64, 6>& unique_hashes) {
|
||||||
}
|
}
|
||||||
const auto& shader_config{maxwell3d->regs.pipelines[index]};
|
const auto& shader_config{maxwell3d->regs.pipelines[index]};
|
||||||
const auto program{static_cast<Tegra::Engines::Maxwell3D::Regs::ShaderType>(index)};
|
const auto program{static_cast<Tegra::Engines::Maxwell3D::Regs::ShaderType>(index)};
|
||||||
|
if (program == Tegra::Engines::Maxwell3D::Regs::ShaderType::Pixel &&
|
||||||
|
!maxwell3d->regs.rasterize_enable) {
|
||||||
|
unique_hashes[index] = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
const GPUVAddr shader_addr{base_addr + shader_config.offset};
|
const GPUVAddr shader_addr{base_addr + shader_config.offset};
|
||||||
const std::optional<VAddr> cpu_shader_addr{gpu_memory->GpuToCpuAddress(shader_addr)};
|
const std::optional<VAddr> cpu_shader_addr{gpu_memory->GpuToCpuAddress(shader_addr)};
|
||||||
if (!cpu_shader_addr) {
|
if (!cpu_shader_addr) {
|
||||||
|
|
|
@ -70,10 +70,16 @@ public:
|
||||||
protected:
|
protected:
|
||||||
struct GraphicsEnvironments {
|
struct GraphicsEnvironments {
|
||||||
std::array<GraphicsEnvironment, NUM_PROGRAMS> envs;
|
std::array<GraphicsEnvironment, NUM_PROGRAMS> envs;
|
||||||
std::array<Shader::Environment*, NUM_PROGRAMS> env_ptrs;
|
std::array<Shader::Environment*, NUM_PROGRAMS> env_ptrs{};
|
||||||
|
|
||||||
std::span<Shader::Environment* const> Span() const noexcept {
|
std::span<Shader::Environment* const> Span() const noexcept {
|
||||||
return std::span(env_ptrs.begin(), std::ranges::find(env_ptrs, nullptr));
|
size_t size{};
|
||||||
|
for (; size < NUM_PROGRAMS; size++) {
|
||||||
|
if (!env_ptrs[size]) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return std::span(env_ptrs.begin(), size);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -102,7 +102,8 @@ static std::string_view StageToPrefix(Shader::Stage stage) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DumpImpl(u64 hash, const u64* code, u32 read_highest, u32 read_lowest,
|
static void DumpImpl(u64 pipeline_hash, u64 shader_hash, std::span<const u64> code,
|
||||||
|
[[maybe_unused]] u32 read_highest, [[maybe_unused]] u32 read_lowest,
|
||||||
u32 initial_offset, Shader::Stage stage) {
|
u32 initial_offset, Shader::Stage stage) {
|
||||||
const auto shader_dir{Common::FS::GetYuzuPath(Common::FS::YuzuPath::DumpDir)};
|
const auto shader_dir{Common::FS::GetYuzuPath(Common::FS::YuzuPath::DumpDir)};
|
||||||
const auto base_dir{shader_dir / "shaders"};
|
const auto base_dir{shader_dir / "shaders"};
|
||||||
|
@ -111,13 +112,18 @@ static void DumpImpl(u64 hash, const u64* code, u32 read_highest, u32 read_lowes
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const auto prefix = StageToPrefix(stage);
|
const auto prefix = StageToPrefix(stage);
|
||||||
const auto name{base_dir / fmt::format("{}{:016x}.ash", prefix, hash)};
|
const auto name{base_dir /
|
||||||
const size_t real_size = read_highest - read_lowest + initial_offset;
|
fmt::format("{:016x}_{}_{:016x}.ash", pipeline_hash, prefix, shader_hash)};
|
||||||
const size_t padding_needed = ((32 - (real_size % 32)) % 32);
|
|
||||||
std::fstream shader_file(name, std::ios::out | std::ios::binary);
|
std::fstream shader_file(name, std::ios::out | std::ios::binary);
|
||||||
|
ASSERT(initial_offset % sizeof(u64) == 0);
|
||||||
const size_t jump_index = initial_offset / sizeof(u64);
|
const size_t jump_index = initial_offset / sizeof(u64);
|
||||||
shader_file.write(reinterpret_cast<const char*>(code + jump_index), real_size);
|
const size_t code_size = code.size_bytes() - initial_offset;
|
||||||
for (size_t i = 0; i < padding_needed; i++) {
|
shader_file.write(reinterpret_cast<const char*>(&code[jump_index]), code_size);
|
||||||
|
|
||||||
|
// + 1 instruction, due to the fact that we skip the final self branch instruction in the code,
|
||||||
|
// but we need to consider it for padding, otherwise nvdisasm rages.
|
||||||
|
const size_t padding_needed = (32 - ((code_size + INST_SIZE) % 32)) % 32;
|
||||||
|
for (size_t i = 0; i < INST_SIZE + padding_needed; i++) {
|
||||||
shader_file.put(0);
|
shader_file.put(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,8 +203,8 @@ u64 GenericEnvironment::CalculateHash() const {
|
||||||
return Common::CityHash64(data.get(), size);
|
return Common::CityHash64(data.get(), size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GenericEnvironment::Dump(u64 hash) {
|
void GenericEnvironment::Dump(u64 pipeline_hash, u64 shader_hash) {
|
||||||
DumpImpl(hash, code.data(), read_highest, read_lowest, initial_offset, stage);
|
DumpImpl(pipeline_hash, shader_hash, code, read_highest, read_lowest, initial_offset, stage);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GenericEnvironment::Serialize(std::ofstream& file) const {
|
void GenericEnvironment::Serialize(std::ofstream& file) const {
|
||||||
|
@ -282,6 +288,7 @@ std::optional<u64> GenericEnvironment::TryFindSize() {
|
||||||
Tegra::Texture::TICEntry GenericEnvironment::ReadTextureInfo(GPUVAddr tic_addr, u32 tic_limit,
|
Tegra::Texture::TICEntry GenericEnvironment::ReadTextureInfo(GPUVAddr tic_addr, u32 tic_limit,
|
||||||
bool via_header_index, u32 raw) {
|
bool via_header_index, u32 raw) {
|
||||||
const auto handle{Tegra::Texture::TexturePair(raw, via_header_index)};
|
const auto handle{Tegra::Texture::TexturePair(raw, via_header_index)};
|
||||||
|
ASSERT(handle.first <= tic_limit);
|
||||||
const GPUVAddr descriptor_addr{tic_addr + handle.first * sizeof(Tegra::Texture::TICEntry)};
|
const GPUVAddr descriptor_addr{tic_addr + handle.first * sizeof(Tegra::Texture::TICEntry)};
|
||||||
Tegra::Texture::TICEntry entry;
|
Tegra::Texture::TICEntry entry;
|
||||||
gpu_memory->ReadBlock(descriptor_addr, &entry, sizeof(entry));
|
gpu_memory->ReadBlock(descriptor_addr, &entry, sizeof(entry));
|
||||||
|
@ -465,8 +472,8 @@ void FileEnvironment::Deserialize(std::ifstream& file) {
|
||||||
.read(reinterpret_cast<char*>(&read_highest), sizeof(read_highest))
|
.read(reinterpret_cast<char*>(&read_highest), sizeof(read_highest))
|
||||||
.read(reinterpret_cast<char*>(&viewport_transform_state), sizeof(viewport_transform_state))
|
.read(reinterpret_cast<char*>(&viewport_transform_state), sizeof(viewport_transform_state))
|
||||||
.read(reinterpret_cast<char*>(&stage), sizeof(stage));
|
.read(reinterpret_cast<char*>(&stage), sizeof(stage));
|
||||||
code = std::make_unique<u64[]>(Common::DivCeil(code_size, sizeof(u64)));
|
code.resize(Common::DivCeil(code_size, sizeof(u64)));
|
||||||
file.read(reinterpret_cast<char*>(code.get()), code_size);
|
file.read(reinterpret_cast<char*>(code.data()), code_size);
|
||||||
for (size_t i = 0; i < num_texture_types; ++i) {
|
for (size_t i = 0; i < num_texture_types; ++i) {
|
||||||
u32 key;
|
u32 key;
|
||||||
Shader::TextureType type;
|
Shader::TextureType type;
|
||||||
|
@ -509,8 +516,8 @@ void FileEnvironment::Deserialize(std::ifstream& file) {
|
||||||
is_propietary_driver = texture_bound == 2;
|
is_propietary_driver = texture_bound == 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileEnvironment::Dump(u64 hash) {
|
void FileEnvironment::Dump(u64 pipeline_hash, u64 shader_hash) {
|
||||||
DumpImpl(hash, code.get(), read_highest, read_lowest, initial_offset, stage);
|
DumpImpl(pipeline_hash, shader_hash, code, read_highest, read_lowest, initial_offset, stage);
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 FileEnvironment::ReadInstruction(u32 address) {
|
u64 FileEnvironment::ReadInstruction(u32 address) {
|
||||||
|
|
|
@ -58,7 +58,7 @@ public:
|
||||||
|
|
||||||
[[nodiscard]] u64 CalculateHash() const;
|
[[nodiscard]] u64 CalculateHash() const;
|
||||||
|
|
||||||
void Dump(u64 hash) override;
|
void Dump(u64 pipeline_hash, u64 shader_hash) override;
|
||||||
|
|
||||||
void Serialize(std::ofstream& file) const;
|
void Serialize(std::ofstream& file) const;
|
||||||
|
|
||||||
|
@ -188,10 +188,10 @@ public:
|
||||||
return cbuf_replacements.size() != 0;
|
return cbuf_replacements.size() != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dump(u64 hash) override;
|
void Dump(u64 pipeline_hash, u64 shader_hash) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<u64[]> code;
|
std::vector<u64> code;
|
||||||
std::unordered_map<u32, Shader::TextureType> texture_types;
|
std::unordered_map<u32, Shader::TextureType> texture_types;
|
||||||
std::unordered_map<u32, Shader::TexturePixelFormat> texture_pixel_formats;
|
std::unordered_map<u32, Shader::TexturePixelFormat> texture_pixel_formats;
|
||||||
std::unordered_map<u64, u32> cbuf_values;
|
std::unordered_map<u64, u32> cbuf_values;
|
||||||
|
|
|
@ -963,7 +963,7 @@ bool Device::GetSuitability(bool requires_swapchain) {
|
||||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR;
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR;
|
||||||
SetNext(next, properties.push_descriptor);
|
SetNext(next, properties.push_descriptor);
|
||||||
}
|
}
|
||||||
if (extensions.subgroup_size_control) {
|
if (extensions.subgroup_size_control || features.subgroup_size_control.subgroupSizeControl) {
|
||||||
properties.subgroup_size_control.sType =
|
properties.subgroup_size_control.sType =
|
||||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES;
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES;
|
||||||
SetNext(next, properties.subgroup_size_control);
|
SetNext(next, properties.subgroup_size_control);
|
||||||
|
|
|
@ -20,7 +20,6 @@ VK_DEFINE_HANDLE(VmaAllocator)
|
||||||
// Vulkan version in the macro describes the minimum version required for feature availability.
|
// Vulkan version in the macro describes the minimum version required for feature availability.
|
||||||
// If the Vulkan version is lower than the required version, the named extension is required.
|
// If the Vulkan version is lower than the required version, the named extension is required.
|
||||||
#define FOR_EACH_VK_FEATURE_1_1(FEATURE) \
|
#define FOR_EACH_VK_FEATURE_1_1(FEATURE) \
|
||||||
FEATURE(EXT, SubgroupSizeControl, SUBGROUP_SIZE_CONTROL, subgroup_size_control) \
|
|
||||||
FEATURE(KHR, 16BitStorage, 16BIT_STORAGE, bit16_storage) \
|
FEATURE(KHR, 16BitStorage, 16BIT_STORAGE, bit16_storage) \
|
||||||
FEATURE(KHR, ShaderAtomicInt64, SHADER_ATOMIC_INT64, shader_atomic_int64) \
|
FEATURE(KHR, ShaderAtomicInt64, SHADER_ATOMIC_INT64, shader_atomic_int64) \
|
||||||
FEATURE(KHR, ShaderDrawParameters, SHADER_DRAW_PARAMETERS, shader_draw_parameters) \
|
FEATURE(KHR, ShaderDrawParameters, SHADER_DRAW_PARAMETERS, shader_draw_parameters) \
|
||||||
|
@ -36,7 +35,8 @@ VK_DEFINE_HANDLE(VmaAllocator)
|
||||||
|
|
||||||
#define FOR_EACH_VK_FEATURE_1_3(FEATURE) \
|
#define FOR_EACH_VK_FEATURE_1_3(FEATURE) \
|
||||||
FEATURE(EXT, ShaderDemoteToHelperInvocation, SHADER_DEMOTE_TO_HELPER_INVOCATION, \
|
FEATURE(EXT, ShaderDemoteToHelperInvocation, SHADER_DEMOTE_TO_HELPER_INVOCATION, \
|
||||||
shader_demote_to_helper_invocation)
|
shader_demote_to_helper_invocation) \
|
||||||
|
FEATURE(EXT, SubgroupSizeControl, SUBGROUP_SIZE_CONTROL, subgroup_size_control)
|
||||||
|
|
||||||
// Define all features which may be used by the implementation and require an extension here.
|
// Define all features which may be used by the implementation and require an extension here.
|
||||||
#define FOR_EACH_VK_FEATURE_EXT(FEATURE) \
|
#define FOR_EACH_VK_FEATURE_EXT(FEATURE) \
|
||||||
|
|
Loading…
Reference in a new issue