mirror of
https://github.com/yuzu-emu/yuzu.git
synced 2024-07-04 23:31:19 +01:00
service: hid: Implement ResetIsSixAxisSensorDeviceNewlyAssigned
Needed by Nintendo Switch Sports
This commit is contained in:
parent
240f59a4c8
commit
a1f2610522
5 changed files with 125 additions and 6 deletions
|
@ -498,6 +498,16 @@ struct SixAxisSensorFusionParameters {
|
||||||
static_assert(sizeof(SixAxisSensorFusionParameters) == 8,
|
static_assert(sizeof(SixAxisSensorFusionParameters) == 8,
|
||||||
"SixAxisSensorFusionParameters is an invalid size");
|
"SixAxisSensorFusionParameters is an invalid size");
|
||||||
|
|
||||||
|
// This is nn::hid::server::SixAxisSensorProperties
|
||||||
|
struct SixAxisSensorProperties {
|
||||||
|
union {
|
||||||
|
u8 raw{};
|
||||||
|
BitField<0, 1, u8> is_newly_assigned;
|
||||||
|
BitField<1, 1, u8> is_firmware_update_available;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
static_assert(sizeof(SixAxisSensorProperties) == 1, "SixAxisSensorProperties is an invalid size");
|
||||||
|
|
||||||
// This is nn::hid::SixAxisSensorCalibrationParameter
|
// This is nn::hid::SixAxisSensorCalibrationParameter
|
||||||
struct SixAxisSensorCalibrationParameter {
|
struct SixAxisSensorCalibrationParameter {
|
||||||
std::array<u8, 0x744> unknown_data{};
|
std::array<u8, 0x744> unknown_data{};
|
||||||
|
|
|
@ -169,6 +169,7 @@ void Controller_NPad::InitNewlyAddedController(Core::HID::NpadIdType npad_id) {
|
||||||
shared_memory->system_properties.use_plus.Assign(1);
|
shared_memory->system_properties.use_plus.Assign(1);
|
||||||
shared_memory->system_properties.use_minus.Assign(1);
|
shared_memory->system_properties.use_minus.Assign(1);
|
||||||
shared_memory->applet_nfc_xcd.applet_footer.type = AppletFooterUiType::SwitchProController;
|
shared_memory->applet_nfc_xcd.applet_footer.type = AppletFooterUiType::SwitchProController;
|
||||||
|
shared_memory->sixaxis_fullkey_properties.is_newly_assigned.Assign(1);
|
||||||
break;
|
break;
|
||||||
case Core::HID::NpadStyleIndex::Handheld:
|
case Core::HID::NpadStyleIndex::Handheld:
|
||||||
shared_memory->style_tag.handheld.Assign(1);
|
shared_memory->style_tag.handheld.Assign(1);
|
||||||
|
@ -181,16 +182,19 @@ void Controller_NPad::InitNewlyAddedController(Core::HID::NpadIdType npad_id) {
|
||||||
shared_memory->assignment_mode = NpadJoyAssignmentMode::Dual;
|
shared_memory->assignment_mode = NpadJoyAssignmentMode::Dual;
|
||||||
shared_memory->applet_nfc_xcd.applet_footer.type =
|
shared_memory->applet_nfc_xcd.applet_footer.type =
|
||||||
AppletFooterUiType::HandheldJoyConLeftJoyConRight;
|
AppletFooterUiType::HandheldJoyConLeftJoyConRight;
|
||||||
|
shared_memory->sixaxis_handheld_properties.is_newly_assigned.Assign(1);
|
||||||
break;
|
break;
|
||||||
case Core::HID::NpadStyleIndex::JoyconDual:
|
case Core::HID::NpadStyleIndex::JoyconDual:
|
||||||
shared_memory->style_tag.joycon_dual.Assign(1);
|
shared_memory->style_tag.joycon_dual.Assign(1);
|
||||||
if (controller.is_dual_left_connected) {
|
if (controller.is_dual_left_connected) {
|
||||||
shared_memory->device_type.joycon_left.Assign(1);
|
shared_memory->device_type.joycon_left.Assign(1);
|
||||||
shared_memory->system_properties.use_minus.Assign(1);
|
shared_memory->system_properties.use_minus.Assign(1);
|
||||||
|
shared_memory->sixaxis_dual_left_properties.is_newly_assigned.Assign(1);
|
||||||
}
|
}
|
||||||
if (controller.is_dual_right_connected) {
|
if (controller.is_dual_right_connected) {
|
||||||
shared_memory->device_type.joycon_right.Assign(1);
|
shared_memory->device_type.joycon_right.Assign(1);
|
||||||
shared_memory->system_properties.use_plus.Assign(1);
|
shared_memory->system_properties.use_plus.Assign(1);
|
||||||
|
shared_memory->sixaxis_dual_right_properties.is_newly_assigned.Assign(1);
|
||||||
}
|
}
|
||||||
shared_memory->system_properties.use_directional_buttons.Assign(1);
|
shared_memory->system_properties.use_directional_buttons.Assign(1);
|
||||||
shared_memory->system_properties.is_vertical.Assign(1);
|
shared_memory->system_properties.is_vertical.Assign(1);
|
||||||
|
@ -209,6 +213,7 @@ void Controller_NPad::InitNewlyAddedController(Core::HID::NpadIdType npad_id) {
|
||||||
shared_memory->system_properties.is_horizontal.Assign(1);
|
shared_memory->system_properties.is_horizontal.Assign(1);
|
||||||
shared_memory->system_properties.use_minus.Assign(1);
|
shared_memory->system_properties.use_minus.Assign(1);
|
||||||
shared_memory->applet_nfc_xcd.applet_footer.type = AppletFooterUiType::JoyLeftHorizontal;
|
shared_memory->applet_nfc_xcd.applet_footer.type = AppletFooterUiType::JoyLeftHorizontal;
|
||||||
|
shared_memory->sixaxis_left_properties.is_newly_assigned.Assign(1);
|
||||||
break;
|
break;
|
||||||
case Core::HID::NpadStyleIndex::JoyconRight:
|
case Core::HID::NpadStyleIndex::JoyconRight:
|
||||||
shared_memory->style_tag.joycon_right.Assign(1);
|
shared_memory->style_tag.joycon_right.Assign(1);
|
||||||
|
@ -216,6 +221,7 @@ void Controller_NPad::InitNewlyAddedController(Core::HID::NpadIdType npad_id) {
|
||||||
shared_memory->system_properties.is_horizontal.Assign(1);
|
shared_memory->system_properties.is_horizontal.Assign(1);
|
||||||
shared_memory->system_properties.use_plus.Assign(1);
|
shared_memory->system_properties.use_plus.Assign(1);
|
||||||
shared_memory->applet_nfc_xcd.applet_footer.type = AppletFooterUiType::JoyRightHorizontal;
|
shared_memory->applet_nfc_xcd.applet_footer.type = AppletFooterUiType::JoyRightHorizontal;
|
||||||
|
shared_memory->sixaxis_right_properties.is_newly_assigned.Assign(1);
|
||||||
break;
|
break;
|
||||||
case Core::HID::NpadStyleIndex::GameCube:
|
case Core::HID::NpadStyleIndex::GameCube:
|
||||||
shared_memory->style_tag.gamecube.Assign(1);
|
shared_memory->style_tag.gamecube.Assign(1);
|
||||||
|
@ -226,6 +232,7 @@ void Controller_NPad::InitNewlyAddedController(Core::HID::NpadIdType npad_id) {
|
||||||
case Core::HID::NpadStyleIndex::Pokeball:
|
case Core::HID::NpadStyleIndex::Pokeball:
|
||||||
shared_memory->style_tag.palma.Assign(1);
|
shared_memory->style_tag.palma.Assign(1);
|
||||||
shared_memory->device_type.palma.Assign(1);
|
shared_memory->device_type.palma.Assign(1);
|
||||||
|
shared_memory->sixaxis_fullkey_properties.is_newly_assigned.Assign(1);
|
||||||
break;
|
break;
|
||||||
case Core::HID::NpadStyleIndex::NES:
|
case Core::HID::NpadStyleIndex::NES:
|
||||||
shared_memory->style_tag.lark.Assign(1);
|
shared_memory->style_tag.lark.Assign(1);
|
||||||
|
@ -997,6 +1004,12 @@ ResultCode Controller_NPad::DisconnectNpad(Core::HID::NpadIdType npad_id) {
|
||||||
shared_memory->device_type.raw = 0;
|
shared_memory->device_type.raw = 0;
|
||||||
shared_memory->system_properties.raw = 0;
|
shared_memory->system_properties.raw = 0;
|
||||||
shared_memory->button_properties.raw = 0;
|
shared_memory->button_properties.raw = 0;
|
||||||
|
shared_memory->sixaxis_fullkey_properties.raw = 0;
|
||||||
|
shared_memory->sixaxis_handheld_properties.raw = 0;
|
||||||
|
shared_memory->sixaxis_dual_left_properties.raw = 0;
|
||||||
|
shared_memory->sixaxis_dual_right_properties.raw = 0;
|
||||||
|
shared_memory->sixaxis_left_properties.raw = 0;
|
||||||
|
shared_memory->sixaxis_right_properties.raw = 0;
|
||||||
shared_memory->battery_level_dual = 0;
|
shared_memory->battery_level_dual = 0;
|
||||||
shared_memory->battery_level_left = 0;
|
shared_memory->battery_level_left = 0;
|
||||||
shared_memory->battery_level_right = 0;
|
shared_memory->battery_level_right = 0;
|
||||||
|
@ -1069,8 +1082,8 @@ ResultCode Controller_NPad::IsFirmwareUpdateAvailableForSixAxisSensor(
|
||||||
return is_valid;
|
return is_valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't support joycon firmware updates
|
const auto& sixaxis_properties = GetSixaxisProperties(sixaxis_handle);
|
||||||
is_firmware_available = false;
|
is_firmware_available = sixaxis_properties.is_firmware_update_available != 0;
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1130,6 +1143,20 @@ ResultCode Controller_NPad::GetSixAxisSensorIcInformation(
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ResultCode Controller_NPad::ResetIsSixAxisSensorDeviceNewlyAssigned(
|
||||||
|
const Core::HID::SixAxisSensorHandle& sixaxis_handle) {
|
||||||
|
const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle);
|
||||||
|
if (is_valid.IsError()) {
|
||||||
|
LOG_ERROR(Service_HID, "Invalid handle, error_code={}", is_valid.raw);
|
||||||
|
return is_valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& sixaxis_properties = GetSixaxisProperties(sixaxis_handle);
|
||||||
|
sixaxis_properties.is_newly_assigned.Assign(0);
|
||||||
|
|
||||||
|
return ResultSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
ResultCode Controller_NPad::SetSixAxisEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle,
|
ResultCode Controller_NPad::SetSixAxisEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle,
|
||||||
bool sixaxis_status) {
|
bool sixaxis_status) {
|
||||||
const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle);
|
const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle);
|
||||||
|
@ -1477,6 +1504,52 @@ const Controller_NPad::NpadControllerData& Controller_NPad::GetControllerFromNpa
|
||||||
return controller_data[npad_index];
|
return controller_data[npad_index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Core::HID::SixAxisSensorProperties& Controller_NPad::GetSixaxisProperties(
|
||||||
|
const Core::HID::SixAxisSensorHandle& sixaxis_handle) {
|
||||||
|
auto& controller = GetControllerFromHandle(sixaxis_handle);
|
||||||
|
switch (sixaxis_handle.npad_type) {
|
||||||
|
case Core::HID::NpadStyleIndex::ProController:
|
||||||
|
case Core::HID::NpadStyleIndex::Pokeball:
|
||||||
|
return controller.shared_memory->sixaxis_fullkey_properties;
|
||||||
|
case Core::HID::NpadStyleIndex::Handheld:
|
||||||
|
return controller.shared_memory->sixaxis_handheld_properties;
|
||||||
|
case Core::HID::NpadStyleIndex::JoyconDual:
|
||||||
|
if (sixaxis_handle.device_index == Core::HID::DeviceIndex::Left) {
|
||||||
|
return controller.shared_memory->sixaxis_dual_left_properties;
|
||||||
|
}
|
||||||
|
return controller.shared_memory->sixaxis_dual_right_properties;
|
||||||
|
case Core::HID::NpadStyleIndex::JoyconLeft:
|
||||||
|
return controller.shared_memory->sixaxis_left_properties;
|
||||||
|
case Core::HID::NpadStyleIndex::JoyconRight:
|
||||||
|
return controller.shared_memory->sixaxis_right_properties;
|
||||||
|
default:
|
||||||
|
return controller.shared_memory->sixaxis_fullkey_properties;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const Core::HID::SixAxisSensorProperties& Controller_NPad::GetSixaxisProperties(
|
||||||
|
const Core::HID::SixAxisSensorHandle& sixaxis_handle) const {
|
||||||
|
const auto& controller = GetControllerFromHandle(sixaxis_handle);
|
||||||
|
switch (sixaxis_handle.npad_type) {
|
||||||
|
case Core::HID::NpadStyleIndex::ProController:
|
||||||
|
case Core::HID::NpadStyleIndex::Pokeball:
|
||||||
|
return controller.shared_memory->sixaxis_fullkey_properties;
|
||||||
|
case Core::HID::NpadStyleIndex::Handheld:
|
||||||
|
return controller.shared_memory->sixaxis_handheld_properties;
|
||||||
|
case Core::HID::NpadStyleIndex::JoyconDual:
|
||||||
|
if (sixaxis_handle.device_index == Core::HID::DeviceIndex::Left) {
|
||||||
|
return controller.shared_memory->sixaxis_dual_left_properties;
|
||||||
|
}
|
||||||
|
return controller.shared_memory->sixaxis_dual_right_properties;
|
||||||
|
case Core::HID::NpadStyleIndex::JoyconLeft:
|
||||||
|
return controller.shared_memory->sixaxis_left_properties;
|
||||||
|
case Core::HID::NpadStyleIndex::JoyconRight:
|
||||||
|
return controller.shared_memory->sixaxis_right_properties;
|
||||||
|
default:
|
||||||
|
return controller.shared_memory->sixaxis_fullkey_properties;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Controller_NPad::SixaxisParameters& Controller_NPad::GetSixaxisState(
|
Controller_NPad::SixaxisParameters& Controller_NPad::GetSixaxisState(
|
||||||
const Core::HID::SixAxisSensorHandle& sixaxis_handle) {
|
const Core::HID::SixAxisSensorHandle& sixaxis_handle) {
|
||||||
auto& controller = GetControllerFromHandle(sixaxis_handle);
|
auto& controller = GetControllerFromHandle(sixaxis_handle);
|
||||||
|
|
|
@ -161,6 +161,8 @@ public:
|
||||||
ResultCode GetSixAxisSensorIcInformation(
|
ResultCode GetSixAxisSensorIcInformation(
|
||||||
const Core::HID::SixAxisSensorHandle& sixaxis_handle,
|
const Core::HID::SixAxisSensorHandle& sixaxis_handle,
|
||||||
Core::HID::SixAxisSensorIcInformation& ic_information) const;
|
Core::HID::SixAxisSensorIcInformation& ic_information) const;
|
||||||
|
ResultCode ResetIsSixAxisSensorDeviceNewlyAssigned(
|
||||||
|
const Core::HID::SixAxisSensorHandle& sixaxis_handle);
|
||||||
ResultCode SetSixAxisEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle,
|
ResultCode SetSixAxisEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle,
|
||||||
bool sixaxis_status);
|
bool sixaxis_status);
|
||||||
ResultCode IsSixAxisSensorFusionEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle,
|
ResultCode IsSixAxisSensorFusionEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle,
|
||||||
|
@ -464,9 +466,13 @@ private:
|
||||||
NpadLuciaType lucia_type{};
|
NpadLuciaType lucia_type{};
|
||||||
NpadLagonType lagon_type{};
|
NpadLagonType lagon_type{};
|
||||||
NpadLagerType lager_type{};
|
NpadLagerType lager_type{};
|
||||||
// FW 13.x Investigate there is some sort of bitflag related to joycons
|
Core::HID::SixAxisSensorProperties sixaxis_fullkey_properties;
|
||||||
INSERT_PADDING_BYTES(0x4);
|
Core::HID::SixAxisSensorProperties sixaxis_handheld_properties;
|
||||||
INSERT_PADDING_BYTES(0xc08); // Unknown
|
Core::HID::SixAxisSensorProperties sixaxis_dual_left_properties;
|
||||||
|
Core::HID::SixAxisSensorProperties sixaxis_dual_right_properties;
|
||||||
|
Core::HID::SixAxisSensorProperties sixaxis_left_properties;
|
||||||
|
Core::HID::SixAxisSensorProperties sixaxis_right_properties;
|
||||||
|
INSERT_PADDING_BYTES(0xc06); // Unknown
|
||||||
};
|
};
|
||||||
static_assert(sizeof(NpadInternalState) == 0x5000, "NpadInternalState is an invalid size");
|
static_assert(sizeof(NpadInternalState) == 0x5000, "NpadInternalState is an invalid size");
|
||||||
|
|
||||||
|
@ -539,6 +545,10 @@ private:
|
||||||
NpadControllerData& GetControllerFromNpadIdType(Core::HID::NpadIdType npad_id);
|
NpadControllerData& GetControllerFromNpadIdType(Core::HID::NpadIdType npad_id);
|
||||||
const NpadControllerData& GetControllerFromNpadIdType(Core::HID::NpadIdType npad_id) const;
|
const NpadControllerData& GetControllerFromNpadIdType(Core::HID::NpadIdType npad_id) const;
|
||||||
|
|
||||||
|
Core::HID::SixAxisSensorProperties& GetSixaxisProperties(
|
||||||
|
const Core::HID::SixAxisSensorHandle& device_handle);
|
||||||
|
const Core::HID::SixAxisSensorProperties& GetSixaxisProperties(
|
||||||
|
const Core::HID::SixAxisSensorHandle& device_handle) const;
|
||||||
SixaxisParameters& GetSixaxisState(const Core::HID::SixAxisSensorHandle& device_handle);
|
SixaxisParameters& GetSixaxisState(const Core::HID::SixAxisSensorHandle& device_handle);
|
||||||
const SixaxisParameters& GetSixaxisState(
|
const SixaxisParameters& GetSixaxisState(
|
||||||
const Core::HID::SixAxisSensorHandle& device_handle) const;
|
const Core::HID::SixAxisSensorHandle& device_handle) const;
|
||||||
|
|
|
@ -262,7 +262,7 @@ Hid::Hid(Core::System& system_)
|
||||||
{86, nullptr, "StoreSixAxisSensorCalibrationParameter"},
|
{86, nullptr, "StoreSixAxisSensorCalibrationParameter"},
|
||||||
{87, &Hid::LoadSixAxisSensorCalibrationParameter, "LoadSixAxisSensorCalibrationParameter"},
|
{87, &Hid::LoadSixAxisSensorCalibrationParameter, "LoadSixAxisSensorCalibrationParameter"},
|
||||||
{88, &Hid::GetSixAxisSensorIcInformation, "GetSixAxisSensorIcInformation"},
|
{88, &Hid::GetSixAxisSensorIcInformation, "GetSixAxisSensorIcInformation"},
|
||||||
{89, nullptr, "ResetIsSixAxisSensorDeviceNewlyAssigned"},
|
{89, &Hid::ResetIsSixAxisSensorDeviceNewlyAssigned, "ResetIsSixAxisSensorDeviceNewlyAssigned"},
|
||||||
{91, &Hid::ActivateGesture, "ActivateGesture"},
|
{91, &Hid::ActivateGesture, "ActivateGesture"},
|
||||||
{100, &Hid::SetSupportedNpadStyleSet, "SetSupportedNpadStyleSet"},
|
{100, &Hid::SetSupportedNpadStyleSet, "SetSupportedNpadStyleSet"},
|
||||||
{101, &Hid::GetSupportedNpadStyleSet, "GetSupportedNpadStyleSet"},
|
{101, &Hid::GetSupportedNpadStyleSet, "GetSupportedNpadStyleSet"},
|
||||||
|
@ -930,6 +930,31 @@ void Hid::GetSixAxisSensorIcInformation(Kernel::HLERequestContext& ctx) {
|
||||||
rb.Push(result);
|
rb.Push(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Hid::ResetIsSixAxisSensorDeviceNewlyAssigned(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
struct Parameters {
|
||||||
|
Core::HID::SixAxisSensorHandle sixaxis_handle;
|
||||||
|
INSERT_PADDING_WORDS_NOINIT(1);
|
||||||
|
u64 applet_resource_user_id;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
|
||||||
|
|
||||||
|
const auto parameters{rp.PopRaw<Parameters>()};
|
||||||
|
|
||||||
|
auto& controller = GetAppletResource()->GetController<Controller_NPad>(HidController::NPad);
|
||||||
|
const auto result =
|
||||||
|
controller.ResetIsSixAxisSensorDeviceNewlyAssigned(parameters.sixaxis_handle);
|
||||||
|
|
||||||
|
LOG_WARNING(
|
||||||
|
Service_HID,
|
||||||
|
"(STUBBED) called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
|
||||||
|
parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
|
||||||
|
parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(result);
|
||||||
|
}
|
||||||
|
|
||||||
void Hid::ActivateGesture(Kernel::HLERequestContext& ctx) {
|
void Hid::ActivateGesture(Kernel::HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
struct Parameters {
|
struct Parameters {
|
||||||
|
|
|
@ -117,6 +117,7 @@ private:
|
||||||
void IsSixAxisSensorUnalteredPassthroughEnabled(Kernel::HLERequestContext& ctx);
|
void IsSixAxisSensorUnalteredPassthroughEnabled(Kernel::HLERequestContext& ctx);
|
||||||
void LoadSixAxisSensorCalibrationParameter(Kernel::HLERequestContext& ctx);
|
void LoadSixAxisSensorCalibrationParameter(Kernel::HLERequestContext& ctx);
|
||||||
void GetSixAxisSensorIcInformation(Kernel::HLERequestContext& ctx);
|
void GetSixAxisSensorIcInformation(Kernel::HLERequestContext& ctx);
|
||||||
|
void ResetIsSixAxisSensorDeviceNewlyAssigned(Kernel::HLERequestContext& ctx);
|
||||||
void ActivateGesture(Kernel::HLERequestContext& ctx);
|
void ActivateGesture(Kernel::HLERequestContext& ctx);
|
||||||
void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);
|
void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);
|
||||||
void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);
|
void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);
|
||||||
|
|
Loading…
Reference in a new issue