diff options
| -rw-r--r-- | libs/binder/ParcelableHolder.cpp | 2 | ||||
| -rw-r--r-- | libs/binder/include/binder/ParcelableHolder.h | 3 | ||||
| -rw-r--r-- | libs/binder/ndk/include_cpp/android/binder_parcelable_utils.h | 85 | ||||
| -rw-r--r-- | libs/binder/ndk/include_ndk/android/binder_parcel.h | 47 | ||||
| -rw-r--r-- | libs/binder/ndk/libbinder_ndk.map.txt | 5 | ||||
| -rw-r--r-- | libs/binder/ndk/parcel.cpp | 18 | ||||
| -rw-r--r-- | libs/gralloc/types/Android.bp | 4 | ||||
| -rw-r--r-- | libs/gui/Surface.cpp | 15 | ||||
| -rw-r--r-- | libs/gui/include/gui/Surface.h | 8 | ||||
| -rw-r--r-- | libs/ui/Android.bp | 4 | ||||
| -rw-r--r-- | services/inputflinger/reader/include/TouchVideoDevice.h | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 3 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/Android.bp | 2 |
13 files changed, 186 insertions, 12 deletions
diff --git a/libs/binder/ParcelableHolder.cpp b/libs/binder/ParcelableHolder.cpp index e9df27976c..b2b86716d5 100644 --- a/libs/binder/ParcelableHolder.cpp +++ b/libs/binder/ParcelableHolder.cpp @@ -27,7 +27,6 @@ namespace android { namespace os { status_t ParcelableHolder::writeToParcel(Parcel* p) const { - std::lock_guard<std::mutex> l(mMutex); RETURN_ON_FAILURE(p->writeInt32(static_cast<int32_t>(this->getStability()))); if (this->mParcelPtr) { RETURN_ON_FAILURE(p->writeInt32(this->mParcelPtr->dataSize())); @@ -53,7 +52,6 @@ status_t ParcelableHolder::writeToParcel(Parcel* p) const { } status_t ParcelableHolder::readFromParcel(const Parcel* p) { - std::lock_guard<std::mutex> l(mMutex); this->mStability = static_cast<Stability>(p->readInt32()); this->mParcelable = nullptr; this->mParcelableName = std::nullopt; diff --git a/libs/binder/include/binder/ParcelableHolder.h b/libs/binder/include/binder/ParcelableHolder.h index 5da2515006..4ea3dd3399 100644 --- a/libs/binder/include/binder/ParcelableHolder.h +++ b/libs/binder/include/binder/ParcelableHolder.h @@ -59,7 +59,6 @@ public: template <typename T> bool setParcelable(std::shared_ptr<T> p) { - std::lock_guard<std::mutex> l(mMutex); static_assert(std::is_base_of<Parcelable, T>::value, "T must be derived from Parcelable"); if (p && this->getStability() > p->getStability()) { return false; @@ -73,7 +72,6 @@ public: template <typename T> std::shared_ptr<T> getParcelable() const { static_assert(std::is_base_of<Parcelable, T>::value, "T must be derived from Parcelable"); - std::lock_guard<std::mutex> l(mMutex); const std::string& parcelableDesc = T::getParcelableDescriptor(); if (!this->mParcelPtr) { if (!this->mParcelable || !this->mParcelableName) { @@ -135,7 +133,6 @@ private: mutable std::optional<std::string> mParcelableName; mutable std::unique_ptr<Parcel> mParcelPtr; Stability mStability; - mutable std::mutex mMutex; }; } // namespace os } // namespace android diff --git a/libs/binder/ndk/include_cpp/android/binder_parcelable_utils.h b/libs/binder/ndk/include_cpp/android/binder_parcelable_utils.h index 670151882f..dfcf4dc26f 100644 --- a/libs/binder/ndk/include_cpp/android/binder_parcelable_utils.h +++ b/libs/binder/ndk/include_cpp/android/binder_parcelable_utils.h @@ -25,6 +25,8 @@ */ #pragma once +#include <android/binder_parcel_utils.h> +#include <optional> namespace ndk { // Also see Parcelable.h in libbinder. @@ -33,6 +35,89 @@ enum { STABILITY_LOCAL, STABILITY_VINTF, // corresponds to @VintfStability }; +#define RETURN_ON_FAILURE(expr) \ + do { \ + binder_status_t _status = (expr); \ + if (_status != STATUS_OK) return _status; \ + } while (false) + +class AParcelableHolder { + public: + AParcelableHolder() = delete; + explicit AParcelableHolder(parcelable_stability_t stability) + : mParcel(AParcel_create()), mStability(stability) {} + + virtual ~AParcelableHolder() = default; + + binder_status_t writeToParcel(AParcel* parcel) const { + RETURN_ON_FAILURE(AParcel_writeInt32(parcel, static_cast<int32_t>(this->mStability))); + RETURN_ON_FAILURE(AParcel_writeInt32(parcel, AParcel_getDataSize(this->mParcel.get()))); + RETURN_ON_FAILURE(AParcel_appendFrom(this->mParcel.get(), parcel, 0, + AParcel_getDataSize(this->mParcel.get()))); + return STATUS_OK; + } + + binder_status_t readFromParcel(const AParcel* parcel) { + AParcel_reset(mParcel.get()); + + RETURN_ON_FAILURE(AParcel_readInt32(parcel, &this->mStability)); + int32_t dataSize; + binder_status_t status = AParcel_readInt32(parcel, &dataSize); + + if (status != STATUS_OK || dataSize < 0) { + return status != STATUS_OK ? status : STATUS_BAD_VALUE; + } + + int32_t dataStartPos = AParcel_getDataPosition(parcel); + + if (dataStartPos > INT32_MAX - dataSize) { + return STATUS_BAD_VALUE; + } + + status = AParcel_appendFrom(parcel, mParcel.get(), dataStartPos, dataSize); + if (status != STATUS_OK) { + return status; + } + return AParcel_setDataPosition(parcel, dataStartPos + dataSize); + } + + template <typename T> + bool setParcelable(T* p) { + if (p && this->mStability > T::_aidl_stability) { + return false; + } + AParcel_reset(mParcel.get()); + AParcel_writeString(mParcel.get(), T::descriptor, strlen(T::descriptor)); + p->writeToParcel(mParcel.get()); + return true; + } + + template <typename T> + std::unique_ptr<T> getParcelable() const { + const std::string parcelableDesc(T::descriptor); + AParcel_setDataPosition(mParcel.get(), 0); + if (AParcel_getDataSize(mParcel.get()) == 0) { + return nullptr; + } + std::string parcelableDescInParcel; + binder_status_t status = AParcel_readString(mParcel.get(), &parcelableDescInParcel); + if (status != STATUS_OK || parcelableDesc != parcelableDescInParcel) { + return nullptr; + } + std::unique_ptr<T> ret = std::make_unique<T>(); + status = ret->readFromParcel(this->mParcel.get()); + if (status != STATUS_OK) { + return nullptr; + } + return std::move(ret); + } + + private: + mutable ndk::ScopedAParcel mParcel; + parcelable_stability_t mStability; +}; + +#undef RETURN_ON_FAILURE } // namespace ndk /** @} */ diff --git a/libs/binder/ndk/include_ndk/android/binder_parcel.h b/libs/binder/ndk/include_ndk/android/binder_parcel.h index a031e2973d..93c3f32100 100644 --- a/libs/binder/ndk/include_ndk/android/binder_parcel.h +++ b/libs/binder/ndk/include_ndk/android/binder_parcel.h @@ -1120,6 +1120,53 @@ binder_status_t AParcel_readByteArray(const AParcel* parcel, void* arrayData, // @END-PRIMITIVE-READ-WRITE #endif //__ANDROID_API__ >= 29 +#if __ANDROID_API__ >= 31 +/** + * Reset the parcel to the initial status. + * + * Available since API level 31. + * + * \param parcel The parcel of which to be reset. + * + * \return STATUS_OK on success. + */ +binder_status_t AParcel_reset(AParcel* parcel) __INTRODUCED_IN(31); + +/** + * Gets the size of the parcel. + * + * Available since API level 31. + * + * \param parcel The parcel of which to get the size. + * + * \return The size of the parcel. + */ +int32_t AParcel_getDataSize(const AParcel* parcel) __INTRODUCED_IN(31); + +/** + * Copy the data of a parcel to other parcel. + * + * Available since API level 31. + * + * \param from The source + * \param to The detination + * \param start The position where the copied data starts. + * \param size The amount of data which will be copied. + * + * \return STATUS_OK on success. + */ +binder_status_t AParcel_appendFrom(const AParcel* from, AParcel* to, int32_t start, int32_t size) + __INTRODUCED_IN(31); + +/** + * Creates a parcel. + * + * Available since API level 31. + * + * \return A parcel which is not related to any IBinder objects. + */ +AParcel* AParcel_create() __INTRODUCED_IN(31); +#endif //__ANDROID_API__ >= 31 __END_DECLS /** @} */ diff --git a/libs/binder/ndk/libbinder_ndk.map.txt b/libs/binder/ndk/libbinder_ndk.map.txt index 1701fb5705..947cc98d55 100644 --- a/libs/binder/ndk/libbinder_ndk.map.txt +++ b/libs/binder/ndk/libbinder_ndk.map.txt @@ -120,6 +120,11 @@ LIBBINDER_NDK31 { # introduced=31 AServiceManager_isDeclared; # apex llndk AServiceManager_registerLazyService; # llndk AServiceManager_waitForService; # apex llndk + + AParcel_reset; + AParcel_getDataSize; + AParcel_appendFrom; + AParcel_create; }; LIBBINDER_NDK_PLATFORM { diff --git a/libs/binder/ndk/parcel.cpp b/libs/binder/ndk/parcel.cpp index 722ae232ed..2f95318874 100644 --- a/libs/binder/ndk/parcel.cpp +++ b/libs/binder/ndk/parcel.cpp @@ -647,4 +647,22 @@ bool AParcel_getAllowFds(const AParcel* parcel) { return parcel->get()->allowFds(); } +binder_status_t AParcel_reset(AParcel* parcel) { + parcel->get()->freeData(); + return STATUS_OK; +} + +int32_t AParcel_getDataSize(const AParcel* parcel) { + return parcel->get()->dataSize(); +} + +binder_status_t AParcel_appendFrom(const AParcel* from, AParcel* to, int32_t start, int32_t size) { + status_t status = to->get()->appendFrom(from->get(), start, size); + return PruneStatusT(status); +} + +AParcel* AParcel_create() { + return new AParcel(nullptr); +} + // @END diff --git a/libs/gralloc/types/Android.bp b/libs/gralloc/types/Android.bp index 66fb295a19..cc31cd5f24 100644 --- a/libs/gralloc/types/Android.bp +++ b/libs/gralloc/types/Android.bp @@ -38,14 +38,14 @@ cc_library { ], shared_libs: [ - "android.hardware.graphics.common-ndk_platform", + "android.hardware.graphics.common-unstable-ndk_platform", "android.hardware.graphics.mapper@4.0", "libhidlbase", "liblog", ], export_shared_lib_headers: [ - "android.hardware.graphics.common-ndk_platform", + "android.hardware.graphics.common-unstable-ndk_platform", "android.hardware.graphics.mapper@4.0", "libhidlbase", ], diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index c3323fefb2..d6f9e635f3 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -732,6 +732,8 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) { mSharedBufferHasBeenQueued = false; } + mDequeuedSlots.insert(buf); + return OK; } @@ -760,6 +762,8 @@ int Surface::cancelBuffer(android_native_buffer_t* buffer, mSharedBufferHasBeenQueued = true; } + mDequeuedSlots.erase(i); + return OK; } @@ -895,6 +899,8 @@ int Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) { ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err); } + mDequeuedSlots.erase(i); + if (mEnableFrameTimestamps) { mFrameEventHistory->applyDelta(output.frameTimestamps); // Update timestamps with the local acquire fence. @@ -1660,6 +1666,7 @@ int Surface::attachBuffer(ANativeWindowBuffer* buffer) mRemovedBuffers.push_back(mSlots[attachedSlot].buffer); } mSlots[attachedSlot].buffer = graphicBuffer; + mDequeuedSlots.insert(attachedSlot); return NO_ERROR; } @@ -1926,6 +1933,10 @@ Dataspace Surface::getBuffersDataSpace() { } void Surface::freeAllBuffers() { + if (!mDequeuedSlots.empty()) { + ALOGE("%s: %zu buffers were freed while being dequeued!", + __FUNCTION__, mDequeuedSlots.size()); + } for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { mSlots[i].buffer = nullptr; } @@ -1947,6 +1958,10 @@ status_t Surface::getAndFlushBuffersFromSlots(const std::vector<int32_t>& slots, ALOGW("%s: Discarded slot %d doesn't contain buffer!", __FUNCTION__, i); continue; } + // Don't flush currently dequeued buffers + if (mDequeuedSlots.count(i) > 0) { + continue; + } outBuffers->push_back(mSlots[i].buffer); mSlots[i].buffer = nullptr; } diff --git a/libs/gui/include/gui/Surface.h b/libs/gui/include/gui/Surface.h index 49c83da319..55b4101908 100644 --- a/libs/gui/include/gui/Surface.h +++ b/libs/gui/include/gui/Surface.h @@ -30,6 +30,7 @@ #include <utils/RefBase.h> #include <shared_mutex> +#include <unordered_set> namespace android { @@ -543,8 +544,15 @@ protected: int mMaxBufferCount; sp<IProducerListener> mListenerProxy; + + // Get and flush the buffers of given slots, if the buffer in the slot + // is currently dequeued then it won't be flushed and won't be returned + // in outBuffers. status_t getAndFlushBuffersFromSlots(const std::vector<int32_t>& slots, std::vector<sp<GraphicBuffer>>* outBuffers); + + // Buffers that are successfully dequeued/attached and handed to clients + std::unordered_set<int> mDequeuedSlots; }; } // namespace android diff --git a/libs/ui/Android.bp b/libs/ui/Android.bp index 1ee8c7105c..47eb59fb0a 100644 --- a/libs/ui/Android.bp +++ b/libs/ui/Android.bp @@ -72,7 +72,7 @@ cc_library_shared { "android.hardware.graphics.allocator@2.0", "android.hardware.graphics.allocator@3.0", "android.hardware.graphics.allocator@4.0", - "android.hardware.graphics.common-ndk_platform", + "android.hardware.graphics.common-unstable-ndk_platform", "android.hardware.graphics.common@1.2", "android.hardware.graphics.mapper@2.0", "android.hardware.graphics.mapper@2.1", @@ -89,7 +89,7 @@ cc_library_shared { export_shared_lib_headers: [ "android.hardware.graphics.common@1.2", - "android.hardware.graphics.common-ndk_platform", + "android.hardware.graphics.common-unstable-ndk_platform", "android.hardware.graphics.mapper@4.0", "libgralloctypes", ], diff --git a/services/inputflinger/reader/include/TouchVideoDevice.h b/services/inputflinger/reader/include/TouchVideoDevice.h index 5a32443f29..7de9b830b2 100644 --- a/services/inputflinger/reader/include/TouchVideoDevice.h +++ b/services/inputflinger/reader/include/TouchVideoDevice.h @@ -102,7 +102,7 @@ private: * How many buffers to keep for the internal queue. When the internal buffer * exceeds this capacity, oldest frames will be dropped. */ - static constexpr size_t MAX_QUEUE_SIZE = 10; + static constexpr size_t MAX_QUEUE_SIZE = 20; std::vector<TouchVideoFrame> mFrames; /** diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 1342cfcb6e..9d65f2f2af 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2122,7 +2122,8 @@ void SurfaceFlinger::onMessageRefresh() { mTimeStats->incrementCompositionStrategyChanges(); } - mVSyncModulator->onRefreshed(mHadClientComposition); + // TODO: b/160583065 Enable skip validation when SF caches all client composition layers + mVSyncModulator->onRefreshed(mHadClientComposition || mReusedClientComposition); mLayersWithQueuedFrames.clear(); if (mVisibleRegionsDirty) { diff --git a/services/surfaceflinger/tests/Android.bp b/services/surfaceflinger/tests/Android.bp index fe2af80c98..1532855089 100644 --- a/services/surfaceflinger/tests/Android.bp +++ b/services/surfaceflinger/tests/Android.bp @@ -44,7 +44,7 @@ cc_test { "libtrace_proto", ], shared_libs: [ - "android.hardware.graphics.common-ndk_platform", + "android.hardware.graphics.common-unstable-ndk_platform", "android.hardware.graphics.common@1.2", "android.hardware.graphics.composer@2.1", "libandroid", |