summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar wwylele2017-05-25 16:49:09 +0300
committerGravatar wwylele2017-05-27 21:30:07 +0300
commit857510a7c084daa337c6e4a1d8a8eafc06253197 (patch)
tree6f3ab2c5cefd44fd5dc476f02861c7c3e8e0db0e
parentcam: move u32->u8 trancation to IPCHelper (diff)
downloadyuzu-857510a7c084daa337c6e4a1d8a8eafc06253197.tar.gz
yuzu-857510a7c084daa337c6e4a1d8a8eafc06253197.tar.xz
yuzu-857510a7c084daa337c6e4a1d8a8eafc06253197.zip
fixup!cam: use IPCHelper
-rw-r--r--src/core/hle/service/cam/cam.cpp60
-rw-r--r--src/core/hle/service/cam/cam.h13
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
941template <typename PackageParameterType, int command_id, int param_length> 942template <typename PackageParameterType>
942static void SetPackageParameter() { 943static 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
978Resolution PackageParameterWithContext::GetResolution() { 970Resolution PackageParameterWithContext::GetResolution() const {
979 return PRESET_RESOLUTION[static_cast<int>(size)]; 971 return PRESET_RESOLUTION[static_cast<int>(size)];
980} 972}
981 973
982void SetPackageParameterWithContext(Service::Interface* self) { 974void 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
986void SetPackageParameterWithContextDetail(Service::Interface* self) { 987void 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
990void GetSuitableY2rStandardCoefficient(Service::Interface* self) { 1000void 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
1009void DriverInitialize(Service::Interface* self) { 1019void 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
1042void DriverFinalize(Service::Interface* self) { 1052void 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
189static_assert(sizeof(PackageParameterWithoutContext) == 28, 190static_assert(sizeof(PackageParameterWithoutContext) == 44,
190 "PackageParameterCameraWithoutContext structure size is wrong"); 191 "PackageParameterCameraWithoutContext structure size is wrong");
191 192
192struct PackageParameterWithContext { 193struct 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
203static_assert(sizeof(PackageParameterWithContext) == 8, 205static_assert(sizeof(PackageParameterWithContext) == 20,
204 "PackageParameterWithContext structure size is wrong"); 206 "PackageParameterWithContext structure size is wrong");
205 207
206struct PackageParameterWithContextDetail { 208struct 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
218static_assert(sizeof(PackageParameterWithContextDetail) == 16, 221static_assert(sizeof(PackageParameterWithContextDetail) == 28,
219 "PackageParameterWithContextDetail structure size is wrong"); 222 "PackageParameterWithContextDetail structure size is wrong");
220 223
221/** 224/**