diff options
| -rw-r--r-- | src/core/hle/service/nvflinger/nvflinger.cpp | 23 | ||||
| -rw-r--r-- | src/core/hle/service/nvflinger/nvflinger.h | 7 | ||||
| -rw-r--r-- | src/core/hle/service/vi/vi.cpp | 46 |
3 files changed, 31 insertions, 45 deletions
diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp index 44aa2bdae..a7a679df1 100644 --- a/src/core/hle/service/nvflinger/nvflinger.cpp +++ b/src/core/hle/service/nvflinger/nvflinger.cpp | |||
| @@ -104,6 +104,8 @@ void NVFlinger::SetNVDrvInstance(std::shared_ptr<Nvidia::Module> instance) { | |||
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | std::optional<u64> NVFlinger::OpenDisplay(std::string_view name) { | 106 | std::optional<u64> NVFlinger::OpenDisplay(std::string_view name) { |
| 107 | const auto guard = Lock(); | ||
| 108 | |||
| 107 | LOG_DEBUG(Service, "Opening \"{}\" display", name); | 109 | LOG_DEBUG(Service, "Opening \"{}\" display", name); |
| 108 | 110 | ||
| 109 | // TODO(Subv): Currently we only support the Default display. | 111 | // TODO(Subv): Currently we only support the Default display. |
| @@ -121,6 +123,7 @@ std::optional<u64> NVFlinger::OpenDisplay(std::string_view name) { | |||
| 121 | } | 123 | } |
| 122 | 124 | ||
| 123 | std::optional<u64> NVFlinger::CreateLayer(u64 display_id) { | 125 | std::optional<u64> NVFlinger::CreateLayer(u64 display_id) { |
| 126 | const auto guard = Lock(); | ||
| 124 | auto* const display = FindDisplay(display_id); | 127 | auto* const display = FindDisplay(display_id); |
| 125 | 128 | ||
| 126 | if (display == nullptr) { | 129 | if (display == nullptr) { |
| @@ -135,12 +138,15 @@ std::optional<u64> NVFlinger::CreateLayer(u64 display_id) { | |||
| 135 | } | 138 | } |
| 136 | 139 | ||
| 137 | void NVFlinger::CloseLayer(u64 layer_id) { | 140 | void NVFlinger::CloseLayer(u64 layer_id) { |
| 141 | const auto guard = Lock(); | ||
| 142 | |||
| 138 | for (auto& display : displays) { | 143 | for (auto& display : displays) { |
| 139 | display.CloseLayer(layer_id); | 144 | display.CloseLayer(layer_id); |
| 140 | } | 145 | } |
| 141 | } | 146 | } |
| 142 | 147 | ||
| 143 | std::optional<u32> NVFlinger::FindBufferQueueId(u64 display_id, u64 layer_id) const { | 148 | std::optional<u32> NVFlinger::FindBufferQueueId(u64 display_id, u64 layer_id) const { |
| 149 | const auto guard = Lock(); | ||
| 144 | const auto* const layer = FindLayer(display_id, layer_id); | 150 | const auto* const layer = FindLayer(display_id, layer_id); |
| 145 | 151 | ||
| 146 | if (layer == nullptr) { | 152 | if (layer == nullptr) { |
| @@ -151,6 +157,7 @@ std::optional<u32> NVFlinger::FindBufferQueueId(u64 display_id, u64 layer_id) co | |||
| 151 | } | 157 | } |
| 152 | 158 | ||
| 153 | std::shared_ptr<Kernel::ReadableEvent> NVFlinger::FindVsyncEvent(u64 display_id) const { | 159 | std::shared_ptr<Kernel::ReadableEvent> NVFlinger::FindVsyncEvent(u64 display_id) const { |
| 160 | const auto guard = Lock(); | ||
| 154 | auto* const display = FindDisplay(display_id); | 161 | auto* const display = FindDisplay(display_id); |
| 155 | 162 | ||
| 156 | if (display == nullptr) { | 163 | if (display == nullptr) { |
| @@ -160,20 +167,16 @@ std::shared_ptr<Kernel::ReadableEvent> NVFlinger::FindVsyncEvent(u64 display_id) | |||
| 160 | return display->GetVSyncEvent(); | 167 | return display->GetVSyncEvent(); |
| 161 | } | 168 | } |
| 162 | 169 | ||
| 163 | BufferQueue& NVFlinger::FindBufferQueue(u32 id) { | 170 | BufferQueue* NVFlinger::FindBufferQueue(u32 id) { |
| 171 | const auto guard = Lock(); | ||
| 164 | const auto itr = std::find_if(buffer_queues.begin(), buffer_queues.end(), | 172 | const auto itr = std::find_if(buffer_queues.begin(), buffer_queues.end(), |
| 165 | [id](const auto& queue) { return queue.GetId() == id; }); | 173 | [id](const auto& queue) { return queue.GetId() == id; }); |
| 166 | 174 | ||
| 167 | ASSERT(itr != buffer_queues.end()); | 175 | if (itr == buffer_queues.end()) { |
| 168 | return *itr; | 176 | return nullptr; |
| 169 | } | 177 | } |
| 170 | |||
| 171 | const BufferQueue& NVFlinger::FindBufferQueue(u32 id) const { | ||
| 172 | const auto itr = std::find_if(buffer_queues.begin(), buffer_queues.end(), | ||
| 173 | [id](const auto& queue) { return queue.GetId() == id; }); | ||
| 174 | 178 | ||
| 175 | ASSERT(itr != buffer_queues.end()); | 179 | return &*itr; |
| 176 | return *itr; | ||
| 177 | } | 180 | } |
| 178 | 181 | ||
| 179 | VI::Display* NVFlinger::FindDisplay(u64 display_id) { | 182 | VI::Display* NVFlinger::FindDisplay(u64 display_id) { |
diff --git a/src/core/hle/service/nvflinger/nvflinger.h b/src/core/hle/service/nvflinger/nvflinger.h index 1ebe949c0..ce1347d6d 100644 --- a/src/core/hle/service/nvflinger/nvflinger.h +++ b/src/core/hle/service/nvflinger/nvflinger.h | |||
| @@ -75,10 +75,7 @@ public: | |||
| 75 | [[nodiscard]] std::shared_ptr<Kernel::ReadableEvent> FindVsyncEvent(u64 display_id) const; | 75 | [[nodiscard]] std::shared_ptr<Kernel::ReadableEvent> FindVsyncEvent(u64 display_id) const; |
| 76 | 76 | ||
| 77 | /// Obtains a buffer queue identified by the ID. | 77 | /// Obtains a buffer queue identified by the ID. |
| 78 | [[nodiscard]] BufferQueue& FindBufferQueue(u32 id); | 78 | [[nodiscard]] BufferQueue* FindBufferQueue(u32 id); |
| 79 | |||
| 80 | /// Obtains a buffer queue identified by the ID. | ||
| 81 | [[nodiscard]] const BufferQueue& FindBufferQueue(u32 id) const; | ||
| 82 | 79 | ||
| 83 | /// Performs a composition request to the emulated nvidia GPU and triggers the vsync events when | 80 | /// Performs a composition request to the emulated nvidia GPU and triggers the vsync events when |
| 84 | /// finished. | 81 | /// finished. |
| @@ -86,11 +83,11 @@ public: | |||
| 86 | 83 | ||
| 87 | [[nodiscard]] s64 GetNextTicks() const; | 84 | [[nodiscard]] s64 GetNextTicks() const; |
| 88 | 85 | ||
| 86 | private: | ||
| 89 | [[nodiscard]] std::unique_lock<std::mutex> Lock() const { | 87 | [[nodiscard]] std::unique_lock<std::mutex> Lock() const { |
| 90 | return std::unique_lock{*guard}; | 88 | return std::unique_lock{*guard}; |
| 91 | } | 89 | } |
| 92 | 90 | ||
| 93 | private: | ||
| 94 | /// Finds the display identified by the specified ID. | 91 | /// Finds the display identified by the specified ID. |
| 95 | [[nodiscard]] VI::Display* FindDisplay(u64 display_id); | 92 | [[nodiscard]] VI::Display* FindDisplay(u64 display_id); |
| 96 | 93 | ||
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index 93a113b93..ce0272e59 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp | |||
| @@ -551,9 +551,9 @@ private: | |||
| 551 | IGBPSetPreallocatedBufferRequestParcel request{ctx.ReadBuffer()}; | 551 | IGBPSetPreallocatedBufferRequestParcel request{ctx.ReadBuffer()}; |
| 552 | 552 | ||
| 553 | { | 553 | { |
| 554 | const auto guard = nv_flinger.Lock(); | 554 | auto& buffer_queue = *nv_flinger.FindBufferQueue(id); |
| 555 | auto& buffer_queue = nv_flinger.FindBufferQueue(id); | 555 | buffer_queue.SetPreallocatedBuffer(request.data.slot, |
| 556 | buffer_queue.SetPreallocatedBuffer(request.data.slot, request.buffer_container.buffer); | 556 | request.buffer_container.buffer); |
| 557 | } | 557 | } |
| 558 | 558 | ||
| 559 | IGBPSetPreallocatedBufferResponseParcel response{}; | 559 | IGBPSetPreallocatedBufferResponseParcel response{}; |
| @@ -568,11 +568,8 @@ private: | |||
| 568 | std::optional<std::pair<u32, Service::Nvidia::MultiFence*>> result; | 568 | std::optional<std::pair<u32, Service::Nvidia::MultiFence*>> result; |
| 569 | 569 | ||
| 570 | while (!result) { | 570 | while (!result) { |
| 571 | { | 571 | auto& buffer_queue = *nv_flinger.FindBufferQueue(id); |
| 572 | const auto guard = nv_flinger.Lock(); | 572 | result = buffer_queue.DequeueBuffer(width, height); |
| 573 | auto& buffer_queue = nv_flinger.FindBufferQueue(id); | ||
| 574 | result = buffer_queue.DequeueBuffer(width, height); | ||
| 575 | } | ||
| 576 | 573 | ||
| 577 | if (result) { | 574 | if (result) { |
| 578 | // Buffer is available | 575 | // Buffer is available |
| @@ -586,8 +583,7 @@ private: | |||
| 586 | case TransactionId::RequestBuffer: { | 583 | case TransactionId::RequestBuffer: { |
| 587 | IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()}; | 584 | IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()}; |
| 588 | 585 | ||
| 589 | const auto guard = nv_flinger.Lock(); | 586 | auto& buffer_queue = *nv_flinger.FindBufferQueue(id); |
| 590 | auto& buffer_queue = nv_flinger.FindBufferQueue(id); | ||
| 591 | auto& buffer = buffer_queue.RequestBuffer(request.slot); | 587 | auto& buffer = buffer_queue.RequestBuffer(request.slot); |
| 592 | IGBPRequestBufferResponseParcel response{buffer}; | 588 | IGBPRequestBufferResponseParcel response{buffer}; |
| 593 | ctx.WriteBuffer(response.Serialize()); | 589 | ctx.WriteBuffer(response.Serialize()); |
| @@ -597,13 +593,10 @@ private: | |||
| 597 | case TransactionId::QueueBuffer: { | 593 | case TransactionId::QueueBuffer: { |
| 598 | IGBPQueueBufferRequestParcel request{ctx.ReadBuffer()}; | 594 | IGBPQueueBufferRequestParcel request{ctx.ReadBuffer()}; |
| 599 | 595 | ||
| 600 | { | 596 | auto& buffer_queue = *nv_flinger.FindBufferQueue(id); |
| 601 | const auto guard = nv_flinger.Lock(); | 597 | buffer_queue.QueueBuffer(request.data.slot, request.data.transform, |
| 602 | auto& buffer_queue = nv_flinger.FindBufferQueue(id); | 598 | request.data.GetCropRect(), request.data.swap_interval, |
| 603 | buffer_queue.QueueBuffer(request.data.slot, request.data.transform, | 599 | request.data.multi_fence); |
| 604 | request.data.GetCropRect(), request.data.swap_interval, | ||
| 605 | request.data.multi_fence); | ||
| 606 | } | ||
| 607 | 600 | ||
| 608 | IGBPQueueBufferResponseParcel response{1280, 720}; | 601 | IGBPQueueBufferResponseParcel response{1280, 720}; |
| 609 | ctx.WriteBuffer(response.Serialize()); | 602 | ctx.WriteBuffer(response.Serialize()); |
| @@ -612,8 +605,7 @@ private: | |||
| 612 | case TransactionId::Query: { | 605 | case TransactionId::Query: { |
| 613 | IGBPQueryRequestParcel request{ctx.ReadBuffer()}; | 606 | IGBPQueryRequestParcel request{ctx.ReadBuffer()}; |
| 614 | 607 | ||
| 615 | const auto guard = nv_flinger.Lock(); | 608 | auto& buffer_queue = *nv_flinger.FindBufferQueue(id); |
| 616 | auto& buffer_queue = nv_flinger.FindBufferQueue(id); | ||
| 617 | const u32 value = | 609 | const u32 value = |
| 618 | buffer_queue.Query(static_cast<NVFlinger::BufferQueue::QueryType>(request.type)); | 610 | buffer_queue.Query(static_cast<NVFlinger::BufferQueue::QueryType>(request.type)); |
| 619 | 611 | ||
| @@ -624,11 +616,8 @@ private: | |||
| 624 | case TransactionId::CancelBuffer: { | 616 | case TransactionId::CancelBuffer: { |
| 625 | IGBPCancelBufferRequestParcel request{ctx.ReadBuffer()}; | 617 | IGBPCancelBufferRequestParcel request{ctx.ReadBuffer()}; |
| 626 | 618 | ||
| 627 | { | 619 | auto& buffer_queue = *nv_flinger.FindBufferQueue(id); |
| 628 | const auto guard = nv_flinger.Lock(); | 620 | buffer_queue.CancelBuffer(request.data.slot, request.data.multi_fence); |
| 629 | auto& buffer_queue = nv_flinger.FindBufferQueue(id); | ||
| 630 | buffer_queue.CancelBuffer(request.data.slot, request.data.multi_fence); | ||
| 631 | } | ||
| 632 | 621 | ||
| 633 | IGBPCancelBufferResponseParcel response{}; | 622 | IGBPCancelBufferResponseParcel response{}; |
| 634 | ctx.WriteBuffer(response.Serialize()); | 623 | ctx.WriteBuffer(response.Serialize()); |
| @@ -638,11 +627,8 @@ private: | |||
| 638 | LOG_WARNING(Service_VI, "(STUBBED) called, transaction=Disconnect"); | 627 | LOG_WARNING(Service_VI, "(STUBBED) called, transaction=Disconnect"); |
| 639 | const auto buffer = ctx.ReadBuffer(); | 628 | const auto buffer = ctx.ReadBuffer(); |
| 640 | 629 | ||
| 641 | { | 630 | auto& buffer_queue = *nv_flinger.FindBufferQueue(id); |
| 642 | const auto guard = nv_flinger.Lock(); | 631 | buffer_queue.Disconnect(); |
| 643 | auto& buffer_queue = nv_flinger.FindBufferQueue(id); | ||
| 644 | buffer_queue.Disconnect(); | ||
| 645 | } | ||
| 646 | 632 | ||
| 647 | IGBPEmptyResponseParcel response{}; | 633 | IGBPEmptyResponseParcel response{}; |
| 648 | ctx.WriteBuffer(response.Serialize()); | 634 | ctx.WriteBuffer(response.Serialize()); |
| @@ -691,7 +677,7 @@ private: | |||
| 691 | 677 | ||
| 692 | LOG_WARNING(Service_VI, "(STUBBED) called id={}, unknown={:08X}", id, unknown); | 678 | LOG_WARNING(Service_VI, "(STUBBED) called id={}, unknown={:08X}", id, unknown); |
| 693 | 679 | ||
| 694 | const auto& buffer_queue = nv_flinger.FindBufferQueue(id); | 680 | const auto& buffer_queue = *nv_flinger.FindBufferQueue(id); |
| 695 | 681 | ||
| 696 | // TODO(Subv): Find out what this actually is. | 682 | // TODO(Subv): Find out what this actually is. |
| 697 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 683 | IPC::ResponseBuilder rb{ctx, 2, 1}; |