early-access version 3295
This commit is contained in:
		| @@ -1,7 +1,7 @@ | ||||
| yuzu emulator early access | ||||
| ============= | ||||
|  | ||||
| This is the source code for early-access 3294. | ||||
| This is the source code for early-access 3295. | ||||
|  | ||||
| ## Legal Notice | ||||
|  | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								dist/yuzu.ico
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dist/yuzu.ico
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 23 KiB | 
							
								
								
									
										2
									
								
								dist/yuzu.svg
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								dist/yuzu.svg
									
									
									
									
										vendored
									
									
								
							| @@ -1 +1 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 612.15 680.17"><defs><style>.cls-1{fill:#c6c6c6;}.cls-2{fill:#ffdc00;}</style></defs><title>newAsset 7</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><g id="g823"><g id="right"><g id="g827"><g id="g833"><path id="path835" class="cls-1" d="M340.08,136V680.17c150.26,0,272.07-121.81,272.07-272.07S490.34,136,340.08,136m53.14,59.6a219.06,219.06,0,0,1,0,424.94V195.63"/></g></g></g><g id="left"><g id="g839"><g id="g845"><path id="path847" class="cls-2" d="M272.07,0C121.81,0,0,121.81,0,272.07S121.81,544.13,272.07,544.13ZM218.93,59.6V484.54A219,219,0,0,1,117.26,117.26,217.44,217.44,0,0,1,218.93,59.6"/></g></g></g></g></g></g></svg> | ||||
