diff options
| author | 2017-05-25 16:49:09 +0300 | |
|---|---|---|
| committer | 2017-05-27 21:30:07 +0300 | |
| commit | 857510a7c084daa337c6e4a1d8a8eafc06253197 (patch) | |
| tree | 6f3ab2c5cefd44fd5dc476f02861c7c3e8e0db0e /src | |
| parent | cam: move u32->u8 trancation to IPCHelper (diff) | |
| download | yuzu-857510a7c084daa337c6e4a1d8a8eafc06253197.tar.gz yuzu-857510a7c084daa337c6e4a1d8a8eafc06253197.tar.xz yuzu-857510a7c084daa337c6e4a1d8a8eafc06253197.zip | |
fixup!cam: use IPCHelper
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/cam/cam.cpp | 60 | ||||
| -rw-r--r-- | src/core/hle/service/cam/cam.h | 13 |
2 files changed, 43 insertions, 30 deletions
diff --git a/src/core/hle/service/cam/cam.cpp b/src/core/hle/service/cam/cam.cpp index 342a0edeb..85af70a3f 100644 --- a/src/core/hle/service/cam/cam.cpp +++ b/src/core/hle/service/cam/cam.cpp | |||
| @@ -398,6 +398,7 @@ void SetReceiving(Service::Interface* self) { | |||
| 398 | rb.Push(RESULT_SUCCESS); | 398 | rb.Push(RESULT_SUCCESS); |
| 399 | rb.PushCopyHandles(Kernel::g_handle_table.Create(port.completion_event).MoveFrom()); | 399 | rb.PushCopyHandles(Kernel::g_handle_table.Create(port.completion_event).MoveFrom()); |
| 400 | } else { | 400 | } else { |
| 401 | LOG_ERROR(Service_CAM, "invalid port_select=%u", port_select.m_val); | ||
| 401 | rb.Push(ERROR_INVALID_ENUM_VALUE); | 402 | rb.Push(ERROR_INVALID_ENUM_VALUE); |
| 402 | rb.PushCopyHandles(0); | 403 | rb.PushCopyHandles(0); |
| 403 | } | 404 | } |
| @@ -413,8 +414,9 @@ void IsFinishedReceiving(Service::Interface* self) { | |||
| 413 | IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | 414 | IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); |
| 414 | if (port_select.IsSingle()) { | 415 | if (port_select.IsSingle()) { |
| 415 | int port = *port_select.begin(); | 416 | int port = *port_select.begin(); |
| 417 | bool is_busy = ports[port].is_receiving || ports[port].is_pending_receiving; | ||
| 416 | rb.Push(RESULT_SUCCESS); | 418 | rb.Push(RESULT_SUCCESS); |
| 417 | rb.Push(ports[port].is_receiving || ports[port].is_pending_receiving); | 419 | rb.Push(!is_busy); |
| 418 | } else { | 420 | } else { |
| 419 | LOG_ERROR(Service_CAM, "invalid port_select=%u", port_select.m_val); | 421 | LOG_ERROR(Service_CAM, "invalid port_select=%u", port_select.m_val); |
| 420 | rb.Push(ERROR_INVALID_ENUM_VALUE); | 422 | rb.Push(ERROR_INVALID_ENUM_VALUE); |
| @@ -508,7 +510,7 @@ void GetTransferBytes(Service::Interface* self) { | |||
| 508 | IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | 510 | IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); |
| 509 | if (port_select.IsSingle()) { | 511 | if (port_select.IsSingle()) { |
| 510 | int port = *port_select.begin(); | 512 | int port = *port_select.begin(); |
| 511 | rb.Push(RESULT_SUCCESS.raw); | 513 | rb.Push(RESULT_SUCCESS); |
| 512 | rb.Push(ports[port].transfer_bytes); | 514 | rb.Push(ports[port].transfer_bytes); |
| 513 | } else { | 515 | } else { |
| 514 | LOG_ERROR(Service_CAM, "invalid port_select=%u", port_select.m_val); | 516 | LOG_ERROR(Service_CAM, "invalid port_select=%u", port_select.m_val); |
| @@ -930,7 +932,6 @@ void SetPackageParameterWithoutContext(Service::Interface* self) { | |||
| 930 | 932 | ||
| 931 | PackageParameterWithoutContext package; | 933 | PackageParameterWithoutContext package; |
| 932 | rp.PopRaw(package); | 934 | rp.PopRaw(package); |
| 933 | rp.Skip(4, false); | ||
| 934 | 935 | ||
| 935 | IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | 936 | IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |
| 936 | rb.Push(RESULT_SUCCESS); | 937 | rb.Push(RESULT_SUCCESS); |
| @@ -938,18 +939,11 @@ void SetPackageParameterWithoutContext(Service::Interface* self) { | |||
| 938 | LOG_WARNING(Service_CAM, "(STUBBED) called"); | 939 | LOG_WARNING(Service_CAM, "(STUBBED) called"); |
| 939 | } | 940 | } |
| 940 | 941 | ||
| 941 | template <typename PackageParameterType, int command_id, int param_length> | 942 | template <typename PackageParameterType> |
| 942 | static void SetPackageParameter() { | 943 | static ResultCode SetPackageParameter(const PackageParameterType& package) { |
| 943 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), command_id, param_length, 0); | ||
| 944 | |||
| 945 | PackageParameterType package; | ||
| 946 | rp.PopRaw(package); | ||
| 947 | rp.Skip(param_length - (sizeof(PackageParameterType) + 3) / 4, false); | ||
| 948 | |||
| 949 | const CameraSet camera_select(package.camera_select); | 944 | const CameraSet camera_select(package.camera_select); |
| 950 | const ContextSet context_select(package.context_select); | 945 | const ContextSet context_select(package.context_select); |
| 951 | 946 | ||
| 952 | IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||
| 953 | if (camera_select.IsValid() && context_select.IsValid()) { | 947 | if (camera_select.IsValid() && context_select.IsValid()) { |
| 954 | for (int camera_id : camera_select) { | 948 | for (int camera_id : camera_select) { |
| 955 | CameraConfig& camera = cameras[camera_id]; | 949 | CameraConfig& camera = cameras[camera_id]; |
| @@ -965,31 +959,47 @@ static void SetPackageParameter() { | |||
| 965 | } | 959 | } |
| 966 | } | 960 | } |
| 967 | } | 961 | } |
| 968 | rb.Push(RESULT_SUCCESS); | 962 | return RESULT_SUCCESS; |
| 969 | } else { | 963 | } else { |
| 970 | LOG_ERROR(Service_CAM, "invalid camera_select=%u, context_select=%u", package.camera_select, | 964 | LOG_ERROR(Service_CAM, "invalid camera_select=%u, context_select=%u", package.camera_select, |
| 971 | package.context_select); | 965 | package.context_select); |
| 972 | rb.Push(ERROR_INVALID_ENUM_VALUE); | 966 | return ERROR_INVALID_ENUM_VALUE; |
| 973 | } | 967 | } |
| 974 | |||
| 975 | LOG_DEBUG(Service_CAM, "called"); | ||
| 976 | } | 968 | } |
| 977 | 969 | ||
| 978 | Resolution PackageParameterWithContext::GetResolution() { | 970 | Resolution PackageParameterWithContext::GetResolution() const { |
| 979 | return PRESET_RESOLUTION[static_cast<int>(size)]; | 971 | return PRESET_RESOLUTION[static_cast<int>(size)]; |
| 980 | } | 972 | } |
| 981 | 973 | ||
| 982 | void SetPackageParameterWithContext(Service::Interface* self) { | 974 | void SetPackageParameterWithContext(Service::Interface* self) { |
| 983 | SetPackageParameter<PackageParameterWithContext, 0x34, 5>(); | 975 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x34, 5, 0); |
| 976 | |||
| 977 | PackageParameterWithContext package; | ||
| 978 | rp.PopRaw(package); | ||
| 979 | |||
| 980 | IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||
| 981 | ResultCode result = SetPackageParameter(package); | ||
| 982 | rb.Push(result); | ||
| 983 | |||
| 984 | LOG_DEBUG(Service_CAM, "called"); | ||
| 984 | } | 985 | } |
| 985 | 986 | ||
| 986 | void SetPackageParameterWithContextDetail(Service::Interface* self) { | 987 | void SetPackageParameterWithContextDetail(Service::Interface* self) { |
| 987 | SetPackageParameter<PackageParameterWithContextDetail, 0x35, 7>(); | 988 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x35, 7, 0); |
| 989 | |||
| 990 | PackageParameterWithContextDetail package; | ||
| 991 | rp.PopRaw(package); | ||
| 992 | |||
| 993 | IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||
| 994 | ResultCode result = SetPackageParameter(package); | ||
| 995 | rb.Push(result); | ||
| 996 | |||
| 997 | LOG_DEBUG(Service_CAM, "called"); | ||
| 988 | } | 998 | } |
| 989 | 999 | ||
| 990 | void GetSuitableY2rStandardCoefficient(Service::Interface* self) { | 1000 | void GetSuitableY2rStandardCoefficient(Service::Interface* self) { |
| 991 | IPC::RequestBuilder rb = | 1001 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x36, 0, 0); |
| 992 | IPC::RequestParser(Kernel::GetCommandBuffer(), 0x36, 0, 0).MakeBuilder(2, 0); | 1002 | IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); |
| 993 | rb.Push(RESULT_SUCCESS); | 1003 | rb.Push(RESULT_SUCCESS); |
| 994 | rb.Push<u32>(0); | 1004 | rb.Push<u32>(0); |
| 995 | 1005 | ||
| @@ -1007,8 +1017,8 @@ void PlayShutterSound(Service::Interface* self) { | |||
| 1007 | } | 1017 | } |
| 1008 | 1018 | ||
| 1009 | void DriverInitialize(Service::Interface* self) { | 1019 | void DriverInitialize(Service::Interface* self) { |
| 1010 | IPC::RequestBuilder rb = | 1020 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x39, 0, 0); |
| 1011 | IPC::RequestParser(Kernel::GetCommandBuffer(), 0x39, 0, 0).MakeBuilder(1, 0); | 1021 | IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |
| 1012 | 1022 | ||
| 1013 | for (int camera_id = 0; camera_id < NumCameras; ++camera_id) { | 1023 | for (int camera_id = 0; camera_id < NumCameras; ++camera_id) { |
| 1014 | CameraConfig& camera = cameras[camera_id]; | 1024 | CameraConfig& camera = cameras[camera_id]; |
| @@ -1040,8 +1050,8 @@ void DriverInitialize(Service::Interface* self) { | |||
| 1040 | } | 1050 | } |
| 1041 | 1051 | ||
| 1042 | void DriverFinalize(Service::Interface* self) { | 1052 | void DriverFinalize(Service::Interface* self) { |
| 1043 | IPC::RequestBuilder rb = | 1053 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x3A, 0, 0); |
| 1044 | IPC::RequestParser(Kernel::GetCommandBuffer(), 0x3A, 0, 0).MakeBuilder(1, 0); | 1054 | IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |
| 1045 | 1055 | ||
| 1046 | CancelReceiving(0); | 1056 | CancelReceiving(0); |
| 1047 | CancelReceiving(1); | 1057 | CancelReceiving(1); |
diff --git a/src/core/hle/service/cam/cam.h b/src/core/hle/service/cam/cam.h index 34a9c8479..b6da721d8 100644 --- a/src/core/hle/service/cam/cam.h +++ b/src/core/hle/service/cam/cam.h | |||
| @@ -184,9 +184,10 @@ struct PackageParameterWithoutContext { | |||
| 184 | s16 auto_white_balance_window_y; | 184 | s16 auto_white_balance_window_y; |
| 185 | s16 auto_white_balance_window_width; | 185 | s16 auto_white_balance_window_width; |
| 186 | s16 auto_white_balance_window_height; | 186 | s16 auto_white_balance_window_height; |
| 187 | INSERT_PADDING_WORDS(4); | ||
| 187 | }; | 188 | }; |
| 188 | 189 | ||
| 189 | static_assert(sizeof(PackageParameterWithoutContext) == 28, | 190 | static_assert(sizeof(PackageParameterWithoutContext) == 44, |
| 190 | "PackageParameterCameraWithoutContext structure size is wrong"); | 191 | "PackageParameterCameraWithoutContext structure size is wrong"); |
| 191 | 192 | ||
| 192 | struct PackageParameterWithContext { | 193 | struct PackageParameterWithContext { |
| @@ -196,11 +197,12 @@ struct PackageParameterWithContext { | |||
| 196 | Effect effect; | 197 | Effect effect; |
| 197 | Size size; | 198 | Size size; |
| 198 | INSERT_PADDING_BYTES(3); | 199 | INSERT_PADDING_BYTES(3); |
| 200 | INSERT_PADDING_WORDS(3); | ||
| 199 | 201 | ||
| 200 | Resolution GetResolution(); | 202 | Resolution GetResolution() const; |
| 201 | }; | 203 | }; |
| 202 | 204 | ||
| 203 | static_assert(sizeof(PackageParameterWithContext) == 8, | 205 | static_assert(sizeof(PackageParameterWithContext) == 20, |
| 204 | "PackageParameterWithContext structure size is wrong"); | 206 | "PackageParameterWithContext structure size is wrong"); |
| 205 | 207 | ||
| 206 | struct PackageParameterWithContextDetail { | 208 | struct PackageParameterWithContextDetail { |
| @@ -209,13 +211,14 @@ struct PackageParameterWithContextDetail { | |||
| 209 | Flip flip; | 211 | Flip flip; |
| 210 | Effect effect; | 212 | Effect effect; |
| 211 | Resolution resolution; | 213 | Resolution resolution; |
| 214 | INSERT_PADDING_WORDS(3); | ||
| 212 | 215 | ||
| 213 | Resolution GetResolution() { | 216 | Resolution GetResolution() const { |
| 214 | return resolution; | 217 | return resolution; |
| 215 | } | 218 | } |
| 216 | }; | 219 | }; |
| 217 | 220 | ||
| 218 | static_assert(sizeof(PackageParameterWithContextDetail) == 16, | 221 | static_assert(sizeof(PackageParameterWithContextDetail) == 28, |
| 219 | "PackageParameterWithContextDetail structure size is wrong"); | 222 | "PackageParameterWithContextDetail structure size is wrong"); |
| 220 | 223 | ||
| 221 | /** | 224 | /** |