diff options
Diffstat (limited to '')
| -rw-r--r-- | src/core/hle/service/nvflinger/nvflinger.cpp | 17 | ||||
| -rw-r--r-- | src/core/hle/service/nvflinger/nvflinger.h | 7 | ||||
| -rw-r--r-- | src/core/hle/service/vi/display/vi_display.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/service/vi/display/vi_display.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/vi/layer/vi_layer.cpp | 7 | ||||
| -rw-r--r-- | src/core/hle/service/vi/layer/vi_layer.h | 12 | ||||
| -rw-r--r-- | src/core/hle/service/vi/vi.cpp | 26 |
7 files changed, 39 insertions, 36 deletions
diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp index 95bb55bbb..56f31e2ac 100644 --- a/src/core/hle/service/nvflinger/nvflinger.cpp +++ b/src/core/hle/service/nvflinger/nvflinger.cpp | |||
| @@ -78,9 +78,8 @@ std::optional<u64> NVFlinger::CreateLayer(u64 display_id) { | |||
| 78 | 78 | ||
| 79 | const u64 layer_id = next_layer_id++; | 79 | const u64 layer_id = next_layer_id++; |
| 80 | const u32 buffer_queue_id = next_buffer_queue_id++; | 80 | const u32 buffer_queue_id = next_buffer_queue_id++; |
| 81 | auto buffer_queue = std::make_shared<BufferQueue>(buffer_queue_id, layer_id); | 81 | buffer_queues.emplace_back(buffer_queue_id, layer_id); |
| 82 | display->CreateLayer(layer_id, buffer_queue); | 82 | display->CreateLayer(layer_id, buffer_queues.back()); |
| 83 | buffer_queues.emplace_back(std::move(buffer_queue)); | ||
| 84 | return layer_id; | 83 | return layer_id; |
| 85 | } | 84 | } |
| 86 | 85 | ||
| @@ -104,9 +103,17 @@ Kernel::SharedPtr<Kernel::ReadableEvent> NVFlinger::FindVsyncEvent(u64 display_i | |||
| 104 | return display->GetVSyncEvent(); | 103 | return display->GetVSyncEvent(); |
| 105 | } | 104 | } |
| 106 | 105 | ||
| 107 | std::shared_ptr<BufferQueue> NVFlinger::FindBufferQueue(u32 id) const { | 106 | BufferQueue& NVFlinger::FindBufferQueue(u32 id) { |
| 108 | const auto itr = std::find_if(buffer_queues.begin(), buffer_queues.end(), | 107 | const auto itr = std::find_if(buffer_queues.begin(), buffer_queues.end(), |
| 109 | [&](const auto& queue) { return queue->GetId() == id; }); | 108 | [id](const auto& queue) { return queue.GetId() == id; }); |
| 109 | |||
| 110 | ASSERT(itr != buffer_queues.end()); | ||
| 111 | return *itr; | ||
| 112 | } | ||
| 113 | |||
| 114 | const BufferQueue& NVFlinger::FindBufferQueue(u32 id) const { | ||
| 115 | const auto itr = std::find_if(buffer_queues.begin(), buffer_queues.end(), | ||
| 116 | [id](const auto& queue) { return queue.GetId() == id; }); | ||
| 110 | 117 | ||
| 111 | ASSERT(itr != buffer_queues.end()); | 118 | ASSERT(itr != buffer_queues.end()); |
| 112 | return *itr; | 119 | return *itr; |
diff --git a/src/core/hle/service/nvflinger/nvflinger.h b/src/core/hle/service/nvflinger/nvflinger.h index f9458745a..c0a83fffb 100644 --- a/src/core/hle/service/nvflinger/nvflinger.h +++ b/src/core/hle/service/nvflinger/nvflinger.h | |||
| @@ -65,7 +65,10 @@ public: | |||
| 65 | Kernel::SharedPtr<Kernel::ReadableEvent> FindVsyncEvent(u64 display_id) const; | 65 | Kernel::SharedPtr<Kernel::ReadableEvent> FindVsyncEvent(u64 display_id) const; |
| 66 | 66 | ||
| 67 | /// Obtains a buffer queue identified by the ID. | 67 | /// Obtains a buffer queue identified by the ID. |
| 68 | std::shared_ptr<BufferQueue> FindBufferQueue(u32 id) const; | 68 | BufferQueue& FindBufferQueue(u32 id); |
| 69 | |||
| 70 | /// Obtains a buffer queue identified by the ID. | ||
| 71 | const BufferQueue& FindBufferQueue(u32 id) const; | ||
| 69 | 72 | ||
| 70 | /// Performs a composition request to the emulated nvidia GPU and triggers the vsync events when | 73 | /// Performs a composition request to the emulated nvidia GPU and triggers the vsync events when |
| 71 | /// finished. | 74 | /// finished. |
| @@ -87,7 +90,7 @@ private: | |||
| 87 | std::shared_ptr<Nvidia::Module> nvdrv; | 90 | std::shared_ptr<Nvidia::Module> nvdrv; |
| 88 | 91 | ||
| 89 | std::vector<VI::Display> displays; | 92 | std::vector<VI::Display> displays; |
| 90 | std::vector<std::shared_ptr<BufferQueue>> buffer_queues; | 93 | std::vector<BufferQueue> buffer_queues; |
| 91 | 94 | ||
| 92 | /// Id to use for the next layer that is created, this counter is shared among all displays. | 95 | /// Id to use for the next layer that is created, this counter is shared among all displays. |
| 93 | u64 next_layer_id = 1; | 96 | u64 next_layer_id = 1; |
diff --git a/src/core/hle/service/vi/display/vi_display.cpp b/src/core/hle/service/vi/display/vi_display.cpp index 9c0afd152..01d80311b 100644 --- a/src/core/hle/service/vi/display/vi_display.cpp +++ b/src/core/hle/service/vi/display/vi_display.cpp | |||
| @@ -39,11 +39,11 @@ void Display::SignalVSyncEvent() { | |||
| 39 | vsync_event.writable->Signal(); | 39 | vsync_event.writable->Signal(); |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | void Display::CreateLayer(u64 id, std::shared_ptr<NVFlinger::BufferQueue> buffer_queue) { | 42 | void Display::CreateLayer(u64 id, NVFlinger::BufferQueue& buffer_queue) { |
| 43 | // TODO(Subv): Support more than 1 layer. | 43 | // TODO(Subv): Support more than 1 layer. |
| 44 | ASSERT_MSG(layers.empty(), "Only one layer is supported per display at the moment"); | 44 | ASSERT_MSG(layers.empty(), "Only one layer is supported per display at the moment"); |
| 45 | 45 | ||
| 46 | layers.emplace_back(id, std::move(buffer_queue)); | 46 | layers.emplace_back(id, buffer_queue); |
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | Layer* Display::FindLayer(u64 id) { | 49 | Layer* Display::FindLayer(u64 id) { |
diff --git a/src/core/hle/service/vi/display/vi_display.h b/src/core/hle/service/vi/display/vi_display.h index 8948102bc..2acd46ff8 100644 --- a/src/core/hle/service/vi/display/vi_display.h +++ b/src/core/hle/service/vi/display/vi_display.h | |||
| @@ -67,7 +67,7 @@ public: | |||
| 67 | /// @param id The ID to assign to the created layer. | 67 | /// @param id The ID to assign to the created layer. |
| 68 | /// @param buffer_queue The buffer queue for the layer instance to use. | 68 | /// @param buffer_queue The buffer queue for the layer instance to use. |
| 69 | /// | 69 | /// |
| 70 | void CreateLayer(u64 id, std::shared_ptr<NVFlinger::BufferQueue> buffer_queue); | 70 | void CreateLayer(u64 id, NVFlinger::BufferQueue& buffer_queue); |
| 71 | 71 | ||
| 72 | /// Attempts to find a layer with the given ID. | 72 | /// Attempts to find a layer with the given ID. |
| 73 | /// | 73 | /// |
diff --git a/src/core/hle/service/vi/layer/vi_layer.cpp b/src/core/hle/service/vi/layer/vi_layer.cpp index 48f4c57cb..954225c26 100644 --- a/src/core/hle/service/vi/layer/vi_layer.cpp +++ b/src/core/hle/service/vi/layer/vi_layer.cpp | |||
| @@ -2,16 +2,11 @@ | |||
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include "common/assert.h" | ||
| 6 | #include "core/hle/service/vi/layer/vi_layer.h" | 5 | #include "core/hle/service/vi/layer/vi_layer.h" |
| 7 | 6 | ||
| 8 | namespace Service::VI { | 7 | namespace Service::VI { |
| 9 | 8 | ||
| 10 | Layer::Layer(u64 id, std::shared_ptr<NVFlinger::BufferQueue> queue) | 9 | Layer::Layer(u64 id, NVFlinger::BufferQueue& queue) : id{id}, buffer_queue{queue} {} |
| 11 | : id{id}, buffer_queue{std::move(queue)} | ||
| 12 | { | ||
| 13 | ASSERT_MSG(buffer_queue != nullptr, "buffer_queue may not be null."); | ||
| 14 | } | ||
| 15 | 10 | ||
| 16 | Layer::~Layer() = default; | 11 | Layer::~Layer() = default; |
| 17 | 12 | ||
diff --git a/src/core/hle/service/vi/layer/vi_layer.h b/src/core/hle/service/vi/layer/vi_layer.h index dd4f7e596..c6bfd01f6 100644 --- a/src/core/hle/service/vi/layer/vi_layer.h +++ b/src/core/hle/service/vi/layer/vi_layer.h | |||
| @@ -4,8 +4,6 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <memory> | ||
| 8 | |||
| 9 | #include "common/common_types.h" | 7 | #include "common/common_types.h" |
| 10 | 8 | ||
| 11 | namespace Service::NVFlinger { | 9 | namespace Service::NVFlinger { |
| @@ -22,14 +20,14 @@ public: | |||
| 22 | /// @param id The ID to assign to this layer. | 20 | /// @param id The ID to assign to this layer. |
| 23 | /// @param queue The buffer queue for this layer to use. | 21 | /// @param queue The buffer queue for this layer to use. |
| 24 | /// | 22 | /// |
| 25 | Layer(u64 id, std::shared_ptr<NVFlinger::BufferQueue> queue); | 23 | Layer(u64 id, NVFlinger::BufferQueue& queue); |
| 26 | ~Layer(); | 24 | ~Layer(); |
| 27 | 25 | ||
| 28 | Layer(const Layer&) = delete; | 26 | Layer(const Layer&) = delete; |
| 29 | Layer& operator=(const Layer&) = delete; | 27 | Layer& operator=(const Layer&) = delete; |
| 30 | 28 | ||
| 31 | Layer(Layer&&) = default; | 29 | Layer(Layer&&) = default; |
| 32 | Layer& operator=(Layer&&) = default; | 30 | Layer& operator=(Layer&&) = delete; |
| 33 | 31 | ||
| 34 | /// Gets the ID for this layer. | 32 | /// Gets the ID for this layer. |
| 35 | u64 GetID() const { | 33 | u64 GetID() const { |
| @@ -38,17 +36,17 @@ public: | |||
| 38 | 36 | ||
| 39 | /// Gets a reference to the buffer queue this layer is using. | 37 | /// Gets a reference to the buffer queue this layer is using. |
| 40 | NVFlinger::BufferQueue& GetBufferQueue() { | 38 | NVFlinger::BufferQueue& GetBufferQueue() { |
| 41 | return *buffer_queue; | 39 | return buffer_queue; |
| 42 | } | 40 | } |
| 43 | 41 | ||
| 44 | /// Gets a const reference to the buffer queue this layer is using. | 42 | /// Gets a const reference to the buffer queue this layer is using. |
| 45 | const NVFlinger::BufferQueue& GetBufferQueue() const { | 43 | const NVFlinger::BufferQueue& GetBufferQueue() const { |
| 46 | return *buffer_queue; | 44 | return buffer_queue; |
| 47 | } | 45 | } |
| 48 | 46 | ||
| 49 | private: | 47 | private: |
| 50 | u64 id; | 48 | u64 id; |
| 51 | std::shared_ptr<NVFlinger::BufferQueue> buffer_queue; | 49 | NVFlinger::BufferQueue& buffer_queue; |
| 52 | }; | 50 | }; |
| 53 | 51 | ||
| 54 | } // namespace Service::VI | 52 | } // namespace Service::VI |
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index a317a2885..7369a09ec 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp | |||
| @@ -525,7 +525,7 @@ private: | |||
| 525 | LOG_DEBUG(Service_VI, "called. id=0x{:08X} transaction={:X}, flags=0x{:08X}", id, | 525 | LOG_DEBUG(Service_VI, "called. id=0x{:08X} transaction={:X}, flags=0x{:08X}", id, |
| 526 | static_cast<u32>(transaction), flags); | 526 | static_cast<u32>(transaction), flags); |
| 527 | 527 | ||
| 528 | auto buffer_queue = nv_flinger->FindBufferQueue(id); | 528 | auto& buffer_queue = nv_flinger->FindBufferQueue(id); |
| 529 | 529 | ||
| 530 | if (transaction == TransactionId::Connect) { | 530 | if (transaction == TransactionId::Connect) { |
| 531 | IGBPConnectRequestParcel request{ctx.ReadBuffer()}; | 531 | IGBPConnectRequestParcel request{ctx.ReadBuffer()}; |
| @@ -538,7 +538,7 @@ private: | |||
| 538 | } else if (transaction == TransactionId::SetPreallocatedBuffer) { | 538 | } else if (transaction == TransactionId::SetPreallocatedBuffer) { |
| 539 | IGBPSetPreallocatedBufferRequestParcel request{ctx.ReadBuffer()}; | 539 | IGBPSetPreallocatedBufferRequestParcel request{ctx.ReadBuffer()}; |
| 540 | 540 | ||
| 541 | buffer_queue->SetPreallocatedBuffer(request.data.slot, request.buffer); | 541 | buffer_queue.SetPreallocatedBuffer(request.data.slot, request.buffer); |
| 542 | 542 | ||
| 543 | IGBPSetPreallocatedBufferResponseParcel response{}; | 543 | IGBPSetPreallocatedBufferResponseParcel response{}; |
| 544 | ctx.WriteBuffer(response.Serialize()); | 544 | ctx.WriteBuffer(response.Serialize()); |
| @@ -546,7 +546,7 @@ private: | |||
| 546 | IGBPDequeueBufferRequestParcel request{ctx.ReadBuffer()}; | 546 | IGBPDequeueBufferRequestParcel request{ctx.ReadBuffer()}; |
| 547 | const u32 width{request.data.width}; | 547 | const u32 width{request.data.width}; |
| 548 | const u32 height{request.data.height}; | 548 | const u32 height{request.data.height}; |
| 549 | std::optional<u32> slot = buffer_queue->DequeueBuffer(width, height); | 549 | std::optional<u32> slot = buffer_queue.DequeueBuffer(width, height); |
| 550 | 550 | ||
| 551 | if (slot) { | 551 | if (slot) { |
| 552 | // Buffer is available | 552 | // Buffer is available |
| @@ -559,8 +559,8 @@ private: | |||
| 559 | [=](Kernel::SharedPtr<Kernel::Thread> thread, Kernel::HLERequestContext& ctx, | 559 | [=](Kernel::SharedPtr<Kernel::Thread> thread, Kernel::HLERequestContext& ctx, |
| 560 | Kernel::ThreadWakeupReason reason) { | 560 | Kernel::ThreadWakeupReason reason) { |
| 561 | // Repeat TransactParcel DequeueBuffer when a buffer is available | 561 | // Repeat TransactParcel DequeueBuffer when a buffer is available |
| 562 | auto buffer_queue = nv_flinger->FindBufferQueue(id); | 562 | auto& buffer_queue = nv_flinger->FindBufferQueue(id); |
| 563 | std::optional<u32> slot = buffer_queue->DequeueBuffer(width, height); | 563 | std::optional<u32> slot = buffer_queue.DequeueBuffer(width, height); |
| 564 | ASSERT_MSG(slot != std::nullopt, "Could not dequeue buffer."); | 564 | ASSERT_MSG(slot != std::nullopt, "Could not dequeue buffer."); |
| 565 | 565 | ||
| 566 | IGBPDequeueBufferResponseParcel response{*slot}; | 566 | IGBPDequeueBufferResponseParcel response{*slot}; |
| @@ -568,28 +568,28 @@ private: | |||
| 568 | IPC::ResponseBuilder rb{ctx, 2}; | 568 | IPC::ResponseBuilder rb{ctx, 2}; |
| 569 | rb.Push(RESULT_SUCCESS); | 569 | rb.Push(RESULT_SUCCESS); |
| 570 | }, | 570 | }, |
| 571 | buffer_queue->GetWritableBufferWaitEvent()); | 571 | buffer_queue.GetWritableBufferWaitEvent()); |
| 572 | } | 572 | } |
| 573 | } else if (transaction == TransactionId::RequestBuffer) { | 573 | } else if (transaction == TransactionId::RequestBuffer) { |
| 574 | IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()}; | 574 | IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()}; |
| 575 | 575 | ||
| 576 | auto& buffer = buffer_queue->RequestBuffer(request.slot); | 576 | auto& buffer = buffer_queue.RequestBuffer(request.slot); |
| 577 | 577 | ||
| 578 | IGBPRequestBufferResponseParcel response{buffer}; | 578 | IGBPRequestBufferResponseParcel response{buffer}; |
| 579 | ctx.WriteBuffer(response.Serialize()); | 579 | ctx.WriteBuffer(response.Serialize()); |
| 580 | } else if (transaction == TransactionId::QueueBuffer) { | 580 | } else if (transaction == TransactionId::QueueBuffer) { |
| 581 | IGBPQueueBufferRequestParcel request{ctx.ReadBuffer()}; | 581 | IGBPQueueBufferRequestParcel request{ctx.ReadBuffer()}; |
| 582 | 582 | ||
| 583 | buffer_queue->QueueBuffer(request.data.slot, request.data.transform, | 583 | buffer_queue.QueueBuffer(request.data.slot, request.data.transform, |
| 584 | request.data.GetCropRect()); | 584 | request.data.GetCropRect()); |
| 585 | 585 | ||
| 586 | IGBPQueueBufferResponseParcel response{1280, 720}; | 586 | IGBPQueueBufferResponseParcel response{1280, 720}; |
| 587 | ctx.WriteBuffer(response.Serialize()); | 587 | ctx.WriteBuffer(response.Serialize()); |
| 588 | } else if (transaction == TransactionId::Query) { | 588 | } else if (transaction == TransactionId::Query) { |
| 589 | IGBPQueryRequestParcel request{ctx.ReadBuffer()}; | 589 | IGBPQueryRequestParcel request{ctx.ReadBuffer()}; |
| 590 | 590 | ||
| 591 | u32 value = | 591 | const u32 value = |
| 592 | buffer_queue->Query(static_cast<NVFlinger::BufferQueue::QueryType>(request.type)); | 592 | buffer_queue.Query(static_cast<NVFlinger::BufferQueue::QueryType>(request.type)); |
| 593 | 593 | ||
| 594 | IGBPQueryResponseParcel response{value}; | 594 | IGBPQueryResponseParcel response{value}; |
| 595 | ctx.WriteBuffer(response.Serialize()); | 595 | ctx.WriteBuffer(response.Serialize()); |
| @@ -629,12 +629,12 @@ private: | |||
| 629 | 629 | ||
| 630 | LOG_WARNING(Service_VI, "(STUBBED) called id={}, unknown={:08X}", id, unknown); | 630 | LOG_WARNING(Service_VI, "(STUBBED) called id={}, unknown={:08X}", id, unknown); |
| 631 | 631 | ||
| 632 | const auto buffer_queue = nv_flinger->FindBufferQueue(id); | 632 | const auto& buffer_queue = nv_flinger->FindBufferQueue(id); |
| 633 | 633 | ||
| 634 | // TODO(Subv): Find out what this actually is. | 634 | // TODO(Subv): Find out what this actually is. |
| 635 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 635 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 636 | rb.Push(RESULT_SUCCESS); | 636 | rb.Push(RESULT_SUCCESS); |
| 637 | rb.PushCopyObjects(buffer_queue->GetBufferWaitEvent()); | 637 | rb.PushCopyObjects(buffer_queue.GetBufferWaitEvent()); |
| 638 | } | 638 | } |
| 639 | 639 | ||
| 640 | std::shared_ptr<NVFlinger::NVFlinger> nv_flinger; | 640 | std::shared_ptr<NVFlinger::NVFlinger> nv_flinger; |