diff --git a/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp b/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp index a458244fc1..2cd027eeb2 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp +++ b/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp @@ -724,22 +724,26 @@ 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, "api = {}", api); + LOG_DEBUG(Service_Nvnflinger, "disconnect api = {}", api); - Status status = Status::NoError; std::shared_ptr listener; + Status status = Status::NoError; { 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: @@ -754,20 +758,20 @@ Status BufferQueueProducer::Disconnect(NativeWindowApi api) { buffer_wait_event->Signal(); listener = core->consumer_listener; } else { - LOG_ERROR(Service_Nvnflinger, "still connected to another api (cur = {} req = {})", + LOG_ERROR(Service_Nvnflinger, + "disconnect: still connected to another api (cur = {} req = {})", core->connected_api, api); status = Status::BadValue; } break; default: - LOG_ERROR(Service_Nvnflinger, "unknown api = {}", api); + LOG_ERROR(Service_Nvnflinger, "disconnect: unknown api = {}", api); status = Status::BadValue; break; } } - // Call back without lock held - if (listener != nullptr) { + if (listener) { listener->OnBuffersReleased(); }