From 2b3f3cd22249270bddd1834dba5605491726d2a4 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Fri, 31 Jan 2020 14:56:45 -0800 Subject: Remove need for libbinderthreadstate. Instead of having this library, libbinder/libhwbinder can keep track of stack pointers so that when they recurse, we know which one was visited most recently. As with the original implementation of libbinderthreadstate, this is somewhat of a hack. An explanation of why this is and what to do instead is added in CallerUtils.h. Bug: 148692216 Test: libbinderthreadstateutils_test Change-Id: Ief28663728fb8786b06bf9e72238052b9af81d87 --- libs/gui/BufferQueueThreadState.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'libs/gui/BufferQueueThreadState.cpp') diff --git a/libs/gui/BufferQueueThreadState.cpp b/libs/gui/BufferQueueThreadState.cpp index 3b531ec752..c13030b1ed 100644 --- a/libs/gui/BufferQueueThreadState.cpp +++ b/libs/gui/BufferQueueThreadState.cpp @@ -15,6 +15,7 @@ */ #include +#include #include #include #include @@ -22,14 +23,14 @@ namespace android { uid_t BufferQueueThreadState::getCallingUid() { - if (hardware::IPCThreadState::self()->isServingCall()) { + if (getCurrentServingCall() == BinderCallType::HWBINDER) { return hardware::IPCThreadState::self()->getCallingUid(); } return IPCThreadState::self()->getCallingUid(); } pid_t BufferQueueThreadState::getCallingPid() { - if (hardware::IPCThreadState::self()->isServingCall()) { + if (getCurrentServingCall() == BinderCallType::HWBINDER) { return hardware::IPCThreadState::self()->getCallingPid(); } return IPCThreadState::self()->getCallingPid(); -- cgit v1.2.3-59-g8ed1b From 62493096843ffd4fd2a134588181599727f1c10d Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Wed, 15 Jan 2020 16:04:47 -0800 Subject: Remove libbinder usage from media.swcodec apex libgui_bufferqueue_static is used by com.android.media.swcodec apex which doesn't do any IPC through binder. Remove binder dependency to eliminate any possibility of IPC via any unstable interfaces. b/147759770 b/139201422 test: atest CtsMediaTestCases -- --module-arg CtsMediaTestCases:size:small Change-Id: I98dbe751527bf4725c7764ba21f46b6af60968b4 --- libs/gui/Android.bp | 27 ++-- libs/gui/BufferQueueConsumer.cpp | 12 +- libs/gui/BufferQueueProducer.cpp | 8 +- libs/gui/BufferQueueThreadState.cpp | 10 ++ libs/gui/IConsumerListener.cpp | 1 - libs/gui/IGraphicBufferProducer.cpp | 128 ----------------- libs/gui/IProducerListener.cpp | 2 - libs/gui/QueueBufferInputOutput.cpp | 159 +++++++++++++++++++++ libs/gui/bufferqueue/1.0/Conversion.cpp | 65 --------- libs/gui/bufferqueue/1.0/H2BProducerListener.cpp | 4 + libs/gui/bufferqueue/1.0/WProducerListener.cpp | 2 + .../bufferqueue/2.0/B2HGraphicBufferProducer.cpp | 26 ++++ libs/gui/bufferqueue/2.0/H2BProducerListener.cpp | 7 + libs/gui/include/gui/BufferQueueProducer.h | 5 + libs/gui/include/gui/IConsumerListener.h | 8 ++ libs/gui/include/gui/IGraphicBufferConsumer.h | 11 +- libs/gui/include/gui/IGraphicBufferProducer.h | 32 +++-- libs/gui/include/gui/IProducerListener.h | 7 + libs/gui/include/gui/bufferqueue/1.0/Conversion.h | 11 -- .../gui/bufferqueue/1.0/H2BProducerListener.h | 5 + .../gui/bufferqueue/1.0/WGraphicBufferProducer.h | 1 - .../gui/bufferqueue/1.0/WProducerListener.h | 2 +- .../gui/bufferqueue/2.0/B2HGraphicBufferProducer.h | 2 + .../gui/bufferqueue/2.0/H2BProducerListener.h | 8 ++ 24 files changed, 307 insertions(+), 236 deletions(-) create mode 100644 libs/gui/QueueBufferInputOutput.cpp (limited to 'libs/gui/BufferQueueThreadState.cpp') diff --git a/libs/gui/Android.bp b/libs/gui/Android.bp index 40c044df0a..99d385624b 100644 --- a/libs/gui/Android.bp +++ b/libs/gui/Android.bp @@ -55,7 +55,11 @@ cc_library_shared { "DisplayEventReceiver.cpp", "GLConsumer.cpp", "GuiConfig.cpp", + "IConsumerListener.cpp", "IDisplayEventConnection.cpp", + "IGraphicBufferConsumer.cpp", + "IGraphicBufferProducer.cpp", + "IProducerListener.cpp", "IRegionSamplingListener.cpp", "ISurfaceComposer.cpp", "ISurfaceComposerClient.cpp", @@ -63,22 +67,32 @@ cc_library_shared { "LayerDebugInfo.cpp", "LayerMetadata.cpp", "LayerState.cpp", + "OccupancyTracker.cpp", "StreamSplitter.cpp", "Surface.cpp", "SurfaceControl.cpp", "SurfaceComposerClient.cpp", "SyncFeatures.cpp", "view/Surface.cpp", + "bufferqueue/1.0/B2HProducerListener.cpp", + "bufferqueue/1.0/H2BGraphicBufferProducer.cpp", + "bufferqueue/2.0/B2HProducerListener.cpp", + "bufferqueue/2.0/H2BGraphicBufferProducer.cpp", ], shared_libs: [ "android.frameworks.bufferhub@1.0", + "libbinder", "libbufferhub", "libbufferhubqueue", // TODO(b/70046255): Remove this once BufferHub is integrated into libgui. "libinput", "libpdx_default_transport", ], + export_shared_lib_headers: [ + "libbinder", + ], + // bufferhub is not used when building libgui for vendors target: { vendor: { @@ -118,6 +132,7 @@ cc_library_static { cflags: [ "-DNO_BUFFERHUB", + "-DNO_BINDER", ], defaults: ["libgui_bufferqueue-defaults"], @@ -140,19 +155,11 @@ filegroup { "FrameTimestamps.cpp", "GLConsumerUtils.cpp", "HdrMetadata.cpp", - "IConsumerListener.cpp", - "IGraphicBufferConsumer.cpp", - "IGraphicBufferProducer.cpp", - "IProducerListener.cpp", - "OccupancyTracker.cpp", - "bufferqueue/1.0/B2HProducerListener.cpp", + "QueueBufferInputOutput.cpp", "bufferqueue/1.0/Conversion.cpp", - "bufferqueue/1.0/H2BGraphicBufferProducer.cpp", "bufferqueue/1.0/H2BProducerListener.cpp", "bufferqueue/1.0/WProducerListener.cpp", "bufferqueue/2.0/B2HGraphicBufferProducer.cpp", - "bufferqueue/2.0/B2HProducerListener.cpp", - "bufferqueue/2.0/H2BGraphicBufferProducer.cpp", "bufferqueue/2.0/H2BProducerListener.cpp", "bufferqueue/2.0/types.cpp", ], @@ -189,7 +196,6 @@ cc_defaults { "android.hardware.graphics.common@1.2", "android.hidl.token@1.0-utils", "libbase", - "libbinder", "libcutils", "libEGL", "libGLESv2", @@ -212,7 +218,6 @@ cc_defaults { ], export_shared_lib_headers: [ - "libbinder", "libEGL", "libnativewindow", "libui", diff --git a/libs/gui/BufferQueueConsumer.cpp b/libs/gui/BufferQueueConsumer.cpp index 9b74fef752..4435265bb2 100644 --- a/libs/gui/BufferQueueConsumer.cpp +++ b/libs/gui/BufferQueueConsumer.cpp @@ -66,6 +66,8 @@ namespace android { mCore->mUniqueId, mCore->mConnectedApi, mCore->mConnectedPid, (mCore->mUniqueId) >> 32, \ ##__VA_ARGS__) +ConsumerListener::~ConsumerListener() = default; + BufferQueueConsumer::BufferQueueConsumer(const sp& core) : mCore(core), mSlots(core->mSlots), @@ -291,8 +293,9 @@ status_t BufferQueueConsumer::acquireBuffer(BufferItem* outBuffer, ATRACE_INT(mCore->mConsumerName.string(), static_cast(mCore->mQueue.size())); +#ifndef NO_BINDER mCore->mOccupancyTracker.registerOccupancyChange(mCore->mQueue.size()); - +#endif VALIDATE_CONSISTENCY(); } @@ -765,7 +768,12 @@ status_t BufferQueueConsumer::getSidebandStream(sp* outStream) con status_t BufferQueueConsumer::getOccupancyHistory(bool forceFlush, std::vector* outHistory) { std::lock_guard lock(mCore->mMutex); +#ifndef NO_BINDER *outHistory = mCore->mOccupancyTracker.getSegmentHistory(forceFlush); +#else + (void)forceFlush; + outHistory->clear(); +#endif return NO_ERROR; } @@ -798,7 +806,7 @@ status_t BufferQueueConsumer::dumpState(const String8& prefix, String8* outResul bool denied = false; const uid_t uid = BufferQueueThreadState::getCallingUid(); -#ifndef __ANDROID_VNDK__ +#if !defined(__ANDROID_VNDK__) && !defined(NO_BINDER) // permission check can't be done for vendors as vendors have no access to // the PermissionController. We need to do a runtime check as well, since // the system variant of libgui can be loaded in a vendor process. For eg: diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp index 6b11a54e2b..9e86838592 100644 --- a/libs/gui/BufferQueueProducer.cpp +++ b/libs/gui/BufferQueueProducer.cpp @@ -67,6 +67,7 @@ namespace android { ##__VA_ARGS__) static constexpr uint32_t BQ_LAYER_COUNT = 1; +ProducerListener::~ProducerListener() = default; BufferQueueProducer::BufferQueueProducer(const sp& core, bool consumerIsSurfaceFlinger) : @@ -1005,8 +1006,9 @@ status_t BufferQueueProducer::queueBuffer(int slot, ATRACE_INT(mCore->mConsumerName.string(), static_cast(mCore->mQueue.size())); +#ifndef NO_BINDER mCore->mOccupancyTracker.registerOccupancyChange(mCore->mQueue.size()); - +#endif // Take a ticket for the callback functions callbackTicket = mNextCallbackTicket++; @@ -1252,6 +1254,7 @@ status_t BufferQueueProducer::connect(const sp& listener, if (listener != nullptr) { // Set up a death notification so that we can disconnect // automatically if the remote producer dies +#ifndef NO_BINDER if (IInterface::asBinder(listener)->remoteBinder() != nullptr) { status = IInterface::asBinder(listener)->linkToDeath( static_cast(this)); @@ -1261,6 +1264,7 @@ status_t BufferQueueProducer::connect(const sp& listener, } mCore->mLinkedToDeath = listener; } +#endif mCore->mConnectedProducerListener = listener; mCore->mBufferReleasedCbEnabled = listener->needsReleaseNotify(); } @@ -1329,6 +1333,7 @@ status_t BufferQueueProducer::disconnect(int api, DisconnectMode mode) { if (mCore->mConnectedApi == api) { mCore->freeAllBuffersLocked(); +#ifndef NO_BINDER // Remove our death notification callback if we have one if (mCore->mLinkedToDeath != nullptr) { sp token = @@ -1338,6 +1343,7 @@ status_t BufferQueueProducer::disconnect(int api, DisconnectMode mode) { token->unlinkToDeath( static_cast(this)); } +#endif mCore->mSharedBufferSlot = BufferQueueCore::INVALID_BUFFER_SLOT; mCore->mLinkedToDeath = nullptr; diff --git a/libs/gui/BufferQueueThreadState.cpp b/libs/gui/BufferQueueThreadState.cpp index c13030b1ed..976c9b9d50 100644 --- a/libs/gui/BufferQueueThreadState.cpp +++ b/libs/gui/BufferQueueThreadState.cpp @@ -14,8 +14,10 @@ * limitations under the License. */ +#ifndef NO_BINDER #include #include +#endif // NO_BINDER #include #include #include @@ -23,17 +25,25 @@ namespace android { uid_t BufferQueueThreadState::getCallingUid() { +#ifndef NO_BINDER if (getCurrentServingCall() == BinderCallType::HWBINDER) { return hardware::IPCThreadState::self()->getCallingUid(); } return IPCThreadState::self()->getCallingUid(); +#else // NO_BINDER + return hardware::IPCThreadState::self()->getCallingUid(); +#endif // NO_BINDER } pid_t BufferQueueThreadState::getCallingPid() { +#ifndef NO_BINDER if (getCurrentServingCall() == BinderCallType::HWBINDER) { return hardware::IPCThreadState::self()->getCallingPid(); } return IPCThreadState::self()->getCallingPid(); +#else // NO_BINDER + return hardware::IPCThreadState::self()->getCallingPid(); +#endif // NO_BINDER } } // namespace android diff --git a/libs/gui/IConsumerListener.cpp b/libs/gui/IConsumerListener.cpp index 48cb4b9db8..f3bd90cffb 100644 --- a/libs/gui/IConsumerListener.cpp +++ b/libs/gui/IConsumerListener.cpp @@ -90,7 +90,6 @@ public: // Out-of-line virtual method definitions to trigger vtable emission in this translation unit (see // clang warning -Wweak-vtables) BpConsumerListener::~BpConsumerListener() = default; -ConsumerListener::~ConsumerListener() = default; IMPLEMENT_META_INTERFACE(ConsumerListener, "android.gui.IConsumerListener"); diff --git a/libs/gui/IGraphicBufferProducer.cpp b/libs/gui/IGraphicBufferProducer.cpp index 75876f26f3..7b5596e43c 100644 --- a/libs/gui/IGraphicBufferProducer.cpp +++ b/libs/gui/IGraphicBufferProducer.cpp @@ -1113,133 +1113,5 @@ IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) parcel.read(*this); } -constexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() { - return sizeof(timestamp) + - sizeof(isAutoTimestamp) + - sizeof(dataSpace) + - sizeof(crop) + - sizeof(scalingMode) + - sizeof(transform) + - sizeof(stickyTransform) + - sizeof(getFrameTimestamps); -} - -size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { - return minFlattenedSize() + - fence->getFlattenedSize() + - surfaceDamage.getFlattenedSize() + - hdrMetadata.getFlattenedSize(); -} - -size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const { - return fence->getFdCount(); -} - -status_t IGraphicBufferProducer::QueueBufferInput::flatten( - void*& buffer, size_t& size, int*& fds, size_t& count) const -{ - if (size < getFlattenedSize()) { - return NO_MEMORY; - } - - FlattenableUtils::write(buffer, size, timestamp); - FlattenableUtils::write(buffer, size, isAutoTimestamp); - FlattenableUtils::write(buffer, size, dataSpace); - FlattenableUtils::write(buffer, size, crop); - FlattenableUtils::write(buffer, size, scalingMode); - FlattenableUtils::write(buffer, size, transform); - FlattenableUtils::write(buffer, size, stickyTransform); - FlattenableUtils::write(buffer, size, getFrameTimestamps); - - status_t result = fence->flatten(buffer, size, fds, count); - if (result != NO_ERROR) { - return result; - } - result = surfaceDamage.flatten(buffer, size); - if (result != NO_ERROR) { - return result; - } - FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize()); - return hdrMetadata.flatten(buffer, size); -} - -status_t IGraphicBufferProducer::QueueBufferInput::unflatten( - void const*& buffer, size_t& size, int const*& fds, size_t& count) -{ - if (size < minFlattenedSize()) { - return NO_MEMORY; - } - - FlattenableUtils::read(buffer, size, timestamp); - FlattenableUtils::read(buffer, size, isAutoTimestamp); - FlattenableUtils::read(buffer, size, dataSpace); - FlattenableUtils::read(buffer, size, crop); - FlattenableUtils::read(buffer, size, scalingMode); - FlattenableUtils::read(buffer, size, transform); - FlattenableUtils::read(buffer, size, stickyTransform); - FlattenableUtils::read(buffer, size, getFrameTimestamps); - - fence = new Fence(); - status_t result = fence->unflatten(buffer, size, fds, count); - if (result != NO_ERROR) { - return result; - } - result = surfaceDamage.unflatten(buffer, size); - if (result != NO_ERROR) { - return result; - } - FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize()); - return hdrMetadata.unflatten(buffer, size); -} - -// ---------------------------------------------------------------------------- -constexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() { - return sizeof(width) + sizeof(height) + sizeof(transformHint) + sizeof(numPendingBuffers) + - sizeof(nextFrameNumber) + sizeof(bufferReplaced) + sizeof(maxBufferCount); -} - -size_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const { - return minFlattenedSize() + frameTimestamps.getFlattenedSize(); -} - -size_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const { - return frameTimestamps.getFdCount(); -} - -status_t IGraphicBufferProducer::QueueBufferOutput::flatten( - void*& buffer, size_t& size, int*& fds, size_t& count) const -{ - if (size < getFlattenedSize()) { - return NO_MEMORY; - } - - FlattenableUtils::write(buffer, size, width); - FlattenableUtils::write(buffer, size, height); - FlattenableUtils::write(buffer, size, transformHint); - FlattenableUtils::write(buffer, size, numPendingBuffers); - FlattenableUtils::write(buffer, size, nextFrameNumber); - FlattenableUtils::write(buffer, size, bufferReplaced); - FlattenableUtils::write(buffer, size, maxBufferCount); - - return frameTimestamps.flatten(buffer, size, fds, count); -} - -status_t IGraphicBufferProducer::QueueBufferOutput::unflatten( - void const*& buffer, size_t& size, int const*& fds, size_t& count) -{ - if (size < minFlattenedSize()) { - return NO_MEMORY; - } - - FlattenableUtils::read(buffer, size, width); - FlattenableUtils::read(buffer, size, height); - FlattenableUtils::read(buffer, size, transformHint); - FlattenableUtils::read(buffer, size, numPendingBuffers); - FlattenableUtils::read(buffer, size, nextFrameNumber); - FlattenableUtils::read(buffer, size, bufferReplaced); - FlattenableUtils::read(buffer, size, maxBufferCount); - - return frameTimestamps.unflatten(buffer, size, fds, count); -} }; // namespace android diff --git a/libs/gui/IProducerListener.cpp b/libs/gui/IProducerListener.cpp index 808e3369f1..5c81b9d7db 100644 --- a/libs/gui/IProducerListener.cpp +++ b/libs/gui/IProducerListener.cpp @@ -119,8 +119,6 @@ status_t BnProducerListener::onTransact(uint32_t code, const Parcel& data, return BBinder::onTransact(code, data, reply, flags); } -ProducerListener::~ProducerListener() = default; - DummyProducerListener::~DummyProducerListener() = default; bool BnProducerListener::needsReleaseNotify() { diff --git a/libs/gui/QueueBufferInputOutput.cpp b/libs/gui/QueueBufferInputOutput.cpp new file mode 100644 index 0000000000..30f0ef6785 --- /dev/null +++ b/libs/gui/QueueBufferInputOutput.cpp @@ -0,0 +1,159 @@ +/* + * Copyright 2010 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. + */ + +#include + +#define LOG_TAG "QueueBufferInputOutput" +#define ATRACE_TAG ATRACE_TAG_GRAPHICS +//#define LOG_NDEBUG 0 + +#include + +namespace android { + +constexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() { + return sizeof(timestamp) + + sizeof(isAutoTimestamp) + + sizeof(dataSpace) + + sizeof(crop) + + sizeof(scalingMode) + + sizeof(transform) + + sizeof(stickyTransform) + + sizeof(getFrameTimestamps); +} + +IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) { + parcel.read(*this); +} + +size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { + return minFlattenedSize() + + fence->getFlattenedSize() + + surfaceDamage.getFlattenedSize() + + hdrMetadata.getFlattenedSize(); +} + +size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const { + return fence->getFdCount(); +} + +status_t IGraphicBufferProducer::QueueBufferInput::flatten( + void*& buffer, size_t& size, int*& fds, size_t& count) const +{ + if (size < getFlattenedSize()) { + return NO_MEMORY; + } + + FlattenableUtils::write(buffer, size, timestamp); + FlattenableUtils::write(buffer, size, isAutoTimestamp); + FlattenableUtils::write(buffer, size, dataSpace); + FlattenableUtils::write(buffer, size, crop); + FlattenableUtils::write(buffer, size, scalingMode); + FlattenableUtils::write(buffer, size, transform); + FlattenableUtils::write(buffer, size, stickyTransform); + FlattenableUtils::write(buffer, size, getFrameTimestamps); + + status_t result = fence->flatten(buffer, size, fds, count); + if (result != NO_ERROR) { + return result; + } + result = surfaceDamage.flatten(buffer, size); + if (result != NO_ERROR) { + return result; + } + FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize()); + return hdrMetadata.flatten(buffer, size); +} + +status_t IGraphicBufferProducer::QueueBufferInput::unflatten( + void const*& buffer, size_t& size, int const*& fds, size_t& count) +{ + if (size < minFlattenedSize()) { + return NO_MEMORY; + } + + FlattenableUtils::read(buffer, size, timestamp); + FlattenableUtils::read(buffer, size, isAutoTimestamp); + FlattenableUtils::read(buffer, size, dataSpace); + FlattenableUtils::read(buffer, size, crop); + FlattenableUtils::read(buffer, size, scalingMode); + FlattenableUtils::read(buffer, size, transform); + FlattenableUtils::read(buffer, size, stickyTransform); + FlattenableUtils::read(buffer, size, getFrameTimestamps); + + fence = new Fence(); + status_t result = fence->unflatten(buffer, size, fds, count); + if (result != NO_ERROR) { + return result; + } + result = surfaceDamage.unflatten(buffer, size); + if (result != NO_ERROR) { + return result; + } + FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize()); + return hdrMetadata.unflatten(buffer, size); +} + +//////////////////////////////////////////////////////////////////////// +constexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() { + return sizeof(width) + sizeof(height) + sizeof(transformHint) + sizeof(numPendingBuffers) + + sizeof(nextFrameNumber) + sizeof(bufferReplaced) + sizeof(maxBufferCount); +} +size_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const { + return minFlattenedSize() + frameTimestamps.getFlattenedSize(); +} + +size_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const { + return frameTimestamps.getFdCount(); +} + +status_t IGraphicBufferProducer::QueueBufferOutput::flatten( + void*& buffer, size_t& size, int*& fds, size_t& count) const +{ + if (size < getFlattenedSize()) { + return NO_MEMORY; + } + + FlattenableUtils::write(buffer, size, width); + FlattenableUtils::write(buffer, size, height); + FlattenableUtils::write(buffer, size, transformHint); + FlattenableUtils::write(buffer, size, numPendingBuffers); + FlattenableUtils::write(buffer, size, nextFrameNumber); + FlattenableUtils::write(buffer, size, bufferReplaced); + FlattenableUtils::write(buffer, size, maxBufferCount); + + return frameTimestamps.flatten(buffer, size, fds, count); +} + +status_t IGraphicBufferProducer::QueueBufferOutput::unflatten( + void const*& buffer, size_t& size, int const*& fds, size_t& count) +{ + if (size < minFlattenedSize()) { + return NO_MEMORY; + } + + FlattenableUtils::read(buffer, size, width); + FlattenableUtils::read(buffer, size, height); + FlattenableUtils::read(buffer, size, transformHint); + FlattenableUtils::read(buffer, size, numPendingBuffers); + FlattenableUtils::read(buffer, size, nextFrameNumber); + FlattenableUtils::read(buffer, size, bufferReplaced); + FlattenableUtils::read(buffer, size, maxBufferCount); + + return frameTimestamps.unflatten(buffer, size, fds, count); +} + +} // namespace android diff --git a/libs/gui/bufferqueue/1.0/Conversion.cpp b/libs/gui/bufferqueue/1.0/Conversion.cpp index 5cb35933e9..3e20a37d54 100644 --- a/libs/gui/bufferqueue/1.0/Conversion.cpp +++ b/libs/gui/bufferqueue/1.0/Conversion.cpp @@ -108,20 +108,6 @@ status_t toStatusT(Return const& t) { return t.isOk() ? OK : (t.isDeadObject() ? DEAD_OBJECT : UNKNOWN_ERROR); } -/** - * \brief Convert `Return` to `binder::Status`. - * - * \param[in] t The source `Return`. - * \return The corresponding `binder::Status`. - */ -// convert: Return -> ::android::binder::Status -::android::binder::Status toBinderStatus( - Return const& t) { - return ::android::binder::Status::fromExceptionCode( - toStatusT(t), - t.description().c_str()); -} - /** * \brief Wrap `native_handle_t*` in `hidl_handle`. * @@ -1337,57 +1323,6 @@ status_t unflatten( return unflatten(&(t->surfaceDamage), buffer, size); } -/** - * \brief Wrap `BGraphicBufferProducer::QueueBufferInput` in - * `HGraphicBufferProducer::QueueBufferInput`. - * - * \param[out] t The wrapper of type - * `HGraphicBufferProducer::QueueBufferInput`. - * \param[out] nh The underlying native handle for `t->fence`. - * \param[in] l The source `BGraphicBufferProducer::QueueBufferInput`. - * - * If the return value is `true` and `t->fence` contains a valid file - * descriptor, \p nh will be a newly created native handle holding that file - * descriptor. \p nh needs to be deleted with `native_handle_delete()` - * afterwards. - */ -bool wrapAs( - HGraphicBufferProducer::QueueBufferInput* t, - native_handle_t** nh, - BGraphicBufferProducer::QueueBufferInput const& l) { - - size_t const baseSize = l.getFlattenedSize(); - std::unique_ptr baseBuffer( - new (std::nothrow) uint8_t[baseSize]); - if (!baseBuffer) { - return false; - } - - size_t const baseNumFds = l.getFdCount(); - std::unique_ptr baseFds( - new (std::nothrow) int[baseNumFds]); - if (!baseFds) { - return false; - } - - void* buffer = static_cast(baseBuffer.get()); - size_t size = baseSize; - int* fds = baseFds.get(); - size_t numFds = baseNumFds; - if (l.flatten(buffer, size, fds, numFds) != NO_ERROR) { - return false; - } - - void const* constBuffer = static_cast(baseBuffer.get()); - size = baseSize; - int const* constFds = static_cast(baseFds.get()); - numFds = baseNumFds; - if (unflatten(t, nh, constBuffer, size, constFds, numFds) != NO_ERROR) { - return false; - } - - return true; -} /** * \brief Convert `HGraphicBufferProducer::QueueBufferInput` to diff --git a/libs/gui/bufferqueue/1.0/H2BProducerListener.cpp b/libs/gui/bufferqueue/1.0/H2BProducerListener.cpp index 2712f42c89..598c8dea9b 100644 --- a/libs/gui/bufferqueue/1.0/H2BProducerListener.cpp +++ b/libs/gui/bufferqueue/1.0/H2BProducerListener.cpp @@ -32,7 +32,11 @@ namespace utils { using ::android::hardware::Return; H2BProducerListener::H2BProducerListener(sp const& base) +#ifndef NO_BINDER : CBase{base} { +#else + : mBase(base) { +#endif } void H2BProducerListener::onBufferReleased() { diff --git a/libs/gui/bufferqueue/1.0/WProducerListener.cpp b/libs/gui/bufferqueue/1.0/WProducerListener.cpp index 78dc4e8b18..56b64b9ddd 100644 --- a/libs/gui/bufferqueue/1.0/WProducerListener.cpp +++ b/libs/gui/bufferqueue/1.0/WProducerListener.cpp @@ -46,5 +46,7 @@ void LWProducerListener::onBufferReleased() { bool LWProducerListener::needsReleaseNotify() { return static_cast(mBase->needsReleaseNotify()); } +void LWProducerListener::onBuffersDiscarded(const std::vector& /*slots*/) { +} } // namespace android diff --git a/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp b/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp index e891ec581e..0f3ae2e28c 100644 --- a/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp +++ b/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp @@ -249,6 +249,24 @@ Return B2HGraphicBufferProducer::query(int32_t what, query_cb _hidl_cb) { return {}; } +struct Obituary : public hardware::hidl_death_recipient { + wp producer; + sp listener; + HConnectionType apiType; + Obituary(const wp& p, + const sp& l, + HConnectionType t) + : producer(p), listener(l), apiType(t) {} + + void serviceDied(uint64_t /* cookie */, + const wp<::android::hidl::base::V1_0::IBase>& /* who */) override { + sp dr = producer.promote(); + if (dr != nullptr) { + (void)dr->disconnect(apiType); + } + } +}; + Return B2HGraphicBufferProducer::connect( sp const& hListener, HConnectionType hConnectionType, @@ -270,6 +288,10 @@ Return B2HGraphicBufferProducer::connect( &bOutput), &hStatus) && b2h(bOutput, &hOutput); + if (converted) { + mObituary = new Obituary(this, hListener, hConnectionType); + hListener->linkToDeath(mObituary, 0); + } _hidl_cb(converted ? hStatus : HStatus::UNKNOWN_ERROR, hOutput); return {}; } @@ -282,6 +304,10 @@ Return B2HGraphicBufferProducer::disconnect( } HStatus hStatus{}; bool converted = b2h(mBase->disconnect(bConnectionType), &hStatus); + if (mObituary != nullptr) { + mObituary->listener->unlinkToDeath(mObituary); + mObituary.clear(); + } return {converted ? hStatus : HStatus::UNKNOWN_ERROR}; } diff --git a/libs/gui/bufferqueue/2.0/H2BProducerListener.cpp b/libs/gui/bufferqueue/2.0/H2BProducerListener.cpp index b81a357d63..b2bd1172d6 100644 --- a/libs/gui/bufferqueue/2.0/H2BProducerListener.cpp +++ b/libs/gui/bufferqueue/2.0/H2BProducerListener.cpp @@ -32,7 +32,11 @@ namespace utils { using ::android::hardware::Return; H2BProducerListener::H2BProducerListener(sp const& base) +#ifndef NO_BINDER : CBase{base} { +#else + : mBase(base) { +#endif } void H2BProducerListener::onBufferReleased() { @@ -48,6 +52,9 @@ bool H2BProducerListener::needsReleaseNotify() { return static_cast(mBase); } +void H2BProducerListener::onBuffersDiscarded(const std::vector& /*slots*/) { +} + } // namespace utils } // namespace V2_0 } // namespace bufferqueue diff --git a/libs/gui/include/gui/BufferQueueProducer.h b/libs/gui/include/gui/BufferQueueProducer.h index 2dec663183..cbace5bb8b 100644 --- a/libs/gui/include/gui/BufferQueueProducer.h +++ b/libs/gui/include/gui/BufferQueueProducer.h @@ -22,10 +22,15 @@ namespace android { +class IBinder; struct BufferSlot; +#ifndef NO_BINDER class BufferQueueProducer : public BnGraphicBufferProducer, private IBinder::DeathRecipient { +#else +class BufferQueueProducer : public BnGraphicBufferProducer { +#endif public: friend class BufferQueue; // Needed to access binderDied diff --git a/libs/gui/include/gui/IConsumerListener.h b/libs/gui/include/gui/IConsumerListener.h index 046f6e10d0..0ab2399eb2 100644 --- a/libs/gui/include/gui/IConsumerListener.h +++ b/libs/gui/include/gui/IConsumerListener.h @@ -92,6 +92,7 @@ public: FrameEventHistoryDelta* /*outDelta*/) {} }; +#ifndef NO_BINDER class IConsumerListener : public ConsumerListener, public IInterface { public: DECLARE_META_INTERFACE(ConsumerListener) @@ -105,4 +106,11 @@ public: uint32_t flags = 0) override; }; +#else +class IConsumerListener : public ConsumerListener { +}; +class BnConsumerListener : public IConsumerListener { +}; +#endif + } // namespace android diff --git a/libs/gui/include/gui/IGraphicBufferConsumer.h b/libs/gui/include/gui/IGraphicBufferConsumer.h index 54f77b424a..56fe949c9c 100644 --- a/libs/gui/include/gui/IGraphicBufferConsumer.h +++ b/libs/gui/include/gui/IGraphicBufferConsumer.h @@ -35,10 +35,14 @@ class Fence; class GraphicBuffer; class IConsumerListener; class NativeHandle; - +#ifndef NO_BINDER class IGraphicBufferConsumer : public IInterface { public: DECLARE_META_INTERFACE(GraphicBufferConsumer) +#else +class IGraphicBufferConsumer : public RefBase { +public: +#endif enum { // Returned by releaseBuffer, after which the consumer must free any references to the @@ -292,6 +296,7 @@ public: } }; +#ifndef NO_BINDER class BnGraphicBufferConsumer : public SafeBnInterface { public: BnGraphicBufferConsumer() @@ -300,5 +305,9 @@ public: status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0) override; }; +#else +class BnGraphicBufferConsumer : public IGraphicBufferConsumer { +}; +#endif } // namespace android diff --git a/libs/gui/include/gui/IGraphicBufferProducer.h b/libs/gui/include/gui/IGraphicBufferProducer.h index 680d64ed75..87989da19b 100644 --- a/libs/gui/include/gui/IGraphicBufferProducer.h +++ b/libs/gui/include/gui/IGraphicBufferProducer.h @@ -45,6 +45,13 @@ class IProducerListener; class NativeHandle; class Surface; +using HGraphicBufferProducerV1_0 = + ::android::hardware::graphics::bufferqueue::V1_0:: + IGraphicBufferProducer; +using HGraphicBufferProducerV2_0 = + ::android::hardware::graphics::bufferqueue::V2_0:: + IGraphicBufferProducer; + /* * This class defines the Binder IPC interface for the producer side of * a queue of graphics buffers. It's used to send graphics data from one @@ -59,20 +66,15 @@ class Surface; * * This class was previously called ISurfaceTexture. */ -class IGraphicBufferProducer : public IInterface -{ -public: - using HGraphicBufferProducerV1_0 = - ::android::hardware::graphics::bufferqueue::V1_0:: - IGraphicBufferProducer; - using HGraphicBufferProducerV2_0 = - ::android::hardware::graphics::bufferqueue::V2_0:: - IGraphicBufferProducer; - +#ifndef NO_BINDER +class IGraphicBufferProducer : public IInterface { DECLARE_HYBRID_META_INTERFACE(GraphicBufferProducer, HGraphicBufferProducerV1_0, HGraphicBufferProducerV2_0) - +#else +class IGraphicBufferProducer : public RefBase { +#endif +public: enum { // A flag returned by dequeueBuffer when the client needs to call // requestBuffer immediately thereafter. @@ -640,6 +642,7 @@ public: // Sets the apps intended frame rate. virtual status_t setFrameRate(float frameRate); +#ifndef NO_BINDER // Static method exports any IGraphicBufferProducer object to a parcel. It // handles null producer as well. static status_t exportToParcel(const sp& producer, @@ -657,10 +660,11 @@ protected: // it writes a strong binder object; for BufferHub, it writes a // ProducerQueueParcelable object. virtual status_t exportToParcel(Parcel* parcel); +#endif }; // ---------------------------------------------------------------------------- - +#ifndef NO_BINDER class BnGraphicBufferProducer : public BnInterface { public: @@ -669,6 +673,10 @@ public: Parcel* reply, uint32_t flags = 0); }; +#else +class BnGraphicBufferProducer : public IGraphicBufferProducer { +}; +#endif // ---------------------------------------------------------------------------- }; // namespace android diff --git a/libs/gui/include/gui/IProducerListener.h b/libs/gui/include/gui/IProducerListener.h index 32a3690ff2..0b1f4b5838 100644 --- a/libs/gui/include/gui/IProducerListener.h +++ b/libs/gui/include/gui/IProducerListener.h @@ -51,6 +51,7 @@ public: virtual void onBuffersDiscarded(const std::vector& slots) = 0; // Asynchronous }; +#ifndef NO_BINDER class IProducerListener : public ProducerListener, public IInterface { public: @@ -73,6 +74,12 @@ public: virtual void onBuffersDiscarded(const std::vector& slots); }; +#else +class IProducerListener : public ProducerListener { +}; +class BnProducerListener : public IProducerListener { +}; +#endif class DummyProducerListener : public BnProducerListener { public: diff --git a/libs/gui/include/gui/bufferqueue/1.0/Conversion.h b/libs/gui/include/gui/bufferqueue/1.0/Conversion.h index 627845c0ea..811dcbeb02 100644 --- a/libs/gui/include/gui/bufferqueue/1.0/Conversion.h +++ b/libs/gui/include/gui/bufferqueue/1.0/Conversion.h @@ -25,8 +25,6 @@ #include #include -#include -#include #include #include #include @@ -126,15 +124,6 @@ int native_handle_read_fd(native_handle_t const* nh, int index = 0); * `convertTo()` do. */ -/** - * \brief Convert `Return` to `binder::Status`. - * - * \param[in] t The source `Return`. - * \return The corresponding `binder::Status`. - */ -// convert: Return -> ::android::binder::Status -::android::binder::Status toBinderStatus(Return const& t); - /** * \brief Convert `Return` to `status_t`. This is for legacy binder calls. * diff --git a/libs/gui/include/gui/bufferqueue/1.0/H2BProducerListener.h b/libs/gui/include/gui/bufferqueue/1.0/H2BProducerListener.h index 211fdd5351..cda5103334 100644 --- a/libs/gui/include/gui/bufferqueue/1.0/H2BProducerListener.h +++ b/libs/gui/include/gui/bufferqueue/1.0/H2BProducerListener.h @@ -34,7 +34,12 @@ using HProducerListener = ::android::hardware::graphics::bufferqueue::V1_0:: using BProducerListener = ::android::IProducerListener; class H2BProducerListener +#ifndef NO_BINDER : public H2BConverter { +#else + : public BProducerListener { + sp mBase; +#endif public: H2BProducerListener(sp const& base); virtual void onBufferReleased() override; diff --git a/libs/gui/include/gui/bufferqueue/1.0/WGraphicBufferProducer.h b/libs/gui/include/gui/bufferqueue/1.0/WGraphicBufferProducer.h index 029dcc047f..99ab0857d3 100644 --- a/libs/gui/include/gui/bufferqueue/1.0/WGraphicBufferProducer.h +++ b/libs/gui/include/gui/bufferqueue/1.0/WGraphicBufferProducer.h @@ -49,7 +49,6 @@ typedef ::android::hardware::graphics::bufferqueue::V1_0:: typedef ::android::IGraphicBufferProducer BGraphicBufferProducer; typedef ::android::IProducerListener BProducerListener; -using ::android::BnGraphicBufferProducer; #ifndef LOG struct LOG_dummy { diff --git a/libs/gui/include/gui/bufferqueue/1.0/WProducerListener.h b/libs/gui/include/gui/bufferqueue/1.0/WProducerListener.h index 51dff5b8be..197db26444 100644 --- a/libs/gui/include/gui/bufferqueue/1.0/WProducerListener.h +++ b/libs/gui/include/gui/bufferqueue/1.0/WProducerListener.h @@ -20,7 +20,6 @@ #include #include -#include #include #include @@ -55,6 +54,7 @@ public: LWProducerListener(sp const& base); void onBufferReleased() override; bool needsReleaseNotify() override; + void onBuffersDiscarded(const std::vector& slots) override; }; } // namespace android diff --git a/libs/gui/include/gui/bufferqueue/2.0/B2HGraphicBufferProducer.h b/libs/gui/include/gui/bufferqueue/2.0/B2HGraphicBufferProducer.h index 1c58167752..16d054ba9e 100644 --- a/libs/gui/include/gui/bufferqueue/2.0/B2HGraphicBufferProducer.h +++ b/libs/gui/include/gui/bufferqueue/2.0/B2HGraphicBufferProducer.h @@ -45,6 +45,7 @@ using ::android::hardware::hidl_string; using ::android::hardware::hidl_vec; using ::android::hardware::graphics::common::V1_2::HardwareBuffer; +struct Obituary; class B2HGraphicBufferProducer : public HGraphicBufferProducer { public: @@ -108,6 +109,7 @@ public: protected: sp mBase; + sp mObituary; }; diff --git a/libs/gui/include/gui/bufferqueue/2.0/H2BProducerListener.h b/libs/gui/include/gui/bufferqueue/2.0/H2BProducerListener.h index 898920bf8a..92650b701b 100644 --- a/libs/gui/include/gui/bufferqueue/2.0/H2BProducerListener.h +++ b/libs/gui/include/gui/bufferqueue/2.0/H2BProducerListener.h @@ -33,12 +33,20 @@ using HProducerListener = ::android::hardware::graphics::bufferqueue::V2_0:: using BProducerListener = ::android::IProducerListener; +#ifndef NO_BINDER class H2BProducerListener : public H2BConverter { +#else +class H2BProducerListener + : public BProducerListener { + sp mBase; + +#endif public: H2BProducerListener(sp const& base); virtual void onBufferReleased() override; virtual bool needsReleaseNotify() override; + virtual void onBuffersDiscarded(const std::vector& slots) override; }; } // namespace utils -- cgit v1.2.3-59-g8ed1b