From 309276a3170b876ef7818dc42b7ef81a467fd83e Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 9 Feb 2018 21:42:08 -0500 Subject: IGBPRequestBufferResponseParcel: Fix response for libnx. --- src/core/hle/service/vi/vi.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'src/core/hle/service/vi') diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index 7508443a8..589a4937c 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp @@ -301,14 +301,11 @@ public: protected: void SerializeData() override { - // TODO(Subv): Find out what this all means - Write(1); - - Write(sizeof(NVFlinger::IGBPBuffer)); - Write(0); // Unknown - + // TODO(bunnei): Find out what this all means. Writing anything non-zero here breaks libnx. + Write(0); + Write(0); + Write(0); Write(buffer); - Write(0); } -- cgit v1.2.3 From 63de56ee0ff50895f1c318949c027cc96ee40b9c Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 9 Feb 2018 21:42:49 -0500 Subject: IGBPQueueBufferRequestParcel: Don't enforce buffer length. - Another fix for libnx. --- src/core/hle/service/vi/vi.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/core/hle/service/vi') diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index 589a4937c..a0eee9e4b 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp @@ -211,7 +211,6 @@ public: void DeserializeData() override { std::u16string token = ReadInterfaceToken(); data = Read(); - ASSERT(data.graphic_buffer_length == sizeof(NVFlinger::IGBPBuffer)); buffer = Read(); } -- cgit v1.2.3 From c83a1b232028ae4d84eb255e8c04154e9b6e8930 Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 9 Feb 2018 22:50:29 -0500 Subject: vi: Implement TransactParcelAuto. --- src/core/hle/service/vi/vi.cpp | 78 +++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 32 deletions(-) (limited to 'src/core/hle/service/vi') diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index a0eee9e4b..69ac2fe07 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp @@ -397,7 +397,7 @@ public: {0, &IHOSBinderDriver::TransactParcel, "TransactParcel"}, {1, &IHOSBinderDriver::AdjustRefcount, "AdjustRefcount"}, {2, &IHOSBinderDriver::GetNativeHandle, "GetNativeHandle"}, - {3, nullptr, "TransactParcelAuto"}, + {3, &IHOSBinderDriver::TransactParcelAuto, "TransactParcelAuto"}, }; RegisterHandlers(functions); } @@ -421,35 +421,21 @@ private: SetPreallocatedBuffer = 14 }; - void TransactParcel(Kernel::HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - u32 id = rp.Pop(); - auto transaction = static_cast(rp.Pop()); - u32 flags = rp.Pop(); - - auto& input_buffer = ctx.BufferDescriptorA()[0]; - std::vector input_data(input_buffer.Size()); - Memory::ReadBlock(input_buffer.Address(), input_data.data(), input_buffer.Size()); - - auto& output_buffer = ctx.BufferDescriptorB()[0]; - + void TransactParcel(u32 id, TransactionId transaction, const std::vector& input_data, + VAddr output_addr, u64 output_size) { auto buffer_queue = nv_flinger->GetBufferQueue(id); - LOG_WARNING(Service_VI, "(STUBBED) called, transaction=%x", transaction); + std::vector response_buffer; if (transaction == TransactionId::Connect) { IGBPConnectRequestParcel request{input_data}; IGBPConnectResponseParcel response{1280, 720}; - auto response_buffer = response.Serialize(); - Memory::WriteBlock(output_buffer.Address(), response_buffer.data(), - output_buffer.Size()); + response_buffer = response.Serialize(); } else if (transaction == TransactionId::SetPreallocatedBuffer) { IGBPSetPreallocatedBufferRequestParcel request{input_data}; buffer_queue->SetPreallocatedBuffer(request.data.slot, request.buffer); IGBPSetPreallocatedBufferResponseParcel response{}; - auto response_buffer = response.Serialize(); - Memory::WriteBlock(output_buffer.Address(), response_buffer.data(), - output_buffer.Size()); + response_buffer = response.Serialize(); } else if (transaction == TransactionId::DequeueBuffer) { IGBPDequeueBufferRequestParcel request{input_data}; @@ -457,27 +443,21 @@ private: request.data.height); IGBPDequeueBufferResponseParcel response{slot}; - auto response_buffer = response.Serialize(); - Memory::WriteBlock(output_buffer.Address(), response_buffer.data(), - output_buffer.Size()); + response_buffer = response.Serialize(); } else if (transaction == TransactionId::RequestBuffer) { IGBPRequestBufferRequestParcel request{input_data}; auto& buffer = buffer_queue->RequestBuffer(request.slot); IGBPRequestBufferResponseParcel response{buffer}; - auto response_buffer = response.Serialize(); - Memory::WriteBlock(output_buffer.Address(), response_buffer.data(), - output_buffer.Size()); + response_buffer = response.Serialize(); } else if (transaction == TransactionId::QueueBuffer) { IGBPQueueBufferRequestParcel request{input_data}; buffer_queue->QueueBuffer(request.data.slot); IGBPQueueBufferResponseParcel response{1280, 720}; - auto response_buffer = response.Serialize(); - Memory::WriteBlock(output_buffer.Address(), response_buffer.data(), - output_buffer.Size()); + response_buffer = response.Serialize(); } else if (transaction == TransactionId::Query) { IGBPQueryRequestParcel request{input_data}; @@ -485,13 +465,47 @@ private: buffer_queue->Query(static_cast(request.type)); IGBPQueryResponseParcel response{value}; - auto response_buffer = response.Serialize(); - Memory::WriteBlock(output_buffer.Address(), response_buffer.data(), - output_buffer.Size()); + response_buffer = response.Serialize(); + } else { ASSERT_MSG(false, "Unimplemented"); } + Memory::WriteBlock(output_addr, response_buffer.data(), output_size); + } + + void TransactParcel(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + u32 id = rp.Pop(); + auto transaction = static_cast(rp.Pop()); + u32 flags = rp.Pop(); + LOG_DEBUG(Service_VI, "called, transaction=%x", transaction); + + auto& input_buffer = ctx.BufferDescriptorA()[0]; + auto& output_buffer = ctx.BufferDescriptorB()[0]; + std::vector 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(); + auto transaction = static_cast(rp.Pop()); + u32 flags = rp.Pop(); + LOG_DEBUG(Service_VI, "called, transaction=%x", transaction); + + auto& input_buffer = ctx.BufferDescriptorX()[0]; + auto& output_buffer = ctx.BufferDescriptorC()[0]; + std::vector 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); } -- cgit v1.2.3