| <svg id="svg815" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 614.4 682.67"><defs><style>.cls-1{fill:none;}.cls-2{clip-path:url(#clip-path);}.cls-3{fill:#ff3c28;}.cls-4{fill:#0ab9e6;}</style><clipPath id="clip-path"><rect class="cls-1" x="-43" y="-46.67" width="699.6" height="777.33"/></clipPath></defs><title>Artboard 1</title><g id="g823"><g id="right"><g class="cls-2"><g id="g827"><g id="g833"><path id="path835" class="cls-3" d="M340.81,138V682.08c150.26,0,272.06-121.81,272.06-272.06S491.07,138,340.81,138M394,197.55a219.06,219.06,0,0,1,0,424.94V197.55"/></g></g></g></g><g id="left"><g class="cls-2"><g id="g839"><g id="g845"><path id="path847" class="cls-4" d="M272.79,1.92C122.53,1.92.73,123.73.73,274s121.8,272.07,272.06,272.07ZM219.65,61.51v425A219,219,0,0,1,118,119.18,217.51,217.51,0,0,1,219.65,61.51"/></g></g></g></g></g></svg> | ||||
| Before Width: | Height: | Size: 717 B After Width: | Height: | Size: 889 B | 
| @@ -51,8 +51,6 @@ enum class PollingMode { | ||||
|     NFC, | ||||
|     // Enable infrared camera polling | ||||
|     IR, | ||||
|     // Enable ring controller polling | ||||
|     Ring, | ||||
| }; | ||||
|  | ||||
| enum class CameraFormat { | ||||
| @@ -64,22 +62,21 @@ enum class CameraFormat { | ||||
|     None, | ||||
| }; | ||||
|  | ||||
| // Different results that can happen from a device request | ||||
| enum class DriverResult { | ||||
|     Success, | ||||
|     WrongReply, | ||||
|     Timeout, | ||||
|     UnsupportedControllerType, | ||||
|     HandleInUse, | ||||
|     ErrorReadingData, | ||||
|     ErrorWritingData, | ||||
|     NoDeviceDetected, | ||||
|     InvalidHandle, | ||||
| // Vibration reply from the controller | ||||
| enum class VibrationError { | ||||
|     None, | ||||
|     NotSupported, | ||||
|     Disabled, | ||||
|     Unknown, | ||||
| }; | ||||
|  | ||||
| // Polling mode reply from the controller | ||||
| enum class PollingError { | ||||
|     None, | ||||
|     NotSupported, | ||||
|     Unknown, | ||||
| }; | ||||
|  | ||||
| // Nfc reply from the controller | ||||
| enum class NfcState { | ||||
|     Success, | ||||
| @@ -93,6 +90,13 @@ enum class NfcState { | ||||
|     Unknown, | ||||
| }; | ||||
|  | ||||
| // Ir camera reply from the controller | ||||
| enum class CameraError { | ||||
|     None, | ||||
|     NotSupported, | ||||
|     Unknown, | ||||
| }; | ||||
|  | ||||
| // Hint for amplification curve to be used | ||||
| enum class VibrationAmplificationType { | ||||
|     Linear, | ||||
| @@ -186,8 +190,6 @@ struct TouchStatus { | ||||
| struct BodyColorStatus { | ||||
|     u32 body{}; | ||||
|     u32 buttons{}; | ||||
|     u32 left_grip{}; | ||||
|     u32 right_grip{}; | ||||
| }; | ||||
|  | ||||
| // HD rumble data | ||||
| @@ -226,31 +228,17 @@ enum class ButtonNames { | ||||
|     Engine, | ||||
|     // This will display the button by value instead of the button name | ||||
|     Value, | ||||
|  | ||||
|     // Joycon button names | ||||
|     ButtonLeft, | ||||
|     ButtonRight, | ||||
|     ButtonDown, | ||||
|     ButtonUp, | ||||
|     TriggerZ, | ||||
|     TriggerR, | ||||
|     TriggerL, | ||||
|     ButtonA, | ||||
|     ButtonB, | ||||
|     ButtonX, | ||||
|     ButtonY, | ||||
|     ButtonPlus, | ||||
|     ButtonMinus, | ||||
|     ButtonHome, | ||||
|     ButtonCapture, | ||||
|     ButtonStickL, | ||||
|     ButtonStickR, | ||||
|     TriggerL, | ||||
|     TriggerZL, | ||||
|     TriggerSL, | ||||
|     TriggerR, | ||||
|     TriggerZR, | ||||
|     TriggerSR, | ||||
|  | ||||
|     // GC button names | ||||
|     TriggerZ, | ||||
|     ButtonStart, | ||||
|  | ||||
|     // DS4 button names | ||||
| @@ -331,24 +319,22 @@ class OutputDevice { | ||||
| public: | ||||
|     virtual ~OutputDevice() = default; | ||||
|  | ||||
|     virtual DriverResult SetLED([[maybe_unused]] const LedStatus& led_status) { | ||||
|         return DriverResult::NotSupported; | ||||
|     } | ||||
|     virtual void SetLED([[maybe_unused]] const LedStatus& led_status) {} | ||||
|  | ||||
|     virtual DriverResult SetVibration([[maybe_unused]] const VibrationStatus& vibration_status) { | ||||
|         return DriverResult::NotSupported; | ||||
|     virtual VibrationError SetVibration([[maybe_unused]] const VibrationStatus& vibration_status) { | ||||
|         return VibrationError::NotSupported; | ||||
|     } | ||||
|  | ||||
|     virtual bool IsVibrationEnabled() { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     virtual DriverResult SetPollingMode([[maybe_unused]] PollingMode polling_mode) { | ||||
|         return DriverResult::NotSupported; | ||||
|     virtual PollingError SetPollingMode([[maybe_unused]] PollingMode polling_mode) { | ||||
|         return PollingError::NotSupported; | ||||
|     } | ||||
|  | ||||
|     virtual DriverResult SetCameraFormat([[maybe_unused]] CameraFormat camera_format) { | ||||
|         return DriverResult::NotSupported; | ||||
|     virtual CameraError SetCameraFormat([[maybe_unused]] CameraFormat camera_format) { | ||||
|         return CameraError::NotSupported; | ||||
|     } | ||||
|  | ||||
|     virtual NfcState SupportsNfc() const { | ||||
|   | ||||
| @@ -480,7 +480,6 @@ struct Values { | ||||
|  | ||||
|     Setting<bool> enable_raw_input{false, "enable_raw_input"}; | ||||
|     Setting<bool> controller_navigation{true, "controller_navigation"}; | ||||
|     Setting<bool> enable_joycon_driver{true, "enable_joycon_driver"}; | ||||
|  | ||||
|     SwitchableSetting<bool> vibration_enabled{true, "vibration_enabled"}; | ||||
|     SwitchableSetting<bool> enable_accurate_vibrations{false, "enable_accurate_vibrations"}; | ||||
|   | ||||
| @@ -30,7 +30,7 @@ std::string ToUpper(std::string str) { | ||||
|     return str; | ||||
| } | ||||
|  | ||||
| std::string StringFromBuffer(std::span<const u8> data) { | ||||
| std::string StringFromBuffer(const std::vector<u8>& data) { | ||||
|     return std::string(data.begin(), std::find(data.begin(), data.end(), '\0')); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,6 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <cstddef> | ||||
| #include <span> | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include "common/common_types.h" | ||||
| @@ -18,7 +17,7 @@ namespace Common { | ||||
| /// Make a string uppercase | ||||
| [[nodiscard]] std::string ToUpper(std::string str); | ||||
|  | ||||
| [[nodiscard]] std::string StringFromBuffer(std::span<const u8> data); | ||||
| [[nodiscard]] std::string StringFromBuffer(const std::vector<u8>& data); | ||||
|  | ||||
| [[nodiscard]] std::string StripSpaces(const std::string& s); | ||||
| [[nodiscard]] std::string StripQuotes(const std::string& s); | ||||
|   | ||||
| @@ -93,7 +93,6 @@ void EmulatedController::ReloadFromSettings() { | ||||
|         motion_params[index] = Common::ParamPackage(player.motions[index]); | ||||
|     } | ||||
|  | ||||
|     controller.color_values = {}; | ||||
|     controller.colors_state.fullkey = { | ||||
|         .body = GetNpadColor(player.body_color_left), | ||||
|         .button = GetNpadColor(player.button_color_left), | ||||
| @@ -107,8 +106,6 @@ void EmulatedController::ReloadFromSettings() { | ||||
|         .button = GetNpadColor(player.button_color_right), | ||||
|     }; | ||||
|  | ||||
|     ring_params[0] = Common::ParamPackage(Settings::values.ringcon_analogs); | ||||
|  | ||||
|     // Other or debug controller should always be a pro controller | ||||
|     if (npad_id_type != NpadIdType::Other) { | ||||
|         SetNpadStyleIndex(MapSettingsTypeToNPad(player.controller_type)); | ||||
| @@ -135,28 +132,18 @@ void EmulatedController::LoadDevices() { | ||||
|     trigger_params[LeftIndex] = button_params[Settings::NativeButton::ZL]; | ||||
|     trigger_params[RightIndex] = button_params[Settings::NativeButton::ZR]; | ||||
|  | ||||
|     color_params[LeftIndex] = left_joycon; | ||||
|     color_params[RightIndex] = right_joycon; | ||||
|     color_params[LeftIndex].Set("color", true); | ||||
|     color_params[RightIndex].Set("color", true); | ||||
|  | ||||
|     battery_params[LeftIndex] = left_joycon; | ||||
|     battery_params[RightIndex] = right_joycon; | ||||
|     battery_params[LeftIndex].Set("battery", true); | ||||
|     battery_params[RightIndex].Set("battery", true); | ||||
|  | ||||
|     camera_params[0] = right_joycon; | ||||
|     camera_params[0].Set("camera", true); | ||||
|     camera_params[1] = Common::ParamPackage{"engine:camera,camera:1"}; | ||||
|     ring_params[1] = Common::ParamPackage{"engine:joycon,axis_x:100,axis_y:101"}; | ||||
|     nfc_params[0] = Common::ParamPackage{"engine:virtual_amiibo,nfc:1"}; | ||||
|     nfc_params[1] = right_joycon; | ||||
|     nfc_params[1].Set("nfc", true); | ||||
|     camera_params = Common::ParamPackage{"engine:camera,camera:1"}; | ||||
|     nfc_params = Common::ParamPackage{"engine:virtual_amiibo,nfc:1"}; | ||||
|  | ||||
|     output_params[LeftIndex] = left_joycon; | ||||
|     output_params[RightIndex] = right_joycon; | ||||
|     output_params[2] = camera_params[1]; | ||||
|     output_params[3] = nfc_params[0]; | ||||
|     output_params[2] = camera_params; | ||||
|     output_params[3] = nfc_params; | ||||
|     output_params[LeftIndex].Set("output", true); | ||||
|     output_params[RightIndex].Set("output", true); | ||||
|     output_params[2].Set("output", true); | ||||
| @@ -172,11 +159,8 @@ void EmulatedController::LoadDevices() { | ||||
|                            Common::Input::CreateInputDevice); | ||||
|     std::ranges::transform(battery_params, battery_devices.begin(), | ||||
|                            Common::Input::CreateInputDevice); | ||||
|     std::ranges::transform(color_params, color_devices.begin(), Common::Input::CreateInputDevice); | ||||
|     std::ranges::transform(camera_params, camera_devices.begin(), Common::Input::CreateInputDevice); | ||||
|     std::ranges::transform(ring_params, ring_analog_devices.begin(), | ||||
|                            Common::Input::CreateInputDevice); | ||||
|     std::ranges::transform(nfc_params, nfc_devices.begin(), Common::Input::CreateInputDevice); | ||||
|     camera_devices = Common::Input::CreateInputDevice(camera_params); | ||||
|     nfc_devices = Common::Input::CreateInputDevice(nfc_params); | ||||
|     std::ranges::transform(output_params, output_devices.begin(), | ||||
|                            Common::Input::CreateOutputDevice); | ||||
|  | ||||
| @@ -338,19 +322,6 @@ void EmulatedController::ReloadInput() { | ||||
|         battery_devices[index]->ForceUpdate(); | ||||
|     } | ||||
|  | ||||
|     for (std::size_t index = 0; index < color_devices.size(); ++index) { | ||||
|         if (!color_devices[index]) { | ||||
|             continue; | ||||
|         } | ||||
|         color_devices[index]->SetCallback({ | ||||
|             .on_change = | ||||
|                 [this, index](const Common::Input::CallbackStatus& callback) { | ||||
|                     SetColors(callback, index); | ||||
|                 }, | ||||
|         }); | ||||
|         color_devices[index]->ForceUpdate(); | ||||
|     } | ||||
|  | ||||
|     for (std::size_t index = 0; index < motion_devices.size(); ++index) { | ||||
|         if (!motion_devices[index]) { | ||||
|             continue; | ||||
| @@ -364,37 +335,22 @@ void EmulatedController::ReloadInput() { | ||||
|         motion_devices[index]->ForceUpdate(); | ||||
|     } | ||||
|  | ||||
|     for (std::size_t index = 0; index < camera_devices.size(); ++index) { | ||||
|         if (!camera_devices[index]) { | ||||
|             continue; | ||||
|         } | ||||
|         camera_devices[index]->SetCallback({ | ||||
|     if (camera_devices) { | ||||
|         camera_devices->SetCallback({ | ||||
|             .on_change = | ||||
|                 [this](const Common::Input::CallbackStatus& callback) { SetCamera(callback); }, | ||||
|         }); | ||||
|         camera_devices[index]->ForceUpdate(); | ||||
|         camera_devices->ForceUpdate(); | ||||
|     } | ||||
|  | ||||
|     for (std::size_t index = 0; index < ring_analog_devices.size(); ++index) { | ||||
|         if (!ring_analog_devices[index]) { | ||||
|             continue; | ||||
|     if (nfc_devices) { | ||||
|         if (npad_id_type == NpadIdType::Handheld || npad_id_type == NpadIdType::Player1) { | ||||
|             nfc_devices->SetCallback({ | ||||
|                 .on_change = | ||||
|                     [this](const Common::Input::CallbackStatus& callback) { SetNfc(callback); }, | ||||
|             }); | ||||
|             nfc_devices->ForceUpdate(); | ||||
|         } | ||||
|         ring_analog_devices[index]->SetCallback({ | ||||
|             .on_change = | ||||
|                 [this](const Common::Input::CallbackStatus& callback) { SetRingAnalog(callback); }, | ||||
|         }); | ||||
|         ring_analog_devices[index]->ForceUpdate(); | ||||
|     } | ||||
|  | ||||
|     for (std::size_t index = 0; index < nfc_devices.size(); ++index) { | ||||
|         if (!nfc_devices[index]) { | ||||
|             continue; | ||||
|         } | ||||
|         nfc_devices[index]->SetCallback({ | ||||
|             .on_change = | ||||
|                 [this](const Common::Input::CallbackStatus& callback) { SetNfc(callback); }, | ||||
|         }); | ||||
|         nfc_devices[index]->ForceUpdate(); | ||||
|     } | ||||
|  | ||||
|     // Register TAS devices. No need to force update | ||||
| @@ -464,9 +420,6 @@ void EmulatedController::UnloadInput() { | ||||
|     for (auto& battery : battery_devices) { | ||||
|         battery.reset(); | ||||
|     } | ||||
|     for (auto& color : color_devices) { | ||||
|         color.reset(); | ||||
|     } | ||||
|     for (auto& output : output_devices) { | ||||
|         output.reset(); | ||||
|     } | ||||
| @@ -482,15 +435,8 @@ void EmulatedController::UnloadInput() { | ||||
|     for (auto& stick : virtual_stick_devices) { | ||||
|         stick.reset(); | ||||
|     } | ||||
|     for (auto& camera : camera_devices) { | ||||
|         camera.reset(); | ||||
|     } | ||||
|     for (auto& ring : ring_analog_devices) { | ||||
|         ring.reset(); | ||||
|     } | ||||
|     for (auto& nfc : nfc_devices) { | ||||
|         nfc.reset(); | ||||
|     } | ||||
|     camera_devices.reset(); | ||||
|     nfc_devices.reset(); | ||||
| } | ||||
|  | ||||
| void EmulatedController::EnableConfiguration() { | ||||
| @@ -502,11 +448,6 @@ void EmulatedController::EnableConfiguration() { | ||||
| void EmulatedController::DisableConfiguration() { | ||||
|     is_configuring = false; | ||||
|  | ||||
|     // Get Joycon colors before turning on the controller | ||||
|     for (const auto& color_device : color_devices) { | ||||
|         color_device->ForceUpdate(); | ||||
|     } | ||||
|  | ||||
|     // Apply temporary npad type to the real controller | ||||
|     if (tmp_npad_type != npad_type) { | ||||
|         if (is_connected) { | ||||
| @@ -560,9 +501,6 @@ void EmulatedController::SaveCurrentConfig() { | ||||
|     for (std::size_t index = 0; index < player.motions.size(); ++index) { | ||||
|         player.motions[index] = motion_params[index].Serialize(); | ||||
|     } | ||||
|     if (npad_id_type == NpadIdType::Player1) { | ||||
|         Settings::values.ringcon_analogs = ring_params[0].Serialize(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void EmulatedController::RestoreConfig() { | ||||
| @@ -977,58 +915,6 @@ void EmulatedController::SetMotion(const Common::Input::CallbackStatus& callback | ||||
|     TriggerOnChange(ControllerTriggerType::Motion, true); | ||||
| } | ||||
|  | ||||
| void EmulatedController::SetColors(const Common::Input::CallbackStatus& callback, | ||||
|                                    std::size_t index) { | ||||
|     if (index >= controller.color_values.size()) { | ||||
|         return; | ||||
|     } | ||||
|     std::unique_lock lock{mutex}; | ||||
|     controller.color_values[index] = TransformToColor(callback); | ||||
|  | ||||
|     if (is_configuring) { | ||||
|         lock.unlock(); | ||||
|         TriggerOnChange(ControllerTriggerType::Color, false); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if (controller.color_values[index].body == 0) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     controller.colors_state.fullkey = { | ||||
|         .body = GetNpadColor(controller.color_values[index].body), | ||||
|         .button = GetNpadColor(controller.color_values[index].buttons), | ||||
|     }; | ||||
|     if (npad_type == NpadStyleIndex::ProController) { | ||||
|         controller.colors_state.left = { | ||||
|             .body = GetNpadColor(controller.color_values[index].left_grip), | ||||
|             .button = GetNpadColor(controller.color_values[index].buttons), | ||||
|         }; | ||||
|         controller.colors_state.right = { | ||||
|             .body = GetNpadColor(controller.color_values[index].right_grip), | ||||
|             .button = GetNpadColor(controller.color_values[index].buttons), | ||||
|         }; | ||||
|     } else { | ||||
|         switch (index) { | ||||
|         case LeftIndex: | ||||
|             controller.colors_state.left = { | ||||
|                 .body = GetNpadColor(controller.color_values[index].body), | ||||
|                 .button = GetNpadColor(controller.color_values[index].buttons), | ||||
|             }; | ||||
|             break; | ||||
|         case RightIndex: | ||||
|             controller.colors_state.right = { | ||||
|                 .body = GetNpadColor(controller.color_values[index].body), | ||||
|                 .button = GetNpadColor(controller.color_values[index].buttons), | ||||
|             }; | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     lock.unlock(); | ||||
|     TriggerOnChange(ControllerTriggerType::Color, true); | ||||
| } | ||||
|  | ||||
| void EmulatedController::SetBattery(const Common::Input::CallbackStatus& callback, | ||||
|                                     std::size_t index) { | ||||
|     if (index >= controller.battery_values.size()) { | ||||
| @@ -1119,24 +1005,6 @@ void EmulatedController::SetCamera(const Common::Input::CallbackStatus& callback | ||||
|     TriggerOnChange(ControllerTriggerType::IrSensor, true); | ||||
| } | ||||
|  | ||||
| void EmulatedController::SetRingAnalog(const Common::Input::CallbackStatus& callback) { | ||||
|     std::unique_lock lock{mutex}; | ||||
|     const auto force_value = TransformToStick(callback); | ||||
|  | ||||
|     controller.ring_analog_value = force_value.x; | ||||
|  | ||||
|     if (is_configuring) { | ||||
|         lock.unlock(); | ||||
|         TriggerOnChange(ControllerTriggerType::RingController, false); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     controller.ring_analog_state.force = force_value.x.value; | ||||
|  | ||||
|     lock.unlock(); | ||||
|     TriggerOnChange(ControllerTriggerType::RingController, true); | ||||
| } | ||||
|  | ||||
| void EmulatedController::SetNfc(const Common::Input::CallbackStatus& callback) { | ||||
|     std::unique_lock lock{mutex}; | ||||
|     controller.nfc_values = TransformToNfc(callback); | ||||
| @@ -1185,7 +1053,7 @@ bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue v | ||||
|         .type = type, | ||||
|     }; | ||||
|     return output_devices[device_index]->SetVibration(status) == | ||||
|            Common::Input::DriverResult::Success; | ||||
|            Common::Input::VibrationError::None; | ||||
| } | ||||
|  | ||||
| bool EmulatedController::IsVibrationEnabled(std::size_t device_index) { | ||||
| @@ -1207,8 +1075,7 @@ bool EmulatedController::IsVibrationEnabled(std::size_t device_index) { | ||||
|     return output_devices[device_index]->IsVibrationEnabled(); | ||||
| } | ||||
|  | ||||
| Common::Input::DriverResult EmulatedController::SetPollingMode( | ||||
|     Common::Input::PollingMode polling_mode) { | ||||
| bool EmulatedController::SetPollingMode(Common::Input::PollingMode polling_mode) { | ||||
|     LOG_INFO(Service_HID, "Set polling mode {}", polling_mode); | ||||
|     auto& output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; | ||||
|     auto& nfc_output_device = output_devices[3]; | ||||
| @@ -1216,11 +1083,8 @@ Common::Input::DriverResult EmulatedController::SetPollingMode( | ||||
|     const auto virtual_nfc_result = nfc_output_device->SetPollingMode(polling_mode); | ||||
|     const auto mapped_nfc_result = output_device->SetPollingMode(polling_mode); | ||||
|  | ||||
|     if (virtual_nfc_result == Common::Input::DriverResult::Success) { | ||||
|         return virtual_nfc_result; | ||||
|     } | ||||
|  | ||||
|     return mapped_nfc_result; | ||||
|     return virtual_nfc_result == Common::Input::PollingError::None || | ||||
|            mapped_nfc_result == Common::Input::PollingError::None; | ||||
| } | ||||
|  | ||||
| bool EmulatedController::SetCameraFormat( | ||||
| @@ -1231,22 +1095,13 @@ bool EmulatedController::SetCameraFormat( | ||||
|     auto& camera_output_device = output_devices[2]; | ||||
|  | ||||
|     if (right_output_device->SetCameraFormat(static_cast<Common::Input::CameraFormat>( | ||||
|             camera_format)) == Common::Input::DriverResult::Success) { | ||||
|             camera_format)) == Common::Input::CameraError::None) { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     // Fallback to Qt camera if native device doesn't have support | ||||
|     return camera_output_device->SetCameraFormat(static_cast<Common::Input::CameraFormat>( | ||||
|                camera_format)) == Common::Input::DriverResult::Success; | ||||
| } | ||||
|  | ||||
| Common::ParamPackage EmulatedController::GetRingParam() const { | ||||
|     return ring_params[0]; | ||||
| } | ||||
|  | ||||
| void EmulatedController::SetRingParam(Common::ParamPackage param) { | ||||
|     ring_params[0] = std::move(param); | ||||
|     ReloadInput(); | ||||
|                camera_format)) == Common::Input::CameraError::None; | ||||
| } | ||||
|  | ||||
| bool EmulatedController::HasNfc() const { | ||||
| @@ -1540,10 +1395,6 @@ CameraValues EmulatedController::GetCameraValues() const { | ||||
|     return controller.camera_values; | ||||
| } | ||||
|  | ||||
| RingAnalogValue EmulatedController::GetRingSensorValues() const { | ||||
|     return controller.ring_analog_value; | ||||
| } | ||||
|  | ||||
| HomeButtonState EmulatedController::GetHomeButtons() const { | ||||
|     std::scoped_lock lock{mutex}; | ||||
|     if (is_configuring) { | ||||
| @@ -1637,10 +1488,6 @@ const CameraState& EmulatedController::GetCamera() const { | ||||
|     return controller.camera_state; | ||||
| } | ||||
|  | ||||
| RingSensorForce EmulatedController::GetRingSensorForce() const { | ||||
|     return controller.ring_analog_state; | ||||
| } | ||||
|  | ||||
| const NfcState& EmulatedController::GetNfc() const { | ||||
|     std::scoped_lock lock{mutex}; | ||||
|     return controller.nfc_state; | ||||
|   | ||||
| @@ -35,27 +35,19 @@ using ControllerMotionDevices = | ||||
|     std::array<std::unique_ptr<Common::Input::InputDevice>, Settings::NativeMotion::NumMotions>; | ||||
| using TriggerDevices = | ||||
|     std::array<std::unique_ptr<Common::Input::InputDevice>, Settings::NativeTrigger::NumTriggers>; | ||||
| using ColorDevices = | ||||
|     std::array<std::unique_ptr<Common::Input::InputDevice>, max_emulated_controllers>; | ||||
| using BatteryDevices = | ||||
|     std::array<std::unique_ptr<Common::Input::InputDevice>, max_emulated_controllers>; | ||||
| using CameraDevices = | ||||
|     std::array<std::unique_ptr<Common::Input::InputDevice>, max_emulated_controllers>; | ||||
| using RingAnalogDevices = | ||||
|     std::array<std::unique_ptr<Common::Input::InputDevice>, max_emulated_controllers>; | ||||
| using NfcDevices = | ||||
|     std::array<std::unique_ptr<Common::Input::InputDevice>, max_emulated_controllers>; | ||||
| using CameraDevices = std::unique_ptr<Common::Input::InputDevice>; | ||||
| using NfcDevices = std::unique_ptr<Common::Input::InputDevice>; | ||||
| using OutputDevices = std::array<std::unique_ptr<Common::Input::OutputDevice>, output_devices_size>; | ||||
|  | ||||
| using ButtonParams = std::array<Common::ParamPackage, Settings::NativeButton::NumButtons>; | ||||
| using StickParams = std::array<Common::ParamPackage, Settings::NativeAnalog::NumAnalogs>; | ||||
| using ControllerMotionParams = std::array<Common::ParamPackage, Settings::NativeMotion::NumMotions>; | ||||
| using TriggerParams = std::array<Common::ParamPackage, Settings::NativeTrigger::NumTriggers>; | ||||
| using ColorParams = std::array<Common::ParamPackage, max_emulated_controllers>; | ||||
| using BatteryParams = std::array<Common::ParamPackage, max_emulated_controllers>; | ||||
| using CameraParams = std::array<Common::ParamPackage, max_emulated_controllers>; | ||||
| using RingAnalogParams = std::array<Common::ParamPackage, max_emulated_controllers>; | ||||
| using NfcParams = std::array<Common::ParamPackage, max_emulated_controllers>; | ||||
| using CameraParams = Common::ParamPackage; | ||||
| using NfcParams = Common::ParamPackage; | ||||
| using OutputParams = std::array<Common::ParamPackage, output_devices_size>; | ||||
|  | ||||
| using ButtonValues = std::array<Common::Input::ButtonStatus, Settings::NativeButton::NumButtons>; | ||||
| @@ -66,7 +58,6 @@ using ControllerMotionValues = std::array<ControllerMotionInfo, Settings::Native | ||||
| using ColorValues = std::array<Common::Input::BodyColorStatus, max_emulated_controllers>; | ||||
| using BatteryValues = std::array<Common::Input::BatteryStatus, max_emulated_controllers>; | ||||
| using CameraValues = Common::Input::CameraStatus; | ||||
| using RingAnalogValue = Common::Input::AnalogStatus; | ||||
| using NfcValues = Common::Input::NfcStatus; | ||||
| using VibrationValues = std::array<Common::Input::VibrationStatus, max_emulated_controllers>; | ||||
|  | ||||
| @@ -93,10 +84,6 @@ struct CameraState { | ||||
|     std::size_t sample{}; | ||||
| }; | ||||
|  | ||||
| struct RingSensorForce { | ||||
|     f32 force; | ||||
| }; | ||||
|  | ||||
| struct NfcState { | ||||
|     Common::Input::NfcState state{}; | ||||
|     std::vector<u8> data{}; | ||||
| @@ -129,7 +116,6 @@ struct ControllerStatus { | ||||
|     BatteryValues battery_values{}; | ||||
|     VibrationValues vibration_values{}; | ||||
|     CameraValues camera_values{}; | ||||
|     RingAnalogValue ring_analog_value{}; | ||||
|     NfcValues nfc_values{}; | ||||
|  | ||||
|     // Data for HID serices | ||||
| @@ -143,7 +129,6 @@ struct ControllerStatus { | ||||
|     ControllerColors colors_state{}; | ||||
|     BatteryLevelState battery_state{}; | ||||
|     CameraState camera_state{}; | ||||
|     RingSensorForce ring_analog_state{}; | ||||
|     NfcState nfc_state{}; | ||||
| }; | ||||
|  | ||||
| @@ -156,7 +141,6 @@ enum class ControllerTriggerType { | ||||
|     Battery, | ||||
|     Vibration, | ||||
|     IrSensor, | ||||
|     RingController, | ||||
|     Nfc, | ||||
|     Connected, | ||||
|     Disconnected, | ||||
| @@ -310,9 +294,6 @@ public: | ||||
|     /// Returns the latest camera status from the controller with parameters | ||||
|     CameraValues GetCameraValues() const; | ||||
|  | ||||
|     /// Returns the latest status of analog input from the ring sensor with parameters | ||||
|     RingAnalogValue GetRingSensorValues() const; | ||||
|  | ||||
|     /// Returns the latest status of button input for the hid::HomeButton service | ||||
|     HomeButtonState GetHomeButtons() const; | ||||
|  | ||||
| @@ -343,9 +324,6 @@ public: | ||||
|     /// Returns the latest camera status from the controller | ||||
|     const CameraState& GetCamera() const; | ||||
|  | ||||
|     /// Returns the latest ringcon force sensor value | ||||
|     RingSensorForce GetRingSensorForce() const; | ||||
|  | ||||
|     /// Returns the latest ntag status from the controller | ||||
|     const NfcState& GetNfc() const; | ||||
|  | ||||
| @@ -364,9 +342,9 @@ public: | ||||
|     /** | ||||
|      * Sets the desired data to be polled from a controller | ||||
|      * @param polling_mode type of input desired buttons, gyro, nfc, ir, etc. | ||||
|      * @return driver result from this command | ||||
|      * @return true if SetPollingMode was successfull | ||||
|      */ | ||||
|     Common::Input::DriverResult SetPollingMode(Common::Input::PollingMode polling_mode); | ||||
|     bool SetPollingMode(Common::Input::PollingMode polling_mode); | ||||
|  | ||||
|     /** | ||||
|      * Sets the desired camera format to be polled from a controller | ||||
| @@ -375,15 +353,6 @@ public: | ||||
|      */ | ||||
|     bool SetCameraFormat(Core::IrSensor::ImageTransferProcessorFormat camera_format); | ||||
|  | ||||
|     // Returns the current mapped ring device | ||||
|     Common::ParamPackage GetRingParam() const; | ||||
|  | ||||
|     /** | ||||
|      * Updates the current mapped ring device | ||||
|      * @param param ParamPackage with ring sensor data to be mapped | ||||
|      */ | ||||
|     void SetRingParam(Common::ParamPackage param); | ||||
|  | ||||
|     /// Returns true if the device has nfc support | ||||
|     bool HasNfc() const; | ||||
|  | ||||
| @@ -463,17 +432,10 @@ private: | ||||
|      */ | ||||
|     void SetMotion(const Common::Input::CallbackStatus& callback, std::size_t index); | ||||
|  | ||||
|     /** | ||||
|      * Updates the color status of the controller | ||||
|      * @param callback A CallbackStatus containing the color status | ||||
|      * @param index color ID of the to be updated | ||||
|      */ | ||||
|     void SetColors(const Common::Input::CallbackStatus& callback, std::size_t index); | ||||
|  | ||||
|     /** | ||||
|      * Updates the battery status of the controller | ||||
|      * @param callback A CallbackStatus containing the battery status | ||||
|      * @param index battery ID of the to be updated | ||||
|      * @param index Button ID of the to be updated | ||||
|      */ | ||||
|     void SetBattery(const Common::Input::CallbackStatus& callback, std::size_t index); | ||||
|  | ||||
| @@ -483,12 +445,6 @@ private: | ||||
|      */ | ||||
|     void SetCamera(const Common::Input::CallbackStatus& callback); | ||||
|  | ||||
|     /** | ||||
|      * Updates the ring analog sensor status of the ring controller | ||||
|      * @param callback A CallbackStatus containing the force status | ||||
|      */ | ||||
|     void SetRingAnalog(const Common::Input::CallbackStatus& callback); | ||||
|  | ||||
|     /** | ||||
|      * Updates the nfc status of the controller | ||||
|      * @param callback A CallbackStatus containing the nfc status | ||||
| @@ -528,9 +484,7 @@ private: | ||||
|     ControllerMotionParams motion_params; | ||||
|     TriggerParams trigger_params; | ||||
|     BatteryParams battery_params; | ||||
|     ColorParams color_params; | ||||
|     CameraParams camera_params; | ||||
|     RingAnalogParams ring_params; | ||||
|     NfcParams nfc_params; | ||||
|     OutputParams output_params; | ||||
|  | ||||
| @@ -539,9 +493,7 @@ private: | ||||
|     ControllerMotionDevices motion_devices; | ||||
|     TriggerDevices trigger_devices; | ||||
|     BatteryDevices battery_devices; | ||||
|     ColorDevices color_devices; | ||||
|     CameraDevices camera_devices; | ||||
|     RingAnalogDevices ring_analog_devices; | ||||
|     NfcDevices nfc_devices; | ||||
|     OutputDevices output_devices; | ||||
|  | ||||
|   | ||||
| @@ -14,6 +14,7 @@ EmulatedDevices::EmulatedDevices() = default; | ||||
| EmulatedDevices::~EmulatedDevices() = default; | ||||
|  | ||||
| void EmulatedDevices::ReloadFromSettings() { | ||||
|     ring_params = Common::ParamPackage(Settings::values.ringcon_analogs); | ||||
|     ReloadInput(); | ||||
| } | ||||
|  | ||||
| @@ -65,6 +66,8 @@ void EmulatedDevices::ReloadInput() { | ||||
|         key_index++; | ||||
|     } | ||||
|  | ||||
|     ring_analog_device = Common::Input::CreateInputDevice(ring_params); | ||||
|  | ||||
|     for (std::size_t index = 0; index < mouse_button_devices.size(); ++index) { | ||||
|         if (!mouse_button_devices[index]) { | ||||
|             continue; | ||||
| @@ -119,6 +122,13 @@ void EmulatedDevices::ReloadInput() { | ||||
|                 }, | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     if (ring_analog_device) { | ||||
|         ring_analog_device->SetCallback({ | ||||
|             .on_change = | ||||
|                 [this](const Common::Input::CallbackStatus& callback) { SetRingAnalog(callback); }, | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void EmulatedDevices::UnloadInput() { | ||||
| @@ -135,6 +145,7 @@ void EmulatedDevices::UnloadInput() { | ||||
|     for (auto& button : keyboard_modifier_devices) { | ||||
|         button.reset(); | ||||
|     } | ||||
|     ring_analog_device.reset(); | ||||
| } | ||||
|  | ||||
| void EmulatedDevices::EnableConfiguration() { | ||||
| @@ -154,6 +165,7 @@ void EmulatedDevices::SaveCurrentConfig() { | ||||
|     if (!is_configuring) { | ||||
|         return; | ||||
|     } | ||||
|     Settings::values.ringcon_analogs = ring_params.Serialize(); | ||||
| } | ||||
|  | ||||
| void EmulatedDevices::RestoreConfig() { | ||||
| @@ -163,6 +175,15 @@ void EmulatedDevices::RestoreConfig() { | ||||
|     ReloadFromSettings(); | ||||
| } | ||||
|  | ||||
| Common::ParamPackage EmulatedDevices::GetRingParam() const { | ||||
|     return ring_params; | ||||
| } | ||||
|  | ||||
| void EmulatedDevices::SetRingParam(Common::ParamPackage param) { | ||||
|     ring_params = std::move(param); | ||||
|     ReloadInput(); | ||||
| } | ||||
|  | ||||
| void EmulatedDevices::SetKeyboardButton(const Common::Input::CallbackStatus& callback, | ||||
|                                         std::size_t index) { | ||||
|     if (index >= device_status.keyboard_values.size()) { | ||||
| @@ -409,6 +430,23 @@ void EmulatedDevices::SetMouseStick(const Common::Input::CallbackStatus& callbac | ||||
|     TriggerOnChange(DeviceTriggerType::Mouse); | ||||
| } | ||||
|  | ||||
| void EmulatedDevices::SetRingAnalog(const Common::Input::CallbackStatus& callback) { | ||||
|     std::lock_guard lock{mutex}; | ||||
|     const auto force_value = TransformToStick(callback); | ||||
|  | ||||
|     device_status.ring_analog_value = force_value.x; | ||||
|  | ||||
|     if (is_configuring) { | ||||
|         device_status.ring_analog_value = {}; | ||||
|         TriggerOnChange(DeviceTriggerType::RingController); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     device_status.ring_analog_state.force = force_value.x.value; | ||||
|  | ||||
|     TriggerOnChange(DeviceTriggerType::RingController); | ||||
| } | ||||
|  | ||||
| KeyboardValues EmulatedDevices::GetKeyboardValues() const { | ||||
|     std::scoped_lock lock{mutex}; | ||||
|     return device_status.keyboard_values; | ||||
| @@ -424,6 +462,10 @@ MouseButtonValues EmulatedDevices::GetMouseButtonsValues() const { | ||||
|     return device_status.mouse_button_values; | ||||
| } | ||||
|  | ||||
| RingAnalogValue EmulatedDevices::GetRingSensorValues() const { | ||||
|     return device_status.ring_analog_value; | ||||
| } | ||||
|  | ||||
| KeyboardKey EmulatedDevices::GetKeyboard() const { | ||||
|     std::scoped_lock lock{mutex}; | ||||
|     return device_status.keyboard_state; | ||||
| @@ -449,6 +491,10 @@ AnalogStickState EmulatedDevices::GetMouseWheel() const { | ||||
|     return device_status.mouse_wheel_state; | ||||
| } | ||||
|  | ||||
| RingSensorForce EmulatedDevices::GetRingSensorForce() const { | ||||
|     return device_status.ring_analog_state; | ||||
| } | ||||
|  | ||||
| void EmulatedDevices::TriggerOnChange(DeviceTriggerType type) { | ||||
|     std::scoped_lock lock{callback_mutex}; | ||||
|     for (const auto& poller_pair : callback_list) { | ||||
|   | ||||
| @@ -26,9 +26,11 @@ using MouseButtonDevices = std::array<std::unique_ptr<Common::Input::InputDevice | ||||
| using MouseAnalogDevices = std::array<std::unique_ptr<Common::Input::InputDevice>, | ||||
|                                       Settings::NativeMouseWheel::NumMouseWheels>; | ||||
| using MouseStickDevice = std::unique_ptr<Common::Input::InputDevice>; | ||||
| using RingAnalogDevice = std::unique_ptr<Common::Input::InputDevice>; | ||||
|  | ||||
| using MouseButtonParams = | ||||
|     std::array<Common::ParamPackage, Settings::NativeMouseButton::NumMouseButtons>; | ||||
| using RingAnalogParams = Common::ParamPackage; | ||||
|  | ||||
| using KeyboardValues = | ||||
|     std::array<Common::Input::ButtonStatus, Settings::NativeKeyboard::NumKeyboardKeys>; | ||||
| @@ -39,12 +41,17 @@ using MouseButtonValues = | ||||
| using MouseAnalogValues = | ||||
|     std::array<Common::Input::AnalogStatus, Settings::NativeMouseWheel::NumMouseWheels>; | ||||
| using MouseStickValue = Common::Input::TouchStatus; | ||||
| using RingAnalogValue = Common::Input::AnalogStatus; | ||||
|  | ||||
| struct MousePosition { | ||||
|     f32 x; | ||||
|     f32 y; | ||||
| }; | ||||
|  | ||||
| struct RingSensorForce { | ||||
|     f32 force; | ||||
| }; | ||||
|  | ||||
| struct DeviceStatus { | ||||
|     // Data from input_common | ||||
|     KeyboardValues keyboard_values{}; | ||||
| @@ -52,6 +59,7 @@ struct DeviceStatus { | ||||
|     MouseButtonValues mouse_button_values{}; | ||||
|     MouseAnalogValues mouse_analog_values{}; | ||||
|     MouseStickValue mouse_stick_value{}; | ||||
|     RingAnalogValue ring_analog_value{}; | ||||
|  | ||||
|     // Data for HID serices | ||||
|     KeyboardKey keyboard_state{}; | ||||
| @@ -59,6 +67,7 @@ struct DeviceStatus { | ||||
|     MouseButton mouse_button_state{}; | ||||
|     MousePosition mouse_position_state{}; | ||||
|     AnalogStickState mouse_wheel_state{}; | ||||
|     RingSensorForce ring_analog_state{}; | ||||
| }; | ||||
|  | ||||
| enum class DeviceTriggerType { | ||||
| @@ -129,6 +138,9 @@ public: | ||||
|     /// Returns the latest status of button input from the mouse with parameters | ||||
|     MouseButtonValues GetMouseButtonsValues() const; | ||||
|  | ||||
|     /// Returns the latest status of analog input from the ring sensor with parameters | ||||
|     RingAnalogValue GetRingSensorValues() const; | ||||
|  | ||||
|     /// Returns the latest status of button input from the keyboard | ||||
|     KeyboardKey GetKeyboard() const; | ||||
|  | ||||
| @@ -144,6 +156,9 @@ public: | ||||
|     /// Returns the latest mouse wheel change | ||||
|     AnalogStickState GetMouseWheel() const; | ||||
|  | ||||
|     /// Returns the latest ringcon force sensor value | ||||
|     RingSensorForce GetRingSensorForce() const; | ||||
|  | ||||
|     /** | ||||
|      * Adds a callback to the list of events | ||||
|      * @param update_callback InterfaceUpdateCallback that will be triggered | ||||
| @@ -209,11 +224,14 @@ private: | ||||
|  | ||||
|     bool is_configuring{false}; | ||||
|  | ||||
|     RingAnalogParams ring_params; | ||||
|  | ||||
|     KeyboardDevices keyboard_devices; | ||||
|     KeyboardModifierDevices keyboard_modifier_devices; | ||||
|     MouseButtonDevices mouse_button_devices; | ||||
|     MouseAnalogDevices mouse_analog_devices; | ||||
|     MouseStickDevice mouse_stick_device; | ||||
|     RingAnalogDevice ring_analog_device; | ||||
|  | ||||
|     mutable std::mutex mutex; | ||||
|     mutable std::mutex callback_mutex; | ||||
|   | ||||
| @@ -304,18 +304,6 @@ Common::Input::NfcStatus TransformToNfc(const Common::Input::CallbackStatus& cal | ||||
|     return nfc; | ||||
| } | ||||
|  | ||||
| Common::Input::BodyColorStatus TransformToColor(const Common::Input::CallbackStatus& callback) { | ||||
|     switch (callback.type) { | ||||
|     case Common::Input::InputType::Color: | ||||
|         return callback.color_status; | ||||
|         break; | ||||
|     default: | ||||
|         LOG_ERROR(Input, "Conversion from type {} to color not implemented", callback.type); | ||||
|         return {}; | ||||
|         break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void SanitizeAnalog(Common::Input::AnalogStatus& analog, bool clamp_value) { | ||||
|     const auto& properties = analog.properties; | ||||
|     float& raw_value = analog.raw_value; | ||||
|   | ||||
| @@ -88,18 +88,10 @@ Common::Input::CameraStatus TransformToCamera(const Common::Input::CallbackStatu | ||||
|  * Converts raw input data into a valid nfc status. | ||||
|  * | ||||
|  * @param callback Supported callbacks: Nfc. | ||||
|  * @return A valid data tag vector. | ||||
|  * @return A valid CameraObject object. | ||||
|  */ | ||||
| Common::Input::NfcStatus TransformToNfc(const Common::Input::CallbackStatus& callback); | ||||
|  | ||||
| /** | ||||
|  * Converts raw input data into a valid color status. | ||||
|  * | ||||
|  * @param callback Supported callbacks: Color. | ||||
|  * @return A valid Color object. | ||||
|  */ | ||||
| Common::Input::BodyColorStatus TransformToColor(const Common::Input::CallbackStatus& callback); | ||||
|  | ||||
| /** | ||||
|  * Converts raw analog data into a valid analog value | ||||
|  * @param analog An analog object containing raw data and properties | ||||
|   | ||||
| @@ -11,7 +11,6 @@ | ||||
| #include "common/common_funcs.h" | ||||
| #include "common/common_types.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "common/scratch_buffer.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/hle_ipc.h" | ||||
| #include "core/hle/kernel/k_auto_object.h" | ||||
| @@ -326,7 +325,7 @@ Result HLERequestContext::WriteToOutgoingCommandBuffer(KThread& requesting_threa | ||||
|     return ResultSuccess; | ||||
| } | ||||
|  | ||||
| std::vector<u8> HLERequestContext::ReadBufferCopy(std::size_t buffer_index) const { | ||||
| std::vector<u8> HLERequestContext::ReadBuffer(std::size_t buffer_index) const { | ||||
|     const bool is_buffer_a{BufferDescriptorA().size() > buffer_index && | ||||
|                            BufferDescriptorA()[buffer_index].Size()}; | ||||
|     if (is_buffer_a) { | ||||
| @@ -346,33 +345,6 @@ std::vector<u8> HLERequestContext::ReadBufferCopy(std::size_t buffer_index) cons | ||||
|     } | ||||
| } | ||||
|  | ||||
| std::span<const u8> HLERequestContext::ReadBuffer(std::size_t buffer_index) const { | ||||
|     static thread_local std::array<Common::ScratchBuffer<u8>, 2> read_buffer_a; | ||||
|     static thread_local std::array<Common::ScratchBuffer<u8>, 2> read_buffer_x; | ||||
|  | ||||
|     const bool is_buffer_a{BufferDescriptorA().size() > buffer_index && | ||||
|                            BufferDescriptorA()[buffer_index].Size()}; | ||||
|     if (is_buffer_a) { | ||||
|         ASSERT_OR_EXECUTE_MSG( | ||||
|             BufferDescriptorA().size() > buffer_index, { return {}; }, | ||||
|             "BufferDescriptorA invalid buffer_index {}", buffer_index); | ||||
|         auto& read_buffer = read_buffer_a[buffer_index]; | ||||
|         read_buffer.resize_destructive(BufferDescriptorA()[buffer_index].Size()); | ||||
|         memory.ReadBlock(BufferDescriptorA()[buffer_index].Address(), read_buffer.data(), | ||||
|                          read_buffer.size()); | ||||
|         return read_buffer; | ||||
|     } else { | ||||
|         ASSERT_OR_EXECUTE_MSG( | ||||
|             BufferDescriptorX().size() > buffer_index, { return {}; }, | ||||
|             "BufferDescriptorX invalid buffer_index {}", buffer_index); | ||||
|         auto& read_buffer = read_buffer_x[buffer_index]; | ||||
|         read_buffer.resize_destructive(BufferDescriptorX()[buffer_index].Size()); | ||||
|         memory.ReadBlock(BufferDescriptorX()[buffer_index].Address(), read_buffer.data(), | ||||
|                          read_buffer.size()); | ||||
|         return read_buffer; | ||||
|     } | ||||
| } | ||||
|  | ||||
| std::size_t HLERequestContext::WriteBuffer(const void* buffer, std::size_t size, | ||||
|                                            std::size_t buffer_index) const { | ||||
|     if (size == 0) { | ||||
|   | ||||
| @@ -7,7 +7,6 @@ | ||||
| #include <functional> | ||||
| #include <memory> | ||||
| #include <optional> | ||||
| #include <span> | ||||
| #include <string> | ||||
| #include <type_traits> | ||||
| #include <vector> | ||||
| @@ -271,11 +270,8 @@ public: | ||||
|         return domain_message_header.has_value(); | ||||
|     } | ||||
|  | ||||
|     /// Helper function to get a span of a buffer using the appropriate buffer descriptor | ||||
|     [[nodiscard]] std::span<const u8> ReadBuffer(std::size_t buffer_index = 0) const; | ||||
|  | ||||
|     /// Helper function to read a copy of a buffer using the appropriate buffer descriptor | ||||
|     [[nodiscard]] std::vector<u8> ReadBufferCopy(std::size_t buffer_index = 0) const; | ||||
|     /// Helper function to read a buffer using the appropriate buffer descriptor | ||||
|     [[nodiscard]] std::vector<u8> ReadBuffer(std::size_t buffer_index = 0) const; | ||||
|  | ||||
|     /// Helper function to write a buffer using the appropriate buffer descriptor | ||||
|     std::size_t WriteBuffer(const void* buffer, std::size_t size, | ||||
|   | ||||
| @@ -1124,7 +1124,7 @@ void IStorageAccessor::Write(Kernel::HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|  | ||||
|     const u64 offset{rp.Pop<u64>()}; | ||||
|     const auto data{ctx.ReadBuffer()}; | ||||
|     const std::vector<u8> data{ctx.ReadBuffer()}; | ||||
|     const std::size_t size{std::min<u64>(data.size(), backing.GetSize() - offset)}; | ||||
|  | ||||
|     LOG_DEBUG(Service_AM, "called, offset={}, size={}", offset, size); | ||||
|   | ||||
| @@ -112,7 +112,7 @@ private: | ||||
|     void RequestUpdate(Kernel::HLERequestContext& ctx) { | ||||
|         LOG_TRACE(Service_Audio, "called"); | ||||
|  | ||||
|         const auto input{ctx.ReadBuffer(0)}; | ||||
|         std::vector<u8> input{ctx.ReadBuffer(0)}; | ||||
|  | ||||
|         // These buffers are written manually to avoid an issue with WriteBuffer throwing errors for | ||||
|         // checking size 0. Performance size is 0 for most games. | ||||
|   | ||||
| @@ -93,7 +93,7 @@ private: | ||||
|         ctx.WriteBuffer(samples); | ||||
|     } | ||||
|  | ||||
|     bool DecodeOpusData(u32& consumed, u32& sample_count, std::span<const u8> input, | ||||
|     bool DecodeOpusData(u32& consumed, u32& sample_count, const std::vector<u8>& input, | ||||
|                         std::vector<opus_int16>& output, u64* out_performance_time) const { | ||||
|         const auto start_time = std::chrono::steady_clock::now(); | ||||
|         const std::size_t raw_output_sz = output.size() * sizeof(opus_int16); | ||||
|   | ||||
| @@ -122,7 +122,7 @@ private: | ||||
|  | ||||
|     void ImportTicket(Kernel::HLERequestContext& ctx) { | ||||
|         const auto ticket = ctx.ReadBuffer(); | ||||
|         [[maybe_unused]] const auto cert = ctx.ReadBuffer(1); | ||||
|         const auto cert = ctx.ReadBuffer(1); | ||||
|  | ||||
|         if (ticket.size() < sizeof(Core::Crypto::Ticket)) { | ||||
|             LOG_ERROR(Service_ETicket, "The input buffer is not large enough!"); | ||||
|   | ||||
| @@ -190,7 +190,7 @@ private: | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         const auto data = ctx.ReadBuffer(); | ||||
|         const std::vector<u8> data = ctx.ReadBuffer(); | ||||
|  | ||||
|         ASSERT_MSG( | ||||
|             static_cast<s64>(data.size()) <= length, | ||||
| @@ -401,8 +401,11 @@ public: | ||||
|     } | ||||
|  | ||||
|     void RenameFile(Kernel::HLERequestContext& ctx) { | ||||
|         const std::string src_name = Common::StringFromBuffer(ctx.ReadBuffer(0)); | ||||
|         const std::string dst_name = Common::StringFromBuffer(ctx.ReadBuffer(1)); | ||||
|         std::vector<u8> buffer = ctx.ReadBuffer(0); | ||||
|         const std::string src_name = Common::StringFromBuffer(buffer); | ||||
|  | ||||
|         buffer = ctx.ReadBuffer(1); | ||||
|         const std::string dst_name = Common::StringFromBuffer(buffer); | ||||
|  | ||||
|         LOG_DEBUG(Service_FS, "called. file '{}' to file '{}'", src_name, dst_name); | ||||
|  | ||||
|   | ||||
| @@ -228,8 +228,7 @@ private: | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // TODO: Can this be a span? | ||||
|         control = ctx.ReadBufferCopy(); | ||||
|         control = ctx.ReadBuffer(); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(ResultSuccess); | ||||
|   | ||||
| @@ -272,8 +272,6 @@ void Controller_NPad::InitNewlyAddedController(Core::HID::NpadIdType npad_id) { | ||||
|         } | ||||
|         break; | ||||
|     case Core::HID::NpadStyleIndex::JoyconLeft: | ||||
|         shared_memory->fullkey_color.attribute = ColorAttribute::Ok; | ||||
|         shared_memory->fullkey_color.fullkey = body_colors.left; | ||||
|         shared_memory->joycon_color.attribute = ColorAttribute::Ok; | ||||
|         shared_memory->joycon_color.left = body_colors.left; | ||||
|         shared_memory->battery_level_dual = battery_level.left.battery_level; | ||||
| @@ -287,8 +285,6 @@ void Controller_NPad::InitNewlyAddedController(Core::HID::NpadIdType npad_id) { | ||||
|         shared_memory->sixaxis_left_properties.is_newly_assigned.Assign(1); | ||||
|         break; | ||||
|     case Core::HID::NpadStyleIndex::JoyconRight: | ||||
|         shared_memory->fullkey_color.attribute = ColorAttribute::Ok; | ||||
|         shared_memory->fullkey_color.fullkey = body_colors.right; | ||||
|         shared_memory->joycon_color.attribute = ColorAttribute::Ok; | ||||
|         shared_memory->joycon_color.right = body_colors.right; | ||||
|         shared_memory->battery_level_right = battery_level.right.battery_level; | ||||
| @@ -336,8 +332,6 @@ void Controller_NPad::InitNewlyAddedController(Core::HID::NpadIdType npad_id) { | ||||
|  | ||||
|     controller.is_connected = true; | ||||
|     controller.device->Connect(); | ||||
|     controller.device->SetLedPattern(); | ||||
|     controller.device->SetPollingMode(Common::Input::PollingMode::Active); | ||||
|     SignalStyleSetChangedEvent(npad_id); | ||||
|     WriteEmptyEntry(controller.shared_memory); | ||||
| } | ||||
| @@ -743,12 +737,11 @@ Core::HID::NpadStyleTag Controller_NPad::GetSupportedStyleSet() const { | ||||
|     return hid_core.GetSupportedStyleTag(); | ||||
| } | ||||
|  | ||||
| void Controller_NPad::SetSupportedNpadIdTypes(std::span<const u8> data) { | ||||
|     const auto length = data.size(); | ||||
| void Controller_NPad::SetSupportedNpadIdTypes(u8* data, std::size_t length) { | ||||
|     ASSERT(length > 0 && (length % sizeof(u32)) == 0); | ||||
|     supported_npad_id_types.clear(); | ||||
|     supported_npad_id_types.resize(length / sizeof(u32)); | ||||
|     std::memcpy(supported_npad_id_types.data(), data.data(), length); | ||||
|     std::memcpy(supported_npad_id_types.data(), data, length); | ||||
| } | ||||
|  | ||||
| void Controller_NPad::GetSupportedNpadIdTypes(u32* data, std::size_t max_length) { | ||||
|   | ||||
| @@ -6,7 +6,6 @@ | ||||
| #include <array> | ||||
| #include <atomic> | ||||
| #include <mutex> | ||||
| #include <span> | ||||
|  | ||||
| #include "common/bit_field.h" | ||||
| #include "common/common_types.h" | ||||
| @@ -96,7 +95,7 @@ public: | ||||
|     void SetSupportedStyleSet(Core::HID::NpadStyleTag style_set); | ||||
|     Core::HID::NpadStyleTag GetSupportedStyleSet() const; | ||||
|  | ||||
|     void SetSupportedNpadIdTypes(std::span<const u8> data); | ||||
|     void SetSupportedNpadIdTypes(u8* data, std::size_t length); | ||||
|     void GetSupportedNpadIdTypes(u32* data, std::size_t max_length); | ||||
|     std::size_t GetSupportedNpadIdTypesSize() const; | ||||
|  | ||||
|   | ||||
| @@ -1026,7 +1026,7 @@ void Hid::SetSupportedNpadIdType(Kernel::HLERequestContext& ctx) { | ||||
|     const auto applet_resource_user_id{rp.Pop<u64>()}; | ||||
|  | ||||
|     applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||||
|         .SetSupportedNpadIdTypes(ctx.ReadBuffer()); | ||||
|         .SetSupportedNpadIdTypes(ctx.ReadBuffer().data(), ctx.GetReadBufferSize()); | ||||
|  | ||||
|     LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | ||||
|  | ||||
| @@ -2104,7 +2104,7 @@ void Hid::WritePalmaRgbLedPatternEntry(Kernel::HLERequestContext& ctx) { | ||||
|     const auto connection_handle{rp.PopRaw<Controller_Palma::PalmaConnectionHandle>()}; | ||||
|     const auto unknown{rp.Pop<u64>()}; | ||||
|  | ||||
|     [[maybe_unused]] const auto buffer = ctx.ReadBuffer(); | ||||
|     const auto buffer = ctx.ReadBuffer(); | ||||
|  | ||||
|     LOG_WARNING(Service_HID, "(STUBBED) called, connection_handle={}, unknown={}", | ||||
|                 connection_handle.npad_id, unknown); | ||||
|   | ||||
| @@ -297,13 +297,13 @@ void HidBus::EnableExternalDevice(Kernel::HLERequestContext& ctx) { | ||||
|  | ||||
|     const auto parameters{rp.PopRaw<Parameters>()}; | ||||
|  | ||||
|     LOG_DEBUG(Service_HID, | ||||
|               "called, enable={}, abstracted_pad_id={}, bus_type={}, internal_index={}, " | ||||
|               "player_number={}, is_valid={}, inval={}, applet_resource_user_id{}", | ||||
|               parameters.enable, parameters.bus_handle.abstracted_pad_id, | ||||
|               parameters.bus_handle.bus_type, parameters.bus_handle.internal_index, | ||||
|               parameters.bus_handle.player_number, parameters.bus_handle.is_valid, parameters.inval, | ||||
|               parameters.applet_resource_user_id); | ||||
|     LOG_INFO(Service_HID, | ||||
|              "called, enable={}, abstracted_pad_id={}, bus_type={}, internal_index={}, " | ||||
|              "player_number={}, is_valid={}, inval={}, applet_resource_user_id{}", | ||||
|              parameters.enable, parameters.bus_handle.abstracted_pad_id, | ||||
|              parameters.bus_handle.bus_type, parameters.bus_handle.internal_index, | ||||
|              parameters.bus_handle.player_number, parameters.bus_handle.is_valid, parameters.inval, | ||||
|              parameters.applet_resource_user_id); | ||||
|  | ||||
|     const auto device_index = GetDeviceIndexFromHandle(parameters.bus_handle); | ||||
|  | ||||
| @@ -326,11 +326,11 @@ void HidBus::GetExternalDeviceId(Kernel::HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto bus_handle_{rp.PopRaw<BusHandle>()}; | ||||
|  | ||||
|     LOG_DEBUG(Service_HID, | ||||
|               "called, abstracted_pad_id={}, bus_type={}, internal_index={}, player_number={}, " | ||||
|               "is_valid={}", | ||||
|               bus_handle_.abstracted_pad_id, bus_handle_.bus_type, bus_handle_.internal_index, | ||||
|               bus_handle_.player_number, bus_handle_.is_valid); | ||||
|     LOG_INFO(Service_HID, | ||||
|              "called, abstracted_pad_id={}, bus_type={}, internal_index={}, player_number={}, " | ||||
|              "is_valid={}", | ||||
|              bus_handle_.abstracted_pad_id, bus_handle_.bus_type, bus_handle_.internal_index, | ||||
|              bus_handle_.player_number, bus_handle_.is_valid); | ||||
|  | ||||
|     const auto device_index = GetDeviceIndexFromHandle(bus_handle_); | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,6 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <array> | ||||
| #include <span> | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/result.h" | ||||
|  | ||||
| @@ -151,7 +150,7 @@ public: | ||||
|     } | ||||
|  | ||||
|     // Assigns a command from data | ||||
|     virtual bool SetCommand(std::span<const u8> data) { | ||||
|     virtual bool SetCommand(const std::vector<u8>& data) { | ||||
|         return {}; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later | ||||
|  | ||||
| #include "core/hid/emulated_controller.h" | ||||
| #include "core/hid/emulated_devices.h" | ||||
| #include "core/hid/hid_core.h" | ||||
| #include "core/hle/kernel/k_event.h" | ||||
| #include "core/hle/kernel/k_readable_event.h" | ||||
| @@ -12,18 +12,16 @@ namespace Service::HID { | ||||
| RingController::RingController(Core::HID::HIDCore& hid_core_, | ||||
|                                KernelHelpers::ServiceContext& service_context_) | ||||
|     : HidbusBase(service_context_) { | ||||
|     input = hid_core_.GetEmulatedController(Core::HID::NpadIdType::Player1); | ||||
|     input = hid_core_.GetEmulatedDevices(); | ||||
| } | ||||
|  | ||||
| RingController::~RingController() = default; | ||||
|  | ||||
| void RingController::OnInit() { | ||||
|     input->SetPollingMode(Common::Input::PollingMode::Ring); | ||||
|     return; | ||||
| } | ||||
|  | ||||
| void RingController::OnRelease() { | ||||
|     input->SetPollingMode(Common::Input::PollingMode::Active); | ||||
|     return; | ||||
| }; | ||||
|  | ||||
| @@ -114,7 +112,7 @@ std::vector<u8> RingController::GetReply() const { | ||||
|     } | ||||
| } | ||||
|  | ||||
| bool RingController::SetCommand(std::span<const u8> data) { | ||||
| bool RingController::SetCommand(const std::vector<u8>& data) { | ||||
|     if (data.size() < 4) { | ||||
|         LOG_ERROR(Service_HID, "Command size not supported {}", data.size()); | ||||
|         command = RingConCommands::Error; | ||||
|   | ||||
| @@ -4,13 +4,12 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <array> | ||||
| #include <span> | ||||
|  | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/service/hid/hidbus/hidbus_base.h" | ||||
|  | ||||
| namespace Core::HID { | ||||
| class EmulatedController; | ||||
| class EmulatedDevices; | ||||
| } // namespace Core::HID | ||||
|  | ||||
| namespace Service::HID { | ||||
| @@ -32,7 +31,7 @@ public: | ||||
|     u8 GetDeviceId() const override; | ||||
|  | ||||
|     // Assigns a command from data | ||||
|     bool SetCommand(std::span<const u8> data) override; | ||||
|     bool SetCommand(const std::vector<u8>& data) override; | ||||
|  | ||||
|     // Returns a reply from a command | ||||
|     std::vector<u8> GetReply() const override; | ||||
| @@ -249,6 +248,6 @@ private: | ||||
|         .zero = {.value = idle_value, .crc = 225}, | ||||
|     }; | ||||
|  | ||||
|     Core::HID::EmulatedController* input; | ||||
|     Core::HID::EmulatedDevices* input; | ||||
| }; | ||||
| } // namespace Service::HID | ||||
|   | ||||
| @@ -42,7 +42,7 @@ std::vector<u8> Starlink::GetReply() const { | ||||
|     return {}; | ||||
| } | ||||
|  | ||||
| bool Starlink::SetCommand(std::span<const u8> data) { | ||||
| bool Starlink::SetCommand(const std::vector<u8>& data) { | ||||
|     LOG_ERROR(Service_HID, "Command not implemented"); | ||||
|     return false; | ||||
| } | ||||
|   | ||||
| @@ -29,7 +29,7 @@ public: | ||||
|     u8 GetDeviceId() const override; | ||||
|  | ||||
|     // Assigns a command from data | ||||
|     bool SetCommand(std::span<const u8> data) override; | ||||
|     bool SetCommand(const std::vector<u8>& data) override; | ||||
|  | ||||
|     // Returns a reply from a command | ||||
|     std::vector<u8> GetReply() const override; | ||||
|   | ||||
| @@ -43,7 +43,7 @@ std::vector<u8> HidbusStubbed::GetReply() const { | ||||
|     return {}; | ||||
| } | ||||
|  | ||||
| bool HidbusStubbed::SetCommand(std::span<const u8> data) { | ||||
| bool HidbusStubbed::SetCommand(const std::vector<u8>& data) { | ||||
|     LOG_ERROR(Service_HID, "Command not implemented"); | ||||
|     return false; | ||||
| } | ||||
|   | ||||
| @@ -29,7 +29,7 @@ public: | ||||
|     u8 GetDeviceId() const override; | ||||
|  | ||||
|     // Assigns a command from data | ||||
|     bool SetCommand(std::span<const u8> data) override; | ||||
|     bool SetCommand(const std::vector<u8>& data) override; | ||||
|  | ||||
|     // Returns a reply from a command | ||||
|     std::vector<u8> GetReply() const override; | ||||
|   | ||||
| @@ -108,7 +108,6 @@ void IRS::StopImageProcessor(Kernel::HLERequestContext& ctx) { | ||||
|     auto result = IsIrCameraHandleValid(parameters.camera_handle); | ||||
|     if (result.IsSuccess()) { | ||||
|         // TODO: Stop Image processor | ||||
|         npad_device->SetPollingMode(Common::Input::PollingMode::Active); | ||||
|         result = ResultSuccess; | ||||
|     } | ||||
|  | ||||
| @@ -140,7 +139,6 @@ void IRS::RunMomentProcessor(Kernel::HLERequestContext& ctx) { | ||||
|         MakeProcessor<MomentProcessor>(parameters.camera_handle, device); | ||||
|         auto& image_transfer_processor = GetProcessor<MomentProcessor>(parameters.camera_handle); | ||||
|         image_transfer_processor.SetConfig(parameters.processor_config); | ||||
|         npad_device->SetPollingMode(Common::Input::PollingMode::IR); | ||||
|     } | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
| @@ -172,7 +170,6 @@ void IRS::RunClusteringProcessor(Kernel::HLERequestContext& ctx) { | ||||
|         auto& image_transfer_processor = | ||||
|             GetProcessor<ClusteringProcessor>(parameters.camera_handle); | ||||
|         image_transfer_processor.SetConfig(parameters.processor_config); | ||||
|         npad_device->SetPollingMode(Common::Input::PollingMode::IR); | ||||
|     } | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
| @@ -222,7 +219,6 @@ void IRS::RunImageTransferProcessor(Kernel::HLERequestContext& ctx) { | ||||
|             GetProcessor<ImageTransferProcessor>(parameters.camera_handle); | ||||
|         image_transfer_processor.SetConfig(parameters.processor_config); | ||||
|         image_transfer_processor.SetTransferMemoryPointer(transfer_memory); | ||||
|         npad_device->SetPollingMode(Common::Input::PollingMode::IR); | ||||
|     } | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
| @@ -298,7 +294,6 @@ void IRS::RunTeraPluginProcessor(Kernel::HLERequestContext& ctx) { | ||||
|         auto& image_transfer_processor = | ||||
|             GetProcessor<TeraPluginProcessor>(parameters.camera_handle); | ||||
|         image_transfer_processor.SetConfig(parameters.processor_config); | ||||
|         npad_device->SetPollingMode(Common::Input::PollingMode::IR); | ||||
|     } | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
| @@ -348,7 +343,6 @@ void IRS::RunPointingProcessor(Kernel::HLERequestContext& ctx) { | ||||
|         MakeProcessor<PointingProcessor>(camera_handle, device); | ||||
|         auto& image_transfer_processor = GetProcessor<PointingProcessor>(camera_handle); | ||||
|         image_transfer_processor.SetConfig(processor_config); | ||||
|         npad_device->SetPollingMode(Common::Input::PollingMode::IR); | ||||
|     } | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
| @@ -459,7 +453,6 @@ void IRS::RunImageTransferExProcessor(Kernel::HLERequestContext& ctx) { | ||||
|             GetProcessor<ImageTransferProcessor>(parameters.camera_handle); | ||||
|         image_transfer_processor.SetConfig(parameters.processor_config); | ||||
|         image_transfer_processor.SetTransferMemoryPointer(transfer_memory); | ||||
|         npad_device->SetPollingMode(Common::Input::PollingMode::IR); | ||||
|     } | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
| @@ -486,7 +479,6 @@ void IRS::RunIrLedProcessor(Kernel::HLERequestContext& ctx) { | ||||
|         MakeProcessor<IrLedProcessor>(camera_handle, device); | ||||
|         auto& image_transfer_processor = GetProcessor<IrLedProcessor>(camera_handle); | ||||
|         image_transfer_processor.SetConfig(processor_config); | ||||
|         npad_device->SetPollingMode(Common::Input::PollingMode::IR); | ||||
|     } | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
| @@ -512,7 +504,6 @@ void IRS::StopImageProcessorAsync(Kernel::HLERequestContext& ctx) { | ||||
|     auto result = IsIrCameraHandleValid(parameters.camera_handle); | ||||
|     if (result.IsSuccess()) { | ||||
|         // TODO: Stop image processor async | ||||
|         npad_device->SetPollingMode(Common::Input::PollingMode::Active); | ||||
|         result = ResultSuccess; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -62,7 +62,7 @@ public: | ||||
|         const auto parameters{rp.PopRaw<InputParameters>()}; | ||||
|  | ||||
|         // Optional input/output buffers | ||||
|         const auto input_buffer{ctx.CanReadBuffer() ? ctx.ReadBuffer() : std::span<const u8>()}; | ||||
|         std::vector<u8> input_buffer{ctx.CanReadBuffer() ? ctx.ReadBuffer() : std::vector<u8>()}; | ||||
|         std::vector<u8> output_buffer(ctx.CanWriteBuffer() ? ctx.GetWriteBufferSize() : 0); | ||||
|  | ||||
|         // Function call prototype: | ||||
| @@ -132,7 +132,7 @@ public: | ||||
|         const auto command{rp.PopRaw<u64>()}; | ||||
|  | ||||
|         // Optional input/output buffers | ||||
|         const auto input_buffer{ctx.CanReadBuffer() ? ctx.ReadBuffer() : std::span<const u8>()}; | ||||
|         std::vector<u8> input_buffer{ctx.CanReadBuffer() ? ctx.ReadBuffer() : std::vector<u8>()}; | ||||
|         std::vector<u8> output_buffer(ctx.CanWriteBuffer() ? ctx.GetWriteBufferSize() : 0); | ||||
|  | ||||
|         // Function call prototype: | ||||
|   | ||||
| @@ -427,7 +427,7 @@ public: | ||||
|     } | ||||
|  | ||||
|     void SetAdvertiseData(Kernel::HLERequestContext& ctx) { | ||||
|         const auto read_buffer = ctx.ReadBuffer(); | ||||
|         std::vector<u8> read_buffer = ctx.ReadBuffer(); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(lan_discovery.SetAdvertiseData(read_buffer)); | ||||
| @@ -479,7 +479,7 @@ public: | ||||
|                  parameters.security_config.passphrase_size, | ||||
|                  parameters.security_config.security_mode, parameters.local_communication_version); | ||||
|  | ||||
|         const auto read_buffer = ctx.ReadBuffer(); | ||||
|         const std::vector<u8> read_buffer = ctx.ReadBuffer(); | ||||
|         if (read_buffer.size() != sizeof(NetworkInfo)) { | ||||
|             LOG_ERROR(Frontend, "NetworkInfo doesn't match read_buffer size!"); | ||||
|             IPC::ResponseBuilder rb{ctx, 2}; | ||||
|   | ||||
| @@ -130,8 +130,7 @@ Result NfcDevice::StartDetection(NFP::TagProtocol allowed_protocol) { | ||||
|         return WrongDeviceState; | ||||
|     } | ||||
|  | ||||
|     if (npad_device->SetPollingMode(Common::Input::PollingMode::NFC) != | ||||
|         Common::Input::DriverResult::Success) { | ||||
|     if (!npad_device->SetPollingMode(Common::Input::PollingMode::NFC)) { | ||||
|         LOG_ERROR(Service_NFC, "Nfc not supported"); | ||||
|         return NfcDisabled; | ||||
|     } | ||||
|   | ||||
| @@ -152,8 +152,7 @@ Result NfpDevice::StartDetection(TagProtocol allowed_protocol) { | ||||
|         return WrongDeviceState; | ||||
|     } | ||||
|  | ||||
|     if (npad_device->SetPollingMode(Common::Input::PollingMode::NFC) != | ||||
|         Common::Input::DriverResult::Success) { | ||||
|     if (!npad_device->SetPollingMode(Common::Input::PollingMode::NFC)) { | ||||
|         LOG_ERROR(Service_NFP, "Nfc not supported"); | ||||
|         return NfcDisabled; | ||||
|     } | ||||
|   | ||||
| @@ -3,9 +3,7 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <span> | ||||
| #include <vector> | ||||
|  | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/service/nvdrv/nvdata.h" | ||||
|  | ||||
| @@ -33,7 +31,7 @@ public: | ||||
|      * @param output A buffer where the output data will be written to. | ||||
|      * @returns The result code of the ioctl. | ||||
|      */ | ||||
|     virtual NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|     virtual NvResult Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                             std::vector<u8>& output) = 0; | ||||
|  | ||||
|     /** | ||||
| @@ -44,8 +42,8 @@ public: | ||||
|      * @param output A buffer where the output data will be written to. | ||||
|      * @returns The result code of the ioctl. | ||||
|      */ | ||||
|     virtual NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                             std::span<const u8> inline_input, std::vector<u8>& output) = 0; | ||||
|     virtual NvResult Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                             const std::vector<u8>& inline_input, std::vector<u8>& output) = 0; | ||||
|  | ||||
|     /** | ||||
|      * Handles an ioctl3 request. | ||||
| @@ -55,7 +53,7 @@ public: | ||||
|      * @param inline_output A buffer where the inlined output data will be written to. | ||||
|      * @returns The result code of the ioctl. | ||||
|      */ | ||||
|     virtual NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|     virtual NvResult Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                             std::vector<u8>& output, std::vector<u8>& inline_output) = 0; | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -17,19 +17,19 @@ nvdisp_disp0::nvdisp_disp0(Core::System& system_, NvCore::Container& core) | ||||
|     : nvdevice{system_}, container{core}, nvmap{core.GetNvMapFile()} {} | ||||
| nvdisp_disp0::~nvdisp_disp0() = default; | ||||
|  | ||||
| NvResult nvdisp_disp0::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvdisp_disp0::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                               std::vector<u8>& output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvdisp_disp0::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                               std::span<const u8> inline_input, std::vector<u8>& output) { | ||||
| NvResult nvdisp_disp0::Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                               const std::vector<u8>& inline_input, std::vector<u8>& output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvdisp_disp0::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvdisp_disp0::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                               std::vector<u8>& output, std::vector<u8>& inline_output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
|   | ||||
| @@ -25,12 +25,12 @@ public: | ||||
|     explicit nvdisp_disp0(Core::System& system_, NvCore::Container& core); | ||||
|     ~nvdisp_disp0() override; | ||||
|  | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                     std::span<const u8> inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, | ||||
|                     std::vector<u8>& inline_output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     const std::vector<u8>& inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output, std::vector<u8>& inline_output) override; | ||||
|  | ||||
|     void OnOpen(DeviceFD fd) override; | ||||
|     void OnClose(DeviceFD fd) override; | ||||
|   | ||||
| @@ -27,7 +27,7 @@ nvhost_as_gpu::nvhost_as_gpu(Core::System& system_, Module& module_, NvCore::Con | ||||
|  | ||||
| nvhost_as_gpu::~nvhost_as_gpu() = default; | ||||
|  | ||||
| NvResult nvhost_as_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvhost_as_gpu::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                                std::vector<u8>& output) { | ||||
|     switch (command.group) { | ||||
|     case 'A': | ||||
| @@ -60,13 +60,13 @@ NvResult nvhost_as_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> i | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_as_gpu::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                                std::span<const u8> inline_input, std::vector<u8>& output) { | ||||
| NvResult nvhost_as_gpu::Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                                const std::vector<u8>& inline_input, std::vector<u8>& output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_as_gpu::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvhost_as_gpu::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                                std::vector<u8>& output, std::vector<u8>& inline_output) { | ||||
|     switch (command.group) { | ||||
|     case 'A': | ||||
| @@ -87,7 +87,7 @@ NvResult nvhost_as_gpu::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> i | ||||
| void nvhost_as_gpu::OnOpen(DeviceFD fd) {} | ||||
| void nvhost_as_gpu::OnClose(DeviceFD fd) {} | ||||
|  | ||||
| NvResult nvhost_as_gpu::AllocAsEx(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_as_gpu::AllocAsEx(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlAllocAsEx params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
|  | ||||
| @@ -141,7 +141,7 @@ NvResult nvhost_as_gpu::AllocAsEx(std::span<const u8> input, std::vector<u8>& ou | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_as_gpu::AllocateSpace(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_as_gpu::AllocateSpace(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlAllocSpace params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
|  | ||||
| @@ -220,7 +220,7 @@ void nvhost_as_gpu::FreeMappingLocked(u64 offset) { | ||||
|     mapping_map.erase(offset); | ||||
| } | ||||
|  | ||||
| NvResult nvhost_as_gpu::FreeSpace(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_as_gpu::FreeSpace(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlFreeSpace params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
|  | ||||
| @@ -266,7 +266,7 @@ NvResult nvhost_as_gpu::FreeSpace(std::span<const u8> input, std::vector<u8>& ou | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_as_gpu::Remap(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_as_gpu::Remap(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     const auto num_entries = input.size() / sizeof(IoctlRemapEntry); | ||||
|  | ||||
|     LOG_DEBUG(Service_NVDRV, "called, num_entries=0x{:X}", num_entries); | ||||
| @@ -320,7 +320,7 @@ NvResult nvhost_as_gpu::Remap(std::span<const u8> input, std::vector<u8>& output | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_as_gpu::MapBufferEx(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_as_gpu::MapBufferEx(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlMapBufferEx params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
|  | ||||
| @@ -424,7 +424,7 @@ NvResult nvhost_as_gpu::MapBufferEx(std::span<const u8> input, std::vector<u8>& | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_as_gpu::UnmapBuffer(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_as_gpu::UnmapBuffer(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlUnmapBuffer params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
|  | ||||
| @@ -463,7 +463,7 @@ NvResult nvhost_as_gpu::UnmapBuffer(std::span<const u8> input, std::vector<u8>& | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_as_gpu::BindChannel(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_as_gpu::BindChannel(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlBindChannel params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
|     LOG_DEBUG(Service_NVDRV, "called, fd={:X}", params.fd); | ||||
| @@ -492,7 +492,7 @@ void nvhost_as_gpu::GetVARegionsImpl(IoctlGetVaRegions& params) { | ||||
|     }; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_as_gpu::GetVARegions(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_as_gpu::GetVARegions(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlGetVaRegions params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
|  | ||||
| @@ -511,7 +511,7 @@ NvResult nvhost_as_gpu::GetVARegions(std::span<const u8> input, std::vector<u8>& | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_as_gpu::GetVARegions(std::span<const u8> input, std::vector<u8>& output, | ||||
| NvResult nvhost_as_gpu::GetVARegions(const std::vector<u8>& input, std::vector<u8>& output, | ||||
|                                      std::vector<u8>& inline_output) { | ||||
|     IoctlGetVaRegions params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
|   | ||||
| @@ -47,12 +47,12 @@ public: | ||||
|     explicit nvhost_as_gpu(Core::System& system_, Module& module, NvCore::Container& core); | ||||
|     ~nvhost_as_gpu() override; | ||||
|  | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                     std::span<const u8> inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, | ||||
|                     std::vector<u8>& inline_output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     const std::vector<u8>& inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output, std::vector<u8>& inline_output) override; | ||||
|  | ||||
|     void OnOpen(DeviceFD fd) override; | ||||
|     void OnClose(DeviceFD fd) override; | ||||
| @@ -138,17 +138,17 @@ private: | ||||
|     static_assert(sizeof(IoctlGetVaRegions) == 16 + sizeof(VaRegion) * 2, | ||||
|                   "IoctlGetVaRegions is incorrect size"); | ||||
|  | ||||
|     NvResult AllocAsEx(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult AllocateSpace(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult Remap(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult MapBufferEx(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult UnmapBuffer(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult FreeSpace(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult BindChannel(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult AllocAsEx(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult AllocateSpace(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult Remap(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult MapBufferEx(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult UnmapBuffer(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult FreeSpace(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult BindChannel(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|  | ||||
|     void GetVARegionsImpl(IoctlGetVaRegions& params); | ||||
|     NvResult GetVARegions(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult GetVARegions(std::span<const u8> input, std::vector<u8>& output, | ||||
|     NvResult GetVARegions(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult GetVARegions(const std::vector<u8>& input, std::vector<u8>& output, | ||||
|                           std::vector<u8>& inline_output); | ||||
|  | ||||
|     void FreeMappingLocked(u64 offset); | ||||
|   | ||||
| @@ -34,7 +34,7 @@ nvhost_ctrl::~nvhost_ctrl() { | ||||
|     } | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvhost_ctrl::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                              std::vector<u8>& output) { | ||||
|     switch (command.group) { | ||||
|     case 0x0: | ||||
| @@ -63,13 +63,13 @@ NvResult nvhost_ctrl::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> inp | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                              std::span<const u8> inline_input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl::Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                              const std::vector<u8>& inline_input, std::vector<u8>& output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvhost_ctrl::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                              std::vector<u8>& output, std::vector<u8>& inline_outpu) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
| @@ -79,7 +79,7 @@ void nvhost_ctrl::OnOpen(DeviceFD fd) {} | ||||
|  | ||||
| void nvhost_ctrl::OnClose(DeviceFD fd) {} | ||||
|  | ||||
| NvResult nvhost_ctrl::NvOsGetConfigU32(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl::NvOsGetConfigU32(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IocGetConfigParams params{}; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(params)); | ||||
|     LOG_TRACE(Service_NVDRV, "called, setting={}!{}", params.domain_str.data(), | ||||
| @@ -87,7 +87,7 @@ NvResult nvhost_ctrl::NvOsGetConfigU32(std::span<const u8> input, std::vector<u8 | ||||
|     return NvResult::ConfigVarNotFound; // Returns error on production mode | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl::IocCtrlEventWait(std::span<const u8> input, std::vector<u8>& output, | ||||
| NvResult nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector<u8>& output, | ||||
|                                        bool is_allocation) { | ||||
|     IocCtrlEventWaitParams params{}; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(params)); | ||||
| @@ -231,7 +231,7 @@ NvResult nvhost_ctrl::FreeEvent(u32 slot) { | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl::IocCtrlEventRegister(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl::IocCtrlEventRegister(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IocCtrlEventRegisterParams params{}; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(params)); | ||||
|     const u32 event_id = params.user_event_id; | ||||
| @@ -252,7 +252,8 @@ NvResult nvhost_ctrl::IocCtrlEventRegister(std::span<const u8> input, std::vecto | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl::IocCtrlEventUnregister(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl::IocCtrlEventUnregister(const std::vector<u8>& input, | ||||
|                                              std::vector<u8>& output) { | ||||
|     IocCtrlEventUnregisterParams params{}; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(params)); | ||||
|     const u32 event_id = params.user_event_id & 0x00FF; | ||||
| @@ -262,7 +263,7 @@ NvResult nvhost_ctrl::IocCtrlEventUnregister(std::span<const u8> input, std::vec | ||||
|     return FreeEvent(event_id); | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl::IocCtrlEventUnregisterBatch(std::span<const u8> input, | ||||
| NvResult nvhost_ctrl::IocCtrlEventUnregisterBatch(const std::vector<u8>& input, | ||||
|                                                   std::vector<u8>& output) { | ||||
|     IocCtrlEventUnregisterBatchParams params{}; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(params)); | ||||
| @@ -281,7 +282,7 @@ NvResult nvhost_ctrl::IocCtrlEventUnregisterBatch(std::span<const u8> input, | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl::IocCtrlClearEventWait(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl::IocCtrlClearEventWait(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IocCtrlEventClearParams params{}; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(params)); | ||||
|  | ||||
|   | ||||
| @@ -25,12 +25,12 @@ public: | ||||
|                          NvCore::Container& core); | ||||
|     ~nvhost_ctrl() override; | ||||
|  | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                     std::span<const u8> inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, | ||||
|                     std::vector<u8>& inline_output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     const std::vector<u8>& inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output, std::vector<u8>& inline_output) override; | ||||
|  | ||||
|     void OnOpen(DeviceFD fd) override; | ||||
|     void OnClose(DeviceFD fd) override; | ||||
| @@ -186,13 +186,13 @@ private: | ||||
|     static_assert(sizeof(IocCtrlEventUnregisterBatchParams) == 8, | ||||
|                   "IocCtrlEventKill is incorrect size"); | ||||
|  | ||||
|     NvResult NvOsGetConfigU32(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult IocCtrlEventWait(std::span<const u8> input, std::vector<u8>& output, | ||||
|     NvResult NvOsGetConfigU32(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult IocCtrlEventWait(const std::vector<u8>& input, std::vector<u8>& output, | ||||
|                               bool is_allocation); | ||||
|     NvResult IocCtrlEventRegister(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult IocCtrlEventUnregister(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult IocCtrlEventUnregisterBatch(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult IocCtrlClearEventWait(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult IocCtrlEventRegister(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult IocCtrlEventUnregister(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult IocCtrlEventUnregisterBatch(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult IocCtrlClearEventWait(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|  | ||||
|     NvResult FreeEvent(u32 slot); | ||||
|  | ||||
|   | ||||
| @@ -21,7 +21,7 @@ nvhost_ctrl_gpu::~nvhost_ctrl_gpu() { | ||||
|     events_interface.FreeEvent(unknown_event); | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvhost_ctrl_gpu::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                                  std::vector<u8>& output) { | ||||
|     switch (command.group) { | ||||
|     case 'G': | ||||
| @@ -53,13 +53,13 @@ NvResult nvhost_ctrl_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl_gpu::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                                  std::span<const u8> inline_input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl_gpu::Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                                  const std::vector<u8>& inline_input, std::vector<u8>& output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl_gpu::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvhost_ctrl_gpu::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                                  std::vector<u8>& output, std::vector<u8>& inline_output) { | ||||
|     switch (command.group) { | ||||
|     case 'G': | ||||
| @@ -82,7 +82,8 @@ NvResult nvhost_ctrl_gpu::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> | ||||
| void nvhost_ctrl_gpu::OnOpen(DeviceFD fd) {} | ||||
| void nvhost_ctrl_gpu::OnClose(DeviceFD fd) {} | ||||
|  | ||||
| NvResult nvhost_ctrl_gpu::GetCharacteristics(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl_gpu::GetCharacteristics(const std::vector<u8>& input, | ||||
|                                              std::vector<u8>& output) { | ||||
|     LOG_DEBUG(Service_NVDRV, "called"); | ||||
|     IoctlCharacteristics params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
| @@ -127,7 +128,7 @@ NvResult nvhost_ctrl_gpu::GetCharacteristics(std::span<const u8> input, std::vec | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl_gpu::GetCharacteristics(std::span<const u8> input, std::vector<u8>& output, | ||||
| NvResult nvhost_ctrl_gpu::GetCharacteristics(const std::vector<u8>& input, std::vector<u8>& output, | ||||
|                                              std::vector<u8>& inline_output) { | ||||
|     LOG_DEBUG(Service_NVDRV, "called"); | ||||
|     IoctlCharacteristics params{}; | ||||
| @@ -175,7 +176,7 @@ NvResult nvhost_ctrl_gpu::GetCharacteristics(std::span<const u8> input, std::vec | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl_gpu::GetTPCMasks(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl_gpu::GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlGpuGetTpcMasksArgs params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
|     LOG_DEBUG(Service_NVDRV, "called, mask_buffer_size=0x{:X}", params.mask_buffer_size); | ||||
| @@ -186,7 +187,7 @@ NvResult nvhost_ctrl_gpu::GetTPCMasks(std::span<const u8> input, std::vector<u8> | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl_gpu::GetTPCMasks(std::span<const u8> input, std::vector<u8>& output, | ||||
| NvResult nvhost_ctrl_gpu::GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output, | ||||
|                                       std::vector<u8>& inline_output) { | ||||
|     IoctlGpuGetTpcMasksArgs params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
| @@ -199,7 +200,7 @@ NvResult nvhost_ctrl_gpu::GetTPCMasks(std::span<const u8> input, std::vector<u8> | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl_gpu::GetActiveSlotMask(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl_gpu::GetActiveSlotMask(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     LOG_DEBUG(Service_NVDRV, "called"); | ||||
|  | ||||
|     IoctlActiveSlotMask params{}; | ||||
| @@ -212,7 +213,7 @@ NvResult nvhost_ctrl_gpu::GetActiveSlotMask(std::span<const u8> input, std::vect | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl_gpu::ZCullGetCtxSize(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl_gpu::ZCullGetCtxSize(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     LOG_DEBUG(Service_NVDRV, "called"); | ||||
|  | ||||
|     IoctlZcullGetCtxSize params{}; | ||||
| @@ -224,7 +225,7 @@ NvResult nvhost_ctrl_gpu::ZCullGetCtxSize(std::span<const u8> input, std::vector | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl_gpu::ZCullGetInfo(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl_gpu::ZCullGetInfo(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     LOG_DEBUG(Service_NVDRV, "called"); | ||||
|  | ||||
|     IoctlNvgpuGpuZcullGetInfoArgs params{}; | ||||
| @@ -247,7 +248,7 @@ NvResult nvhost_ctrl_gpu::ZCullGetInfo(std::span<const u8> input, std::vector<u8 | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl_gpu::ZBCSetTable(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl_gpu::ZBCSetTable(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     LOG_WARNING(Service_NVDRV, "(STUBBED) called"); | ||||
|  | ||||
|     IoctlZbcSetTable params{}; | ||||
| @@ -263,7 +264,7 @@ NvResult nvhost_ctrl_gpu::ZBCSetTable(std::span<const u8> input, std::vector<u8> | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl_gpu::ZBCQueryTable(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl_gpu::ZBCQueryTable(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     LOG_WARNING(Service_NVDRV, "(STUBBED) called"); | ||||
|  | ||||
|     IoctlZbcQueryTable params{}; | ||||
| @@ -273,7 +274,7 @@ NvResult nvhost_ctrl_gpu::ZBCQueryTable(std::span<const u8> input, std::vector<u | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl_gpu::FlushL2(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl_gpu::FlushL2(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     LOG_WARNING(Service_NVDRV, "(STUBBED) called"); | ||||
|  | ||||
|     IoctlFlushL2 params{}; | ||||
| @@ -283,7 +284,7 @@ NvResult nvhost_ctrl_gpu::FlushL2(std::span<const u8> input, std::vector<u8>& ou | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_ctrl_gpu::GetGpuTime(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_ctrl_gpu::GetGpuTime(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     LOG_DEBUG(Service_NVDRV, "called"); | ||||
|  | ||||
|     IoctlGetGpuTime params{}; | ||||
|   | ||||
| @@ -21,12 +21,12 @@ public: | ||||
|     explicit nvhost_ctrl_gpu(Core::System& system_, EventInterface& events_interface_); | ||||
|     ~nvhost_ctrl_gpu() override; | ||||
|  | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                     std::span<const u8> inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, | ||||
|                     std::vector<u8>& inline_output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     const std::vector<u8>& inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output, std::vector<u8>& inline_output) override; | ||||
|  | ||||
|     void OnOpen(DeviceFD fd) override; | ||||
|     void OnClose(DeviceFD fd) override; | ||||
| @@ -151,21 +151,21 @@ private: | ||||
|     }; | ||||
|     static_assert(sizeof(IoctlGetGpuTime) == 0x10, "IoctlGetGpuTime is incorrect size"); | ||||
|  | ||||
|     NvResult GetCharacteristics(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult GetCharacteristics(std::span<const u8> input, std::vector<u8>& output, | ||||
|     NvResult GetCharacteristics(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult GetCharacteristics(const std::vector<u8>& input, std::vector<u8>& output, | ||||
|                                 std::vector<u8>& inline_output); | ||||
|  | ||||
|     NvResult GetTPCMasks(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult GetTPCMasks(std::span<const u8> input, std::vector<u8>& output, | ||||
|     NvResult GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output, | ||||
|                          std::vector<u8>& inline_output); | ||||
|  | ||||
|     NvResult GetActiveSlotMask(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult ZCullGetCtxSize(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult ZCullGetInfo(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult ZBCSetTable(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult ZBCQueryTable(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult FlushL2(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult GetGpuTime(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult GetActiveSlotMask(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult ZCullGetCtxSize(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult ZCullGetInfo(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult ZBCSetTable(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult ZBCQueryTable(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult FlushL2(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult GetGpuTime(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|  | ||||
|     EventInterface& events_interface; | ||||
|  | ||||
|   | ||||
| @@ -46,7 +46,7 @@ nvhost_gpu::~nvhost_gpu() { | ||||
|     syncpoint_manager.FreeSyncpoint(channel_syncpoint); | ||||
| } | ||||
|  | ||||
| NvResult nvhost_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvhost_gpu::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                             std::vector<u8>& output) { | ||||
|     switch (command.group) { | ||||
|     case 0x0: | ||||
| @@ -98,8 +98,8 @@ NvResult nvhost_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> inpu | ||||
|     return NvResult::NotImplemented; | ||||
| }; | ||||
|  | ||||
| NvResult nvhost_gpu::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                             std::span<const u8> inline_input, std::vector<u8>& output) { | ||||
| NvResult nvhost_gpu::Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                             const std::vector<u8>& inline_input, std::vector<u8>& output) { | ||||
|     switch (command.group) { | ||||
|     case 'H': | ||||
|         switch (command.cmd) { | ||||
| @@ -112,7 +112,7 @@ NvResult nvhost_gpu::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> inpu | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_gpu::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvhost_gpu::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                             std::vector<u8>& output, std::vector<u8>& inline_output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
| @@ -121,7 +121,7 @@ NvResult nvhost_gpu::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> inpu | ||||
| void nvhost_gpu::OnOpen(DeviceFD fd) {} | ||||
| void nvhost_gpu::OnClose(DeviceFD fd) {} | ||||
|  | ||||
| NvResult nvhost_gpu::SetNVMAPfd(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_gpu::SetNVMAPfd(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlSetNvmapFD params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
|     LOG_DEBUG(Service_NVDRV, "called, fd={}", params.nvmap_fd); | ||||
| @@ -130,7 +130,7 @@ NvResult nvhost_gpu::SetNVMAPfd(std::span<const u8> input, std::vector<u8>& outp | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_gpu::SetClientData(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_gpu::SetClientData(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     LOG_DEBUG(Service_NVDRV, "called"); | ||||
|  | ||||
|     IoctlClientData params{}; | ||||
| @@ -139,7 +139,7 @@ NvResult nvhost_gpu::SetClientData(std::span<const u8> input, std::vector<u8>& o | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_gpu::GetClientData(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_gpu::GetClientData(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     LOG_DEBUG(Service_NVDRV, "called"); | ||||
|  | ||||
|     IoctlClientData params{}; | ||||
| @@ -149,7 +149,7 @@ NvResult nvhost_gpu::GetClientData(std::span<const u8> input, std::vector<u8>& o | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_gpu::ZCullBind(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_gpu::ZCullBind(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     std::memcpy(&zcull_params, input.data(), input.size()); | ||||
|     LOG_DEBUG(Service_NVDRV, "called, gpu_va={:X}, mode={:X}", zcull_params.gpu_va, | ||||
|               zcull_params.mode); | ||||
| @@ -158,7 +158,7 @@ NvResult nvhost_gpu::ZCullBind(std::span<const u8> input, std::vector<u8>& outpu | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_gpu::SetErrorNotifier(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_gpu::SetErrorNotifier(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlSetErrorNotifier params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
|     LOG_WARNING(Service_NVDRV, "(STUBBED) called, offset={:X}, size={:X}, mem={:X}", params.offset, | ||||
| @@ -168,14 +168,14 @@ NvResult nvhost_gpu::SetErrorNotifier(std::span<const u8> input, std::vector<u8> | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_gpu::SetChannelPriority(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_gpu::SetChannelPriority(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     std::memcpy(&channel_priority, input.data(), input.size()); | ||||
|     LOG_DEBUG(Service_NVDRV, "(STUBBED) called, priority={:X}", channel_priority); | ||||
|  | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_gpu::AllocGPFIFOEx2(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_gpu::AllocGPFIFOEx2(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlAllocGpfifoEx2 params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
|     LOG_WARNING(Service_NVDRV, | ||||
| @@ -197,7 +197,7 @@ NvResult nvhost_gpu::AllocGPFIFOEx2(std::span<const u8> input, std::vector<u8>& | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_gpu::AllocateObjectContext(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_gpu::AllocateObjectContext(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlAllocObjCtx params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
|     LOG_WARNING(Service_NVDRV, "(STUBBED) called, class_num={:X}, flags={:X}", params.class_num, | ||||
| @@ -293,7 +293,7 @@ NvResult nvhost_gpu::SubmitGPFIFOImpl(IoctlSubmitGpfifo& params, std::vector<u8> | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_gpu::SubmitGPFIFOBase(std::span<const u8> input, std::vector<u8>& output, | ||||
| NvResult nvhost_gpu::SubmitGPFIFOBase(const std::vector<u8>& input, std::vector<u8>& output, | ||||
|                                       bool kickoff) { | ||||
|     if (input.size() < sizeof(IoctlSubmitGpfifo)) { | ||||
|         UNIMPLEMENTED(); | ||||
| @@ -314,7 +314,8 @@ NvResult nvhost_gpu::SubmitGPFIFOBase(std::span<const u8> input, std::vector<u8> | ||||
|     return SubmitGPFIFOImpl(params, output, std::move(entries)); | ||||
| } | ||||
|  | ||||
| NvResult nvhost_gpu::SubmitGPFIFOBase(std::span<const u8> input, std::span<const u8> input_inline, | ||||
| NvResult nvhost_gpu::SubmitGPFIFOBase(const std::vector<u8>& input, | ||||
|                                       const std::vector<u8>& input_inline, | ||||
|                                       std::vector<u8>& output) { | ||||
|     if (input.size() < sizeof(IoctlSubmitGpfifo)) { | ||||
|         UNIMPLEMENTED(); | ||||
| @@ -327,7 +328,7 @@ NvResult nvhost_gpu::SubmitGPFIFOBase(std::span<const u8> input, std::span<const | ||||
|     return SubmitGPFIFOImpl(params, output, std::move(entries)); | ||||
| } | ||||
|  | ||||
| NvResult nvhost_gpu::GetWaitbase(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_gpu::GetWaitbase(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlGetWaitbase params{}; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(IoctlGetWaitbase)); | ||||
|     LOG_INFO(Service_NVDRV, "called, unknown=0x{:X}", params.unknown); | ||||
| @@ -337,7 +338,7 @@ NvResult nvhost_gpu::GetWaitbase(std::span<const u8> input, std::vector<u8>& out | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_gpu::ChannelSetTimeout(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_gpu::ChannelSetTimeout(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlChannelSetTimeout params{}; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(IoctlChannelSetTimeout)); | ||||
|     LOG_INFO(Service_NVDRV, "called, timeout=0x{:X}", params.timeout); | ||||
| @@ -345,7 +346,7 @@ NvResult nvhost_gpu::ChannelSetTimeout(std::span<const u8> input, std::vector<u8 | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_gpu::ChannelSetTimeslice(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_gpu::ChannelSetTimeslice(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlSetTimeslice params{}; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(IoctlSetTimeslice)); | ||||
|     LOG_INFO(Service_NVDRV, "called, timeslice=0x{:X}", params.timeslice); | ||||
|   | ||||
| @@ -40,12 +40,12 @@ public: | ||||
|                         NvCore::Container& core); | ||||
|     ~nvhost_gpu() override; | ||||
|  | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                     std::span<const u8> inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, | ||||
|                     std::vector<u8>& inline_output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     const std::vector<u8>& inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output, std::vector<u8>& inline_output) override; | ||||
|  | ||||
|     void OnOpen(DeviceFD fd) override; | ||||
|     void OnClose(DeviceFD fd) override; | ||||
| @@ -186,23 +186,23 @@ private: | ||||
|     u32_le channel_priority{}; | ||||
|     u32_le channel_timeslice{}; | ||||
|  | ||||
|     NvResult SetNVMAPfd(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult SetClientData(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult GetClientData(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult ZCullBind(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult SetErrorNotifier(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult SetChannelPriority(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult AllocGPFIFOEx2(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult AllocateObjectContext(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult SetNVMAPfd(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult SetClientData(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult GetClientData(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult ZCullBind(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult SetErrorNotifier(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult SetChannelPriority(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult AllocGPFIFOEx2(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult AllocateObjectContext(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult SubmitGPFIFOImpl(IoctlSubmitGpfifo& params, std::vector<u8>& output, | ||||
|                               Tegra::CommandList&& entries); | ||||
|     NvResult SubmitGPFIFOBase(std::span<const u8> input, std::vector<u8>& output, | ||||
|     NvResult SubmitGPFIFOBase(const std::vector<u8>& input, std::vector<u8>& output, | ||||
|                               bool kickoff = false); | ||||
|     NvResult SubmitGPFIFOBase(std::span<const u8> input, std::span<const u8> input_inline, | ||||
|     NvResult SubmitGPFIFOBase(const std::vector<u8>& input, const std::vector<u8>& input_inline, | ||||
|                               std::vector<u8>& output); | ||||
|     NvResult GetWaitbase(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult ChannelSetTimeout(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult ChannelSetTimeslice(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult GetWaitbase(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult ChannelSetTimeout(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult ChannelSetTimeslice(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|  | ||||
|     EventInterface& events_interface; | ||||
|     NvCore::Container& core; | ||||
|   | ||||
| @@ -15,7 +15,7 @@ nvhost_nvdec::nvhost_nvdec(Core::System& system_, NvCore::Container& core_) | ||||
|     : nvhost_nvdec_common{system_, core_, NvCore::ChannelType::NvDec} {} | ||||
| nvhost_nvdec::~nvhost_nvdec() = default; | ||||
|  | ||||
| NvResult nvhost_nvdec::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvhost_nvdec::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                               std::vector<u8>& output) { | ||||
|     switch (command.group) { | ||||
|     case 0x0: | ||||
| @@ -55,13 +55,13 @@ NvResult nvhost_nvdec::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> in | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_nvdec::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                               std::span<const u8> inline_input, std::vector<u8>& output) { | ||||
| NvResult nvhost_nvdec::Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                               const std::vector<u8>& inline_input, std::vector<u8>& output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_nvdec::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvhost_nvdec::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                               std::vector<u8>& output, std::vector<u8>& inline_output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
|   | ||||
| @@ -13,12 +13,12 @@ public: | ||||
|     explicit nvhost_nvdec(Core::System& system_, NvCore::Container& core); | ||||
|     ~nvhost_nvdec() override; | ||||
|  | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                     std::span<const u8> inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, | ||||
|                     std::vector<u8>& inline_output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     const std::vector<u8>& inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output, std::vector<u8>& inline_output) override; | ||||
|  | ||||
|     void OnOpen(DeviceFD fd) override; | ||||
|     void OnClose(DeviceFD fd) override; | ||||
|   | ||||
| @@ -23,7 +23,7 @@ namespace { | ||||
| // Copies count amount of type T from the input vector into the dst vector. | ||||
| // Returns the number of bytes written into dst. | ||||
| template <typename T> | ||||
| std::size_t SliceVectors(std::span<const u8> input, std::vector<T>& dst, std::size_t count, | ||||
| std::size_t SliceVectors(const std::vector<u8>& input, std::vector<T>& dst, std::size_t count, | ||||
|                          std::size_t offset) { | ||||
|     if (dst.empty()) { | ||||
|         return 0; | ||||
| @@ -63,7 +63,7 @@ nvhost_nvdec_common::~nvhost_nvdec_common() { | ||||
|     core.Host1xDeviceFile().syncpts_accumulated.push_back(channel_syncpoint); | ||||
| } | ||||
|  | ||||
| NvResult nvhost_nvdec_common::SetNVMAPfd(std::span<const u8> input) { | ||||
| NvResult nvhost_nvdec_common::SetNVMAPfd(const std::vector<u8>& input) { | ||||
|     IoctlSetNvmapFD params{}; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(IoctlSetNvmapFD)); | ||||
|     LOG_DEBUG(Service_NVDRV, "called, fd={}", params.nvmap_fd); | ||||
| @@ -72,7 +72,7 @@ NvResult nvhost_nvdec_common::SetNVMAPfd(std::span<const u8> input) { | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_nvdec_common::Submit(DeviceFD fd, std::span<const u8> input, | ||||
| NvResult nvhost_nvdec_common::Submit(DeviceFD fd, const std::vector<u8>& input, | ||||
|                                      std::vector<u8>& output) { | ||||
|     IoctlSubmit params{}; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(IoctlSubmit)); | ||||
| @@ -121,7 +121,7 @@ NvResult nvhost_nvdec_common::Submit(DeviceFD fd, std::span<const u8> input, | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_nvdec_common::GetSyncpoint(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_nvdec_common::GetSyncpoint(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlGetSyncpoint params{}; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(IoctlGetSyncpoint)); | ||||
|     LOG_DEBUG(Service_NVDRV, "called GetSyncpoint, id={}", params.param); | ||||
| @@ -133,7 +133,7 @@ NvResult nvhost_nvdec_common::GetSyncpoint(std::span<const u8> input, std::vecto | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_nvdec_common::GetWaitbase(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_nvdec_common::GetWaitbase(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlGetWaitbase params{}; | ||||
|     LOG_CRITICAL(Service_NVDRV, "called WAITBASE"); | ||||
|     std::memcpy(¶ms, input.data(), sizeof(IoctlGetWaitbase)); | ||||
| @@ -142,7 +142,7 @@ NvResult nvhost_nvdec_common::GetWaitbase(std::span<const u8> input, std::vector | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_nvdec_common::MapBuffer(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_nvdec_common::MapBuffer(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlMapBuffer params{}; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(IoctlMapBuffer)); | ||||
|     std::vector<MapBufferEntry> cmd_buffer_handles(params.num_entries); | ||||
| @@ -159,7 +159,7 @@ NvResult nvhost_nvdec_common::MapBuffer(std::span<const u8> input, std::vector<u | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_nvdec_common::UnmapBuffer(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_nvdec_common::UnmapBuffer(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlMapBuffer params{}; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(IoctlMapBuffer)); | ||||
|     std::vector<MapBufferEntry> cmd_buffer_handles(params.num_entries); | ||||
| @@ -173,7 +173,8 @@ NvResult nvhost_nvdec_common::UnmapBuffer(std::span<const u8> input, std::vector | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_nvdec_common::SetSubmitTimeout(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_nvdec_common::SetSubmitTimeout(const std::vector<u8>& input, | ||||
|                                                std::vector<u8>& output) { | ||||
|     std::memcpy(&submit_timeout, input.data(), input.size()); | ||||
|     LOG_WARNING(Service_NVDRV, "(STUBBED) called"); | ||||
|     return NvResult::Success; | ||||
|   | ||||
| @@ -107,13 +107,13 @@ protected: | ||||
|     static_assert(sizeof(IoctlMapBuffer) == 0x0C, "IoctlMapBuffer is incorrect size"); | ||||
|  | ||||
|     /// Ioctl command implementations | ||||
|     NvResult SetNVMAPfd(std::span<const u8> input); | ||||
|     NvResult Submit(DeviceFD fd, std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult GetSyncpoint(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult GetWaitbase(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult MapBuffer(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult UnmapBuffer(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult SetSubmitTimeout(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult SetNVMAPfd(const std::vector<u8>& input); | ||||
|     NvResult Submit(DeviceFD fd, const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult GetSyncpoint(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult GetWaitbase(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult MapBuffer(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult UnmapBuffer(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult SetSubmitTimeout(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|  | ||||
|     Kernel::KEvent* QueryEvent(u32 event_id) override; | ||||
|  | ||||
|   | ||||
| @@ -12,7 +12,7 @@ namespace Service::Nvidia::Devices { | ||||
| nvhost_nvjpg::nvhost_nvjpg(Core::System& system_) : nvdevice{system_} {} | ||||
| nvhost_nvjpg::~nvhost_nvjpg() = default; | ||||
|  | ||||
| NvResult nvhost_nvjpg::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvhost_nvjpg::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                               std::vector<u8>& output) { | ||||
|     switch (command.group) { | ||||
|     case 'H': | ||||
| @@ -31,13 +31,13 @@ NvResult nvhost_nvjpg::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> in | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_nvjpg::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                               std::span<const u8> inline_input, std::vector<u8>& output) { | ||||
| NvResult nvhost_nvjpg::Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                               const std::vector<u8>& inline_input, std::vector<u8>& output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_nvjpg::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvhost_nvjpg::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                               std::vector<u8>& output, std::vector<u8>& inline_output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
| @@ -46,7 +46,7 @@ NvResult nvhost_nvjpg::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> in | ||||
| void nvhost_nvjpg::OnOpen(DeviceFD fd) {} | ||||
| void nvhost_nvjpg::OnClose(DeviceFD fd) {} | ||||
|  | ||||
| NvResult nvhost_nvjpg::SetNVMAPfd(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvhost_nvjpg::SetNVMAPfd(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IoctlSetNvmapFD params{}; | ||||
|     std::memcpy(¶ms, input.data(), input.size()); | ||||
|     LOG_DEBUG(Service_NVDRV, "called, fd={}", params.nvmap_fd); | ||||
|   | ||||
| @@ -15,12 +15,12 @@ public: | ||||
|     explicit nvhost_nvjpg(Core::System& system_); | ||||
|     ~nvhost_nvjpg() override; | ||||
|  | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                     std::span<const u8> inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, | ||||
|                     std::vector<u8>& inline_output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     const std::vector<u8>& inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output, std::vector<u8>& inline_output) override; | ||||
|  | ||||
|     void OnOpen(DeviceFD fd) override; | ||||
|     void OnClose(DeviceFD fd) override; | ||||
| @@ -33,7 +33,7 @@ private: | ||||
|  | ||||
|     s32_le nvmap_fd{}; | ||||
|  | ||||
|     NvResult SetNVMAPfd(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult SetNVMAPfd(const std::vector<u8>& input, std::vector<u8>& output); | ||||
| }; | ||||
|  | ||||
| } // namespace Service::Nvidia::Devices | ||||
|   | ||||
| @@ -15,7 +15,7 @@ nvhost_vic::nvhost_vic(Core::System& system_, NvCore::Container& core_) | ||||
|  | ||||
| nvhost_vic::~nvhost_vic() = default; | ||||
|  | ||||
| NvResult nvhost_vic::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvhost_vic::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                             std::vector<u8>& output) { | ||||
|     switch (command.group) { | ||||
|     case 0x0: | ||||
| @@ -55,13 +55,13 @@ NvResult nvhost_vic::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> inpu | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_vic::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                             std::span<const u8> inline_input, std::vector<u8>& output) { | ||||
| NvResult nvhost_vic::Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                             const std::vector<u8>& inline_input, std::vector<u8>& output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvhost_vic::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvhost_vic::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                             std::vector<u8>& output, std::vector<u8>& inline_output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
|   | ||||
| @@ -12,12 +12,12 @@ public: | ||||
|     explicit nvhost_vic(Core::System& system_, NvCore::Container& core); | ||||
|     ~nvhost_vic(); | ||||
|  | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                     std::span<const u8> inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, | ||||
|                     std::vector<u8>& inline_output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     const std::vector<u8>& inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output, std::vector<u8>& inline_output) override; | ||||
|  | ||||
|     void OnOpen(DeviceFD fd) override; | ||||
|     void OnClose(DeviceFD fd) override; | ||||
|   | ||||
| @@ -25,7 +25,7 @@ nvmap::nvmap(Core::System& system_, NvCore::Container& container_) | ||||
|  | ||||
| nvmap::~nvmap() = default; | ||||
|  | ||||
| NvResult nvmap::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvmap::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                        std::vector<u8>& output) { | ||||
|     switch (command.group) { | ||||
|     case 0x1: | ||||
| @@ -54,13 +54,13 @@ NvResult nvmap::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvmap::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                        std::span<const u8> inline_input, std::vector<u8>& output) { | ||||
| NvResult nvmap::Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                        const std::vector<u8>& inline_input, std::vector<u8>& output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
| } | ||||
|  | ||||
| NvResult nvmap::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult nvmap::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                        std::vector<u8>& output, std::vector<u8>& inline_output) { | ||||
|     UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | ||||
|     return NvResult::NotImplemented; | ||||
| @@ -69,7 +69,7 @@ NvResult nvmap::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| void nvmap::OnOpen(DeviceFD fd) {} | ||||
| void nvmap::OnClose(DeviceFD fd) {} | ||||
|  | ||||
| NvResult nvmap::IocCreate(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvmap::IocCreate(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IocCreateParams params; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(params)); | ||||
|     LOG_DEBUG(Service_NVDRV, "called, size=0x{:08X}", params.size); | ||||
| @@ -89,7 +89,7 @@ NvResult nvmap::IocCreate(std::span<const u8> input, std::vector<u8>& output) { | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvmap::IocAlloc(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvmap::IocAlloc(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IocAllocParams params; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(params)); | ||||
|     LOG_DEBUG(Service_NVDRV, "called, addr={:X}", params.address); | ||||
| @@ -137,7 +137,7 @@ NvResult nvmap::IocAlloc(std::span<const u8> input, std::vector<u8>& output) { | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| NvResult nvmap::IocGetId(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvmap::IocGetId(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IocGetIdParams params; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(params)); | ||||
|  | ||||
| @@ -161,7 +161,7 @@ NvResult nvmap::IocGetId(std::span<const u8> input, std::vector<u8>& output) { | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvmap::IocFromId(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvmap::IocFromId(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IocFromIdParams params; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(params)); | ||||
|  | ||||
| @@ -192,7 +192,7 @@ NvResult nvmap::IocFromId(std::span<const u8> input, std::vector<u8>& output) { | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvmap::IocParam(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvmap::IocParam(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     enum class ParamTypes { Size = 1, Alignment = 2, Base = 3, Heap = 4, Kind = 5, Compr = 6 }; | ||||
|  | ||||
|     IocParamParams params; | ||||
| @@ -241,7 +241,7 @@ NvResult nvmap::IocParam(std::span<const u8> input, std::vector<u8>& output) { | ||||
|     return NvResult::Success; | ||||
| } | ||||
|  | ||||
| NvResult nvmap::IocFree(std::span<const u8> input, std::vector<u8>& output) { | ||||
| NvResult nvmap::IocFree(const std::vector<u8>& input, std::vector<u8>& output) { | ||||
|     IocFreeParams params; | ||||
|     std::memcpy(¶ms, input.data(), sizeof(params)); | ||||
|  | ||||
|   | ||||
| @@ -26,12 +26,12 @@ public: | ||||
|     nvmap(const nvmap&) = delete; | ||||
|     nvmap& operator=(const nvmap&) = delete; | ||||
|  | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                     std::span<const u8> inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, | ||||
|                     std::vector<u8>& inline_output) override; | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     const std::vector<u8>& inline_input, std::vector<u8>& output) override; | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output, std::vector<u8>& inline_output) override; | ||||
|  | ||||
|     void OnOpen(DeviceFD fd) override; | ||||
|     void OnClose(DeviceFD fd) override; | ||||
| @@ -106,12 +106,12 @@ private: | ||||
|     }; | ||||
|     static_assert(sizeof(IocGetIdParams) == 8, "IocGetIdParams has wrong size"); | ||||
|  | ||||
|     NvResult IocCreate(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult IocAlloc(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult IocGetId(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult IocFromId(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult IocParam(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult IocFree(std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult IocCreate(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult IocAlloc(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult IocGetId(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult IocFromId(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult IocParam(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|     NvResult IocFree(const std::vector<u8>& input, std::vector<u8>& output); | ||||
|  | ||||
|     NvCore::Container& container; | ||||
|     NvCore::NvMap& file; | ||||
|   | ||||
| @@ -124,7 +124,7 @@ DeviceFD Module::Open(const std::string& device_name) { | ||||
|     return fd; | ||||
| } | ||||
|  | ||||
| NvResult Module::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult Module::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                         std::vector<u8>& output) { | ||||
|     if (fd < 0) { | ||||
|         LOG_ERROR(Service_NVDRV, "Invalid DeviceFD={}!", fd); | ||||
| @@ -141,8 +141,8 @@ NvResult Module::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|     return itr->second->Ioctl1(fd, command, input, output); | ||||
| } | ||||
|  | ||||
| NvResult Module::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                         std::span<const u8> inline_input, std::vector<u8>& output) { | ||||
| NvResult Module::Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                         const std::vector<u8>& inline_input, std::vector<u8>& output) { | ||||
|     if (fd < 0) { | ||||
|         LOG_ERROR(Service_NVDRV, "Invalid DeviceFD={}!", fd); | ||||
|         return NvResult::InvalidState; | ||||
| @@ -158,7 +158,7 @@ NvResult Module::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|     return itr->second->Ioctl2(fd, command, input, inline_input, output); | ||||
| } | ||||
|  | ||||
| NvResult Module::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
| NvResult Module::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                         std::vector<u8>& output, std::vector<u8>& inline_output) { | ||||
|     if (fd < 0) { | ||||
|         LOG_ERROR(Service_NVDRV, "Invalid DeviceFD={}!", fd); | ||||
|   | ||||
| @@ -7,7 +7,6 @@ | ||||
| #include <functional> | ||||
| #include <list> | ||||
| #include <memory> | ||||
| #include <span> | ||||
| #include <string> | ||||
| #include <unordered_map> | ||||
| #include <vector> | ||||
| @@ -80,13 +79,14 @@ public: | ||||
|     DeviceFD Open(const std::string& device_name); | ||||
|  | ||||
|     /// Sends an ioctl command to the specified file descriptor. | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output); | ||||
|     NvResult Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output); | ||||
|  | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, | ||||
|                     std::span<const u8> inline_input, std::vector<u8>& output); | ||||
|     NvResult Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     const std::vector<u8>& inline_input, std::vector<u8>& output); | ||||
|  | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, | ||||
|                     std::vector<u8>& inline_output); | ||||
|     NvResult Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | ||||
|                     std::vector<u8>& output, std::vector<u8>& inline_output); | ||||
|  | ||||
|     /// Closes a device file descriptor and returns operation success. | ||||
|     NvResult Close(DeviceFD fd); | ||||
|   | ||||
| @@ -815,8 +815,8 @@ Status BufferQueueProducer::SetPreallocatedBuffer(s32 slot, | ||||
|  | ||||
| void BufferQueueProducer::Transact(Kernel::HLERequestContext& ctx, TransactionId code, u32 flags) { | ||||
|     Status status{Status::NoError}; | ||||
|     InputParcel parcel_in{ctx.ReadBuffer()}; | ||||
|     OutputParcel parcel_out{}; | ||||
|     Parcel parcel_in{ctx.ReadBuffer()}; | ||||
|     Parcel parcel_out{}; | ||||
|  | ||||
|     switch (code) { | ||||
|     case TransactionId::Connect: { | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|  | ||||
| namespace Service::android { | ||||
|  | ||||
| QueueBufferInput::QueueBufferInput(InputParcel& parcel) { | ||||
| QueueBufferInput::QueueBufferInput(Parcel& parcel) { | ||||
|     parcel.ReadFlattened(*this); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -14,11 +14,11 @@ | ||||
|  | ||||
| namespace Service::android { | ||||
|  | ||||
| class InputParcel; | ||||
| class Parcel; | ||||
|  | ||||
| #pragma pack(push, 1) | ||||
| struct QueueBufferInput final { | ||||
|     explicit QueueBufferInput(InputParcel& parcel); | ||||
|     explicit QueueBufferInput(Parcel& parcel); | ||||
|  | ||||
|     void Deflate(s64* timestamp_, bool* is_auto_timestamp_, Common::Rectangle<s32>* crop_, | ||||
|                  NativeWindowScalingMode* scaling_mode_, NativeWindowTransform* transform_, | ||||
|   | ||||
| @@ -4,7 +4,6 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <memory> | ||||
| #include <span> | ||||
| #include <vector> | ||||
|  | ||||
| #include "common/alignment.h" | ||||
| @@ -13,17 +12,18 @@ | ||||
|  | ||||
| namespace Service::android { | ||||
|  | ||||
| struct ParcelHeader { | ||||
|     u32 data_size; | ||||
|     u32 data_offset; | ||||
|     u32 objects_size; | ||||
|     u32 objects_offset; | ||||
| }; | ||||
| static_assert(sizeof(ParcelHeader) == 16, "ParcelHeader has wrong size"); | ||||
|  | ||||
| class InputParcel final { | ||||
| class Parcel final { | ||||
| public: | ||||
|     explicit InputParcel(std::span<const u8> in_data) : read_buffer(std::move(in_data)) { | ||||
|     static constexpr std::size_t DefaultBufferSize = 0x40; | ||||
|  | ||||
|     Parcel() : buffer(DefaultBufferSize) {} | ||||
|  | ||||
|     template <typename T> | ||||
|     explicit Parcel(const T& out_data) : buffer(DefaultBufferSize) { | ||||
|         Write(out_data); | ||||
|     } | ||||
|  | ||||
|     explicit Parcel(std::vector<u8> in_data) : buffer(std::move(in_data)) { | ||||
|         DeserializeHeader(); | ||||
|         [[maybe_unused]] const std::u16string token = ReadInterfaceToken(); | ||||
|     } | ||||
| @@ -31,9 +31,9 @@ public: | ||||
|     template <typename T> | ||||
|     void Read(T& val) { | ||||
|         static_assert(std::is_trivially_copyable_v<T>, "T must be trivially copyable."); | ||||
|         ASSERT(read_index + sizeof(T) <= read_buffer.size()); | ||||
|         ASSERT(read_index + sizeof(T) <= buffer.size()); | ||||
|  | ||||
|         std::memcpy(&val, read_buffer.data() + read_index, sizeof(T)); | ||||
|         std::memcpy(&val, buffer.data() + read_index, sizeof(T)); | ||||
|         read_index += sizeof(T); | ||||
|         read_index = Common::AlignUp(read_index, 4); | ||||
|     } | ||||
| @@ -62,10 +62,10 @@ public: | ||||
|     template <typename T> | ||||
|     T ReadUnaligned() { | ||||
|         static_assert(std::is_trivially_copyable_v<T>, "T must be trivially copyable."); | ||||
|         ASSERT(read_index + sizeof(T) <= read_buffer.size()); | ||||
|         ASSERT(read_index + sizeof(T) <= buffer.size()); | ||||
|  | ||||
|         T val; | ||||
|         std::memcpy(&val, read_buffer.data() + read_index, sizeof(T)); | ||||
|         std::memcpy(&val, buffer.data() + read_index, sizeof(T)); | ||||
|         read_index += sizeof(T); | ||||
|         return val; | ||||
|     } | ||||
| @@ -101,31 +101,6 @@ public: | ||||
|         return token; | ||||
|     } | ||||
|  | ||||
|     void DeserializeHeader() { | ||||
|         ASSERT(read_buffer.size() > sizeof(ParcelHeader)); | ||||
|  | ||||
|         ParcelHeader header{}; | ||||
|         std::memcpy(&header, read_buffer.data(), sizeof(ParcelHeader)); | ||||
|  | ||||
|         read_index = header.data_offset; | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     std::span<const u8> read_buffer; | ||||
|     std::size_t read_index = 0; | ||||
| }; | ||||
|  | ||||
| class OutputParcel final { | ||||
| public: | ||||
|     static constexpr std::size_t DefaultBufferSize = 0x40; | ||||
|  | ||||
|     OutputParcel() : buffer(DefaultBufferSize) {} | ||||
|  | ||||
|     template <typename T> | ||||
|     explicit OutputParcel(const T& out_data) : buffer(DefaultBufferSize) { | ||||
|         Write(out_data); | ||||
|     } | ||||
|  | ||||
|     template <typename T> | ||||
|     void Write(const T& val) { | ||||
|         static_assert(std::is_trivially_copyable_v<T>, "T must be trivially copyable."); | ||||
| @@ -158,20 +133,40 @@ public: | ||||
|         WriteObject(ptr.get()); | ||||
|     } | ||||
|  | ||||
|     void DeserializeHeader() { | ||||
|         ASSERT(buffer.size() > sizeof(Header)); | ||||
|  | ||||
|         Header header{}; | ||||
|         std::memcpy(&header, buffer.data(), sizeof(Header)); | ||||
|  | ||||
|         read_index = header.data_offset; | ||||
|     } | ||||
|  | ||||
|     std::vector<u8> Serialize() const { | ||||
|         ParcelHeader header{}; | ||||
|         header.data_size = static_cast<u32>(write_index - sizeof(ParcelHeader)); | ||||
|         header.data_offset = sizeof(ParcelHeader); | ||||
|         ASSERT(read_index == 0); | ||||
|  | ||||
|         Header header{}; | ||||
|         header.data_size = static_cast<u32>(write_index - sizeof(Header)); | ||||
|         header.data_offset = sizeof(Header); | ||||
|         header.objects_size = 4; | ||||
|         header.objects_offset = static_cast<u32>(sizeof(ParcelHeader) + header.data_size); | ||||
|         std::memcpy(buffer.data(), &header, sizeof(ParcelHeader)); | ||||
|         header.objects_offset = static_cast<u32>(sizeof(Header) + header.data_size); | ||||
|         std::memcpy(buffer.data(), &header, sizeof(Header)); | ||||
|  | ||||
|         return buffer; | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     struct Header { | ||||
|         u32 data_size; | ||||
|         u32 data_offset; | ||||
|         u32 objects_size; | ||||
|         u32 objects_offset; | ||||
|     }; | ||||
|     static_assert(sizeof(Header) == 16, "ParcelHeader has wrong size"); | ||||
|  | ||||
|     mutable std::vector<u8> buffer; | ||||
|     std::size_t write_index = sizeof(ParcelHeader); | ||||
|     std::size_t read_index = 0; | ||||
|     std::size_t write_index = sizeof(Header); | ||||
| }; | ||||
|  | ||||
| } // namespace Service::android | ||||
|   | ||||
| @@ -63,7 +63,7 @@ private: | ||||
|                 return ctx.ReadBuffer(1); | ||||
|             } | ||||
|  | ||||
|             return std::span<const u8>{}; | ||||
|             return std::vector<u8>{}; | ||||
|         }(); | ||||
|  | ||||
|         LOG_DEBUG(Service_PREPO, | ||||
| @@ -90,7 +90,7 @@ private: | ||||
|                 return ctx.ReadBuffer(1); | ||||
|             } | ||||
|  | ||||
|             return std::span<const u8>{}; | ||||
|             return std::vector<u8>{}; | ||||
|         }(); | ||||
|  | ||||
|         LOG_DEBUG(Service_PREPO, | ||||
| @@ -142,7 +142,7 @@ private: | ||||
|                 return ctx.ReadBuffer(1); | ||||
|             } | ||||
|  | ||||
|             return std::span<const u8>{}; | ||||
|             return std::vector<u8>{}; | ||||
|         }(); | ||||
|  | ||||
|         LOG_DEBUG(Service_PREPO, "called, title_id={:016X}, data1_size={:016X}, data2_size={:016X}", | ||||
| @@ -166,7 +166,7 @@ private: | ||||
|                 return ctx.ReadBuffer(1); | ||||
|             } | ||||
|  | ||||
|             return std::span<const u8>{}; | ||||
|             return std::vector<u8>{}; | ||||
|         }(); | ||||
|  | ||||
|         LOG_DEBUG(Service_PREPO, | ||||
|   | ||||
| @@ -208,6 +208,7 @@ void BSD::Bind(Kernel::HLERequestContext& ctx) { | ||||
|     const s32 fd = rp.Pop<s32>(); | ||||
|  | ||||
|     LOG_DEBUG(Service, "called. fd={} addrlen={}", fd, ctx.GetReadBufferSize()); | ||||
|  | ||||
|     BuildErrnoResponse(ctx, BindImpl(fd, ctx.ReadBuffer())); | ||||
| } | ||||
|  | ||||
| @@ -311,7 +312,7 @@ void BSD::SetSockOpt(Kernel::HLERequestContext& ctx) { | ||||
|     const u32 level = rp.Pop<u32>(); | ||||
|     const OptName optname = static_cast<OptName>(rp.Pop<u32>()); | ||||
|  | ||||
|     const auto buffer = ctx.ReadBuffer(); | ||||
|     const std::vector<u8> buffer = ctx.ReadBuffer(); | ||||
|     const u8* optval = buffer.empty() ? nullptr : buffer.data(); | ||||
|     size_t optlen = buffer.size(); | ||||
|  | ||||
| @@ -488,7 +489,7 @@ std::pair<s32, Errno> BSD::SocketImpl(Domain domain, Type type, Protocol protoco | ||||
|     return {fd, Errno::SUCCESS}; | ||||
| } | ||||
|  | ||||
| std::pair<s32, Errno> BSD::PollImpl(std::vector<u8>& write_buffer, std::span<const u8> read_buffer, | ||||
| std::pair<s32, Errno> BSD::PollImpl(std::vector<u8>& write_buffer, std::vector<u8> read_buffer, | ||||
|                                     s32 nfds, s32 timeout) { | ||||
|     if (write_buffer.size() < nfds * sizeof(PollFD)) { | ||||
|         return {-1, Errno::INVAL}; | ||||
| @@ -583,7 +584,7 @@ std::pair<s32, Errno> BSD::AcceptImpl(s32 fd, std::vector<u8>& write_buffer) { | ||||
|     return {new_fd, Errno::SUCCESS}; | ||||
| } | ||||
|  | ||||
| Errno BSD::BindImpl(s32 fd, std::span<const u8> addr) { | ||||
| Errno BSD::BindImpl(s32 fd, const std::vector<u8>& addr) { | ||||
|     if (!IsFileDescriptorValid(fd)) { | ||||
|         return Errno::BADF; | ||||
|     } | ||||
| @@ -594,7 +595,7 @@ Errno BSD::BindImpl(s32 fd, std::span<const u8> addr) { | ||||
|     return Translate(file_descriptors[fd]->socket->Bind(Translate(addr_in))); | ||||
| } | ||||
|  | ||||
| Errno BSD::ConnectImpl(s32 fd, std::span<const u8> addr) { | ||||
| Errno BSD::ConnectImpl(s32 fd, const std::vector<u8>& addr) { | ||||
|     if (!IsFileDescriptorValid(fd)) { | ||||
|         return Errno::BADF; | ||||
|     } | ||||
| @@ -799,15 +800,15 @@ std::pair<s32, Errno> BSD::RecvFromImpl(s32 fd, u32 flags, std::vector<u8>& mess | ||||
|     return {ret, bsd_errno}; | ||||
| } | ||||
|  | ||||
| std::pair<s32, Errno> BSD::SendImpl(s32 fd, u32 flags, std::span<const u8> message) { | ||||
| std::pair<s32, Errno> BSD::SendImpl(s32 fd, u32 flags, const std::vector<u8>& message) { | ||||
|     if (!IsFileDescriptorValid(fd)) { | ||||
|         return {-1, Errno::BADF}; | ||||
|     } | ||||
|     return Translate(file_descriptors[fd]->socket->Send(message, flags)); | ||||
| } | ||||
|  | ||||
| std::pair<s32, Errno> BSD::SendToImpl(s32 fd, u32 flags, std::span<const u8> message, | ||||
|                                       std::span<const u8> addr) { | ||||
| std::pair<s32, Errno> BSD::SendToImpl(s32 fd, u32 flags, const std::vector<u8>& message, | ||||
|                                       const std::vector<u8>& addr) { | ||||
|     if (!IsFileDescriptorValid(fd)) { | ||||
|         return {-1, Errno::BADF}; | ||||
|     } | ||||
|   | ||||
| @@ -4,7 +4,6 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <memory> | ||||
| #include <span> | ||||
| #include <vector> | ||||
|  | ||||
| #include "common/common_types.h" | ||||
| @@ -45,7 +44,7 @@ private: | ||||
|  | ||||
|         s32 nfds; | ||||
|         s32 timeout; | ||||
|         std::span<const u8> read_buffer; | ||||
|         std::vector<u8> read_buffer; | ||||
|         std::vector<u8> write_buffer; | ||||
|         s32 ret{}; | ||||
|         Errno bsd_errno{}; | ||||
| @@ -66,7 +65,7 @@ private: | ||||
|         void Response(Kernel::HLERequestContext& ctx); | ||||
|  | ||||
|         s32 fd; | ||||
|         std::span<const u8> addr; | ||||
|         std::vector<u8> addr; | ||||
|         Errno bsd_errno{}; | ||||
|     }; | ||||
|  | ||||
| @@ -99,7 +98,7 @@ private: | ||||
|  | ||||
|         s32 fd; | ||||
|         u32 flags; | ||||
|         std::span<const u8> message; | ||||
|         std::vector<u8> message; | ||||
|         s32 ret{}; | ||||
|         Errno bsd_errno{}; | ||||
|     }; | ||||
| @@ -110,8 +109,8 @@ private: | ||||
|  | ||||
|         s32 fd; | ||||
|         u32 flags; | ||||
|         std::span<const u8> message; | ||||
|         std::span<const u8> addr; | ||||
|         std::vector<u8> message; | ||||
|         std::vector<u8> addr; | ||||
|         s32 ret{}; | ||||
|         Errno bsd_errno{}; | ||||
|     }; | ||||
| @@ -144,11 +143,11 @@ private: | ||||
|     void ExecuteWork(Kernel::HLERequestContext& ctx, Work work); | ||||
|  | ||||
|     std::pair<s32, Errno> SocketImpl(Domain domain, Type type, Protocol protocol); | ||||
|     std::pair<s32, Errno> PollImpl(std::vector<u8>& write_buffer, std::span<const u8> read_buffer, | ||||
|     std::pair<s32, Errno> PollImpl(std::vector<u8>& write_buffer, std::vector<u8> read_buffer, | ||||
|                                    s32 nfds, s32 timeout); | ||||
|     std::pair<s32, Errno> AcceptImpl(s32 fd, std::vector<u8>& write_buffer); | ||||
|     Errno BindImpl(s32 fd, std::span<const u8> addr); | ||||
|     Errno ConnectImpl(s32 fd, std::span<const u8> addr); | ||||
|     Errno BindImpl(s32 fd, const std::vector<u8>& addr); | ||||
|     Errno ConnectImpl(s32 fd, const std::vector<u8>& addr); | ||||
|     Errno GetPeerNameImpl(s32 fd, std::vector<u8>& write_buffer); | ||||
|     Errno GetSockNameImpl(s32 fd, std::vector<u8>& write_buffer); | ||||
|     Errno ListenImpl(s32 fd, s32 backlog); | ||||
| @@ -158,9 +157,9 @@ private: | ||||
|     std::pair<s32, Errno> RecvImpl(s32 fd, u32 flags, std::vector<u8>& message); | ||||
|     std::pair<s32, Errno> RecvFromImpl(s32 fd, u32 flags, std::vector<u8>& message, | ||||
|                                        std::vector<u8>& addr); | ||||
|     std::pair<s32, Errno> SendImpl(s32 fd, u32 flags, std::span<const u8> message); | ||||
|     std::pair<s32, Errno> SendToImpl(s32 fd, u32 flags, std::span<const u8> message, | ||||
|                                      std::span<const u8> addr); | ||||
|     std::pair<s32, Errno> SendImpl(s32 fd, u32 flags, const std::vector<u8>& message); | ||||
|     std::pair<s32, Errno> SendToImpl(s32 fd, u32 flags, const std::vector<u8>& message, | ||||
|                                      const std::vector<u8>& addr); | ||||
|     Errno CloseImpl(s32 fd); | ||||
|  | ||||
|     s32 FindFreeFileDescriptorHandle() noexcept; | ||||
|   | ||||
| @@ -243,4 +243,4 @@ void SFDNSRES::GetAddrInfoRequestWithOptions(Kernel::HLERequestContext& ctx) { | ||||
|     rb.Push(0); | ||||
| } | ||||
|  | ||||
| } // namespace Service::Sockets | ||||
| } // namespace Service::Sockets | ||||
| @@ -101,7 +101,7 @@ private: | ||||
|     void ImportServerPki(Kernel::HLERequestContext& ctx) { | ||||
|         IPC::RequestParser rp{ctx}; | ||||
|         const auto certificate_format = rp.PopEnum<CertificateFormat>(); | ||||
|         [[maybe_unused]] const auto pkcs_12_certificates = ctx.ReadBuffer(0); | ||||
|         const auto pkcs_12_certificates = ctx.ReadBuffer(0); | ||||
|  | ||||
|         constexpr u64 server_id = 0; | ||||
|  | ||||
| @@ -113,13 +113,13 @@ private: | ||||
|     } | ||||
|  | ||||
|     void ImportClientPki(Kernel::HLERequestContext& ctx) { | ||||
|         [[maybe_unused]] const auto pkcs_12_certificate = ctx.ReadBuffer(0); | ||||
|         [[maybe_unused]] const auto ascii_password = [&ctx] { | ||||
|         const auto pkcs_12_certificate = ctx.ReadBuffer(0); | ||||
|         const auto ascii_password = [&ctx] { | ||||
|             if (ctx.CanReadBuffer(1)) { | ||||
|                 return ctx.ReadBuffer(1); | ||||
|             } | ||||
|  | ||||
|             return std::span<const u8>{}; | ||||
|             return std::vector<u8>{}; | ||||
|         }(); | ||||
|  | ||||
|         constexpr u64 client_id = 0; | ||||
|   | ||||
| @@ -603,7 +603,7 @@ private: | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         const auto parcel = android::OutputParcel{NativeWindow{*buffer_queue_id}}; | ||||
|         const auto parcel = android::Parcel{NativeWindow{*buffer_queue_id}}; | ||||
|         const auto buffer_size = ctx.WriteBuffer(parcel.Serialize()); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 4}; | ||||
| @@ -649,7 +649,7 @@ private: | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         const auto parcel = android::OutputParcel{NativeWindow{*buffer_queue_id}}; | ||||
|         const auto parcel = android::Parcel{NativeWindow{*buffer_queue_id}}; | ||||
|         const auto buffer_size = ctx.WriteBuffer(parcel.Serialize()); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 6}; | ||||
|   | ||||
| @@ -550,7 +550,7 @@ std::pair<s32, Errno> Socket::RecvFrom(int flags, std::vector<u8>& message, Sock | ||||
|     return {-1, GetAndLogLastError()}; | ||||
| } | ||||
|  | ||||
| std::pair<s32, Errno> Socket::Send(std::span<const u8> message, int flags) { | ||||
| std::pair<s32, Errno> Socket::Send(const std::vector<u8>& message, int flags) { | ||||
|     ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max())); | ||||
|     ASSERT(flags == 0); | ||||
|  | ||||
| @@ -563,7 +563,7 @@ std::pair<s32, Errno> Socket::Send(std::span<const u8> message, int flags) { | ||||
|     return {-1, GetAndLogLastError()}; | ||||
| } | ||||
|  | ||||
| std::pair<s32, Errno> Socket::SendTo(u32 flags, std::span<const u8> message, | ||||
| std::pair<s32, Errno> Socket::SendTo(u32 flags, const std::vector<u8>& message, | ||||
|                                      const SockAddrIn* addr) { | ||||
|     ASSERT(flags == 0); | ||||
|  | ||||
|   | ||||
| @@ -182,7 +182,7 @@ std::pair<s32, Errno> ProxySocket::ReceivePacket(int flags, std::vector<u8>& mes | ||||
|     return {static_cast<u32>(read_bytes), Errno::SUCCESS}; | ||||
| } | ||||
|  | ||||
| std::pair<s32, Errno> ProxySocket::Send(std::span<const u8> message, int flags) { | ||||
| std::pair<s32, Errno> ProxySocket::Send(const std::vector<u8>& message, int flags) { | ||||
|     LOG_WARNING(Network, "(STUBBED) called"); | ||||
|     ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max())); | ||||
|     ASSERT(flags == 0); | ||||
| @@ -200,7 +200,7 @@ void ProxySocket::SendPacket(ProxyPacket& packet) { | ||||
|     } | ||||
| } | ||||
|  | ||||
| std::pair<s32, Errno> ProxySocket::SendTo(u32 flags, std::span<const u8> message, | ||||
| std::pair<s32, Errno> ProxySocket::SendTo(u32 flags, const std::vector<u8>& message, | ||||
|                                           const SockAddrIn* addr) { | ||||
|     ASSERT(flags == 0); | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,6 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <mutex> | ||||
| #include <span> | ||||
| #include <vector> | ||||
| #include <queue> | ||||
|  | ||||
| @@ -49,11 +48,11 @@ public: | ||||
|     std::pair<s32, Errno> ReceivePacket(int flags, std::vector<u8>& message, SockAddrIn* addr, | ||||
|                                         std::size_t max_length); | ||||
|  | ||||
|     std::pair<s32, Errno> Send(std::span<const u8> message, int flags) override; | ||||
|     std::pair<s32, Errno> Send(const std::vector<u8>& message, int flags) override; | ||||
|  | ||||
|     void SendPacket(ProxyPacket& packet); | ||||
|  | ||||
|     std::pair<s32, Errno> SendTo(u32 flags, std::span<const u8> message, | ||||
|     std::pair<s32, Errno> SendTo(u32 flags, const std::vector<u8>& message, | ||||
|                                  const SockAddrIn* addr) override; | ||||
|  | ||||
|     Errno SetLinger(bool enable, u32 linger) override; | ||||
|   | ||||
| @@ -5,7 +5,6 @@ | ||||
|  | ||||
| #include <map> | ||||
| #include <memory> | ||||
| #include <span> | ||||
| #include <utility> | ||||
|  | ||||
| #if defined(_WIN32) | ||||
| @@ -67,9 +66,9 @@ public: | ||||
|     virtual std::pair<s32, Errno> RecvFrom(int flags, std::vector<u8>& message, | ||||
|                                            SockAddrIn* addr) = 0; | ||||
|  | ||||
|     virtual std::pair<s32, Errno> Send(std::span<const u8> message, int flags) = 0; | ||||
|     virtual std::pair<s32, Errno> Send(const std::vector<u8>& message, int flags) = 0; | ||||
|  | ||||
|     virtual std::pair<s32, Errno> SendTo(u32 flags, std::span<const u8> message, | ||||
|     virtual std::pair<s32, Errno> SendTo(u32 flags, const std::vector<u8>& message, | ||||
|                                          const SockAddrIn* addr) = 0; | ||||
|  | ||||
|     virtual Errno SetLinger(bool enable, u32 linger) = 0; | ||||
| @@ -139,9 +138,9 @@ public: | ||||
|  | ||||
|     std::pair<s32, Errno> RecvFrom(int flags, std::vector<u8>& message, SockAddrIn* addr) override; | ||||
|  | ||||
|     std::pair<s32, Errno> Send(std::span<const u8> message, int flags) override; | ||||
|     std::pair<s32, Errno> Send(const std::vector<u8>& message, int flags) override; | ||||
|  | ||||
|     std::pair<s32, Errno> SendTo(u32 flags, std::span<const u8> message, | ||||
|     std::pair<s32, Errno> SendTo(u32 flags, const std::vector<u8>& message, | ||||
|                                  const SockAddrIn* addr) override; | ||||
|  | ||||
|     Errno SetLinger(bool enable, u32 linger) override; | ||||
|   | ||||
| @@ -312,7 +312,7 @@ void Reporter::SaveUnimplementedAppletReport( | ||||
| } | ||||
|  | ||||
| void Reporter::SavePlayReport(PlayReportType type, u64 title_id, | ||||
|                               const std::vector<std::span<const u8>>& data, | ||||
|                               const std::vector<std::vector<u8>>& data, | ||||
|                               std::optional<u64> process_id, std::optional<u128> user_id) const { | ||||
|     if (!IsReportingEnabled()) { | ||||
|         return; | ||||
|   | ||||
| @@ -5,7 +5,6 @@ | ||||
|  | ||||
| #include <array> | ||||
| #include <optional> | ||||
| #include <span> | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include "common/common_types.h" | ||||
| @@ -57,8 +56,7 @@ public: | ||||
|         System, | ||||
|     }; | ||||
|  | ||||
|     void SavePlayReport(PlayReportType type, u64 title_id, | ||||
|                         const std::vector<std::span<const u8>>& data, | ||||
|     void SavePlayReport(PlayReportType type, u64 title_id, const std::vector<std::vector<u8>>& data, | ||||
|                         std::optional<u64> process_id = {}, std::optional<u128> user_id = {}) const; | ||||
|  | ||||
|     // Used by error applet | ||||
|   | ||||
| @@ -51,29 +51,8 @@ endif() | ||||
|  | ||||
| if (ENABLE_SDL2) | ||||
|     target_sources(input_common PRIVATE | ||||
|         drivers/joycon.cpp | ||||
|         drivers/joycon.h | ||||
|         drivers/sdl_driver.cpp | ||||
|         drivers/sdl_driver.h | ||||
|         helpers/joycon_driver.cpp | ||||
|         helpers/joycon_driver.h | ||||
|         helpers/joycon_protocol/calibration.cpp | ||||
|         helpers/joycon_protocol/calibration.h | ||||
|         helpers/joycon_protocol/common_protocol.cpp | ||||
|         helpers/joycon_protocol/common_protocol.h | ||||
|         helpers/joycon_protocol/generic_functions.cpp | ||||
|         helpers/joycon_protocol/generic_functions.h | ||||
|         helpers/joycon_protocol/joycon_types.h | ||||
|         helpers/joycon_protocol/irs.cpp | ||||
|         helpers/joycon_protocol/irs.h | ||||
|         helpers/joycon_protocol/nfc.cpp | ||||
|         helpers/joycon_protocol/nfc.h | ||||
|         helpers/joycon_protocol/poller.cpp | ||||
|         helpers/joycon_protocol/poller.h | ||||
|         helpers/joycon_protocol/ringcon.cpp | ||||
|         helpers/joycon_protocol/ringcon.h | ||||
|         helpers/joycon_protocol/rumble.cpp | ||||
|         helpers/joycon_protocol/rumble.h | ||||
|     ) | ||||
|     target_link_libraries(input_common PRIVATE SDL2::SDL2) | ||||
|     target_compile_definitions(input_common PRIVATE HAVE_SDL2) | ||||
|   | ||||
| @@ -72,11 +72,11 @@ std::size_t Camera::getImageHeight() const { | ||||
|     } | ||||
| } | ||||
|  | ||||
| Common::Input::DriverResult Camera::SetCameraFormat( | ||||
| Common::Input::CameraError Camera::SetCameraFormat( | ||||
|     [[maybe_unused]] const PadIdentifier& identifier_, | ||||
|     const Common::Input::CameraFormat camera_format) { | ||||
|     status.format = camera_format; | ||||
|     return Common::Input::DriverResult::Success; | ||||
|     return Common::Input::CameraError::None; | ||||
| } | ||||
|  | ||||
| } // namespace InputCommon | ||||
|   | ||||
| @@ -22,8 +22,8 @@ public: | ||||
|     std::size_t getImageWidth() const; | ||||
|     std::size_t getImageHeight() const; | ||||
|  | ||||
|     Common::Input::DriverResult SetCameraFormat(const PadIdentifier& identifier_, | ||||
|                                                 Common::Input::CameraFormat camera_format) override; | ||||
|     Common::Input::CameraError SetCameraFormat(const PadIdentifier& identifier_, | ||||
|                                                Common::Input::CameraFormat camera_format) override; | ||||
|  | ||||
| private: | ||||
|     Common::Input::CameraStatus status{}; | ||||
|   | ||||
| @@ -324,7 +324,7 @@ bool GCAdapter::GetGCEndpoint(libusb_device* device) { | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| Common::Input::DriverResult GCAdapter::SetVibration( | ||||
| Common::Input::VibrationError GCAdapter::SetVibration( | ||||
|     const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) { | ||||
|     const auto mean_amplitude = (vibration.low_amplitude + vibration.high_amplitude) * 0.5f; | ||||
|     const auto processed_amplitude = | ||||
| @@ -333,9 +333,9 @@ Common::Input::DriverResult GCAdapter::SetVibration( | ||||
|     pads[identifier.port].rumble_amplitude = processed_amplitude; | ||||
|  | ||||
|     if (!rumble_enabled) { | ||||
|         return Common::Input::DriverResult::Disabled; | ||||
|         return Common::Input::VibrationError::Disabled; | ||||
|     } | ||||
|     return Common::Input::DriverResult::Success; | ||||
|     return Common::Input::VibrationError::None; | ||||
| } | ||||
|  | ||||
| bool GCAdapter::IsVibrationEnabled([[maybe_unused]] const PadIdentifier& identifier) { | ||||
|   | ||||
| @@ -25,7 +25,7 @@ public: | ||||
|     explicit GCAdapter(std::string input_engine_); | ||||
|     ~GCAdapter() override; | ||||
|  | ||||
|     Common::Input::DriverResult SetVibration( | ||||
|     Common::Input::VibrationError SetVibration( | ||||
|         const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) override; | ||||
|  | ||||
|     bool IsVibrationEnabled(const PadIdentifier& identifier) override; | ||||
|   | ||||
| @@ -318,14 +318,6 @@ void SDLDriver::InitJoystick(int joystick_index) { | ||||
|  | ||||
|     const auto guid = GetGUID(sdl_joystick); | ||||
|  | ||||
|     if (Settings::values.enable_joycon_driver) { | ||||
|         if (guid.uuid[5] == 0x05 && guid.uuid[4] == 0x7e) { | ||||
|             LOG_ERROR(Input, "Device black listed {}", joystick_index); | ||||
|             SDL_JoystickClose(sdl_joystick); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     std::scoped_lock lock{joystick_map_mutex}; | ||||
|     if (joystick_map.find(guid) == joystick_map.end()) { | ||||
|         auto joystick = std::make_shared<SDLJoystick>(guid, 0, sdl_joystick, sdl_gamecontroller); | ||||
| @@ -448,14 +440,9 @@ SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_en | ||||
|     SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE, "1"); | ||||
|     SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1"); | ||||
|  | ||||
|     // Disable hidapi drivers for switch controllers when the custom joycon driver is enabled | ||||
|     if (Settings::values.enable_joycon_driver) { | ||||
|         SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS, "0"); | ||||
|         SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_SWITCH, "0"); | ||||
|     } else { | ||||
|         SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS, "1"); | ||||
|         SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_SWITCH, "1"); | ||||
|     } | ||||
|     // Use hidapi driver for joycons. This will allow joycons to be detected as a GameController and | ||||
|     // not a generic one | ||||
|     SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS, "1"); | ||||
|  | ||||
|     // Disable hidapi driver for xbox. Already default on Windows, this causes conflict with native | ||||
|     // driver on Linux. | ||||
| @@ -545,7 +532,7 @@ std::vector<Common::ParamPackage> SDLDriver::GetInputDevices() const { | ||||
|     return devices; | ||||
| } | ||||
|  | ||||
| Common::Input::DriverResult SDLDriver::SetVibration( | ||||
| Common::Input::VibrationError SDLDriver::SetVibration( | ||||
|     const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) { | ||||
|     const auto joystick = | ||||
|         GetSDLJoystickByGUID(identifier.guid.RawString(), static_cast<int>(identifier.port)); | ||||
| @@ -579,7 +566,7 @@ Common::Input::DriverResult SDLDriver::SetVibration( | ||||
|         .vibration = new_vibration, | ||||
|     }); | ||||
|  | ||||
|     return Common::Input::DriverResult::Success; | ||||
|     return Common::Input::VibrationError::None; | ||||
| } | ||||
|  | ||||
| bool SDLDriver::IsVibrationEnabled(const PadIdentifier& identifier) { | ||||
|   | ||||
| @@ -63,7 +63,7 @@ public: | ||||
|  | ||||
|     bool IsStickInverted(const Common::ParamPackage& params) override; | ||||
|  | ||||
|     Common::Input::DriverResult SetVibration( | ||||
|     Common::Input::VibrationError SetVibration( | ||||
|         const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) override; | ||||
|  | ||||
|     bool IsVibrationEnabled(const PadIdentifier& identifier) override; | ||||
|   | ||||
| @@ -22,23 +22,22 @@ VirtualAmiibo::VirtualAmiibo(std::string input_engine_) : InputEngine(std::move( | ||||
|  | ||||
| VirtualAmiibo::~VirtualAmiibo() = default; | ||||
|  | ||||
| Common::Input::DriverResult VirtualAmiibo::SetPollingMode( | ||||
| Common::Input::PollingError VirtualAmiibo::SetPollingMode( | ||||
|     [[maybe_unused]] const PadIdentifier& identifier_, | ||||
|     const Common::Input::PollingMode polling_mode_) { | ||||
|     polling_mode = polling_mode_; | ||||
|  | ||||
|     switch (polling_mode) { | ||||
|     case Common::Input::PollingMode::NFC: | ||||
|     if (polling_mode == Common::Input::PollingMode::NFC) { | ||||
|         if (state == State::Initialized) { | ||||
|             state = State::WaitingForAmiibo; | ||||
|         } | ||||
|         return Common::Input::DriverResult::Success; | ||||
|     default: | ||||
|     } else { | ||||
|         if (state == State::AmiiboIsOpen) { | ||||
|             CloseAmiibo(); | ||||
|         } | ||||
|         return Common::Input::DriverResult::NotSupported; | ||||
|     } | ||||
|  | ||||
|     return Common::Input::PollingError::None; | ||||
| } | ||||
|  | ||||
| Common::Input::NfcState VirtualAmiibo::SupportsNfc( | ||||
|   | ||||
| @@ -36,7 +36,7 @@ public: | ||||
|     ~VirtualAmiibo() override; | ||||
|  | ||||
|     // Sets polling mode to a controller | ||||
|     Common::Input::DriverResult SetPollingMode( | ||||
|     Common::Input::PollingError SetPollingMode( | ||||
|         const PadIdentifier& identifier_, const Common::Input::PollingMode polling_mode_) override; | ||||
|  | ||||
|     Common::Input::NfcState SupportsNfc(const PadIdentifier& identifier_) const override; | ||||
|   | ||||
| @@ -79,17 +79,6 @@ void InputEngine::SetBattery(const PadIdentifier& identifier, Common::Input::Bat | ||||
|     TriggerOnBatteryChange(identifier, value); | ||||
| } | ||||
|  | ||||
| void InputEngine::SetColor(const PadIdentifier& identifier, Common::Input::BodyColorStatus value) { | ||||
|     { | ||||
|         std::scoped_lock lock{mutex}; | ||||
|         ControllerData& controller = controller_list.at(identifier); | ||||
|         if (!configuring) { | ||||
|             controller.color = value; | ||||
|         } | ||||
|     } | ||||
|     TriggerOnColorChange(identifier, value); | ||||
| } | ||||
|  | ||||
| void InputEngine::SetMotion(const PadIdentifier& identifier, int motion, const BasicMotion& value) { | ||||
|     { | ||||
|         std::scoped_lock lock{mutex}; | ||||
| @@ -187,18 +176,6 @@ Common::Input::BatteryLevel InputEngine::GetBattery(const PadIdentifier& identif | ||||
|     return controller.battery; | ||||
| } | ||||
|  | ||||
| Common::Input::BodyColorStatus InputEngine::GetColor(const PadIdentifier& identifier) const { | ||||
|     std::scoped_lock lock{mutex}; | ||||
|     const auto controller_iter = controller_list.find(identifier); | ||||
|     if (controller_iter == controller_list.cend()) { | ||||
|         LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), | ||||
|                   identifier.pad, identifier.port); | ||||
|         return {}; | ||||
|     } | ||||
|     const ControllerData& controller = controller_iter->second; | ||||
|     return controller.color; | ||||
| } | ||||
|  | ||||
| BasicMotion InputEngine::GetMotion(const PadIdentifier& identifier, int motion) const { | ||||
|     std::scoped_lock lock{mutex}; | ||||
|     const auto controller_iter = controller_list.find(identifier); | ||||
| @@ -351,20 +328,6 @@ void InputEngine::TriggerOnBatteryChange(const PadIdentifier& identifier, | ||||
|     } | ||||
| } | ||||
|  | ||||
| void InputEngine::TriggerOnColorChange(const PadIdentifier& identifier, | ||||
|                                        [[maybe_unused]] Common::Input::BodyColorStatus value) { | ||||
|     std::scoped_lock lock{mutex_callback}; | ||||
|     for (const auto& poller_pair : callback_list) { | ||||
|         const InputIdentifier& poller = poller_pair.second; | ||||
|         if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Color, 0)) { | ||||
|             continue; | ||||
|         } | ||||
|         if (poller.callback.on_change) { | ||||
|             poller.callback.on_change(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| void InputEngine::TriggerOnMotionChange(const PadIdentifier& identifier, int motion, | ||||
|                                         const BasicMotion& value) { | ||||
|     std::scoped_lock lock{mutex_callback}; | ||||
|   | ||||
| @@ -40,7 +40,6 @@ enum class EngineInputType { | ||||
|     Battery, | ||||
|     Button, | ||||
|     Camera, | ||||
|     Color, | ||||
|     HatButton, | ||||
|     Motion, | ||||
|     Nfc, | ||||
| @@ -105,17 +104,14 @@ public: | ||||
|     void EndConfiguration(); | ||||
|  | ||||
|     // Sets a led pattern for a controller | ||||
|     virtual Common::Input::DriverResult SetLeds( | ||||
|         [[maybe_unused]] const PadIdentifier& identifier, | ||||
|         [[maybe_unused]] const Common::Input::LedStatus& led_status) { | ||||
|         return Common::Input::DriverResult::NotSupported; | ||||
|     } | ||||
|     virtual void SetLeds([[maybe_unused]] const PadIdentifier& identifier, | ||||
|                          [[maybe_unused]] const Common::Input::LedStatus& led_status) {} | ||||
|  | ||||
|     // Sets rumble to a controller | ||||
|     virtual Common::Input::DriverResult SetVibration( | ||||
|     virtual Common::Input::VibrationError SetVibration( | ||||
|         [[maybe_unused]] const PadIdentifier& identifier, | ||||
|         [[maybe_unused]] const Common::Input::VibrationStatus& vibration) { | ||||
|         return Common::Input::DriverResult::NotSupported; | ||||
|         return Common::Input::VibrationError::NotSupported; | ||||
|     } | ||||
|  | ||||
|     // Returns true if device supports vibrations | ||||
| @@ -124,17 +120,17 @@ public: | ||||
|     } | ||||
|  | ||||
|     // Sets polling mode to a controller | ||||
|     virtual Common::Input::DriverResult SetPollingMode( | ||||
|     virtual Common::Input::PollingError SetPollingMode( | ||||
|         [[maybe_unused]] const PadIdentifier& identifier, | ||||
|         [[maybe_unused]] const Common::Input::PollingMode polling_mode) { | ||||
|         return Common::Input::DriverResult::NotSupported; | ||||
|         return Common::Input::PollingError::NotSupported; | ||||
|     } | ||||
|  | ||||
|     // Sets camera format to a controller | ||||
|     virtual Common::Input::DriverResult SetCameraFormat( | ||||
|     virtual Common::Input::CameraError SetCameraFormat( | ||||
|         [[maybe_unused]] const PadIdentifier& identifier, | ||||
|         [[maybe_unused]] Common::Input::CameraFormat camera_format) { | ||||
|         return Common::Input::DriverResult::NotSupported; | ||||
|         return Common::Input::CameraError::NotSupported; | ||||
|     } | ||||
|  | ||||
|     // Returns success if nfc is supported | ||||
| @@ -203,7 +199,6 @@ public: | ||||
|     bool GetHatButton(const PadIdentifier& identifier, int button, u8 direction) const; | ||||
|     f32 GetAxis(const PadIdentifier& identifier, int axis) const; | ||||
|     Common::Input::BatteryLevel GetBattery(const PadIdentifier& identifier) const; | ||||
|     Common::Input::BodyColorStatus GetColor(const PadIdentifier& identifier) const; | ||||
|     BasicMotion GetMotion(const PadIdentifier& identifier, int motion) const; | ||||
|     Common::Input::CameraStatus GetCamera(const PadIdentifier& identifier) const; | ||||
|     Common::Input::NfcStatus GetNfc(const PadIdentifier& identifier) const; | ||||
| @@ -217,7 +212,6 @@ protected: | ||||
|     void SetHatButton(const PadIdentifier& identifier, int button, u8 value); | ||||
|     void SetAxis(const PadIdentifier& identifier, int axis, f32 value); | ||||
|     void SetBattery(const PadIdentifier& identifier, Common::Input::BatteryLevel value); | ||||
|     void SetColor(const PadIdentifier& identifier, Common::Input::BodyColorStatus value); | ||||
|     void SetMotion(const PadIdentifier& identifier, int motion, const BasicMotion& value); | ||||
|     void SetCamera(const PadIdentifier& identifier, const Common::Input::CameraStatus& value); | ||||
|     void SetNfc(const PadIdentifier& identifier, const Common::Input::NfcStatus& value); | ||||
| @@ -233,7 +227,6 @@ private: | ||||
|         std::unordered_map<int, float> axes; | ||||
|         std::unordered_map<int, BasicMotion> motions; | ||||
|         Common::Input::BatteryLevel battery{}; | ||||
|         Common::Input::BodyColorStatus color{}; | ||||
|         Common::Input::CameraStatus camera{}; | ||||
|         Common::Input::NfcStatus nfc{}; | ||||
|     }; | ||||
| @@ -242,8 +235,6 @@ private: | ||||
|     void TriggerOnHatButtonChange(const PadIdentifier& identifier, int button, u8 value); | ||||
|     void TriggerOnAxisChange(const PadIdentifier& identifier, int axis, f32 value); | ||||
|     void TriggerOnBatteryChange(const PadIdentifier& identifier, Common::Input::BatteryLevel value); | ||||
|     void TriggerOnColorChange(const PadIdentifier& identifier, | ||||
|                               Common::Input::BodyColorStatus value); | ||||
|     void TriggerOnMotionChange(const PadIdentifier& identifier, int motion, | ||||
|                                const BasicMotion& value); | ||||
|     void TriggerOnCameraChange(const PadIdentifier& identifier, | ||||
|   | ||||
| @@ -498,58 +498,6 @@ private: | ||||
|     InputEngine* input_engine; | ||||
| }; | ||||
|  | ||||
| class InputFromColor final : public Common::Input::InputDevice { | ||||
| public: | ||||
|     explicit InputFromColor(PadIdentifier identifier_, InputEngine* input_engine_) | ||||
|         : identifier(identifier_), input_engine(input_engine_) { | ||||
|         UpdateCallback engine_callback{[this]() { OnChange(); }}; | ||||
|         const InputIdentifier input_identifier{ | ||||
|             .identifier = identifier, | ||||
|             .type = EngineInputType::Color, | ||||
|             .index = 0, | ||||
|             .callback = engine_callback, | ||||
|         }; | ||||
|         last_color_value = {}; | ||||
|         callback_key = input_engine->SetCallback(input_identifier); | ||||
|     } | ||||
|  | ||||
|     ~InputFromColor() override { | ||||
|         input_engine->DeleteCallback(callback_key); | ||||
|     } | ||||
|  | ||||
|     Common::Input::BodyColorStatus GetStatus() const { | ||||
|         return input_engine->GetColor(identifier); | ||||
|     } | ||||
|  | ||||
|     void ForceUpdate() override { | ||||
|         const Common::Input::CallbackStatus status{ | ||||
|             .type = Common::Input::InputType::Color, | ||||
|             .color_status = GetStatus(), | ||||
|         }; | ||||
|  | ||||
|         last_color_value = status.color_status; | ||||
|         TriggerOnChange(status); | ||||
|     } | ||||
|  | ||||
|     void OnChange() { | ||||
|         const Common::Input::CallbackStatus status{ | ||||
|             .type = Common::Input::InputType::Color, | ||||
|             .color_status = GetStatus(), | ||||
|         }; | ||||
|  | ||||
|         if (status.color_status.body != last_color_value.body) { | ||||
|             last_color_value = status.color_status; | ||||
|             TriggerOnChange(status); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     const PadIdentifier identifier; | ||||
|     int callback_key; | ||||
|     Common::Input::BodyColorStatus last_color_value; | ||||
|     InputEngine* input_engine; | ||||
| }; | ||||
|  | ||||
| class InputFromMotion final : public Common::Input::InputDevice { | ||||
| public: | ||||
|     explicit InputFromMotion(PadIdentifier identifier_, int motion_sensor_, float gyro_threshold_, | ||||
| @@ -806,11 +754,11 @@ public: | ||||
|     explicit OutputFromIdentifier(PadIdentifier identifier_, InputEngine* input_engine_) | ||||
|         : identifier(identifier_), input_engine(input_engine_) {} | ||||
|  | ||||
|     Common::Input::DriverResult SetLED(const Common::Input::LedStatus& led_status) override { | ||||
|         return input_engine->SetLeds(identifier, led_status); | ||||
|     void SetLED(const Common::Input::LedStatus& led_status) override { | ||||
|         input_engine->SetLeds(identifier, led_status); | ||||
|     } | ||||
|  | ||||
|     Common::Input::DriverResult SetVibration( | ||||
|     Common::Input::VibrationError SetVibration( | ||||
|         const Common::Input::VibrationStatus& vibration_status) override { | ||||
|         return input_engine->SetVibration(identifier, vibration_status); | ||||
|     } | ||||
| @@ -819,12 +767,11 @@ public: | ||||
|         return input_engine->IsVibrationEnabled(identifier); | ||||
|     } | ||||
|  | ||||
|     Common::Input::DriverResult SetPollingMode(Common::Input::PollingMode polling_mode) override { | ||||
|     Common::Input::PollingError SetPollingMode(Common::Input::PollingMode polling_mode) override { | ||||
|         return input_engine->SetPollingMode(identifier, polling_mode); | ||||
|     } | ||||
|  | ||||
|     Common::Input::DriverResult SetCameraFormat( | ||||
|         Common::Input::CameraFormat camera_format) override { | ||||
|     Common::Input::CameraError SetCameraFormat(Common::Input::CameraFormat camera_format) override { | ||||
|         return input_engine->SetCameraFormat(identifier, camera_format); | ||||
|     } | ||||
|  | ||||
| @@ -1019,18 +966,6 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateBatteryDevice( | ||||
|     return std::make_unique<InputFromBattery>(identifier, input_engine.get()); | ||||
| } | ||||
|  | ||||
| std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateColorDevice( | ||||
|     const Common::ParamPackage& params) { | ||||
|     const PadIdentifier identifier = { | ||||
|         .guid = Common::UUID{params.Get("guid", "")}, | ||||
|         .port = static_cast<std::size_t>(params.Get("port", 0)), | ||||
|         .pad = static_cast<std::size_t>(params.Get("pad", 0)), | ||||
|     }; | ||||
|  | ||||
|     input_engine->PreSetController(identifier); | ||||
|     return std::make_unique<InputFromColor>(identifier, input_engine.get()); | ||||
| } | ||||
|  | ||||
| std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateMotionDevice( | ||||
|     Common::ParamPackage params) { | ||||
|     const PadIdentifier identifier = { | ||||
| @@ -1118,9 +1053,6 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::Create( | ||||
|     if (params.Has("battery")) { | ||||
|         return CreateBatteryDevice(params); | ||||
|     } | ||||
|     if (params.Has("color")) { | ||||
|         return CreateColorDevice(params); | ||||
|     } | ||||
|     if (params.Has("camera")) { | ||||
|         return CreateCameraDevice(params); | ||||
|     } | ||||
|   | ||||
| @@ -190,17 +190,6 @@ private: | ||||
|     std::unique_ptr<Common::Input::InputDevice> CreateBatteryDevice( | ||||
|         const Common::ParamPackage& params); | ||||
|  | ||||
|     /** | ||||
|      * Creates a color device from the parameters given. | ||||
|      * @param params contains parameters for creating the device: | ||||
|      *               - "guid": text string for identifying controllers | ||||
|      *               - "port": port of the connected device | ||||
|      *               - "pad": slot of the connected controller | ||||
|      * @returns a unique input device with the parameters specified | ||||
|      */ | ||||
|     std::unique_ptr<Common::Input::InputDevice> CreateColorDevice( | ||||
|         const Common::ParamPackage& params); | ||||
|  | ||||
|     /** | ||||
|      * Creates a motion device from the parameters given. | ||||
|      * @param params contains parameters for creating the device: | ||||
|   | ||||
| @@ -23,7 +23,6 @@ | ||||
| #include "input_common/drivers/gc_adapter.h" | ||||
| #endif | ||||
| #ifdef HAVE_SDL2 | ||||
| #include "input_common/drivers/joycon.h" | ||||
| #include "input_common/drivers/sdl_driver.h" | ||||
| #endif | ||||
|  | ||||
| @@ -59,7 +58,6 @@ struct InputSubsystem::Impl { | ||||
|         RegisterEngine("virtual_gamepad", virtual_gamepad); | ||||
| #ifdef HAVE_SDL2 | ||||
|         RegisterEngine("sdl", sdl); | ||||
|         RegisterEngine("joycon", joycon); | ||||
| #endif | ||||
|  | ||||
|         Common::Input::RegisterInputFactory("touch_from_button", | ||||
| @@ -89,7 +87,6 @@ struct InputSubsystem::Impl { | ||||
|         UnregisterEngine(virtual_gamepad); | ||||
| #ifdef HAVE_SDL2 | ||||
|         UnregisterEngine(sdl); | ||||
|         UnregisterEngine(joycon); | ||||
| #endif | ||||
|  | ||||
|         Common::Input::UnregisterInputFactory("touch_from_button"); | ||||
| @@ -112,8 +109,6 @@ struct InputSubsystem::Impl { | ||||
|         auto udp_devices = udp_client->GetInputDevices(); | ||||
|         devices.insert(devices.end(), udp_devices.begin(), udp_devices.end()); | ||||
| #ifdef HAVE_SDL2 | ||||
|         auto joycon_devices = joycon->GetInputDevices(); | ||||
|         devices.insert(devices.end(), joycon_devices.begin(), joycon_devices.end()); | ||||
|         auto sdl_devices = sdl->GetInputDevices(); | ||||
|         devices.insert(devices.end(), sdl_devices.begin(), sdl_devices.end()); | ||||
| #endif | ||||
| @@ -145,9 +140,6 @@ struct InputSubsystem::Impl { | ||||
|         if (engine == sdl->GetEngineName()) { | ||||
|             return sdl; | ||||
|         } | ||||
|         if (engine == joycon->GetEngineName()) { | ||||
|             return joycon; | ||||
|         } | ||||
| #endif | ||||
|         return nullptr; | ||||
|     } | ||||
| @@ -231,9 +223,6 @@ struct InputSubsystem::Impl { | ||||
|         if (engine == sdl->GetEngineName()) { | ||||
|             return true; | ||||
|         } | ||||
|         if (engine == joycon->GetEngineName()) { | ||||
|             return true; | ||||
|         } | ||||
| #endif | ||||
|         return false; | ||||
|     } | ||||
| @@ -247,7 +236,6 @@ struct InputSubsystem::Impl { | ||||
|         udp_client->BeginConfiguration(); | ||||
| #ifdef HAVE_SDL2 | ||||
|         sdl->BeginConfiguration(); | ||||
|         joycon->BeginConfiguration(); | ||||
| #endif | ||||
|     } | ||||
|  | ||||
| @@ -260,7 +248,6 @@ struct InputSubsystem::Impl { | ||||
|         udp_client->EndConfiguration(); | ||||
| #ifdef HAVE_SDL2 | ||||
|         sdl->EndConfiguration(); | ||||
|         joycon->EndConfiguration(); | ||||
| #endif | ||||
|     } | ||||
|  | ||||
| @@ -291,7 +278,6 @@ struct InputSubsystem::Impl { | ||||
|  | ||||
| #ifdef HAVE_SDL2 | ||||
|     std::shared_ptr<SDLDriver> sdl; | ||||
|     std::shared_ptr<Joycons> joycon; | ||||
| #endif | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -100,8 +100,6 @@ add_library(video_core STATIC | ||||
|     renderer_null/null_rasterizer.h | ||||
|     renderer_null/renderer_null.cpp | ||||
|     renderer_null/renderer_null.h | ||||
|     renderer_opengl/blit_image.cpp | ||||
|     renderer_opengl/blit_image.h | ||||
|     renderer_opengl/gl_buffer_cache.cpp | ||||
|     renderer_opengl/gl_buffer_cache.h | ||||
|     renderer_opengl/gl_compute_pipeline.cpp | ||||
|   | ||||
| @@ -51,10 +51,6 @@ void DrawManager::ProcessMethodCall(u32 method, u32 argument) { | ||||
|         LOG_WARNING(HW_GPU, "(STUBBED) called"); | ||||
|         break; | ||||
|     } | ||||
|     case MAXWELL3D_REG_INDEX(draw_texture.src_y0): { | ||||
|         DrawTexture(); | ||||
|         break; | ||||
|     } | ||||
|     default: | ||||
|         break; | ||||
|     } | ||||
| @@ -183,33 +179,6 @@ void DrawManager::DrawIndexSmall(u32 argument) { | ||||
|     ProcessDraw(true, 1); | ||||
| } | ||||
|  | ||||
| void DrawManager::DrawTexture() { | ||||
|     const auto& regs{maxwell3d->regs}; | ||||
|     draw_texture_state.dst_x0 = static_cast<float>(regs.draw_texture.dst_x0) / 4096.f; | ||||
|     draw_texture_state.dst_y0 = static_cast<float>(regs.draw_texture.dst_y0) / 4096.f; | ||||
|     const auto dst_width = static_cast<float>(regs.draw_texture.dst_width) / 4096.f; | ||||
|     const auto dst_height = static_cast<float>(regs.draw_texture.dst_height) / 4096.f; | ||||
|     const bool lower_left{regs.window_origin.mode != | ||||
|                           Maxwell3D::Regs::WindowOrigin::Mode::UpperLeft}; | ||||
|     if (lower_left) { | ||||
|         draw_texture_state.dst_y0 -= dst_height; | ||||
|     } | ||||
|     draw_texture_state.dst_x1 = draw_texture_state.dst_x0 + dst_width; | ||||
|     draw_texture_state.dst_y1 = draw_texture_state.dst_y0 + dst_height; | ||||
|     draw_texture_state.src_x0 = static_cast<float>(regs.draw_texture.src_x0) / 4096.f; | ||||
|     draw_texture_state.src_y0 = static_cast<float>(regs.draw_texture.src_y0) / 4096.f; | ||||
|     draw_texture_state.src_x1 = | ||||
|         (static_cast<float>(regs.draw_texture.dx_du) / 4294967295.f) * dst_width + | ||||
|         draw_texture_state.src_x0; | ||||
|     draw_texture_state.src_y1 = | ||||
|         (static_cast<float>(regs.draw_texture.dy_dv) / 4294967295.f) * dst_height + | ||||
|         draw_texture_state.src_y0; | ||||
|     draw_texture_state.src_sampler = regs.draw_texture.src_sampler; | ||||
|     draw_texture_state.src_texture = regs.draw_texture.src_texture; | ||||
|  | ||||
|     maxwell3d->rasterizer->DrawTexture(); | ||||
| } | ||||
|  | ||||
| void DrawManager::UpdateTopology() { | ||||
|     const auto& regs{maxwell3d->regs}; | ||||
|     switch (regs.primitive_topology_control) { | ||||
|   | ||||
| @@ -32,19 +32,6 @@ public: | ||||
|         std::vector<u8> inline_index_draw_indexes; | ||||
|     }; | ||||
|  | ||||
|     struct DrawTextureState { | ||||
|         f32 dst_x0; | ||||
|         f32 dst_y0; | ||||
|         f32 dst_x1; | ||||
|         f32 dst_y1; | ||||
|         f32 src_x0; | ||||
|         f32 src_y0; | ||||
|         f32 src_x1; | ||||
|         f32 src_y1; | ||||
|         u32 src_sampler; | ||||
|         u32 src_texture; | ||||
|     }; | ||||
|  | ||||
|     struct IndirectParams { | ||||
|         bool is_indexed; | ||||
|         bool include_count; | ||||
| @@ -77,10 +64,6 @@ public: | ||||
|         return draw_state; | ||||
|     } | ||||
|  | ||||
|     const DrawTextureState& GetDrawTextureState() const { | ||||
|         return draw_texture_state; | ||||
|     } | ||||
|  | ||||
|     IndirectParams& GetIndirectParams() { | ||||
|         return indirect_state; | ||||
|     } | ||||
| @@ -98,8 +81,6 @@ private: | ||||
|  | ||||
|     void DrawIndexSmall(u32 argument); | ||||
|  | ||||
|     void DrawTexture(); | ||||
|  | ||||
|     void UpdateTopology(); | ||||
|  | ||||
|     void ProcessDraw(bool draw_indexed, u32 instance_count); | ||||
| @@ -108,7 +89,6 @@ private: | ||||
|  | ||||
|     Maxwell3D* maxwell3d{}; | ||||
|     State draw_state{}; | ||||
|     DrawTextureState draw_texture_state{}; | ||||
|     IndirectParams indirect_state{}; | ||||
| }; | ||||
| } // namespace Tegra::Engines | ||||
|   | ||||
| @@ -149,7 +149,6 @@ bool Maxwell3D::IsMethodExecutable(u32 method) { | ||||
|     case MAXWELL3D_REG_INDEX(inline_index_4x8.index0): | ||||
|     case MAXWELL3D_REG_INDEX(vertex_array_instance_first): | ||||
|     case MAXWELL3D_REG_INDEX(vertex_array_instance_subsequent): | ||||
|     case MAXWELL3D_REG_INDEX(draw_texture.src_y0): | ||||
|     case MAXWELL3D_REG_INDEX(wait_for_idle): | ||||
|     case MAXWELL3D_REG_INDEX(shadow_ram_control): | ||||
|     case MAXWELL3D_REG_INDEX(load_mme.instruction_ptr): | ||||
|   | ||||
| @@ -1599,20 +1599,6 @@ public: | ||||
|         }; | ||||
|         static_assert(sizeof(TIRModulationCoeff) == 0x4); | ||||
|  | ||||
|         struct DrawTexture { | ||||
|             s32 dst_x0; | ||||
|             s32 dst_y0; | ||||
|             s32 dst_width; | ||||
|             s32 dst_height; | ||||
|             s64 dx_du; | ||||
|             s64 dy_dv; | ||||
|             u32 src_sampler; | ||||
|             u32 src_texture; | ||||
|             s32 src_x0; | ||||
|             s32 src_y0; | ||||
|         }; | ||||
|         static_assert(sizeof(DrawTexture) == 0x30); | ||||
|  | ||||
|         struct ReduceColorThreshold { | ||||
|             union { | ||||
|                 BitField<0, 8, u32> all_hit_once; | ||||
| @@ -2765,7 +2751,7 @@ public: | ||||
|                 u32 reserved_sw_method2;                                               ///< 0x102C | ||||
|                 std::array<TIRModulationCoeff, 5> tir_modulation_coeff;                ///< 0x1030 | ||||
|                 std::array<u32, 15> spare_nop;                                         ///< 0x1044 | ||||
|                 DrawTexture draw_texture;                                              ///< 0x1080 | ||||
|                 INSERT_PADDING_BYTES_NOINIT(0x30); | ||||
|                 std::array<u32, 7> reserved_sw_method3_to_7;                           ///< 0x10B0 | ||||
|                 ReduceColorThreshold reduce_color_thresholds_unorm8;                   ///< 0x10CC | ||||
|                 std::array<u32, 4> reserved_sw_method10_to_13;                         ///< 0x10D0 | ||||
|   | ||||
| @@ -11,7 +11,6 @@ set(GLSL_INCLUDES | ||||
|  | ||||
| set(SHADER_FILES | ||||
|     astc_decoder.comp | ||||
|     blit_color_float.frag | ||||
|     block_linear_unswizzle_2d.comp | ||||
|     block_linear_unswizzle_3d.comp | ||||
|     convert_abgr8_to_d24s8.frag | ||||
| @@ -37,6 +36,7 @@ set(SHADER_FILES | ||||
|     smaa_blending_weight_calculation.frag | ||||
|     smaa_neighborhood_blending.vert | ||||
|     smaa_neighborhood_blending.frag | ||||
|     vulkan_blit_color_float.frag | ||||
|     vulkan_blit_depth_stencil.frag | ||||
|     vulkan_fidelityfx_fsr_easu_fp16.comp | ||||
|     vulkan_fidelityfx_fsr_easu_fp32.comp | ||||
|   | ||||
| @@ -4,20 +4,13 @@ | ||||
| #version 450 | ||||
|  | ||||
| #ifdef VULKAN | ||||
| #define VERTEX_ID gl_VertexIndex | ||||
| #define BEGIN_PUSH_CONSTANTS layout(push_constant) uniform PushConstants { | ||||
| #define END_PUSH_CONSTANTS }; | ||||
| #define UNIFORM(n) | ||||
| #define FLIPY 1 | ||||
| #else // ^^^ Vulkan ^^^ // vvv OpenGL vvv | ||||
| #define VERTEX_ID gl_VertexID | ||||
| #define BEGIN_PUSH_CONSTANTS | ||||
| #define END_PUSH_CONSTANTS | ||||
| #define FLIPY -1 | ||||
| #define UNIFORM(n) layout (location = n) uniform | ||||
| out gl_PerVertex { | ||||
|     vec4 gl_Position; | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| BEGIN_PUSH_CONSTANTS | ||||
| @@ -28,8 +21,8 @@ END_PUSH_CONSTANTS | ||||
| layout(location = 0) out vec2 texcoord; | ||||
|  | ||||
| void main() { | ||||
|     float x = float((VERTEX_ID & 1) << 2); | ||||
|     float y = float((VERTEX_ID & 2) << 1); | ||||
|     gl_Position = vec4(x - 1.0, FLIPY * (y - 1.0), 0.0, 1.0); | ||||
|     float x = float((gl_VertexIndex & 1) << 2); | ||||
|     float y = float((gl_VertexIndex & 2) << 1); | ||||
|     gl_Position = vec4(x - 1.0, y - 1.0, 0.0, 1.0); | ||||
|     texcoord = fma(vec2(x, y) / 2.0, tex_scale, tex_offset); | ||||
| } | ||||
| } | ||||
|   | ||||
| @@ -47,9 +47,6 @@ public: | ||||
|     /// Dispatches an indirect draw invocation | ||||
|     virtual void DrawIndirect() {} | ||||
|  | ||||
|     /// Dispatches an draw texture invocation | ||||
|     virtual void DrawTexture() = 0; | ||||
|  | ||||
|     /// Clear the current framebuffer | ||||
|     virtual void Clear(u32 layer_count) = 0; | ||||
|  | ||||
|   | ||||
| @@ -21,7 +21,6 @@ RasterizerNull::RasterizerNull(Core::Memory::Memory& cpu_memory_, Tegra::GPU& gp | ||||
| RasterizerNull::~RasterizerNull() = default; | ||||
|  | ||||
| void RasterizerNull::Draw(bool is_indexed, u32 instance_count) {} | ||||
| void RasterizerNull::DrawTexture() {} | ||||
| void RasterizerNull::Clear(u32 layer_count) {} | ||||
| void RasterizerNull::DispatchCompute() {} | ||||
| void RasterizerNull::ResetCounter(VideoCore::QueryType type) {} | ||||
|   | ||||
| @@ -31,7 +31,6 @@ public: | ||||
|     ~RasterizerNull() override; | ||||
|  | ||||
|     void Draw(bool is_indexed, u32 instance_count) override; | ||||
|     void DrawTexture() override; | ||||
|     void Clear(u32 layer_count) override; | ||||
|     void DispatchCompute() override; | ||||
|     void ResetCounter(VideoCore::QueryType type) override; | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user