diff options
| author | 2018-02-13 21:54:12 -0500 | |
|---|---|---|
| committer | 2018-02-13 23:54:11 -0500 | |
| commit | 8f84665775ca7732b20505f5472d640f3eaa8c1e (patch) | |
| tree | e0f3fc152ff065609b3a6fafc102c73aaca70723 /src/core/hle | |
| parent | hle_ipc: Add helper functions for reading and writing buffers. (diff) | |
| download | yuzu-8f84665775ca7732b20505f5472d640f3eaa8c1e.tar.gz yuzu-8f84665775ca7732b20505f5472d640f3eaa8c1e.tar.xz yuzu-8f84665775ca7732b20505f5472d640f3eaa8c1e.zip | |
vi: Use ReadBuffer/WriteBuffer functions for TransactParcel.
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/service/vi/vi.cpp | 63 |
1 files changed, 19 insertions, 44 deletions
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index 55f196ab0..1f00a6cca 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp | |||
| @@ -453,86 +453,61 @@ private: | |||
| 453 | SetPreallocatedBuffer = 14 | 453 | SetPreallocatedBuffer = 14 |
| 454 | }; | 454 | }; |
| 455 | 455 | ||
| 456 | void TransactParcel(u32 id, TransactionId transaction, const std::vector<u8>& input_data, | 456 | void TransactParcel(Kernel::HLERequestContext& ctx) { |
| 457 | VAddr output_addr, u64 output_size) { | 457 | IPC::RequestParser rp{ctx}; |
| 458 | u32 id = rp.Pop<u32>(); | ||
| 459 | auto transaction = static_cast<TransactionId>(rp.Pop<u32>()); | ||
| 460 | u32 flags = rp.Pop<u32>(); | ||
| 458 | auto buffer_queue = nv_flinger->GetBufferQueue(id); | 461 | auto buffer_queue = nv_flinger->GetBufferQueue(id); |
| 459 | 462 | ||
| 463 | LOG_DEBUG(Service_VI, "called, transaction=%x", transaction); | ||
| 464 | |||
| 460 | if (transaction == TransactionId::Connect) { | 465 | if (transaction == TransactionId::Connect) { |
| 461 | IGBPConnectRequestParcel request{input_data}; | 466 | IGBPConnectRequestParcel request{ctx.ReadBuffer()}; |
| 462 | IGBPConnectResponseParcel response{1280, 720}; | 467 | IGBPConnectResponseParcel response{1280, 720}; |
| 463 | std::vector<u8> response_buffer = response.Serialize(); | 468 | ctx.WriteBuffer(response.Serialize()); |
| 464 | Memory::WriteBlock(output_addr, response_buffer.data(), response_buffer.size()); | ||
| 465 | } else if (transaction == TransactionId::SetPreallocatedBuffer) { | 469 | } else if (transaction == TransactionId::SetPreallocatedBuffer) { |
| 466 | IGBPSetPreallocatedBufferRequestParcel request{input_data}; | 470 | IGBPSetPreallocatedBufferRequestParcel request{ctx.ReadBuffer()}; |
| 467 | 471 | ||
| 468 | buffer_queue->SetPreallocatedBuffer(request.data.slot, request.buffer); | 472 | buffer_queue->SetPreallocatedBuffer(request.data.slot, request.buffer); |
| 469 | 473 | ||
| 470 | IGBPSetPreallocatedBufferResponseParcel response{}; | 474 | IGBPSetPreallocatedBufferResponseParcel response{}; |
| 471 | std::vector<u8> response_buffer = response.Serialize(); | 475 | ctx.WriteBuffer(response.Serialize()); |
| 472 | Memory::WriteBlock(output_addr, response_buffer.data(), response_buffer.size()); | ||
| 473 | } else if (transaction == TransactionId::DequeueBuffer) { | 476 | } else if (transaction == TransactionId::DequeueBuffer) { |
| 474 | IGBPDequeueBufferRequestParcel request{input_data}; | 477 | IGBPDequeueBufferRequestParcel request{ctx.ReadBuffer()}; |
| 475 | 478 | ||
| 476 | u32 slot = buffer_queue->DequeueBuffer(request.data.pixel_format, request.data.width, | 479 | u32 slot = buffer_queue->DequeueBuffer(request.data.pixel_format, request.data.width, |
| 477 | request.data.height); | 480 | request.data.height); |
| 478 | 481 | ||
| 479 | IGBPDequeueBufferResponseParcel response{slot}; | 482 | IGBPDequeueBufferResponseParcel response{slot}; |
| 480 | std::vector<u8> response_buffer = response.Serialize(); | 483 | ctx.WriteBuffer(response.Serialize()); |
| 481 | Memory::WriteBlock(output_addr, response_buffer.data(), response_buffer.size()); | ||
| 482 | } else if (transaction == TransactionId::RequestBuffer) { | 484 | } else if (transaction == TransactionId::RequestBuffer) { |
| 483 | IGBPRequestBufferRequestParcel request{input_data}; | 485 | IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()}; |
| 484 | 486 | ||
| 485 | auto& buffer = buffer_queue->RequestBuffer(request.slot); | 487 | auto& buffer = buffer_queue->RequestBuffer(request.slot); |
| 486 | 488 | ||
| 487 | IGBPRequestBufferResponseParcel response{buffer}; | 489 | IGBPRequestBufferResponseParcel response{buffer}; |
| 488 | std::vector<u8> response_buffer = response.Serialize(); | 490 | ctx.WriteBuffer(response.Serialize()); |
| 489 | Memory::WriteBlock(output_addr, response_buffer.data(), response_buffer.size()); | ||
| 490 | } else if (transaction == TransactionId::QueueBuffer) { | 491 | } else if (transaction == TransactionId::QueueBuffer) { |
| 491 | IGBPQueueBufferRequestParcel request{input_data}; | 492 | IGBPQueueBufferRequestParcel request{ctx.ReadBuffer()}; |
| 492 | 493 | ||
| 493 | buffer_queue->QueueBuffer(request.data.slot, request.data.transform); | 494 | buffer_queue->QueueBuffer(request.data.slot, request.data.transform); |
| 494 | 495 | ||
| 495 | IGBPQueueBufferResponseParcel response{1280, 720}; | 496 | IGBPQueueBufferResponseParcel response{1280, 720}; |
| 496 | std::vector<u8> response_buffer = response.Serialize(); | 497 | ctx.WriteBuffer(response.Serialize()); |
| 497 | Memory::WriteBlock(output_addr, response_buffer.data(), response_buffer.size()); | ||
| 498 | } else if (transaction == TransactionId::Query) { | 498 | } else if (transaction == TransactionId::Query) { |
| 499 | IGBPQueryRequestParcel request{input_data}; | 499 | IGBPQueryRequestParcel request{ctx.ReadBuffer()}; |
| 500 | 500 | ||
| 501 | u32 value = | 501 | u32 value = |
| 502 | buffer_queue->Query(static_cast<NVFlinger::BufferQueue::QueryType>(request.type)); | 502 | buffer_queue->Query(static_cast<NVFlinger::BufferQueue::QueryType>(request.type)); |
| 503 | 503 | ||
| 504 | IGBPQueryResponseParcel response{value}; | 504 | IGBPQueryResponseParcel response{value}; |
| 505 | std::vector<u8> response_buffer = response.Serialize(); | 505 | ctx.WriteBuffer(response.Serialize()); |
| 506 | Memory::WriteBlock(output_addr, response_buffer.data(), response_buffer.size()); | ||
| 507 | } else if (transaction == TransactionId::CancelBuffer) { | 506 | } else if (transaction == TransactionId::CancelBuffer) { |
| 508 | LOG_WARNING(Service_VI, "(STUBBED) called, transaction=CancelBuffer"); | 507 | LOG_WARNING(Service_VI, "(STUBBED) called, transaction=CancelBuffer"); |
| 509 | } else { | 508 | } else { |
| 510 | ASSERT_MSG(false, "Unimplemented"); | 509 | ASSERT_MSG(false, "Unimplemented"); |
| 511 | } | 510 | } |
| 512 | } | ||
| 513 | |||
| 514 | void TransactParcel(Kernel::HLERequestContext& ctx) { | ||
| 515 | IPC::RequestParser rp{ctx}; | ||
| 516 | u32 id = rp.Pop<u32>(); | ||
| 517 | auto transaction = static_cast<TransactionId>(rp.Pop<u32>()); | ||
| 518 | u32 flags = rp.Pop<u32>(); | ||
| 519 | LOG_DEBUG(Service_VI, "called, transaction=%x", transaction); | ||
| 520 | |||
| 521 | if (ctx.BufferDescriptorA()[0].Size() != 0) { | ||
| 522 | auto& input_buffer = ctx.BufferDescriptorA()[0]; | ||
| 523 | auto& output_buffer = ctx.BufferDescriptorB()[0]; | ||
| 524 | std::vector<u8> input_data(input_buffer.Size()); | ||
| 525 | Memory::ReadBlock(input_buffer.Address(), input_data.data(), input_buffer.Size()); | ||
| 526 | TransactParcel(id, transaction, input_data, output_buffer.Address(), | ||
| 527 | output_buffer.Size()); | ||
| 528 | } else { | ||
| 529 | auto& input_buffer = ctx.BufferDescriptorX()[0]; | ||
| 530 | auto& output_buffer = ctx.BufferDescriptorC()[0]; | ||
| 531 | std::vector<u8> input_data(input_buffer.size); | ||
| 532 | Memory::ReadBlock(input_buffer.Address(), input_data.data(), input_buffer.size); | ||
| 533 | TransactParcel(id, transaction, input_data, output_buffer.Address(), | ||
| 534 | output_buffer.Size()); | ||
| 535 | } | ||
| 536 | 511 | ||
| 537 | IPC::ResponseBuilder rb{ctx, 2}; | 512 | IPC::ResponseBuilder rb{ctx, 2}; |
| 538 | rb.Push(RESULT_SUCCESS); | 513 | rb.Push(RESULT_SUCCESS); |