From 12d8cf79eab8ce69e0b712ffabfa9f838e61976f Mon Sep 17 00:00:00 2001 From: crueter Date: Sat, 26 Jul 2025 20:20:03 -0400 Subject: [PATCH] Revert "[nvnflinger] unstub AdjustRefcount (#120)" This reverts commit 410e78229113070835f1fd62074431f85e2b544a. --- .../nvnflinger/buffer_queue_producer.cpp | 20 +++++++--------- .../service/nvnflinger/hos_binder_driver.cpp | 9 ++----- .../nvnflinger/hos_binder_driver_server.cpp | 24 ------------------- .../nvnflinger/hos_binder_driver_server.h | 12 ++-------- 4 files changed, 12 insertions(+), 53 deletions(-) diff --git a/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp b/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp index 1bb88a45fa..4317aee1c4 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp +++ b/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp @@ -728,26 +728,22 @@ Status BufferQueueProducer::Connect(const std::shared_ptr& li return status; } -// https://android.googlesource.com/platform/frameworks/native/%2B/master/libs/gui/BufferQueueProducer.cpp#1457 Status BufferQueueProducer::Disconnect(NativeWindowApi api) { - LOG_DEBUG(Service_Nvnflinger, "disconnect api = {}", api); + LOG_DEBUG(Service_Nvnflinger, "api = {}", api); - std::shared_ptr listener; Status status = Status::NoError; + std::shared_ptr listener; { std::scoped_lock lock{core->mutex}; + core->WaitWhileAllocatingLocked(); if (core->is_abandoned) { + // Disconnecting after the surface has been abandoned is a no-op. return Status::NoError; } - if (core->connected_api == NativeWindowApi::NoConnectedApi) { - LOG_DEBUG(Service_Nvnflinger, "disconnect: not connected (req = {})", api); - return Status::NoInit; - } - switch (api) { case NativeWindowApi::Egl: case NativeWindowApi::Cpu: @@ -762,20 +758,20 @@ Status BufferQueueProducer::Disconnect(NativeWindowApi api) { buffer_wait_event->Signal(); listener = core->consumer_listener; } else { - LOG_ERROR(Service_Nvnflinger, - "disconnect: still connected to another api (cur = {} req = {})", + LOG_ERROR(Service_Nvnflinger, "still connected to another api (cur = {} req = {})", core->connected_api, api); status = Status::BadValue; } break; default: - LOG_ERROR(Service_Nvnflinger, "disconnect: unknown api = {}", api); + LOG_ERROR(Service_Nvnflinger, "unknown api = {}", api); status = Status::BadValue; break; } } - if (listener) { + // Call back without lock held + if (listener != nullptr) { listener->OnBuffersReleased(); } diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp index d30aa3717d..8629a2e89b 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp +++ b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp @@ -40,22 +40,17 @@ Result IHOSBinderDriver::TransactParcel(s32 binder_id, u32 transaction_id, } Result IHOSBinderDriver::AdjustRefcount(s32 binder_id, s32 addval, s32 type) { - LOG_DEBUG(Service_VI, "called id={}, addval={}, type={}", binder_id, addval, type); - R_UNLESS(type == 0 || type == 1, ResultUnknown); - m_server->AdjustRefcount(binder_id, addval, type == 1); + LOG_WARNING(Service_VI, "(STUBBED) called id={}, addval={}, type={}", binder_id, addval, type); R_SUCCEED(); } Result IHOSBinderDriver::GetNativeHandle(s32 binder_id, u32 type_id, OutCopyHandle out_handle) { - LOG_DEBUG(Service_VI, "called id={}, type_id={}", binder_id, type_id); + LOG_WARNING(Service_VI, "(STUBBED) called id={}, type_id={}", binder_id, type_id); const auto binder = m_server->TryGetBinder(binder_id); R_UNLESS(binder != nullptr, ResultUnknown); - auto native_handle = binder->GetNativeHandle(type_id); - R_UNLESS(native_handle != nullptr, ResultUnknown); - *out_handle = binder->GetNativeHandle(type_id); R_SUCCEED(); diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp b/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp index b85f1a4fa4..29addda44d 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp +++ b/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp @@ -17,7 +17,6 @@ s32 HosBinderDriverServer::RegisterBinder(std::shared_ptr&& bi last_id++; binders[last_id] = std::move(binder); - refcounts[last_id] = {}; // strong = 1, weak = 0 return last_id; } @@ -26,29 +25,6 @@ void HosBinderDriverServer::UnregisterBinder(s32 binder_id) { std::scoped_lock lk{lock}; binders.erase(binder_id); - refcounts.erase(binder_id); -} - -void HosBinderDriverServer::AdjustRefcount(s32 binder_id, s32 delta, bool is_weak) { - std::scoped_lock lk{lock}; - - auto search_rc = refcounts.find(binder_id); - if (search_rc == refcounts.end()) { - LOG_WARNING(Service_VI, "AdjustRefcount called for unknown binder id {}", binder_id); - return; - } - - auto& rc = search_rc->second; - s32& counter = is_weak ? rc.weak : rc.strong; - counter += delta; - - if (counter < 0) - counter = 0; - - if (rc.strong == 0 && rc.weak == 0) { - binders.erase(binder_id); - refcounts.erase(search_rc); - } } std::shared_ptr HosBinderDriverServer::TryGetBinder(s32 id) const { diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver_server.h b/src/core/hle/service/nvnflinger/hos_binder_driver_server.h index f4b4060115..d72b50833d 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver_server.h +++ b/src/core/hle/service/nvnflinger/hos_binder_driver_server.h @@ -26,18 +26,10 @@ public: std::shared_ptr TryGetBinder(s32 id) const; - void AdjustRefcount(s32 binder_id, s32 delta, bool is_weak); - private: - struct RefCounts { - s32 strong{1}; - s32 weak{0}; - }; - - mutable std::mutex lock; - s32 last_id = 0; std::unordered_map> binders; - std::unordered_map refcounts; + mutable std::mutex lock; + s32 last_id{}; }; } // namespace Service::Nvnflinger