From 9e84811fb0a8ee705f24201995f92a53691b6125 Mon Sep 17 00:00:00 2001 From: Sally Qi Date: Tue, 11 Feb 2025 17:20:25 -0800 Subject: [Lut] Change setLuts function signature. Bug: 380894872 Test: builds Flag: EXEMPT refactor Change-Id: Ie7f0cbaa20edfd532dc1c4f1a13c8d704b83a41c --- libs/gui/SurfaceComposerClient.cpp | 10 +++++----- libs/gui/include/gui/SurfaceComposerClient.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 37ed23bd6b..df57b275c5 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -1953,9 +1953,9 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDesir } SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLuts( - const sp& sc, const base::unique_fd& lutFd, - const std::vector& offsets, const std::vector& dimensions, - const std::vector& sizes, const std::vector& samplingKeys) { + const sp& sc, base::unique_fd&& lutFd, const std::vector& offsets, + const std::vector& dimensions, const std::vector& sizes, + const std::vector& samplingKeys) { layer_state_t* s = getLayerState(sc); if (!s) { mStatus = BAD_INDEX; @@ -1964,8 +1964,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLuts( s->what |= layer_state_t::eLutsChanged; if (lutFd.ok()) { - s->luts = std::make_shared(base::unique_fd(dup(lutFd.get())), offsets, - dimensions, sizes, samplingKeys); + s->luts = std::make_shared(std::move(lutFd), offsets, dimensions, sizes, + samplingKeys); } else { s->luts = nullptr; } diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index 10225cc114..60f16ae902 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -620,7 +620,7 @@ public: Transaction& setExtendedRangeBrightness(const sp& sc, float currentBufferRatio, float desiredRatio); Transaction& setDesiredHdrHeadroom(const sp& sc, float desiredRatio); - Transaction& setLuts(const sp& sc, const base::unique_fd& lutFd, + Transaction& setLuts(const sp& sc, base::unique_fd&& lutFd, const std::vector& offsets, const std::vector& dimensions, const std::vector& sizes, -- cgit v1.2.3-59-g8ed1b From 1bc989aba8a2f0748b38798d518f72227945d01b Mon Sep 17 00:00:00 2001 From: Zimuzo Ezeozue Date: Tue, 18 Feb 2025 16:46:38 +0000 Subject: Reset arguments after emitting a perfetto event We were always resetting arguments but this was left to the caller and was one more non-trivial JNI call. While we are in the library code we should just reset the arguments right away Test: atest PerfettoTraceTest Bug: 303199244 Flag: android.os.perfetto_sdk_tracing_v2 Change-Id: If093c436c24b5519a98d19f7ccf7171f1ded3793 --- libs/tracing_perfetto/tracing_sdk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/tracing_perfetto/tracing_sdk.cpp b/libs/tracing_perfetto/tracing_sdk.cpp index c97e900952..70b8be981b 100644 --- a/libs/tracing_perfetto/tracing_sdk.cpp +++ b/libs/tracing_perfetto/tracing_sdk.cpp @@ -38,7 +38,7 @@ void trace_event(int type, const PerfettoTeCategory* perfettoTeCategory, PerfettoTeHlEmitImpl(perfettoTeCategory->impl, type, type == PERFETTO_TE_TYPE_COUNTER ? nullptr : name, extra->get()); - extra->pop_extra(); + extra->clear_extras(); } } -- cgit v1.2.3-59-g8ed1b From 8bba22be40afdb7f7fcfd5a663be6fc0856c899e Mon Sep 17 00:00:00 2001 From: Tim Van Patten Date: Mon, 13 Jan 2025 14:41:59 -0700 Subject: GraphicsEnv: Get feature overrides from GpuService Query GpuService for the latest ANGLE feature overrides and store them in GraphicsEnv. This must be done separately, because Zygote cannot perform Binder calls and GraphicsEnv must be able to handle being called at Zygote creation and App launch. This also helps minimize the boot time impact of this feature. Bug: 372694741 Test: CQ, Manual verification Flag: com.android.graphics.graphicsenv.flags.feature_overrides Change-Id: I9bfd295e57593074262a77fc8e2abe91b5d18791 --- libs/graphicsenv/GraphicsEnv.cpp | 20 ++++++++++++++++++++ libs/graphicsenv/include/graphicsenv/GraphicsEnv.h | 1 + 2 files changed, 21 insertions(+) diff --git a/libs/graphicsenv/GraphicsEnv.cpp b/libs/graphicsenv/GraphicsEnv.cpp index 4bc261106a..626581cc2a 100644 --- a/libs/graphicsenv/GraphicsEnv.cpp +++ b/libs/graphicsenv/GraphicsEnv.cpp @@ -621,6 +621,10 @@ void GraphicsEnv::setAngleInfo(const std::string& path, const bool shouldUseNati mShouldUseAngle = true; } mShouldUseNativeDriver = shouldUseNativeDriver; + + if (mShouldUseAngle) { + updateAngleFeatureOverrides(); + } } std::string& GraphicsEnv::getPackageName() { @@ -632,6 +636,22 @@ const std::vector& GraphicsEnv::getAngleEglFeatures() { return mAngleEglFeatures; } +// List of ANGLE features to override (enabled or disable). +// The list of overrides is loaded and parsed by GpuService. +void GraphicsEnv::updateAngleFeatureOverrides() { + if (!graphicsenv_flags::feature_overrides()) { + return; + } + + const sp gpuService = getGpuService(); + if (!gpuService) { + ALOGE("No GPU service"); + return; + } + + mFeatureOverrides = gpuService->getFeatureOverrides(); +} + void GraphicsEnv::getAngleFeatureOverrides(std::vector& enabled, std::vector& disabled) { if (!graphicsenv_flags::feature_overrides()) { diff --git a/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h b/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h index 55fa13abb5..68219008e8 100644 --- a/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h +++ b/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h @@ -121,6 +121,7 @@ public: // Get the app package name. std::string& getPackageName(); const std::vector& getAngleEglFeatures(); + void updateAngleFeatureOverrides(); void getAngleFeatureOverrides(std::vector& enabled, std::vector& disabled); // Set the persist.graphics.egl system property value. -- cgit v1.2.3-59-g8ed1b From 637dc97730e58228e20f89382451ffa9871ebb13 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Fri, 10 Jan 2025 22:11:51 +0000 Subject: libbinder_ndk: _disableBackgroundScheduling ABinderProcess_disableBackgroundScheduling In preparation for adding it to #systemapi/#llndk once we can change APIs again. Bug: 389143775 Test: N/A Change-Id: I5f7dd806f7664487f07f4c3b695e8456513083a9 --- .../ndk/include_platform/android/binder_ibinder_platform.h | 2 ++ libs/binder/ndk/include_platform/android/binder_process.h | 13 +++++++++++++ libs/binder/ndk/libbinder_ndk.map.txt | 1 + libs/binder/ndk/process.cpp | 4 ++++ 4 files changed, 20 insertions(+) diff --git a/libs/binder/ndk/include_platform/android/binder_ibinder_platform.h b/libs/binder/ndk/include_platform/android/binder_ibinder_platform.h index 89f21dda21..783e11f0e9 100644 --- a/libs/binder/ndk/include_platform/android/binder_ibinder_platform.h +++ b/libs/binder/ndk/include_platform/android/binder_ibinder_platform.h @@ -62,6 +62,8 @@ __attribute__((weak, warn_unused_result)) const char* AIBinder_getCallingSid() _ * This must be called before the object is sent to another process. * Aborts on invalid values. Not thread safe. * + * This overrides the setting in ABinderProcess_disableBackgroundScheduling. + * * \param binder local server binder to set the policy for * \param policy scheduler policy as defined in linux UAPI * \param priority priority. [-20..19] for SCHED_NORMAL, [1..99] for RT diff --git a/libs/binder/ndk/include_platform/android/binder_process.h b/libs/binder/ndk/include_platform/android/binder_process.h index 6aff994a15..2432099d6e 100644 --- a/libs/binder/ndk/include_platform/android/binder_process.h +++ b/libs/binder/ndk/include_platform/android/binder_process.h @@ -74,6 +74,19 @@ bool ABinderProcess_isThreadPoolStarted(void); */ void ABinderProcess_joinThreadPool(void); +/** + * Disables (or enables) background scheduling. + * + * By default, binder threads execute at a lower priority. However, this can cause + * priority inversion, so it is recommended to be disabled in high priority + * or in system processes. + * + * See also AIBinder_setMinSchedulerPolicy, which overrides this setting. + * + * \param disable whether to disable background scheduling + */ +void ABinderProcess_disableBackgroundScheduling(bool disable); + /** * This gives you an fd to wait on. Whenever data is available on the fd, * ABinderProcess_handlePolledCommands can be called to handle binder queries. diff --git a/libs/binder/ndk/libbinder_ndk.map.txt b/libs/binder/ndk/libbinder_ndk.map.txt index a63716522e..d4eb8c7579 100644 --- a/libs/binder/ndk/libbinder_ndk.map.txt +++ b/libs/binder/ndk/libbinder_ndk.map.txt @@ -229,6 +229,7 @@ LIBBINDER_NDK_PLATFORM { AIBinder_fromPlatformBinder*; AIBinder_toPlatformBinder*; AParcel_viewPlatformParcel*; + ABinderProcess_disableBackgroundScheduling; }; local: *; diff --git a/libs/binder/ndk/process.cpp b/libs/binder/ndk/process.cpp index 0072ac3d3e..bcdb9594fa 100644 --- a/libs/binder/ndk/process.cpp +++ b/libs/binder/ndk/process.cpp @@ -36,6 +36,10 @@ void ABinderProcess_joinThreadPool(void) { IPCThreadState::self()->joinThreadPool(); } +void ABinderProcess_disableBackgroundScheduling(bool disable) { + IPCThreadState::disableBackgroundScheduling(disable); +} + binder_status_t ABinderProcess_setupPolling(int* fd) { return IPCThreadState::self()->setupPolling(fd); } -- cgit v1.2.3-59-g8ed1b From f73db7a6242e297ead71df0d0d1fb3a8515245d3 Mon Sep 17 00:00:00 2001 From: "Priyanka Advani (xWF)" Date: Wed, 19 Feb 2025 17:35:16 -0800 Subject: Revert "Harden construction sites of android::StrongPointer." This reverts commit 81793808b9347a52dd979e4b3d5d9d10fc8c4915. Reason for revert: Droidmonitor created revert due to b/397788382. Will be verifying through ABTD before submission. Change-Id: Idd58b82a5a5380053cdff4e7b92eafa66b2c2782 --- libs/gui/BLASTBufferQueue.cpp | 24 ++++++++---------- libs/gui/BufferItem.cpp | 4 +-- libs/gui/BufferQueue.cpp | 7 +++--- libs/gui/BufferQueueProducer.cpp | 19 +++++++------- libs/gui/BufferReleaseChannel.cpp | 4 +-- libs/gui/Choreographer.cpp | 7 +++--- libs/gui/ConsumerBase.cpp | 2 +- libs/gui/CpuConsumer.cpp | 2 +- libs/gui/DisplayEventDispatcher.cpp | 3 +-- libs/gui/GLConsumer.cpp | 14 +++++------ libs/gui/IGraphicBufferProducer.cpp | 22 ++++++++-------- libs/gui/IGraphicBufferProducerFlattenables.cpp | 8 +++--- libs/gui/ITransactionCompletedListener.cpp | 6 ++--- libs/gui/LayerState.cpp | 6 ++--- libs/gui/ScreenCaptureResults.cpp | 5 ++-- libs/gui/StreamSplitter.cpp | 7 +++--- libs/gui/Surface.cpp | 17 ++++++------- libs/gui/SurfaceComposerClient.cpp | 29 ++++++++++------------ libs/gui/SurfaceControl.cpp | 11 ++++---- libs/gui/WindowInfosListenerReporter.cpp | 15 +++-------- .../bufferqueue/1.0/H2BGraphicBufferProducer.cpp | 16 ++++++------ .../bufferqueue/2.0/B2HGraphicBufferProducer.cpp | 2 +- .../bufferqueue/2.0/H2BGraphicBufferProducer.cpp | 2 +- libs/gui/bufferqueue/2.0/types.cpp | 6 ++--- libs/gui/include/gui/StreamSplitter.h | 2 -- 25 files changed, 110 insertions(+), 130 deletions(-) diff --git a/libs/gui/BLASTBufferQueue.cpp b/libs/gui/BLASTBufferQueue.cpp index ddf5d394bf..0848fac293 100644 --- a/libs/gui/BLASTBufferQueue.cpp +++ b/libs/gui/BLASTBufferQueue.cpp @@ -197,15 +197,15 @@ BLASTBufferQueue::BLASTBufferQueue(const std::string& name, bool updateDestinati mUpdateDestinationFrame(updateDestinationFrame) { createBufferQueue(&mProducer, &mConsumer); #if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ) - mBufferItemConsumer = sp::make(mProducer, mConsumer, - GraphicBuffer::USAGE_HW_COMPOSER | - GraphicBuffer::USAGE_HW_TEXTURE, - 1, false, this); + mBufferItemConsumer = new BLASTBufferItemConsumer(mProducer, mConsumer, + GraphicBuffer::USAGE_HW_COMPOSER | + GraphicBuffer::USAGE_HW_TEXTURE, + 1, false, this); #else - mBufferItemConsumer = sp::make(mConsumer, - GraphicBuffer::USAGE_HW_COMPOSER | - GraphicBuffer::USAGE_HW_TEXTURE, - 1, false, this); + mBufferItemConsumer = new BLASTBufferItemConsumer(mConsumer, + GraphicBuffer::USAGE_HW_COMPOSER | + GraphicBuffer::USAGE_HW_TEXTURE, + 1, false, this); #endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ) // since the adapter is in the client process, set dequeue timeout // explicitly so that dequeueBuffer will block @@ -641,8 +641,7 @@ status_t BLASTBufferQueue::acquireNextBufferLocked( bufferItem.mScalingMode, crop); auto releaseBufferCallback = makeReleaseBufferCallbackThunk(); - sp fence = - bufferItem.mFence ? sp::make(bufferItem.mFence->dup()) : Fence::NO_FENCE; + sp fence = bufferItem.mFence ? new Fence(bufferItem.mFence->dup()) : Fence::NO_FENCE; nsecs_t dequeueTime = -1; { @@ -1019,8 +1018,7 @@ sp BLASTBufferQueue::getSurface(bool includeSurfaceControlHandle) { if (includeSurfaceControlHandle && mSurfaceControl) { scHandle = mSurfaceControl->getHandle(); } - return sp::make(mProducer, true, scHandle, - sp::fromExisting(this)); + return new BBQSurface(mProducer, true, scHandle, this); } void BLASTBufferQueue::mergeWithNextTransaction(SurfaceComposerClient::Transaction* t, @@ -1183,7 +1181,7 @@ public: return BufferQueueProducer::connect(listener, api, producerControlledByApp, output); } - return BufferQueueProducer::connect(sp::make(listener), api, + return BufferQueueProducer::connect(new AsyncProducerListener(listener), api, producerControlledByApp, output); } diff --git a/libs/gui/BufferItem.cpp b/libs/gui/BufferItem.cpp index 9dcd5dc4c5..3b2d337a21 100644 --- a/libs/gui/BufferItem.cpp +++ b/libs/gui/BufferItem.cpp @@ -215,14 +215,14 @@ status_t BufferItem::unflatten( FlattenableUtils::read(buffer, size, flags); if (flags & 1) { - mGraphicBuffer = sp::make(); + mGraphicBuffer = new GraphicBuffer(); status_t err = mGraphicBuffer->unflatten(buffer, size, fds, count); if (err) return err; size -= FlattenableUtils::align<4>(buffer); } if (flags & 2) { - mFence = sp::make(); + mFence = new Fence(); status_t err = mFence->unflatten(buffer, size, fds, count); if (err) return err; size -= FlattenableUtils::align<4>(buffer); diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp index f21ac18f3c..f1374e23fd 100644 --- a/libs/gui/BufferQueue.cpp +++ b/libs/gui/BufferQueue.cpp @@ -125,16 +125,15 @@ void BufferQueue::createBufferQueue(sp* outProducer, LOG_ALWAYS_FATAL_IF(outConsumer == nullptr, "BufferQueue: outConsumer must not be NULL"); - sp core = sp::make(); + sp core(new BufferQueueCore()); LOG_ALWAYS_FATAL_IF(core == nullptr, "BufferQueue: failed to create BufferQueueCore"); - sp producer = - sp::make(core, consumerIsSurfaceFlinger); + sp producer(new BufferQueueProducer(core, consumerIsSurfaceFlinger)); LOG_ALWAYS_FATAL_IF(producer == nullptr, "BufferQueue: failed to create BufferQueueProducer"); - sp consumer = sp::make(core); + sp consumer(new BufferQueueConsumer(core)); LOG_ALWAYS_FATAL_IF(consumer == nullptr, "BufferQueue: failed to create BufferQueueConsumer"); diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp index 54b3a1f08c..c241482827 100644 --- a/libs/gui/BufferQueueProducer.cpp +++ b/libs/gui/BufferQueueProducer.cpp @@ -693,11 +693,11 @@ status_t BufferQueueProducer::dequeueBuffer(int* outSlot, sp* ou .requestorName = {mConsumerName.c_str(), mConsumerName.size()}, .extras = std::move(tempOptions), }; - sp graphicBuffer = sp::make(allocRequest); + sp graphicBuffer = new GraphicBuffer(allocRequest); #else sp graphicBuffer = - sp::make(width, height, format, BQ_LAYER_COUNT, usage, - std::string{mConsumerName.c_str(), mConsumerName.size()}); + new GraphicBuffer(width, height, format, BQ_LAYER_COUNT, usage, + {mConsumerName.c_str(), mConsumerName.size()}); #endif status_t error = graphicBuffer->initCheck(); @@ -1464,7 +1464,7 @@ status_t BufferQueueProducer::connect(const sp& listener, #ifndef NO_BINDER if (IInterface::asBinder(listener)->remoteBinder() != nullptr) { status = IInterface::asBinder(listener)->linkToDeath( - sp::fromExisting(this)); + static_cast(this)); if (status != NO_ERROR) { BQ_LOGE("connect: linkToDeath failed: %s (%d)", strerror(-status), status); @@ -1553,7 +1553,8 @@ status_t BufferQueueProducer::disconnect(int api, DisconnectMode mode) { IInterface::asBinder(mCore->mLinkedToDeath); // This can fail if we're here because of the death // notification, but we just ignore it - token->unlinkToDeath(sp::fromExisting(this)); + token->unlinkToDeath( + static_cast(this)); } #endif mCore->mSharedBufferSlot = @@ -1684,11 +1685,11 @@ void BufferQueueProducer::allocateBuffers(uint32_t width, uint32_t height, #endif #if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(BQ_EXTENDEDALLOCATE) - sp graphicBuffer = sp::make(allocRequest); + sp graphicBuffer = new GraphicBuffer(allocRequest); #else - sp graphicBuffer = - sp::make(allocWidth, allocHeight, allocFormat, BQ_LAYER_COUNT, - allocUsage, allocName); + sp graphicBuffer = new GraphicBuffer( + allocWidth, allocHeight, allocFormat, BQ_LAYER_COUNT, + allocUsage, allocName); #endif status_t result = graphicBuffer->initCheck(); diff --git a/libs/gui/BufferReleaseChannel.cpp b/libs/gui/BufferReleaseChannel.cpp index 4f495d039d..e9cb013baf 100644 --- a/libs/gui/BufferReleaseChannel.cpp +++ b/libs/gui/BufferReleaseChannel.cpp @@ -108,7 +108,7 @@ status_t BufferReleaseChannel::Message::flatten(void*& buffer, size_t& size, int status_t BufferReleaseChannel::Message::unflatten(void const*& buffer, size_t& size, int const*& fds, size_t& count) { - releaseFence = sp::make(); + releaseFence = new Fence(); if (status_t err = releaseFence->unflatten(buffer, size, fds, count); err != OK) { return err; } @@ -344,4 +344,4 @@ status_t BufferReleaseChannel::open(std::string name, return STATUS_OK; } -} // namespace android::gui +} // namespace android::gui \ No newline at end of file diff --git a/libs/gui/Choreographer.cpp b/libs/gui/Choreographer.cpp index bc8df42c62..665704b1da 100644 --- a/libs/gui/Choreographer.cpp +++ b/libs/gui/Choreographer.cpp @@ -15,7 +15,6 @@ */ // #define LOG_NDEBUG 0 -#include "utils/Looper.h" #define ATRACE_TAG ATRACE_TAG_GRAPHICS #include @@ -155,7 +154,7 @@ void Choreographer::postFrameCallbackDelayed(AChoreographer_frameCallback cb, if (std::this_thread::get_id() != mThreadId) { if (mLooper != nullptr) { Message m{MSG_SCHEDULE_VSYNC}; - mLooper->sendMessage(sp::fromExisting(this), m); + mLooper->sendMessage(this, m); } else { scheduleVsync(); } @@ -165,7 +164,7 @@ void Choreographer::postFrameCallbackDelayed(AChoreographer_frameCallback cb, } else { if (mLooper != nullptr) { Message m{MSG_SCHEDULE_CALLBACKS}; - mLooper->sendMessageDelayed(delay, sp::fromExisting(this), m); + mLooper->sendMessageDelayed(delay, this, m); } else { scheduleCallbacks(); } @@ -229,7 +228,7 @@ void Choreographer::unregisterRefreshRateCallback(AChoreographer_refreshRateCall void Choreographer::scheduleLatestConfigRequest() { if (mLooper != nullptr) { Message m{MSG_HANDLE_REFRESH_RATE_UPDATES}; - mLooper->sendMessage(sp::fromExisting(this), m); + mLooper->sendMessage(this, m); } else { // If the looper thread is detached from Choreographer, then refresh rate // changes will be handled in AChoreographer_handlePendingEvents, so we diff --git a/libs/gui/ConsumerBase.cpp b/libs/gui/ConsumerBase.cpp index 62508de052..3ad0e529a5 100644 --- a/libs/gui/ConsumerBase.cpp +++ b/libs/gui/ConsumerBase.cpp @@ -110,7 +110,7 @@ void ConsumerBase::initialize(bool controlledByApp) { // dropping to 0 at the end of the ctor. Since all we need is a wp<...> // that's what we create. wp listener = static_cast(this); - sp proxy = sp::make(listener); + sp proxy = new BufferQueue::ProxyConsumerListener(listener); status_t err = mConsumer->consumerConnect(proxy, controlledByApp); if (err != NO_ERROR) { diff --git a/libs/gui/CpuConsumer.cpp b/libs/gui/CpuConsumer.cpp index 66fe2daba1..23b432e1f4 100644 --- a/libs/gui/CpuConsumer.cpp +++ b/libs/gui/CpuConsumer.cpp @@ -230,7 +230,7 @@ status_t CpuConsumer::unlockBuffer(const LockedBuffer &nativeBuffer) { return err; } - sp fence(fenceFd >= 0 ? sp::make(fenceFd) : Fence::NO_FENCE); + sp fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); addReleaseFenceLocked(ab.mSlot, ab.mGraphicBuffer, fence); releaseBufferLocked(ab.mSlot, ab.mGraphicBuffer); diff --git a/libs/gui/DisplayEventDispatcher.cpp b/libs/gui/DisplayEventDispatcher.cpp index 67ca39c99e..68f10f4d80 100644 --- a/libs/gui/DisplayEventDispatcher.cpp +++ b/libs/gui/DisplayEventDispatcher.cpp @@ -59,8 +59,7 @@ status_t DisplayEventDispatcher::initialize() { } if (mLooper != nullptr) { - int rc = mLooper->addFd(mReceiver.getFd(), 0, Looper::EVENT_INPUT, - sp::fromExisting(this), NULL); + int rc = mLooper->addFd(mReceiver.getFd(), 0, Looper::EVENT_INPUT, this, NULL); if (rc < 0) { return UNKNOWN_ERROR; } diff --git a/libs/gui/GLConsumer.cpp b/libs/gui/GLConsumer.cpp index 70c04b3518..052b8edfaa 100644 --- a/libs/gui/GLConsumer.cpp +++ b/libs/gui/GLConsumer.cpp @@ -333,7 +333,7 @@ status_t GLConsumer::releaseTexImage() { } if (mReleasedTexImage == nullptr) { - mReleasedTexImage = sp::make(getDebugTexImageBuffer()); + mReleasedTexImage = new EglImage(getDebugTexImageBuffer()); } mCurrentTexture = BufferQueue::INVALID_BUFFER_SLOT; @@ -365,10 +365,10 @@ sp GLConsumer::getDebugTexImageBuffer() { if (CC_UNLIKELY(sReleasedTexImageBuffer == nullptr)) { // The first time, create the debug texture in case the application // continues to use it. - sp buffer = - sp::make(kDebugData.width, kDebugData.height, PIXEL_FORMAT_RGBA_8888, - DEFAULT_USAGE_FLAGS | GraphicBuffer::USAGE_SW_WRITE_RARELY, - "[GLConsumer debug texture]"); + sp buffer = new GraphicBuffer( + kDebugData.width, kDebugData.height, PIXEL_FORMAT_RGBA_8888, + DEFAULT_USAGE_FLAGS | GraphicBuffer::USAGE_SW_WRITE_RARELY, + "[GLConsumer debug texture]"); uint32_t* bits; buffer->lock(GraphicBuffer::USAGE_SW_WRITE_RARELY, reinterpret_cast(&bits)); uint32_t stride = buffer->getStride(); @@ -400,7 +400,7 @@ status_t GLConsumer::acquireBufferLocked(BufferItem *item, // replaces any old EglImage with a new one (using the new buffer). if (item->mGraphicBuffer != nullptr) { int slot = item->mSlot; - mEglSlots[slot].mEglImage = sp::make(item->mGraphicBuffer); + mEglSlots[slot].mEglImage = new EglImage(item->mGraphicBuffer); } return NO_ERROR; @@ -737,7 +737,7 @@ status_t GLConsumer::syncForReleaseLocked(EGLDisplay dpy) { "fd: %#x", eglGetError()); return UNKNOWN_ERROR; } - sp fence = sp::make(fenceFd); + sp fence(new Fence(fenceFd)); status_t err = addReleaseFenceLocked(mCurrentTexture, mCurrentTextureImage->graphicBuffer(), fence); if (err != OK) { diff --git a/libs/gui/IGraphicBufferProducer.cpp b/libs/gui/IGraphicBufferProducer.cpp index 1d1910eb08..9f71eb16e7 100644 --- a/libs/gui/IGraphicBufferProducer.cpp +++ b/libs/gui/IGraphicBufferProducer.cpp @@ -104,7 +104,7 @@ public: } bool nonNull = reply.readInt32(); if (nonNull) { - *buf = sp::make(); + *buf = new GraphicBuffer(); result = reply.read(**buf); if(result != NO_ERROR) { (*buf).clear(); @@ -197,7 +197,7 @@ public: } *buf = reply.readInt32(); - *fence = sp::make(); + *fence = new Fence(); result = reply.read(**fence); if (result != NO_ERROR) { fence->clear(); @@ -293,7 +293,7 @@ public: if (result == NO_ERROR) { bool nonNull = reply.readInt32(); if (nonNull) { - *outBuffer = sp::make(); + *outBuffer = new GraphicBuffer; result = reply.read(**outBuffer); if (result != NO_ERROR) { outBuffer->clear(); @@ -302,7 +302,7 @@ public: } nonNull = reply.readInt32(); if (nonNull) { - *outFence = sp::make(); + *outFence = new Fence; result = reply.read(**outFence); if (result != NO_ERROR) { outBuffer->clear(); @@ -640,7 +640,7 @@ public: bool hasBuffer = reply.readBool(); sp buffer; if (hasBuffer) { - buffer = sp::make(); + buffer = new GraphicBuffer(); result = reply.read(*buffer); if (result == NO_ERROR) { result = reply.read(outTransformMatrix, sizeof(float) * 16); @@ -650,7 +650,7 @@ public: ALOGE("getLastQueuedBuffer failed to read buffer: %d", result); return result; } - sp fence = sp::make(); + sp fence(new Fence); result = reply.read(*fence); if (result != NO_ERROR) { ALOGE("getLastQueuedBuffer failed to read fence: %d", result); @@ -687,7 +687,7 @@ public: } sp buffer; if (hasBuffer) { - buffer = sp::make(); + buffer = new GraphicBuffer(); result = reply.read(*buffer); if (result == NO_ERROR) { result = reply.read(*outRect); @@ -700,7 +700,7 @@ public: ALOGE("getLastQueuedBuffer failed to read buffer: %d", result); return result; } - sp fence = sp::make(); + sp fence(new Fence); result = reply.read(*fence); if (result != NO_ERROR) { ALOGE("getLastQueuedBuffer failed to read fence: %d", result); @@ -1232,7 +1232,7 @@ status_t BnGraphicBufferProducer::onTransact( } case ATTACH_BUFFER: { CHECK_INTERFACE(IGraphicBufferProducer, data, reply); - sp buffer = sp::make(); + sp buffer = new GraphicBuffer(); status_t result = data.read(*buffer.get()); int slot = 0; if (result == NO_ERROR) { @@ -1250,7 +1250,7 @@ status_t BnGraphicBufferProducer::onTransact( return result; } for (sp& buffer : buffers) { - buffer = sp::make(); + buffer = new GraphicBuffer(); result = data.read(*buffer.get()); if (result != NO_ERROR) { return result; @@ -1306,7 +1306,7 @@ status_t BnGraphicBufferProducer::onTransact( case CANCEL_BUFFER: { CHECK_INTERFACE(IGraphicBufferProducer, data, reply); int buf = data.readInt32(); - sp fence = sp::make(); + sp fence = new Fence(); status_t result = data.read(*fence.get()); if (result == NO_ERROR) { result = cancelBuffer(buf, fence); diff --git a/libs/gui/IGraphicBufferProducerFlattenables.cpp b/libs/gui/IGraphicBufferProducerFlattenables.cpp index 393e1c3068..8b2e2ddc59 100644 --- a/libs/gui/IGraphicBufferProducerFlattenables.cpp +++ b/libs/gui/IGraphicBufferProducerFlattenables.cpp @@ -105,7 +105,7 @@ status_t IGraphicBufferProducer::QueueBufferInput::unflatten( : std::nullopt; #endif // COM_ANDROID_GRAPHICS_LIBUI_FLAGS_APPLY_PICTURE_PROFILES - fence = sp::make(); + fence = new Fence(); status_t result = fence->unflatten(buffer, size, fds, count); if (result != NO_ERROR) { return result; @@ -228,7 +228,7 @@ status_t IGraphicBufferProducer::RequestBufferOutput::unflatten( FlattenableUtils::read(fBuffer, size, result); int32_t isBufferNull = 0; FlattenableUtils::read(fBuffer, size, isBufferNull); - buffer = sp::make(); + buffer = new GraphicBuffer(); if (!isBufferNull) { status_t status = buffer->unflatten(fBuffer, size, fds, count); if (status != NO_ERROR) { @@ -323,7 +323,7 @@ status_t IGraphicBufferProducer::DequeueBufferOutput::unflatten( FlattenableUtils::read(buffer, size, slot); FlattenableUtils::read(buffer, size, bufferAge); - fence = sp::make(); + fence = new Fence(); status_t status = fence->unflatten(buffer, size, fds, count); if (status != NO_ERROR) { return status; @@ -395,7 +395,7 @@ status_t IGraphicBufferProducer::CancelBufferInput::unflatten( FlattenableUtils::read(buffer, size, slot); - fence = sp::make(); + fence = new Fence(); return fence->unflatten(buffer, size, fds, count); } diff --git a/libs/gui/ITransactionCompletedListener.cpp b/libs/gui/ITransactionCompletedListener.cpp index ed28e7960b..83fc827c5f 100644 --- a/libs/gui/ITransactionCompletedListener.cpp +++ b/libs/gui/ITransactionCompletedListener.cpp @@ -92,7 +92,7 @@ status_t FrameEventHistoryStats::readFromParcel(const Parcel* input) { if (err != NO_ERROR) return err; if (hasFence) { - gpuCompositionDoneFence = sp::make(); + gpuCompositionDoneFence = new Fence(); err = input->read(*gpuCompositionDoneFence); if (err != NO_ERROR) return err; } @@ -157,7 +157,7 @@ status_t SurfaceStats::readFromParcel(const Parcel* input) { SAFE_PARCEL(input->readBool, &hasFence); if (hasFence) { - previousReleaseFence = sp::make(); + previousReleaseFence = new Fence(); SAFE_PARCEL(input->read, *previousReleaseFence); } bool hasTransformHint = false; @@ -216,7 +216,7 @@ status_t TransactionStats::readFromParcel(const Parcel* input) { return err; } if (hasFence) { - presentFence = sp::make(); + presentFence = new Fence(); err = input->read(*presentFence); if (err != NO_ERROR) { return err; diff --git a/libs/gui/LayerState.cpp b/libs/gui/LayerState.cpp index 980c969d0d..44aac9bfae 100644 --- a/libs/gui/LayerState.cpp +++ b/libs/gui/LayerState.cpp @@ -691,7 +691,7 @@ void layer_state_t::merge(const layer_state_t& other) { } if (other.what & eInputInfoChanged) { what |= eInputInfoChanged; - windowInfoHandle = sp::make(*other.windowInfoHandle); + windowInfoHandle = new WindowInfoHandle(*other.windowInfoHandle); } if (other.what & eBackgroundColorChanged) { what |= eBackgroundColorChanged; @@ -1009,13 +1009,13 @@ status_t BufferData::readFromParcel(const Parcel* input) { bool tmpBool = false; SAFE_PARCEL(input->readBool, &tmpBool); if (tmpBool) { - buffer = sp::make(); + buffer = new GraphicBuffer(); SAFE_PARCEL(input->read, *buffer); } SAFE_PARCEL(input->readBool, &tmpBool); if (tmpBool) { - acquireFence = sp::make(); + acquireFence = new Fence(); SAFE_PARCEL(input->read, *acquireFence); } diff --git a/libs/gui/ScreenCaptureResults.cpp b/libs/gui/ScreenCaptureResults.cpp index 0c9d6d663b..2de023e5b2 100644 --- a/libs/gui/ScreenCaptureResults.cpp +++ b/libs/gui/ScreenCaptureResults.cpp @@ -18,7 +18,6 @@ #include #include -#include "ui/GraphicBuffer.h" namespace android::gui { @@ -55,7 +54,7 @@ status_t ScreenCaptureResults::readFromParcel(const android::Parcel* parcel) { bool hasGraphicBuffer; SAFE_PARCEL(parcel->readBool, &hasGraphicBuffer); if (hasGraphicBuffer) { - buffer = sp::make(); + buffer = new GraphicBuffer(); SAFE_PARCEL(parcel->read, *buffer); } @@ -80,7 +79,7 @@ status_t ScreenCaptureResults::readFromParcel(const android::Parcel* parcel) { bool hasGainmap; SAFE_PARCEL(parcel->readBool, &hasGainmap); if (hasGainmap) { - optionalGainMap = sp::make(); + optionalGainMap = new GraphicBuffer(); SAFE_PARCEL(parcel->read, *optionalGainMap); } SAFE_PARCEL(parcel->readFloat, &hdrSdrRatio); diff --git a/libs/gui/StreamSplitter.cpp b/libs/gui/StreamSplitter.cpp index 9b107fc514..653b91bcf6 100644 --- a/libs/gui/StreamSplitter.cpp +++ b/libs/gui/StreamSplitter.cpp @@ -47,7 +47,7 @@ status_t StreamSplitter::createSplitter( return BAD_VALUE; } - sp splitter = sp::make(inputQueue); + sp splitter(new StreamSplitter(inputQueue)); status_t status = splitter->mInput->consumerConnect(splitter, false); if (status == NO_ERROR) { splitter->mInput->setConsumerName(String8("StreamSplitter")); @@ -82,8 +82,7 @@ status_t StreamSplitter::addOutput( Mutex::Autolock lock(mMutex); IGraphicBufferProducer::QueueBufferOutput queueBufferOutput; - sp listener = - sp::make(sp::fromExisting(this), outputQueue); + sp listener(new OutputListener(this, outputQueue)); IInterface::asBinder(outputQueue)->linkToDeath(listener); status_t status = outputQueue->connect(listener, NATIVE_WINDOW_API_CPU, /* producerControlledByApp */ false, &queueBufferOutput); @@ -141,7 +140,7 @@ void StreamSplitter::onFrameAvailable(const BufferItem& /* item */) { // Initialize our reference count for this buffer mBuffers.add(bufferItem.mGraphicBuffer->getId(), - sp::make(bufferItem.mGraphicBuffer)); + new BufferTracker(bufferItem.mGraphicBuffer)); IGraphicBufferProducer::QueueBufferInput queueInput( bufferItem.mTimestamp, bufferItem.mIsAutoTimestamp, diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index a646931cc5..ec23365e1f 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -509,7 +509,7 @@ int Surface::hook_dequeueBuffer_DEPRECATED(ANativeWindow* window, if (result != OK) { return result; } - sp fence = sp::make(fenceFd); + sp fence(new Fence(fenceFd)); int waitResult = fence->waitForever("dequeueBuffer_DEPRECATED"); if (waitResult != OK) { ALOGE("dequeueBuffer_DEPRECATED: Fence::wait returned an error: %d", @@ -979,7 +979,7 @@ int Surface::cancelBuffer(android_native_buffer_t* buffer, } return OK; } - sp fence(fenceFd >= 0 ? sp::make(fenceFd) : Fence::NO_FENCE); + sp fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); mGraphicBufferProducer->cancelBuffer(i, fence); if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot == i) { @@ -1017,7 +1017,7 @@ int Surface::cancelBuffers(const std::vector& buffers) { ALOGE("%s: cannot find slot number for cancelled buffer", __FUNCTION__); badSlotResult = slot; } else { - sp fence(fenceFd >= 0 ? sp::make(fenceFd) : Fence::NO_FENCE); + sp fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); cancelBufferInputs[numBuffersCancelled].slot = slot; cancelBufferInputs[numBuffersCancelled++].fence = fence; } @@ -1078,7 +1078,7 @@ void Surface::getQueueBufferInputLocked(android_native_buffer_t* buffer, int fen Rect crop(Rect::EMPTY_RECT); mCrop.intersect(Rect(buffer->width, buffer->height), &crop); - sp fence(fenceFd >= 0 ? sp::make(fenceFd) : Fence::NO_FENCE); + sp fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); IGraphicBufferProducer::QueueBufferInput input(timestamp, isAutoTimestamp, static_cast(mDataSpace), crop, mScalingMode, mTransform ^ mStickyTransform, fence, mStickyTransform, @@ -2092,7 +2092,7 @@ bool Surface::transformToDisplayInverse() const { } int Surface::connect(int api) { - static sp listener = sp::make(); + static sp listener = new StubSurfaceListener(); return connect(api, listener); } @@ -2104,7 +2104,7 @@ int Surface::connect(int api, const sp& listener, bool reportBu mReportRemovedBuffers = reportBufferRemoval; if (listener != nullptr) { - mListenerProxy = sp::make(this, listener); + mListenerProxy = new ProducerListenerProxy(this, listener); } int err = @@ -2240,8 +2240,7 @@ int Surface::attachBuffer(ANativeWindowBuffer* buffer) mRemovedBuffers.clear(); } - sp graphicBuffer = - sp::fromExisting(static_cast(buffer)); + sp graphicBuffer(static_cast(buffer)); uint32_t priorGeneration = graphicBuffer->mGenerationNumber; graphicBuffer->mGenerationNumber = mGenerationNumber; int32_t attachedSlot = -1; @@ -2703,7 +2702,7 @@ status_t Surface::lock( status_t err = dequeueBuffer(&out, &fenceFd); ALOGE_IF(err, "dequeueBuffer failed (%s)", strerror(-err)); if (err == NO_ERROR) { - sp backBuffer = sp::fromExisting(GraphicBuffer::getSelf(out)); + sp backBuffer(GraphicBuffer::getSelf(out)); const Rect bounds(backBuffer->width, backBuffer->height); Region newDirtyRegion; diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index de3f9ccd14..852885be61 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -123,7 +123,7 @@ bool ComposerService::connectLocked() { explicit DeathObserver(ComposerService& mgr) : mComposerService(mgr) { } }; - mDeathObserver = sp::make(*const_cast(this)); + mDeathObserver = new DeathObserver(*const_cast(this)); IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver); return true; } @@ -170,7 +170,7 @@ bool ComposerServiceAIDL::connectLocked() { explicit DeathObserver(ComposerServiceAIDL& mgr) : mComposerService(mgr) {} }; - mDeathObserver = sp::make(*const_cast(this)); + mDeathObserver = new DeathObserver(*const_cast(this)); IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver); return true; } @@ -202,7 +202,7 @@ public: DefaultComposerClient& dc = DefaultComposerClient::getInstance(); Mutex::Autolock _l(dc.mLock); if (dc.mClient == nullptr) { - dc.mClient = sp::make(); + dc.mClient = new SurfaceComposerClient; } return dc.mClient; } @@ -399,7 +399,7 @@ void TransactionCompletedListener::setInstance(const sp TransactionCompletedListener::getInstance() { std::lock_guard lock(sListenerInstanceMutex); if (sInstance == nullptr) { - sInstance = sp::make(); + sInstance = new TransactionCompletedListener; } return sInstance; } @@ -677,7 +677,7 @@ void TransactionCompletedListener::removeReleaseBufferCallback( SurfaceComposerClient::PresentationCallbackRAII::PresentationCallbackRAII( TransactionCompletedListener* tcl, int id) { - mTcl = sp::fromExisting(tcl); + mTcl = tcl; mId = id; } @@ -691,7 +691,7 @@ TransactionCompletedListener::addTrustedPresentationCallback(TrustedPresentation std::scoped_lock lock(mMutex); mTrustedPresentationCallbacks[id] = std::tuple(tpc, context); - return sp::make(this, id); + return new SurfaceComposerClient::PresentationCallbackRAII(this, id); } void TransactionCompletedListener::clearTrustedPresentationCallback(int id) { @@ -743,7 +743,7 @@ void removeDeadBufferCallback(void* /*context*/, uint64_t graphicBufferId); */ class BufferCache : public Singleton { public: - BufferCache() : token(sp::make()) {} + BufferCache() : token(new BBinder()) {} sp getToken() { return IInterface::asBinder(TransactionCompletedListener::getIInstance()); @@ -1357,7 +1357,7 @@ status_t SurfaceComposerClient::Transaction::apply(bool synchronous, bool oneWay return binderStatus; } -sp SurfaceComposerClient::Transaction::sApplyToken = sp::make(); +sp SurfaceComposerClient::Transaction::sApplyToken = new BBinder(); std::mutex SurfaceComposerClient::Transaction::sApplyTokenMutex; @@ -2695,10 +2695,9 @@ status_t SurfaceComposerClient::createSurfaceChecked(const String8& name, uint32 } ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err)); if (err == NO_ERROR) { - *outSurface = sp::make(sp::fromExisting(this), - result.handle, result.layerId, - toString(result.layerName), w, h, format, - result.transformHint, flags); + *outSurface = new SurfaceControl(this, result.handle, result.layerId, + toString(result.layerName), w, h, format, + result.transformHint, flags); } } return err; @@ -2714,8 +2713,7 @@ sp SurfaceComposerClient::mirrorSurface(SurfaceControl* mirrorFr const binder::Status status = mClient->mirrorSurface(mirrorFromHandle, &result); const status_t err = statusTFromBinderStatus(status); if (err == NO_ERROR) { - return sp::make(sp::fromExisting(this), - result.handle, result.layerId, toString(result.layerName)); + return new SurfaceControl(this, result.handle, result.layerId, toString(result.layerName)); } return nullptr; } @@ -2725,8 +2723,7 @@ sp SurfaceComposerClient::mirrorDisplay(DisplayId displayId) { const binder::Status status = mClient->mirrorDisplay(displayId.value, &result); const status_t err = statusTFromBinderStatus(status); if (err == NO_ERROR) { - return sp::make(sp::fromExisting(this), - result.handle, result.layerId, toString(result.layerName)); + return new SurfaceControl(this, result.handle, result.layerId, toString(result.layerName)); } return nullptr; } diff --git a/libs/gui/SurfaceControl.cpp b/libs/gui/SurfaceControl.cpp index ba2d80d1b3..b735418d4b 100644 --- a/libs/gui/SurfaceControl.cpp +++ b/libs/gui/SurfaceControl.cpp @@ -269,11 +269,10 @@ status_t SurfaceControl::readFromParcel(const Parcel& parcel, SAFE_PARCEL(parcel.readUint32, &format); // We aren't the original owner of the surface. - *outSurfaceControl = - sp::make(sp::make( - interface_cast(client)), - handle, layerId, layerName, width, height, format, - transformHint); + *outSurfaceControl = new SurfaceControl(new SurfaceComposerClient( + interface_cast(client)), + handle.get(), layerId, layerName, width, height, format, + transformHint); return NO_ERROR; } @@ -304,7 +303,7 @@ sp SurfaceControl::getParentingLayer() { if (mBbqChild != nullptr) { return mBbqChild; } - return sp::fromExisting(this); + return this; } uint64_t SurfaceControl::resolveFrameNumber(const std::optional& frameNumber) { diff --git a/libs/gui/WindowInfosListenerReporter.cpp b/libs/gui/WindowInfosListenerReporter.cpp index ce8737b8b9..91c9a85149 100644 --- a/libs/gui/WindowInfosListenerReporter.cpp +++ b/libs/gui/WindowInfosListenerReporter.cpp @@ -17,7 +17,6 @@ #include #include #include -#include "android/gui/IWindowInfosListener.h" #include "gui/WindowInfosUpdate.h" namespace android { @@ -28,7 +27,7 @@ using gui::WindowInfosListener; using gui::aidl_utils::statusTFromBinderStatus; sp WindowInfosListenerReporter::getInstance() { - static sp sInstance = sp::make(); + static sp sInstance = new WindowInfosListenerReporter; return sInstance; } @@ -41,11 +40,7 @@ status_t WindowInfosListenerReporter::addWindowInfosListener( std::scoped_lock lock(mListenersMutex); if (mWindowInfosListeners.empty()) { gui::WindowInfosListenerInfo listenerInfo; - binder::Status s = - surfaceComposer - ->addWindowInfosListener(sp::fromExisting( - this), - &listenerInfo); + binder::Status s = surfaceComposer->addWindowInfosListener(this, &listenerInfo); status = statusTFromBinderStatus(s); if (status == OK) { mWindowInfosPublisher = std::move(listenerInfo.windowInfosPublisher); @@ -77,8 +72,7 @@ status_t WindowInfosListenerReporter::removeWindowInfosListener( } if (mWindowInfosListeners.size() == 1) { - binder::Status s = surfaceComposer->removeWindowInfosListener( - sp::fromExisting(this)); + binder::Status s = surfaceComposer->removeWindowInfosListener(this); status = statusTFromBinderStatus(s); // Clear the last stored state since we're disabling updates and don't want to hold // stale values @@ -122,8 +116,7 @@ void WindowInfosListenerReporter::reconnect(const sp& com std::scoped_lock lock(mListenersMutex); if (!mWindowInfosListeners.empty()) { gui::WindowInfosListenerInfo listenerInfo; - composerService->addWindowInfosListener(sp::fromExisting(this), - &listenerInfo); + composerService->addWindowInfosListener(this, &listenerInfo); mWindowInfosPublisher = std::move(listenerInfo.windowInfosPublisher); mListenerId = listenerInfo.listenerId; } diff --git a/libs/gui/bufferqueue/1.0/H2BGraphicBufferProducer.cpp b/libs/gui/bufferqueue/1.0/H2BGraphicBufferProducer.cpp index b1a23b309e..fd8ffe1f01 100644 --- a/libs/gui/bufferqueue/1.0/H2BGraphicBufferProducer.cpp +++ b/libs/gui/bufferqueue/1.0/H2BGraphicBufferProducer.cpp @@ -971,7 +971,7 @@ inline HGraphicBufferProducer::DisconnectMode toHDisconnectMode( // H2BGraphicBufferProducer status_t H2BGraphicBufferProducer::requestBuffer(int slot, sp* buf) { - *buf = sp::make(); + *buf = new GraphicBuffer(); status_t fnStatus; status_t transStatus = toStatusT(mBase->requestBuffer( static_cast(slot), @@ -999,7 +999,7 @@ status_t H2BGraphicBufferProducer::dequeueBuffer(int* slot, sp* fence, ui uint32_t h, ::android::PixelFormat format, uint64_t usage, uint64_t* outBufferAge, FrameEventHistoryDelta* outTimestamps) { - *fence = sp::make(); + *fence = new Fence(); status_t fnStatus; status_t transStatus = toStatusT(mBase->dequeueBuffer( w, h, static_cast(format), uint32_t(usage), @@ -1035,8 +1035,8 @@ status_t H2BGraphicBufferProducer::detachBuffer(int slot) { status_t H2BGraphicBufferProducer::detachNextBuffer( sp* outBuffer, sp* outFence) { - *outBuffer = sp::make(); - *outFence = sp::make(); + *outBuffer = new GraphicBuffer(); + *outFence = new Fence(); status_t fnStatus; status_t transStatus = toStatusT(mBase->detachNextBuffer( [&fnStatus, outBuffer, outFence] ( @@ -1127,8 +1127,8 @@ int H2BGraphicBufferProducer::query(int what, int* value) { status_t H2BGraphicBufferProducer::connect( const sp& listener, int api, bool producerControlledByApp, QueueBufferOutput* output) { - sp tListener = - listener == nullptr ? nullptr : sp::make(listener); + sp tListener = listener == nullptr ? + nullptr : new B2HProducerListener(listener); status_t fnStatus; status_t transStatus = toStatusT(mBase->connect( tListener, static_cast(api), producerControlledByApp, @@ -1205,13 +1205,13 @@ status_t H2BGraphicBufferProducer::getLastQueuedBuffer( hidl_handle const& fence, hidl_array const& transformMatrix) { fnStatus = toStatusT(status); - *outBuffer = sp::make(); + *outBuffer = new GraphicBuffer(); if (!convertTo(outBuffer->get(), buffer)) { ALOGE("H2BGraphicBufferProducer::getLastQueuedBuffer - " "Invalid output buffer"); fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus; } - *outFence = sp::make(); + *outFence = new Fence(); if (!convertTo(outFence->get(), fence)) { ALOGE("H2BGraphicBufferProducer::getLastQueuedBuffer - " "Invalid output fence"); diff --git a/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp b/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp index 4384bd5faa..c76d771262 100644 --- a/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp +++ b/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp @@ -272,7 +272,7 @@ Return B2HGraphicBufferProducer::connect( HConnectionType hConnectionType, bool producerControlledByApp, connect_cb _hidl_cb) { - sp bListener = sp::make(hListener); + sp bListener = new H2BProducerListener(hListener); int bConnectionType{}; if (!bListener || !h2b(hConnectionType, &bConnectionType)) { _hidl_cb(HStatus::UNKNOWN_ERROR, QueueBufferOutput{}); diff --git a/libs/gui/bufferqueue/2.0/H2BGraphicBufferProducer.cpp b/libs/gui/bufferqueue/2.0/H2BGraphicBufferProducer.cpp index 7121bb7aef..ae00a2642e 100644 --- a/libs/gui/bufferqueue/2.0/H2BGraphicBufferProducer.cpp +++ b/libs/gui/bufferqueue/2.0/H2BGraphicBufferProducer.cpp @@ -325,7 +325,7 @@ status_t H2BGraphicBufferProducer::connect( } sp hListener = nullptr; if (listener && listener->needsReleaseNotify()) { - hListener = sp::make(listener); + hListener = new B2HProducerListener(listener); if (!hListener) { LOG(ERROR) << "connect: failed to wrap listener."; return UNKNOWN_ERROR; diff --git a/libs/gui/bufferqueue/2.0/types.cpp b/libs/gui/bufferqueue/2.0/types.cpp index 9890da398d..cbd6cad847 100644 --- a/libs/gui/bufferqueue/2.0/types.cpp +++ b/libs/gui/bufferqueue/2.0/types.cpp @@ -147,13 +147,13 @@ bool b2h(sp const& from, HFenceWrapper* to) { bool h2b(native_handle_t const* from, sp* to) { if (!from || from->numFds == 0) { - *to = sp<::android::Fence>::make(); + *to = new ::android::Fence(); return true; } if (from->numFds != 1 || from->numInts != 0) { return false; } - *to = sp::make(dup(from->data[0])); + *to = new BFence(dup(from->data[0])); return true; } @@ -288,7 +288,7 @@ bool h2b(HardwareBuffer const& from, sp* to) { &hwBuffer) != OK) { return false; } - *to = sp::fromExisting(GraphicBuffer::fromAHardwareBuffer(hwBuffer)); + *to = GraphicBuffer::fromAHardwareBuffer(hwBuffer); AHardwareBuffer_release(hwBuffer); return true; } diff --git a/libs/gui/include/gui/StreamSplitter.h b/libs/gui/include/gui/StreamSplitter.h index 8176f753c3..28237b6940 100644 --- a/libs/gui/include/gui/StreamSplitter.h +++ b/libs/gui/include/gui/StreamSplitter.h @@ -153,8 +153,6 @@ private: size_t mReleaseCount; }; - friend class sp; - // Only called from createSplitter explicit StreamSplitter(const sp& inputQueue); -- cgit v1.2.3-59-g8ed1b From f9f3f967739483b5f5d771ff08fc2e84a9b0bbce Mon Sep 17 00:00:00 2001 From: Gil Dekel Date: Wed, 19 Feb 2025 19:32:54 -0500 Subject: SF: Allow multiple invalid stack layers through to CE Currently, all duplicate stack layers are denied passage to the CompositionEngine. This makes sense when dealing with per-display on-screen content, but breaks apart if for mirrored and off-screen content. Allow multiple invalid (-1) stack layers through, as this state is used to represent stack layers that can be updated safely by multiple sources or are associated with one source. Fixes: 397775142 Test: atest SurfaceFlinger_test, atest MultiDisplayTest Flag: com.android.graphics.surfaceflinger.flags.reject_dupe_layerstacks Change-Id: Ic103471a8cc997eb30e7f14d08559e351b01b801 --- services/surfaceflinger/SurfaceFlinger.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index afbe20daae..98abd10bee 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2856,18 +2856,20 @@ CompositeResultsPerDisplay SurfaceFlinger::composite( // Tracks layer stacks of displays that are added to CompositionEngine output. ui::DisplayMap outputLayerStacks; - auto isOutputLayerStack = [&outputLayerStacks](DisplayId id, ui::LayerStack layerStack) { - if (FlagManager::getInstance().reject_dupe_layerstacks() && - outputLayerStacks.contains(layerStack)) { - // TODO: remove log and DisplayId from params once reject_dupe_layerstacks flag is - // removed - ALOGD("Existing layer stack ID %d output to another display %" PRIu64 - ", dropping display from outputs", - layerStack.id, id.value); - return true; + auto isUniqueOutputLayerStack = [&outputLayerStacks](DisplayId id, ui::LayerStack layerStack) { + if (FlagManager::getInstance().reject_dupe_layerstacks()) { + if (layerStack != ui::INVALID_LAYER_STACK && outputLayerStacks.contains(layerStack)) { + // TODO: remove log and DisplayId from params once reject_dupe_layerstacks flag is + // removed + ALOGD("Existing layer stack ID %d output to another display %" PRIu64 + ", dropping display from outputs", + layerStack.id, id.value); + return false; + } } + outputLayerStacks.try_emplace(layerStack); - return false; + return true; }; // Add outputs for physical displays. @@ -2876,7 +2878,7 @@ CompositeResultsPerDisplay SurfaceFlinger::composite( if (const auto display = getCompositionDisplayLocked(id)) { const auto layerStack = physicalDisplayLayerStacks.get(id)->get(); - if (!isOutputLayerStack(display->getId(), layerStack)) { + if (isUniqueOutputLayerStack(display->getId(), layerStack)) { refreshArgs.outputs.push_back(display); } } @@ -2895,7 +2897,7 @@ CompositeResultsPerDisplay SurfaceFlinger::composite( if (!refreshRate.isValid() || mScheduler->isVsyncInPhase(pacesetterTarget.frameBeginTime(), refreshRate)) { - if (!isOutputLayerStack(display->getId(), display->getLayerStack())) { + if (isUniqueOutputLayerStack(display->getId(), display->getLayerStack())) { refreshArgs.outputs.push_back(display->getCompositionDisplay()); } } -- cgit v1.2.3-59-g8ed1b From a7135105da0898ef42bb8b35442ac4a690434a09 Mon Sep 17 00:00:00 2001 From: Sally Qi Date: Tue, 11 Feb 2025 23:23:25 -0800 Subject: [Lut] Add support to dump luts for debugging Bug: 396031463 Test: builds; Flag: EXEMPT add dumps Change-Id: I9482ae8e04c5f6104b73611a994e101bdc07c9d5 --- libs/gui/include/gui/DisplayLuts.h | 99 ++++++++++++++++++++++ .../include/renderengine/LayerSettings.h | 4 + 2 files changed, 103 insertions(+) diff --git a/libs/gui/include/gui/DisplayLuts.h b/libs/gui/include/gui/DisplayLuts.h index ab86ac4af8..187381c4ae 100644 --- a/libs/gui/include/gui/DisplayLuts.h +++ b/libs/gui/include/gui/DisplayLuts.h @@ -18,6 +18,10 @@ #include #include #include +#include +#include +#include +#include #include namespace android::gui { @@ -62,4 +66,99 @@ private: base::unique_fd fd; }; // struct DisplayLuts +static inline void PrintTo(const std::vector& offsets, ::std::ostream* os) { + *os << "\n .offsets = {"; + for (size_t i = 0; i < offsets.size(); i++) { + *os << offsets[i]; + if (i != offsets.size() - 1) { + *os << ", "; + } + } + *os << "}"; +} + +static inline void PrintTo(const std::vector& entries, ::std::ostream* os) { + *os << "\n .lutProperties = {\n"; + for (auto& [dimension, size, samplingKey] : entries) { + *os << " Entry{" + << "dimension: " << dimension << ", size: " << size << ", samplingKey: " << samplingKey + << "}\n"; + } + *os << " }"; +} + +static constexpr size_t kMaxPrintCount = 100; + +static inline void PrintTo(const std::vector& buffer, size_t offset, int32_t dimension, + size_t size, ::std::ostream* os) { + size_t range = std::min(size, kMaxPrintCount); + *os << "{"; + if (dimension == 1) { + for (size_t i = 0; i < range; i++) { + *os << buffer[offset + i]; + if (i != range - 1) { + *os << ", "; + } + } + } else { + *os << "\n {R channel:"; + for (size_t i = 0; i < range; i++) { + *os << buffer[offset + i]; + if (i != range - 1) { + *os << ", "; + } + } + *os << "}\n {G channel:"; + for (size_t i = 0; i < range; i++) { + *os << buffer[offset + size + i]; + if (i != range - 1) { + *os << ", "; + } + } + *os << "}\n {B channel:"; + for (size_t i = 0; i < range; i++) { + *os << buffer[offset + 2 * size + i]; + if (i != range - 1) { + *os << ", "; + } + } + } + *os << "}"; +} + +static inline void PrintTo(const std::shared_ptr luts, ::std::ostream* os) { + *os << "gui::DisplayLuts {"; + auto& fd = luts->getLutFileDescriptor(); + *os << "\n .pfd = " << fd.get(); + if (fd.ok()) { + PrintTo(luts->offsets, os); + PrintTo(luts->lutProperties, os); + // decode luts + int32_t fullLength = luts->offsets[luts->offsets.size() - 1]; + if (luts->lutProperties[luts->offsets.size() - 1].dimension == 1) { + fullLength += luts->lutProperties[luts->offsets.size() - 1].size; + } else { + fullLength += (luts->lutProperties[luts->offsets.size() - 1].size * + luts->lutProperties[luts->offsets.size() - 1].size * + luts->lutProperties[luts->offsets.size() - 1].size * 3); + } + size_t bufferSize = static_cast(fullLength) * sizeof(float); + float* ptr = (float*)mmap(NULL, bufferSize, PROT_READ, MAP_SHARED, fd.get(), 0); + if (ptr == MAP_FAILED) { + *os << "\n .bufferdata cannot mmap!"; + return; + } + std::vector buffers(ptr, ptr + fullLength); + munmap(ptr, bufferSize); + + *os << "\n .bufferdata = "; + for (size_t i = 0; i < luts->offsets.size(); i++) { + PrintTo(buffers, static_cast(luts->offsets[i]), + luts->lutProperties[i].dimension, + static_cast(luts->lutProperties[i].size), os); + } + } + *os << "\n }"; +} + } // namespace android::gui \ No newline at end of file diff --git a/libs/renderengine/include/renderengine/LayerSettings.h b/libs/renderengine/include/renderengine/LayerSettings.h index ac43da8dcf..ecb16b2e17 100644 --- a/libs/renderengine/include/renderengine/LayerSettings.h +++ b/libs/renderengine/include/renderengine/LayerSettings.h @@ -301,6 +301,10 @@ static inline void PrintTo(const LayerSettings& settings, ::std::ostream* os) { *os << "\n .edgeExtensionEffect = " << settings.edgeExtensionEffect; } *os << "\n .whitePointNits = " << settings.whitePointNits; + if (settings.luts) { + *os << "\n .luts = "; + PrintTo(settings.luts, os); + } *os << "\n}"; } -- cgit v1.2.3-59-g8ed1b