diff options
| author | 2020-04-12 11:44:48 -0400 | |
|---|---|---|
| committer | 2020-04-12 11:44:48 -0400 | |
| commit | a9f866264dd80aa7115e54404093a7666c425c55 (patch) | |
| tree | 594a37578141e3db010dc02ba90c5c4776003622 /src | |
| parent | Merge pull request #3578 from ReinUsesLisp/vmnmx (diff) | |
| parent | service/vi: Partially implement BufferQueue disconnect (diff) | |
| download | yuzu-a9f866264dd80aa7115e54404093a7666c425c55.tar.gz yuzu-a9f866264dd80aa7115e54404093a7666c425c55.tar.xz yuzu-a9f866264dd80aa7115e54404093a7666c425c55.zip | |
Merge pull request #3606 from ReinUsesLisp/nvflinger
service/vi: Partially implement BufferQueue disconnect
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/nvflinger/buffer_queue.cpp | 7 | ||||
| -rw-r--r-- | src/core/hle/service/nvflinger/buffer_queue.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/vi/vi.cpp | 46 |
3 files changed, 44 insertions, 10 deletions
diff --git a/src/core/hle/service/nvflinger/buffer_queue.cpp b/src/core/hle/service/nvflinger/buffer_queue.cpp index 9bcafa5fc..f1e3d832a 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.cpp +++ b/src/core/hle/service/nvflinger/buffer_queue.cpp | |||
| @@ -126,6 +126,13 @@ void BufferQueue::ReleaseBuffer(u32 slot) { | |||
| 126 | buffer_wait_event.writable->Signal(); | 126 | buffer_wait_event.writable->Signal(); |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | void BufferQueue::Disconnect() { | ||
| 130 | queue.clear(); | ||
| 131 | queue_sequence.clear(); | ||
| 132 | id = 1; | ||
| 133 | layer_id = 1; | ||
| 134 | } | ||
| 135 | |||
| 129 | u32 BufferQueue::Query(QueryType type) { | 136 | u32 BufferQueue::Query(QueryType type) { |
| 130 | LOG_WARNING(Service, "(STUBBED) called type={}", static_cast<u32>(type)); | 137 | LOG_WARNING(Service, "(STUBBED) called type={}", static_cast<u32>(type)); |
| 131 | 138 | ||
diff --git a/src/core/hle/service/nvflinger/buffer_queue.h b/src/core/hle/service/nvflinger/buffer_queue.h index f674823b0..d5f31e567 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.h +++ b/src/core/hle/service/nvflinger/buffer_queue.h | |||
| @@ -87,6 +87,7 @@ public: | |||
| 87 | Service::Nvidia::MultiFence& multi_fence); | 87 | Service::Nvidia::MultiFence& multi_fence); |
| 88 | std::optional<std::reference_wrapper<const Buffer>> AcquireBuffer(); | 88 | std::optional<std::reference_wrapper<const Buffer>> AcquireBuffer(); |
| 89 | void ReleaseBuffer(u32 slot); | 89 | void ReleaseBuffer(u32 slot); |
| 90 | void Disconnect(); | ||
| 90 | u32 Query(QueryType type); | 91 | u32 Query(QueryType type); |
| 91 | 92 | ||
| 92 | u32 GetId() const { | 93 | u32 GetId() const { |
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index 519da74e0..fdc62d05b 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp | |||
| @@ -513,7 +513,8 @@ private: | |||
| 513 | 513 | ||
| 514 | auto& buffer_queue = nv_flinger->FindBufferQueue(id); | 514 | auto& buffer_queue = nv_flinger->FindBufferQueue(id); |
| 515 | 515 | ||
| 516 | if (transaction == TransactionId::Connect) { | 516 | switch (transaction) { |
| 517 | case TransactionId::Connect: { | ||
| 517 | IGBPConnectRequestParcel request{ctx.ReadBuffer()}; | 518 | IGBPConnectRequestParcel request{ctx.ReadBuffer()}; |
| 518 | IGBPConnectResponseParcel response{ | 519 | IGBPConnectResponseParcel response{ |
| 519 | static_cast<u32>(static_cast<u32>(DisplayResolution::UndockedWidth) * | 520 | static_cast<u32>(static_cast<u32>(DisplayResolution::UndockedWidth) * |
| @@ -521,14 +522,18 @@ private: | |||
| 521 | static_cast<u32>(static_cast<u32>(DisplayResolution::UndockedHeight) * | 522 | static_cast<u32>(static_cast<u32>(DisplayResolution::UndockedHeight) * |
| 522 | Settings::values.resolution_factor)}; | 523 | Settings::values.resolution_factor)}; |
| 523 | ctx.WriteBuffer(response.Serialize()); | 524 | ctx.WriteBuffer(response.Serialize()); |
| 524 | } else if (transaction == TransactionId::SetPreallocatedBuffer) { | 525 | break; |
| 526 | } | ||
| 527 | case TransactionId::SetPreallocatedBuffer: { | ||
| 525 | IGBPSetPreallocatedBufferRequestParcel request{ctx.ReadBuffer()}; | 528 | IGBPSetPreallocatedBufferRequestParcel request{ctx.ReadBuffer()}; |
| 526 | 529 | ||
| 527 | buffer_queue.SetPreallocatedBuffer(request.data.slot, request.buffer); | 530 | buffer_queue.SetPreallocatedBuffer(request.data.slot, request.buffer); |
| 528 | 531 | ||
| 529 | IGBPSetPreallocatedBufferResponseParcel response{}; | 532 | IGBPSetPreallocatedBufferResponseParcel response{}; |
| 530 | ctx.WriteBuffer(response.Serialize()); | 533 | ctx.WriteBuffer(response.Serialize()); |
| 531 | } else if (transaction == TransactionId::DequeueBuffer) { | 534 | break; |
| 535 | } | ||
| 536 | case TransactionId::DequeueBuffer: { | ||
| 532 | IGBPDequeueBufferRequestParcel request{ctx.ReadBuffer()}; | 537 | IGBPDequeueBufferRequestParcel request{ctx.ReadBuffer()}; |
| 533 | const u32 width{request.data.width}; | 538 | const u32 width{request.data.width}; |
| 534 | const u32 height{request.data.height}; | 539 | const u32 height{request.data.height}; |
| @@ -556,14 +561,18 @@ private: | |||
| 556 | }, | 561 | }, |
| 557 | buffer_queue.GetWritableBufferWaitEvent()); | 562 | buffer_queue.GetWritableBufferWaitEvent()); |
| 558 | } | 563 | } |
| 559 | } else if (transaction == TransactionId::RequestBuffer) { | 564 | break; |
| 565 | } | ||
| 566 | case TransactionId::RequestBuffer: { | ||
| 560 | IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()}; | 567 | IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()}; |
| 561 | 568 | ||
| 562 | auto& buffer = buffer_queue.RequestBuffer(request.slot); | 569 | auto& buffer = buffer_queue.RequestBuffer(request.slot); |
| 563 | 570 | ||
| 564 | IGBPRequestBufferResponseParcel response{buffer}; | 571 | IGBPRequestBufferResponseParcel response{buffer}; |
| 565 | ctx.WriteBuffer(response.Serialize()); | 572 | ctx.WriteBuffer(response.Serialize()); |
| 566 | } else if (transaction == TransactionId::QueueBuffer) { | 573 | break; |
| 574 | } | ||
| 575 | case TransactionId::QueueBuffer: { | ||
| 567 | IGBPQueueBufferRequestParcel request{ctx.ReadBuffer()}; | 576 | IGBPQueueBufferRequestParcel request{ctx.ReadBuffer()}; |
| 568 | 577 | ||
| 569 | buffer_queue.QueueBuffer(request.data.slot, request.data.transform, | 578 | buffer_queue.QueueBuffer(request.data.slot, request.data.transform, |
| @@ -572,7 +581,9 @@ private: | |||
| 572 | 581 | ||
| 573 | IGBPQueueBufferResponseParcel response{1280, 720}; | 582 | IGBPQueueBufferResponseParcel response{1280, 720}; |
| 574 | ctx.WriteBuffer(response.Serialize()); | 583 | ctx.WriteBuffer(response.Serialize()); |
| 575 | } else if (transaction == TransactionId::Query) { | 584 | break; |
| 585 | } | ||
| 586 | case TransactionId::Query: { | ||
| 576 | IGBPQueryRequestParcel request{ctx.ReadBuffer()}; | 587 | IGBPQueryRequestParcel request{ctx.ReadBuffer()}; |
| 577 | 588 | ||
| 578 | const u32 value = | 589 | const u32 value = |
| @@ -580,15 +591,30 @@ private: | |||
| 580 | 591 | ||
| 581 | IGBPQueryResponseParcel response{value}; | 592 | IGBPQueryResponseParcel response{value}; |
| 582 | ctx.WriteBuffer(response.Serialize()); | 593 | ctx.WriteBuffer(response.Serialize()); |
| 583 | } else if (transaction == TransactionId::CancelBuffer) { | 594 | break; |
| 595 | } | ||
| 596 | case TransactionId::CancelBuffer: { | ||
| 584 | LOG_CRITICAL(Service_VI, "(STUBBED) called, transaction=CancelBuffer"); | 597 | LOG_CRITICAL(Service_VI, "(STUBBED) called, transaction=CancelBuffer"); |
| 585 | } else if (transaction == TransactionId::Disconnect || | 598 | break; |
| 586 | transaction == TransactionId::DetachBuffer) { | 599 | } |
| 600 | case TransactionId::Disconnect: { | ||
| 601 | LOG_WARNING(Service_VI, "(STUBBED) called, transaction=Disconnect"); | ||
| 602 | const auto buffer = ctx.ReadBuffer(); | ||
| 603 | |||
| 604 | buffer_queue.Disconnect(); | ||
| 605 | |||
| 606 | IGBPEmptyResponseParcel response{}; | ||
| 607 | ctx.WriteBuffer(response.Serialize()); | ||
| 608 | break; | ||
| 609 | } | ||
| 610 | case TransactionId::DetachBuffer: { | ||
| 587 | const auto buffer = ctx.ReadBuffer(); | 611 | const auto buffer = ctx.ReadBuffer(); |
| 588 | 612 | ||
| 589 | IGBPEmptyResponseParcel response{}; | 613 | IGBPEmptyResponseParcel response{}; |
| 590 | ctx.WriteBuffer(response.Serialize()); | 614 | ctx.WriteBuffer(response.Serialize()); |
| 591 | } else { | 615 | break; |
| 616 | } | ||
| 617 | default: | ||
| 592 | ASSERT_MSG(false, "Unimplemented"); | 618 | ASSERT_MSG(false, "Unimplemented"); |
| 593 | } | 619 | } |
| 594 | 620 | ||