diff options
19 files changed, 146 insertions, 207 deletions
diff --git a/libs/binder/include/binder/IInterface.h b/libs/binder/include/binder/IInterface.h index 8cc8105ff9..dc572ac953 100644 --- a/libs/binder/include/binder/IInterface.h +++ b/libs/binder/include/binder/IInterface.h @@ -230,6 +230,7 @@ constexpr const char* const kManualInterfaces[] = { "android.graphicsenv.IGpuService", "android.gui.IConsumerListener", "android.gui.IGraphicBufferConsumer", + "android.gui.ITransactionComposerListener", "android.gui.SensorEventConnection", "android.gui.SensorServer", "android.hardware.ICamera", diff --git a/libs/gui/ISurfaceComposer.cpp b/libs/gui/ISurfaceComposer.cpp index a0e75ffe49..a77ca04943 100644 --- a/libs/gui/ISurfaceComposer.cpp +++ b/libs/gui/ISurfaceComposer.cpp @@ -42,7 +42,6 @@ using namespace aidl::android::hardware::graphics; namespace android { -using gui::CallbackId; using gui::DisplayCaptureArgs; using gui::IDisplayEventConnection; using gui::IRegionSamplingListener; diff --git a/libs/gui/ITransactionCompletedListener.cpp b/libs/gui/ITransactionCompletedListener.cpp index 23d7d500c8..2b25b614e9 100644 --- a/libs/gui/ITransactionCompletedListener.cpp +++ b/libs/gui/ITransactionCompletedListener.cpp @@ -21,11 +21,22 @@ #include <optional> #include <gui/ISurfaceComposer.h> +#include <gui/ITransactionCompletedListener.h> #include <gui/LayerState.h> -#include <gui/ListenerStats.h> #include <private/gui/ParcelUtils.h> -namespace android::gui { +namespace android { + +namespace { // Anonymous + +enum class Tag : uint32_t { + ON_TRANSACTION_COMPLETED = IBinder::FIRST_CALL_TRANSACTION, + ON_RELEASE_BUFFER, + ON_TRANSACTION_QUEUE_STALLED, + LAST = ON_TRANSACTION_QUEUE_STALLED, +}; + +} // Anonymous namespace status_t FrameEventHistoryStats::writeToParcel(Parcel* output) const { status_t err = output->writeUint64(frameNumber); @@ -263,6 +274,60 @@ ListenerStats ListenerStats::createEmpty( return listenerStats; } +class BpTransactionCompletedListener : public SafeBpInterface<ITransactionCompletedListener> { +public: + explicit BpTransactionCompletedListener(const sp<IBinder>& impl) + : SafeBpInterface<ITransactionCompletedListener>(impl, "BpTransactionCompletedListener") { + } + + ~BpTransactionCompletedListener() override; + + void onTransactionCompleted(ListenerStats stats) override { + callRemoteAsync<decltype(&ITransactionCompletedListener:: + onTransactionCompleted)>(Tag::ON_TRANSACTION_COMPLETED, + stats); + } + + void onReleaseBuffer(ReleaseCallbackId callbackId, sp<Fence> releaseFence, + uint32_t currentMaxAcquiredBufferCount) override { + callRemoteAsync<decltype(&ITransactionCompletedListener:: + onReleaseBuffer)>(Tag::ON_RELEASE_BUFFER, callbackId, + releaseFence, + currentMaxAcquiredBufferCount); + } + + void onTransactionQueueStalled(const String8& reason) override { + callRemoteAsync< + decltype(&ITransactionCompletedListener:: + onTransactionQueueStalled)>(Tag::ON_TRANSACTION_QUEUE_STALLED, + reason); + } +}; + +// Out-of-line virtual method definitions to trigger vtable emission in this translation unit (see +// clang warning -Wweak-vtables) +BpTransactionCompletedListener::~BpTransactionCompletedListener() = default; + +IMPLEMENT_META_INTERFACE(TransactionCompletedListener, "android.gui.ITransactionComposerListener"); + +status_t BnTransactionCompletedListener::onTransact(uint32_t code, const Parcel& data, + Parcel* reply, uint32_t flags) { + if (code < IBinder::FIRST_CALL_TRANSACTION || code > static_cast<uint32_t>(Tag::LAST)) { + return BBinder::onTransact(code, data, reply, flags); + } + auto tag = static_cast<Tag>(code); + switch (tag) { + case Tag::ON_TRANSACTION_COMPLETED: + return callLocalAsync(data, reply, + &ITransactionCompletedListener::onTransactionCompleted); + case Tag::ON_RELEASE_BUFFER: + return callLocalAsync(data, reply, &ITransactionCompletedListener::onReleaseBuffer); + case Tag::ON_TRANSACTION_QUEUE_STALLED: + return callLocalAsync(data, reply, + &ITransactionCompletedListener::onTransactionQueueStalled); + } +} + ListenerCallbacks ListenerCallbacks::filter(CallbackId::Type type) const { std::vector<CallbackId> filteredCallbackIds; for (const auto& callbackId : callbackIds) { @@ -301,4 +366,4 @@ status_t ReleaseCallbackId::readFromParcel(const Parcel* input) { const ReleaseCallbackId ReleaseCallbackId::INVALID_ID = ReleaseCallbackId(0, 0); -}; // namespace android::gui +}; // namespace android diff --git a/libs/gui/LayerState.cpp b/libs/gui/LayerState.cpp index 0d1a69b898..59b62fe58c 100644 --- a/libs/gui/LayerState.cpp +++ b/libs/gui/LayerState.cpp @@ -51,7 +51,6 @@ namespace android { -using gui::CallbackId; using gui::FocusRequest; using gui::WindowInfoHandle; diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index d741c99d01..7085e8a349 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -314,8 +314,7 @@ void TransactionCompletedListener::addSurfaceControlToCallbacks( } } -binder::Status TransactionCompletedListener::onTransactionCompleted( - const ListenerStats& listenerStats) { +void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) { std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> callbacksMap; std::multimap<int32_t, sp<JankDataListener>> jankListenersMap; { @@ -455,10 +454,9 @@ binder::Status TransactionCompletedListener::onTransactionCompleted( } } } - return binder::Status::ok(); } -binder::Status TransactionCompletedListener::onTransactionQueueStalled(const std::string& reason) { +void TransactionCompletedListener::onTransactionQueueStalled(const String8& reason) { std::unordered_map<void*, std::function<void(const std::string&)>> callbackCopy; { std::scoped_lock<std::mutex> lock(mMutex); @@ -467,7 +465,6 @@ binder::Status TransactionCompletedListener::onTransactionQueueStalled(const std for (auto const& it : callbackCopy) { it.second(reason.c_str()); } - return binder::Status::ok(); } void TransactionCompletedListener::addQueueStallListener( @@ -481,12 +478,9 @@ void TransactionCompletedListener::removeQueueStallListener(void* id) { mQueueStallListeners.erase(id); } -binder::Status TransactionCompletedListener::onReleaseBuffer( - const ReleaseCallbackId& callbackId, - const std::optional<os::ParcelFileDescriptor>& releaseFenceFd, - int32_t currentMaxAcquiredBufferCount) { - sp<Fence> releaseFence(releaseFenceFd ? new Fence(::dup(releaseFenceFd->get())) - : Fence::NO_FENCE); +void TransactionCompletedListener::onReleaseBuffer(ReleaseCallbackId callbackId, + sp<Fence> releaseFence, + uint32_t currentMaxAcquiredBufferCount) { ReleaseBufferCallback callback; { std::scoped_lock<std::mutex> lock(mMutex); @@ -495,14 +489,13 @@ binder::Status TransactionCompletedListener::onReleaseBuffer( if (!callback) { ALOGE("Could not call release buffer callback, buffer not found %s", callbackId.to_string().c_str()); - return binder::Status::fromExceptionCode(binder::Status::EX_ILLEGAL_ARGUMENT); + return; } std::optional<uint32_t> optionalMaxAcquiredBufferCount = - static_cast<uint32_t>(currentMaxAcquiredBufferCount) == UINT_MAX + currentMaxAcquiredBufferCount == UINT_MAX ? std::nullopt : std::make_optional<uint32_t>(currentMaxAcquiredBufferCount); callback(callbackId, releaseFence, optionalMaxAcquiredBufferCount); - return binder::Status::ok(); } ReleaseBufferCallback TransactionCompletedListener::popReleaseBufferCallbackLocked( @@ -832,11 +825,7 @@ void SurfaceComposerClient::Transaction::releaseBufferIfOverwriting(const layer_ ->mReleaseCallbackThread .addReleaseCallback(state.bufferData->generateReleaseCallbackId(), fence); } else { - std::optional<os::ParcelFileDescriptor> fenceFd; - if (fence != Fence::NO_FENCE) { - fenceFd = os::ParcelFileDescriptor(base::unique_fd(::dup(fence->get()))); - } - listener->onReleaseBuffer(state.bufferData->generateReleaseCallbackId(), fenceFd, UINT_MAX); + listener->onReleaseBuffer(state.bufferData->generateReleaseCallbackId(), fence, UINT_MAX); } } @@ -2857,11 +2846,7 @@ void ReleaseCallbackThread::threadMain() { while (!callbackInfos.empty()) { auto [callbackId, releaseFence] = callbackInfos.front(); - std::optional<os::ParcelFileDescriptor> fenceFd; - if (releaseFence != Fence::NO_FENCE) { - fenceFd = os::ParcelFileDescriptor(base::unique_fd(::dup(releaseFence->get()))); - } - listener->onReleaseBuffer(callbackId, fenceFd, UINT_MAX); + listener->onReleaseBuffer(callbackId, std::move(releaseFence), UINT_MAX); callbackInfos.pop(); } diff --git a/libs/gui/aidl/android/gui/ITransactionCompletedListener.aidl b/libs/gui/aidl/android/gui/ITransactionCompletedListener.aidl deleted file mode 100644 index dde4d38cba..0000000000 --- a/libs/gui/aidl/android/gui/ITransactionCompletedListener.aidl +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.gui; - -import android.gui.ListenerStats; -import android.gui.ReleaseCallbackId; - -/** @hide */ -oneway interface ITransactionCompletedListener { - void onTransactionCompleted(in ListenerStats stats); - - void onReleaseBuffer(in ReleaseCallbackId callbackId, - in @nullable ParcelFileDescriptor releaseFenceFd, - int currentMaxAcquiredBufferCount); - - void onTransactionQueueStalled(@utf8InCpp String name); -} diff --git a/libs/gui/aidl/android/gui/ListenerStats.aidl b/libs/gui/aidl/android/gui/ListenerStats.aidl deleted file mode 100644 index 63248b2bf3..0000000000 --- a/libs/gui/aidl/android/gui/ListenerStats.aidl +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.gui; - -parcelable ListenerStats cpp_header "gui/ListenerStats.h"; diff --git a/libs/gui/aidl/android/gui/ReleaseCallbackId.aidl b/libs/gui/aidl/android/gui/ReleaseCallbackId.aidl deleted file mode 100644 index c86de34de9..0000000000 --- a/libs/gui/aidl/android/gui/ReleaseCallbackId.aidl +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.gui; - -parcelable ReleaseCallbackId cpp_header "gui/ReleaseCallbackId.h"; diff --git a/libs/gui/include/gui/ISurfaceComposer.h b/libs/gui/include/gui/ISurfaceComposer.h index d70a7f0f1b..d517e99fda 100644 --- a/libs/gui/include/gui/ISurfaceComposer.h +++ b/libs/gui/include/gui/ISurfaceComposer.h @@ -23,11 +23,11 @@ #include <android/gui/IHdrLayerInfoListener.h> #include <android/gui/IRegionSamplingListener.h> #include <android/gui/IScreenCaptureListener.h> -#include <android/gui/ITransactionCompletedListener.h> #include <android/gui/ITunnelModeEnabledListener.h> #include <android/gui/IWindowInfosListener.h> #include <binder/IBinder.h> #include <binder/IInterface.h> +#include <gui/ITransactionCompletedListener.h> #include <gui/SpHash.h> #include <math/vec4.h> #include <stdint.h> @@ -66,7 +66,6 @@ using gui::FrameTimelineInfo; using gui::IDisplayEventConnection; using gui::IRegionSamplingListener; using gui::IScreenCaptureListener; -using gui::ListenerCallbacks; using gui::SpHash; namespace gui { diff --git a/libs/gui/include/gui/ListenerStats.h b/libs/gui/include/gui/ITransactionCompletedListener.h index 3a12802146..453e8f3ef5 100644 --- a/libs/gui/include/gui/ListenerStats.h +++ b/libs/gui/include/gui/ITransactionCompletedListener.h @@ -24,8 +24,6 @@ #include <binder/SafeInterface.h> #include <gui/FrameTimestamps.h> -#include <gui/ReleaseCallbackId.h> - #include <ui/Fence.h> #include <utils/Timers.h> @@ -34,7 +32,10 @@ #include <unordered_set> #include <variant> -namespace android::gui { +namespace android { + +class ITransactionCompletedListener; +class ListenerCallbacks; class CallbackId : public Parcelable { public: @@ -53,6 +54,30 @@ struct CallbackIdHash { std::size_t operator()(const CallbackId& key) const { return std::hash<int64_t>()(key.id); } }; +class ReleaseCallbackId : public Parcelable { +public: + static const ReleaseCallbackId INVALID_ID; + + uint64_t bufferId; + uint64_t framenumber; + ReleaseCallbackId() {} + ReleaseCallbackId(uint64_t bufferId, uint64_t framenumber) + : bufferId(bufferId), framenumber(framenumber) {} + status_t writeToParcel(Parcel* output) const override; + status_t readFromParcel(const Parcel* input) override; + + bool operator==(const ReleaseCallbackId& rhs) const { + return bufferId == rhs.bufferId && framenumber == rhs.framenumber; + } + bool operator!=(const ReleaseCallbackId& rhs) const { return !operator==(rhs); } + std::string to_string() const { + if (*this == INVALID_ID) return "INVALID_ID"; + + return "bufferId:" + std::to_string(bufferId) + + " framenumber:" + std::to_string(framenumber); + } +}; + struct ReleaseBufferCallbackIdHash { std::size_t operator()(const ReleaseCallbackId& key) const { return std::hash<uint64_t>()(key.bufferId); @@ -161,6 +186,27 @@ public: std::vector<TransactionStats> transactionStats; }; +class ITransactionCompletedListener : public IInterface { +public: + DECLARE_META_INTERFACE(TransactionCompletedListener) + + virtual void onTransactionCompleted(ListenerStats stats) = 0; + + virtual void onReleaseBuffer(ReleaseCallbackId callbackId, sp<Fence> releaseFence, + uint32_t currentMaxAcquiredBufferCount) = 0; + + virtual void onTransactionQueueStalled(const String8& name) = 0; +}; + +class BnTransactionCompletedListener : public SafeBnInterface<ITransactionCompletedListener> { +public: + BnTransactionCompletedListener() + : SafeBnInterface<ITransactionCompletedListener>("BnTransactionCompletedListener") {} + + status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, + uint32_t flags = 0) override; +}; + class ListenerCallbacks { public: ListenerCallbacks(const sp<IBinder>& listener, @@ -222,4 +268,4 @@ struct ListenerCallbacksHash { } }; -} // namespace android::gui +} // namespace android diff --git a/libs/gui/include/gui/LayerState.h b/libs/gui/include/gui/LayerState.h index c5fdf82d4f..45a84f6c66 100644 --- a/libs/gui/include/gui/LayerState.h +++ b/libs/gui/include/gui/LayerState.h @@ -21,10 +21,10 @@ #include <stdint.h> #include <sys/types.h> -#include <android/gui/ITransactionCompletedListener.h> #include <android/gui/IWindowInfosReportedListener.h> #include <android/native_window.h> #include <gui/IGraphicBufferProducer.h> +#include <gui/ITransactionCompletedListener.h> #include <math/mat4.h> #include <android/gui/DropInputMode.h> @@ -35,7 +35,6 @@ #include <gui/ISurfaceComposer.h> #include <gui/LayerCaptureArgs.h> #include <gui/LayerMetadata.h> -#include <gui/ReleaseCallbackId.h> #include <gui/SpHash.h> #include <gui/SurfaceControl.h> #include <gui/WindowInfo.h> @@ -57,9 +56,6 @@ class Parcel; using gui::ISurfaceComposerClient; using gui::LayerMetadata; -using gui::ITransactionCompletedListener; -using gui::ReleaseCallbackId; - struct client_cache_t { wp<IBinder> token = nullptr; uint64_t id; diff --git a/libs/gui/include/gui/ReleaseCallbackId.h b/libs/gui/include/gui/ReleaseCallbackId.h deleted file mode 100644 index 142ee5a727..0000000000 --- a/libs/gui/include/gui/ReleaseCallbackId.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include <binder/Parcel.h> -#include <binder/Parcelable.h> - -#include <cstdint> - -namespace android::gui { - -class ReleaseCallbackId : public Parcelable { -public: - static const ReleaseCallbackId INVALID_ID; - - uint64_t bufferId; - uint64_t framenumber; - ReleaseCallbackId() {} - ReleaseCallbackId(uint64_t bufferId, uint64_t framenumber) - : bufferId(bufferId), framenumber(framenumber) {} - status_t writeToParcel(Parcel* output) const override; - status_t readFromParcel(const Parcel* input) override; - - bool operator==(const ReleaseCallbackId& rhs) const { - return bufferId == rhs.bufferId && framenumber == rhs.framenumber; - } - bool operator!=(const ReleaseCallbackId& rhs) const { return !operator==(rhs); } - std::string to_string() const { - if (*this == INVALID_ID) return "INVALID_ID"; - - return "bufferId:" + std::to_string(bufferId) + - " framenumber:" + std::to_string(framenumber); - } -}; - -} // namespace android::gui diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index 96d3a23bec..df47002b3b 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -42,13 +42,10 @@ #include <android/gui/ISurfaceComposerClient.h> -#include <android/gui/BnTransactionCompletedListener.h> - #include <gui/CpuConsumer.h> #include <gui/ISurfaceComposer.h> +#include <gui/ITransactionCompletedListener.h> #include <gui/LayerState.h> -#include <gui/ListenerStats.h> -#include <gui/ReleaseCallbackId.h> #include <gui/SurfaceControl.h> #include <gui/WindowInfosListenerReporter.h> #include <math/vec3.h> @@ -62,21 +59,11 @@ class IGraphicBufferProducer; class ITunnelModeEnabledListener; class Region; -using gui::BnTransactionCompletedListener; -using gui::CallbackId; -using gui::CallbackIdHash; using gui::DisplayCaptureArgs; -using gui::FrameEventHistoryStats; using gui::IRegionSamplingListener; using gui::ISurfaceComposerClient; -using gui::ITransactionCompletedListener; -using gui::JankData; using gui::LayerCaptureArgs; using gui::LayerMetadata; -using gui::ListenerStats; -using gui::ReleaseBufferCallbackIdHash; -using gui::ReleaseCallbackId; -using gui::SurfaceStats; struct SurfaceControlStats { SurfaceControlStats(const sp<SurfaceControl>& sc, nsecs_t latchTime, @@ -838,17 +825,17 @@ public: void setReleaseBufferCallback(const ReleaseCallbackId&, ReleaseBufferCallback); // BnTransactionCompletedListener overrides - binder::Status onTransactionCompleted(const ListenerStats& stats) override; - binder::Status onReleaseBuffer(const ReleaseCallbackId& callbackId, - const std::optional<os::ParcelFileDescriptor>& releaseFenceFd, - int32_t currentMaxAcquiredBufferCount) override; - binder::Status onTransactionQueueStalled(const std::string& reason) override; + void onTransactionCompleted(ListenerStats stats) override; + void onReleaseBuffer(ReleaseCallbackId, sp<Fence> releaseFence, + uint32_t currentMaxAcquiredBufferCount) override; void removeReleaseBufferCallback(const ReleaseCallbackId& callbackId); // For Testing Only static void setInstance(const sp<TransactionCompletedListener>&); + void onTransactionQueueStalled(const String8& reason) override; + private: ReleaseBufferCallback popReleaseBufferCallbackLocked(const ReleaseCallbackId&); static sp<TransactionCompletedListener> sInstance; diff --git a/services/surfaceflinger/FrontEnd/TransactionHandler.cpp b/services/surfaceflinger/FrontEnd/TransactionHandler.cpp index c2109b3aa5..8629671214 100644 --- a/services/surfaceflinger/FrontEnd/TransactionHandler.cpp +++ b/services/surfaceflinger/FrontEnd/TransactionHandler.cpp @@ -177,7 +177,7 @@ void TransactionHandler::onTransactionQueueStalled(uint64_t transactionId, } mStalledTransactions.push_back(transactionId); - listener->onTransactionQueueStalled(reason); + listener->onTransactionQueueStalled(String8(reason.c_str())); } void TransactionHandler::removeFromStalledTransactions(uint64_t id) { diff --git a/services/surfaceflinger/FrontEnd/TransactionHandler.h b/services/surfaceflinger/FrontEnd/TransactionHandler.h index 475ff1b1dc..a06b870549 100644 --- a/services/surfaceflinger/FrontEnd/TransactionHandler.h +++ b/services/surfaceflinger/FrontEnd/TransactionHandler.h @@ -29,7 +29,6 @@ namespace android { class TestableSurfaceFlinger; -using gui::IListenerHash; namespace surfaceflinger::frontend { class TransactionHandler { diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 56abc516fd..0017af0476 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -2604,12 +2604,9 @@ void Layer::callReleaseBufferCallback(const sp<ITransactionCompletedListener>& l return; } ATRACE_FORMAT_INSTANT("callReleaseBufferCallback %s - %" PRIu64, getDebugName(), framenumber); - std::optional<os::ParcelFileDescriptor> fenceFd; - if (releaseFence) { - fenceFd = os::ParcelFileDescriptor(base::unique_fd(::dup(releaseFence->get()))); - } - listener->onReleaseBuffer({buffer->getId(), framenumber}, fenceFd, - static_cast<int32_t>(currentMaxAcquiredBufferCount)); + listener->onReleaseBuffer({buffer->getId(), framenumber}, + releaseFence ? releaseFence : Fence::NO_FENCE, + currentMaxAcquiredBufferCount); } void Layer::onLayerDisplayed(ftl::SharedFuture<FenceResult> futureFenceResult) { diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 55644e2a41..d4c4fb28f5 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -7113,7 +7113,8 @@ std::shared_ptr<renderengine::ExternalTexture> SurfaceFlinger::getExternalTextur layerName, static_cast<uint32_t>(mMaxRenderTargetSize)); ALOGD("%s", errorMessage.c_str()); if (bufferData.releaseBufferListener) { - bufferData.releaseBufferListener->onTransactionQueueStalled(errorMessage); + bufferData.releaseBufferListener->onTransactionQueueStalled( + String8(errorMessage.c_str())); } return nullptr; } @@ -7131,7 +7132,7 @@ std::shared_ptr<renderengine::ExternalTexture> SurfaceFlinger::getExternalTextur if (bufferData.releaseBufferListener) { bufferData.releaseBufferListener->onTransactionQueueStalled( - "Buffer processing hung due to full buffer cache"); + String8("Buffer processing hung due to full buffer cache")); } } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 8fa427843b..3354b24bbb 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -26,7 +26,6 @@ #include <android/gui/DisplayStatInfo.h> #include <android/gui/DisplayState.h> #include <android/gui/ISurfaceComposerClient.h> -#include <android/gui/ITransactionCompletedListener.h> #include <cutils/atomic.h> #include <cutils/compiler.h> #include <ftl/future.h> @@ -35,8 +34,8 @@ #include <gui/CompositorTiming.h> #include <gui/FrameTimestamps.h> #include <gui/ISurfaceComposer.h> +#include <gui/ITransactionCompletedListener.h> #include <gui/LayerDebugInfo.h> - #include <gui/LayerState.h> #include <layerproto/LayerProtoHeader.h> #include <math/mat4.h> @@ -126,9 +125,7 @@ using frontend::TransactionHandler; using gui::CaptureArgs; using gui::DisplayCaptureArgs; using gui::IRegionSamplingListener; -using gui::ITransactionCompletedListener; using gui::LayerCaptureArgs; - using gui::ScreenCaptureResults; namespace frametimeline { diff --git a/services/surfaceflinger/TransactionCallbackInvoker.h b/services/surfaceflinger/TransactionCallbackInvoker.h index c09bcce067..61ff9bce98 100644 --- a/services/surfaceflinger/TransactionCallbackInvoker.h +++ b/services/surfaceflinger/TransactionCallbackInvoker.h @@ -26,27 +26,14 @@ #include <unordered_set> #include <android-base/thread_annotations.h> -#include <android/gui/ITransactionCompletedListener.h> - #include <binder/IBinder.h> -#include <gui/ListenerStats.h> -#include <gui/ReleaseCallbackId.h> -#include <renderengine/RenderEngine.h> +#include <ftl/future.h> +#include <gui/ITransactionCompletedListener.h> #include <ui/Fence.h> #include <ui/FenceResult.h> namespace android { -using gui::CallbackId; -using gui::FrameEventHistoryStats; -using gui::IListenerHash; -using gui::ITransactionCompletedListener; -using gui::JankData; -using gui::ListenerCallbacks; -using gui::ListenerStats; -using gui::ReleaseCallbackId; -using gui::TransactionStats; - class CallbackHandle : public RefBase { public: CallbackHandle(const sp<IBinder>& transactionListener, const std::vector<CallbackId>& ids, |