summaryrefslogtreecommitdiff
path: root/src/core/hle
diff options
context:
space:
mode:
authorGravatar bunnei2018-02-13 21:54:12 -0500
committerGravatar bunnei2018-02-13 23:54:11 -0500
commit8f84665775ca7732b20505f5472d640f3eaa8c1e (patch)
treee0f3fc152ff065609b3a6fafc102c73aaca70723 /src/core/hle
parenthle_ipc: Add helper functions for reading and writing buffers. (diff)
downloadyuzu-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.cpp63
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);