From d205dee0a62c1310b6119175ef4f1963202f8a8a Mon Sep 17 00:00:00 2001 From: Subv Date: Mon, 8 Jan 2018 18:29:43 -0500 Subject: NV: Give each display its own vsync event. --- src/core/hle/service/vi/vi.cpp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'src/core/hle/service/vi/vi.cpp') diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index 1f218a4f5..4c9df099e 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp @@ -599,6 +599,8 @@ void IApplicationDisplayService::GetDisplayVsyncEvent(Kernel::HLERequestContext& IPC::RequestParser rp{ctx}; u64 display_id = rp.Pop(); + auto vsync_event = nv_flinger->GetVsyncEvent(display_id); + IPC::RequestBuilder rb = rp.MakeBuilder(2, 1, 0, 0); rb.Push(RESULT_SUCCESS); rb.PushCopyObjects(vsync_event); @@ -618,8 +620,6 @@ IApplicationDisplayService::IApplicationDisplayService(std::shared_ptrGetId(); } -std::shared_ptr NVFlinger::GetBufferQueue(u32 id) { +Kernel::SharedPtr NVFlinger::GetVsyncEvent(u64 display_id) { + const auto& display = GetDisplay(display_id); + return display.vsync_event; +} + +std::shared_ptr NVFlinger::GetBufferQueue(u32 id) const { auto itr = std::find_if(buffer_queues.begin(), buffer_queues.end(), [&](const auto& queue) { return queue->GetId() == id; }); @@ -745,5 +750,9 @@ void BufferQueue::QueueBuffer(u32 slot) { Layer::Layer(u64 id, std::shared_ptr queue) : id(id), buffer_queue(std::move(queue)) {} +Display::Display(u64 id, std::string name) : id(id), name(std::move(name)) { + vsync_event = Kernel::Event::Create(Kernel::ResetType::OneShot, "Display VSync Event"); +} + } // namespace VI } // namespace Service -- cgit v1.2.3