summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2020-12-10 15:32:52 -0800
committerGravatar bunnei2020-12-28 16:33:47 -0800
commit19a8f03ad59abacb3fae60f7ba6d5d358e779c29 (patch)
treea5cbf27860e556f1034cc3797105f705c08e26a1 /src
parenthle: service: vi: Remove usage of SleepClientThread. (diff)
downloadyuzu-19a8f03ad59abacb3fae60f7ba6d5d358e779c29.tar.gz
yuzu-19a8f03ad59abacb3fae60f7ba6d5d358e779c29.tar.xz
yuzu-19a8f03ad59abacb3fae60f7ba6d5d358e779c29.zip
hle: service: nvflinger: Refactor locking and interfaces.
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/nvflinger/nvflinger.cpp23
-rw-r--r--src/core/hle/service/nvflinger/nvflinger.h7
-rw-r--r--src/core/hle/service/vi/vi.cpp46
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
106std::optional<u64> NVFlinger::OpenDisplay(std::string_view name) { 106std::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
123std::optional<u64> NVFlinger::CreateLayer(u64 display_id) { 125std::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
137void NVFlinger::CloseLayer(u64 layer_id) { 140void 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
143std::optional<u32> NVFlinger::FindBufferQueueId(u64 display_id, u64 layer_id) const { 148std::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
153std::shared_ptr<Kernel::ReadableEvent> NVFlinger::FindVsyncEvent(u64 display_id) const { 159std::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
163BufferQueue& NVFlinger::FindBufferQueue(u32 id) { 170BufferQueue* 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
171const 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
179VI::Display* NVFlinger::FindDisplay(u64 display_id) { 182VI::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
86private:
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
93private:
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};