summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/vi
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/service/vi')
-rw-r--r--src/core/hle/service/vi/vi.cpp41
1 files changed, 16 insertions, 25 deletions
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp
index 8b4ed30d2..55f196ab0 100644
--- a/src/core/hle/service/vi/vi.cpp
+++ b/src/core/hle/service/vi/vi.cpp
@@ -429,7 +429,7 @@ public:
{0, &IHOSBinderDriver::TransactParcel, "TransactParcel"},
{1, &IHOSBinderDriver::AdjustRefcount, "AdjustRefcount"},
{2, &IHOSBinderDriver::GetNativeHandle, "GetNativeHandle"},
- {3, &IHOSBinderDriver::TransactParcelAuto, "TransactParcelAuto"},
+ {3, &IHOSBinderDriver::TransactParcel, "TransactParcelAuto"},
};
RegisterHandlers(functions);
}
@@ -518,30 +518,21 @@ private:
u32 flags = rp.Pop<u32>();
LOG_DEBUG(Service_VI, "called, transaction=%x", transaction);
- auto& input_buffer = ctx.BufferDescriptorA()[0];
- auto& output_buffer = ctx.BufferDescriptorB()[0];
- std::vector<u8> input_data(input_buffer.Size());
- Memory::ReadBlock(input_buffer.Address(), input_data.data(), input_buffer.Size());
-
- TransactParcel(id, transaction, input_data, output_buffer.Address(), output_buffer.Size());
-
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(RESULT_SUCCESS);
- }
-
- void TransactParcelAuto(Kernel::HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- u32 id = rp.Pop<u32>();
- auto transaction = static_cast<TransactionId>(rp.Pop<u32>());
- u32 flags = rp.Pop<u32>();
- LOG_DEBUG(Service_VI, "called, transaction=%x", transaction);
-
- auto& input_buffer = ctx.BufferDescriptorX()[0];
- auto& output_buffer = ctx.BufferDescriptorC()[0];
- std::vector<u8> input_data(input_buffer.size);
- Memory::ReadBlock(input_buffer.Address(), input_data.data(), input_buffer.size);
-
- TransactParcel(id, transaction, input_data, output_buffer.Address(), output_buffer.Size());
+ if (ctx.BufferDescriptorA()[0].Size() != 0) {
+ auto& input_buffer = ctx.BufferDescriptorA()[0];
+ auto& output_buffer = ctx.BufferDescriptorB()[0];
+ std::vector<u8> input_data(input_buffer.Size());
+ Memory::ReadBlock(input_buffer.Address(), input_data.data(), input_buffer.Size());
+ TransactParcel(id, transaction, input_data, output_buffer.Address(),
+ output_buffer.Size());
+ } else {
+ auto& input_buffer = ctx.BufferDescriptorX()[0];
+ auto& output_buffer = ctx.BufferDescriptorC()[0];
+ std::vector<u8> input_data(input_buffer.size);
+ Memory::ReadBlock(input_buffer.Address(), input_data.data(), input_buffer.size);
+ TransactParcel(id, transaction, input_data, output_buffer.Address(),
+ output_buffer.Size());
+ }
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(RESULT_SUCCESS);