diff options
author | wwylele <wwylele@gmail.com> | 2017-05-25 15:49:09 +0200 |
---|---|---|
committer | wwylele <wwylele@gmail.com> | 2017-05-27 20:30:07 +0200 |
commit | 857510a7c084daa337c6e4a1d8a8eafc06253197 (patch) | |
tree | 6f3ab2c5cefd44fd5dc476f02861c7c3e8e0db0e | |
parent | cam: move u32->u8 trancation to IPCHelper (diff) | |
download | yuzu-857510a7c084daa337c6e4a1d8a8eafc06253197.tar yuzu-857510a7c084daa337c6e4a1d8a8eafc06253197.tar.gz yuzu-857510a7c084daa337c6e4a1d8a8eafc06253197.tar.bz2 yuzu-857510a7c084daa337c6e4a1d8a8eafc06253197.tar.lz yuzu-857510a7c084daa337c6e4a1d8a8eafc06253197.tar.xz yuzu-857510a7c084daa337c6e4a1d8a8eafc06253197.tar.zst yuzu-857510a7c084daa337c6e4a1d8a8eafc06253197.zip |
-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) { rb.Push(RESULT_SUCCESS); rb.PushCopyHandles(Kernel::g_handle_table.Create(port.completion_event).MoveFrom()); } else { + LOG_ERROR(Service_CAM, "invalid port_select=%u", port_select.m_val); rb.Push(ERROR_INVALID_ENUM_VALUE); rb.PushCopyHandles(0); } @@ -413,8 +414,9 @@ void IsFinishedReceiving(Service::Interface* self) { IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); if (port_select.IsSingle()) { int port = *port_select.begin(); + bool is_busy = ports[port].is_receiving || ports[port].is_pending_receiving; rb.Push(RESULT_SUCCESS); - rb.Push(ports[port].is_receiving || ports[port].is_pending_receiving); + rb.Push(!is_busy); } else { LOG_ERROR(Service_CAM, "invalid port_select=%u", port_select.m_val); rb.Push(ERROR_INVALID_ENUM_VALUE); @@ -508,7 +510,7 @@ void GetTransferBytes(Service::Interface* self) { IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); if (port_select.IsSingle()) { int port = *port_select.begin(); - rb.Push(RESULT_SUCCESS.raw); + rb.Push(RESULT_SUCCESS); rb.Push(ports[port].transfer_bytes); } else { LOG_ERROR(Service_CAM, "invalid port_select=%u", port_select.m_val); @@ -930,7 +932,6 @@ void SetPackageParameterWithoutContext(Service::Interface* self) { PackageParameterWithoutContext package; rp.PopRaw(package); - rp.Skip(4, false); IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(RESULT_SUCCESS); @@ -938,18 +939,11 @@ void SetPackageParameterWithoutContext(Service::Interface* self) { LOG_WARNING(Service_CAM, "(STUBBED) called"); } -template <typename PackageParameterType, int command_id, int param_length> -static void SetPackageParameter() { - IPC::RequestParser rp(Kernel::GetCommandBuffer(), command_id, param_length, 0); - - PackageParameterType package; - rp.PopRaw(package); - rp.Skip(param_length - (sizeof(PackageParameterType) + 3) / 4, false); - +template <typename PackageParameterType> +static ResultCode SetPackageParameter(const PackageParameterType& package) { const CameraSet camera_select(package.camera_select); const ContextSet context_select(package.context_select); - IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); if (camera_select.IsValid() && context_select.IsValid()) { for (int camera_id : camera_select) { CameraConfig& camera = cameras[camera_id]; @@ -965,31 +959,47 @@ static void SetPackageParameter() { } } } - rb.Push(RESULT_SUCCESS); + return RESULT_SUCCESS; } else { LOG_ERROR(Service_CAM, "invalid camera_select=%u, context_select=%u", package.camera_select, package.context_select); - rb.Push(ERROR_INVALID_ENUM_VALUE); + return ERROR_INVALID_ENUM_VALUE; } - - LOG_DEBUG(Service_CAM, "called"); } -Resolution PackageParameterWithContext::GetResolution() { +Resolution PackageParameterWithContext::GetResolution() const { return PRESET_RESOLUTION[static_cast<int>(size)]; } void SetPackageParameterWithContext(Service::Interface* self) { - SetPackageParameter<PackageParameterWithContext, 0x34, 5>(); + IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x34, 5, 0); + + PackageParameterWithContext package; + rp.PopRaw(package); + + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + ResultCode result = SetPackageParameter(package); + rb.Push(result); + + LOG_DEBUG(Service_CAM, "called"); } void SetPackageParameterWithContextDetail(Service::Interface* self) { - SetPackageParameter<PackageParameterWithContextDetail, 0x35, 7>(); + IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x35, 7, 0); + + PackageParameterWithContextDetail package; + rp.PopRaw(package); + + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + ResultCode result = SetPackageParameter(package); + rb.Push(result); + + LOG_DEBUG(Service_CAM, "called"); } void GetSuitableY2rStandardCoefficient(Service::Interface* self) { - IPC::RequestBuilder rb = - IPC::RequestParser(Kernel::GetCommandBuffer(), 0x36, 0, 0).MakeBuilder(2, 0); + IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x36, 0, 0); + IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); rb.Push(RESULT_SUCCESS); rb.Push<u32>(0); @@ -1007,8 +1017,8 @@ void PlayShutterSound(Service::Interface* self) { } void DriverInitialize(Service::Interface* self) { - IPC::RequestBuilder rb = - IPC::RequestParser(Kernel::GetCommandBuffer(), 0x39, 0, 0).MakeBuilder(1, 0); + IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x39, 0, 0); + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); for (int camera_id = 0; camera_id < NumCameras; ++camera_id) { CameraConfig& camera = cameras[camera_id]; @@ -1040,8 +1050,8 @@ void DriverInitialize(Service::Interface* self) { } void DriverFinalize(Service::Interface* self) { - IPC::RequestBuilder rb = - IPC::RequestParser(Kernel::GetCommandBuffer(), 0x3A, 0, 0).MakeBuilder(1, 0); + IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x3A, 0, 0); + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); CancelReceiving(0); 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 { s16 auto_white_balance_window_y; s16 auto_white_balance_window_width; s16 auto_white_balance_window_height; + INSERT_PADDING_WORDS(4); }; -static_assert(sizeof(PackageParameterWithoutContext) == 28, +static_assert(sizeof(PackageParameterWithoutContext) == 44, "PackageParameterCameraWithoutContext structure size is wrong"); struct PackageParameterWithContext { @@ -196,11 +197,12 @@ struct PackageParameterWithContext { Effect effect; Size size; INSERT_PADDING_BYTES(3); + INSERT_PADDING_WORDS(3); - Resolution GetResolution(); + Resolution GetResolution() const; }; -static_assert(sizeof(PackageParameterWithContext) == 8, +static_assert(sizeof(PackageParameterWithContext) == 20, "PackageParameterWithContext structure size is wrong"); struct PackageParameterWithContextDetail { @@ -209,13 +211,14 @@ struct PackageParameterWithContextDetail { Flip flip; Effect effect; Resolution resolution; + INSERT_PADDING_WORDS(3); - Resolution GetResolution() { + Resolution GetResolution() const { return resolution; } }; -static_assert(sizeof(PackageParameterWithContextDetail) == 16, +static_assert(sizeof(PackageParameterWithContextDetail) == 28, "PackageParameterWithContextDetail structure size is wrong"); /** |