Loading libs/gui/ISurfaceComposer.cpp +15 −8 Original line number Diff line number Diff line Loading @@ -63,7 +63,8 @@ public: Vector<ComposerState>& state, const Vector<DisplayState>& displays, uint32_t flags, const sp<IBinder>& applyToken, const InputWindowCommands& commands, int64_t desiredPresentTime, bool isAutoTimestamp, const client_cache_t& uncacheBuffer, bool isAutoTimestamp, const std::vector<client_cache_t>& uncacheBuffers, bool hasListenerCallbacks, const std::vector<ListenerCallbacks>& listenerCallbacks, uint64_t transactionId) override { Loading @@ -87,8 +88,11 @@ public: SAFE_PARCEL(commands.write, data); SAFE_PARCEL(data.writeInt64, desiredPresentTime); SAFE_PARCEL(data.writeBool, isAutoTimestamp); SAFE_PARCEL(data.writeUint32, static_cast<uint32_t>(uncacheBuffers.size())); for (const client_cache_t& uncacheBuffer : uncacheBuffers) { SAFE_PARCEL(data.writeStrongBinder, uncacheBuffer.token.promote()); SAFE_PARCEL(data.writeUint64, uncacheBuffer.id); } SAFE_PARCEL(data.writeBool, hasListenerCallbacks); SAFE_PARCEL(data.writeVectorSize, listenerCallbacks); Loading Loading @@ -158,11 +162,14 @@ status_t BnSurfaceComposer::onTransact( SAFE_PARCEL(data.readInt64, &desiredPresentTime); SAFE_PARCEL(data.readBool, &isAutoTimestamp); client_cache_t uncachedBuffer; SAFE_PARCEL_READ_SIZE(data.readUint32, &count, data.dataSize()); std::vector<client_cache_t> uncacheBuffers(count); sp<IBinder> tmpBinder; for (size_t i = 0; i < count; i++) { SAFE_PARCEL(data.readNullableStrongBinder, &tmpBinder); uncachedBuffer.token = tmpBinder; SAFE_PARCEL(data.readUint64, &uncachedBuffer.id); uncacheBuffers[i].token = tmpBinder; SAFE_PARCEL(data.readUint64, &uncacheBuffers[i].id); } bool hasListenerCallbacks = false; SAFE_PARCEL(data.readBool, &hasListenerCallbacks); Loading @@ -182,7 +189,7 @@ status_t BnSurfaceComposer::onTransact( return setTransactionState(frameTimelineInfo, state, displays, stateFlags, applyToken, inputWindowCommands, desiredPresentTime, isAutoTimestamp, uncachedBuffer, hasListenerCallbacks, listenerCallbacks, uncacheBuffers, hasListenerCallbacks, listenerCallbacks, transactionId); } default: { Loading libs/gui/SurfaceComposerClient.cpp +45 −17 Original line number Diff line number Diff line Loading @@ -633,11 +633,13 @@ public: return NO_ERROR; } uint64_t cache(const sp<GraphicBuffer>& buffer) { uint64_t cache(const sp<GraphicBuffer>& buffer, std::optional<client_cache_t>& outUncacheBuffer) { std::lock_guard<std::mutex> lock(mMutex); if (mBuffers.size() >= BUFFER_CACHE_MAX_SIZE) { evictLeastRecentlyUsedBuffer(); outUncacheBuffer = findLeastRecentlyUsedBuffer(); mBuffers.erase(outUncacheBuffer->id); } buffer->addDeathCallback(removeDeadBufferCallback, nullptr); Loading @@ -648,16 +650,13 @@ public: void uncache(uint64_t cacheId) { std::lock_guard<std::mutex> lock(mMutex); uncacheLocked(cacheId); } void uncacheLocked(uint64_t cacheId) REQUIRES(mMutex) { mBuffers.erase(cacheId); if (mBuffers.erase(cacheId)) { SurfaceComposerClient::doUncacheBufferTransaction(cacheId); } } private: void evictLeastRecentlyUsedBuffer() REQUIRES(mMutex) { client_cache_t findLeastRecentlyUsedBuffer() REQUIRES(mMutex) { auto itr = mBuffers.begin(); uint64_t minCounter = itr->second; auto minBuffer = itr; Loading @@ -671,7 +670,8 @@ private: } itr++; } uncacheLocked(minBuffer->first); return {.token = getToken(), .id = minBuffer->first}; } uint64_t getCounter() REQUIRES(mMutex) { Loading Loading @@ -809,6 +809,18 @@ status_t SurfaceComposerClient::Transaction::readFromParcel(const Parcel* parcel InputWindowCommands inputWindowCommands; inputWindowCommands.read(*parcel); count = static_cast<size_t>(parcel->readUint32()); if (count > parcel->dataSize()) { return BAD_VALUE; } std::vector<client_cache_t> uncacheBuffers(count); for (size_t i = 0; i < count; i++) { sp<IBinder> tmpBinder; SAFE_PARCEL(parcel->readStrongBinder, &tmpBinder); uncacheBuffers[i].token = tmpBinder; SAFE_PARCEL(parcel->readUint64, &uncacheBuffers[i].id); } // Parsing was successful. Update the object. mId = transactionId; mTransactionNestCount = transactionNestCount; Loading @@ -823,6 +835,7 @@ status_t SurfaceComposerClient::Transaction::readFromParcel(const Parcel* parcel mComposerStates = composerStates; mInputWindowCommands = inputWindowCommands; mApplyToken = applyToken; mUncacheBuffers = std::move(uncacheBuffers); return NO_ERROR; } Loading Loading @@ -874,6 +887,13 @@ status_t SurfaceComposerClient::Transaction::writeToParcel(Parcel* parcel) const } mInputWindowCommands.write(*parcel); SAFE_PARCEL(parcel->writeUint32, static_cast<uint32_t>(mUncacheBuffers.size())); for (const client_cache_t& uncacheBuffer : mUncacheBuffers) { SAFE_PARCEL(parcel->writeStrongBinder, uncacheBuffer.token.promote()); SAFE_PARCEL(parcel->writeUint64, uncacheBuffer.id); } return NO_ERROR; } Loading Loading @@ -940,6 +960,10 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Tr } } for (const auto& cacheId : other.mUncacheBuffers) { mUncacheBuffers.push_back(cacheId); } mInputWindowCommands.merge(other.mInputWindowCommands); mMayContainBuffer |= other.mMayContainBuffer; Loading @@ -958,6 +982,7 @@ void SurfaceComposerClient::Transaction::clear() { mDisplayStates.clear(); mListenerCallbacks.clear(); mInputWindowCommands.clear(); mUncacheBuffers.clear(); mMayContainBuffer = false; mTransactionNestCount = 0; mAnimation = false; Loading @@ -980,10 +1005,10 @@ void SurfaceComposerClient::doUncacheBufferTransaction(uint64_t cacheId) { uncacheBuffer.token = BufferCache::getInstance().getToken(); uncacheBuffer.id = cacheId; Vector<ComposerState> composerStates; status_t status = sf->setTransactionState(FrameTimelineInfo{}, composerStates, {}, ISurfaceComposer::eOneWay, Transaction::getDefaultApplyToken(), {}, systemTime(), true, uncacheBuffer, false, {}, generateId()); status_t status = sf->setTransactionState(FrameTimelineInfo{}, composerStates, {}, ISurfaceComposer::eOneWay, Transaction::getDefaultApplyToken(), {}, systemTime(), true, {uncacheBuffer}, false, {}, generateId()); if (status != NO_ERROR) { ALOGE_AND_TRACE("SurfaceComposerClient::doUncacheBufferTransaction - %s", strerror(-status)); Loading Loading @@ -1021,7 +1046,11 @@ void SurfaceComposerClient::Transaction::cacheBuffers() { s->bufferData->buffer = nullptr; } else { // Cache-miss. Include the buffer and send the new cacheId. cacheId = BufferCache::getInstance().cache(s->bufferData->buffer); std::optional<client_cache_t> uncacheBuffer; cacheId = BufferCache::getInstance().cache(s->bufferData->buffer, uncacheBuffer); if (uncacheBuffer) { mUncacheBuffers.push_back(*uncacheBuffer); } } s->bufferData->flags |= BufferData::BufferDataChange::cachedBufferChanged; s->bufferData->cachedBuffer.token = BufferCache::getInstance().getToken(); Loading Loading @@ -1154,8 +1183,7 @@ status_t SurfaceComposerClient::Transaction::apply(bool synchronous, bool oneWay sp<ISurfaceComposer> sf(ComposerService::getComposerService()); sf->setTransactionState(mFrameTimelineInfo, composerStates, displayStates, flags, applyToken, mInputWindowCommands, mDesiredPresentTime, mIsAutoTimestamp, {} /*uncacheBuffer - only set in doUncacheBufferTransaction*/, hasListenerCallbacks, listenerCallbacks, mId); mUncacheBuffers, hasListenerCallbacks, listenerCallbacks, mId); mId = generateId(); // Clear the current states and flags Loading libs/gui/include/gui/ISurfaceComposer.h +3 −2 Original line number Diff line number Diff line Loading @@ -113,8 +113,9 @@ public: const FrameTimelineInfo& frameTimelineInfo, Vector<ComposerState>& state, const Vector<DisplayState>& displays, uint32_t flags, const sp<IBinder>& applyToken, const InputWindowCommands& inputWindowCommands, int64_t desiredPresentTime, bool isAutoTimestamp, const client_cache_t& uncacheBuffer, bool hasListenerCallbacks, const std::vector<ListenerCallbacks>& listenerCallbacks, uint64_t transactionId) = 0; bool isAutoTimestamp, const std::vector<client_cache_t>& uncacheBuffer, bool hasListenerCallbacks, const std::vector<ListenerCallbacks>& listenerCallbacks, uint64_t transactionId) = 0; }; // ---------------------------------------------------------------------------- Loading libs/gui/include/gui/SurfaceComposerClient.h +1 −0 Original line number Diff line number Diff line Loading @@ -415,6 +415,7 @@ public: SortedVector<DisplayState> mDisplayStates; std::unordered_map<sp<ITransactionCompletedListener>, CallbackInfo, TCLHash> mListenerCallbacks; std::vector<client_cache_t> mUncacheBuffers; uint64_t mId; Loading libs/gui/tests/Surface_test.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -701,7 +701,7 @@ public: const sp<IBinder>& /*applyToken*/, const InputWindowCommands& /*inputWindowCommands*/, int64_t /*desiredPresentTime*/, bool /*isAutoTimestamp*/, const client_cache_t& /*cachedBuffer*/, const std::vector<client_cache_t>& /*cachedBuffer*/, bool /*hasListenerCallbacks*/, const std::vector<ListenerCallbacks>& /*listenerCallbacks*/, uint64_t /*transactionId*/) override { Loading Loading
libs/gui/ISurfaceComposer.cpp +15 −8 Original line number Diff line number Diff line Loading @@ -63,7 +63,8 @@ public: Vector<ComposerState>& state, const Vector<DisplayState>& displays, uint32_t flags, const sp<IBinder>& applyToken, const InputWindowCommands& commands, int64_t desiredPresentTime, bool isAutoTimestamp, const client_cache_t& uncacheBuffer, bool isAutoTimestamp, const std::vector<client_cache_t>& uncacheBuffers, bool hasListenerCallbacks, const std::vector<ListenerCallbacks>& listenerCallbacks, uint64_t transactionId) override { Loading @@ -87,8 +88,11 @@ public: SAFE_PARCEL(commands.write, data); SAFE_PARCEL(data.writeInt64, desiredPresentTime); SAFE_PARCEL(data.writeBool, isAutoTimestamp); SAFE_PARCEL(data.writeUint32, static_cast<uint32_t>(uncacheBuffers.size())); for (const client_cache_t& uncacheBuffer : uncacheBuffers) { SAFE_PARCEL(data.writeStrongBinder, uncacheBuffer.token.promote()); SAFE_PARCEL(data.writeUint64, uncacheBuffer.id); } SAFE_PARCEL(data.writeBool, hasListenerCallbacks); SAFE_PARCEL(data.writeVectorSize, listenerCallbacks); Loading Loading @@ -158,11 +162,14 @@ status_t BnSurfaceComposer::onTransact( SAFE_PARCEL(data.readInt64, &desiredPresentTime); SAFE_PARCEL(data.readBool, &isAutoTimestamp); client_cache_t uncachedBuffer; SAFE_PARCEL_READ_SIZE(data.readUint32, &count, data.dataSize()); std::vector<client_cache_t> uncacheBuffers(count); sp<IBinder> tmpBinder; for (size_t i = 0; i < count; i++) { SAFE_PARCEL(data.readNullableStrongBinder, &tmpBinder); uncachedBuffer.token = tmpBinder; SAFE_PARCEL(data.readUint64, &uncachedBuffer.id); uncacheBuffers[i].token = tmpBinder; SAFE_PARCEL(data.readUint64, &uncacheBuffers[i].id); } bool hasListenerCallbacks = false; SAFE_PARCEL(data.readBool, &hasListenerCallbacks); Loading @@ -182,7 +189,7 @@ status_t BnSurfaceComposer::onTransact( return setTransactionState(frameTimelineInfo, state, displays, stateFlags, applyToken, inputWindowCommands, desiredPresentTime, isAutoTimestamp, uncachedBuffer, hasListenerCallbacks, listenerCallbacks, uncacheBuffers, hasListenerCallbacks, listenerCallbacks, transactionId); } default: { Loading
libs/gui/SurfaceComposerClient.cpp +45 −17 Original line number Diff line number Diff line Loading @@ -633,11 +633,13 @@ public: return NO_ERROR; } uint64_t cache(const sp<GraphicBuffer>& buffer) { uint64_t cache(const sp<GraphicBuffer>& buffer, std::optional<client_cache_t>& outUncacheBuffer) { std::lock_guard<std::mutex> lock(mMutex); if (mBuffers.size() >= BUFFER_CACHE_MAX_SIZE) { evictLeastRecentlyUsedBuffer(); outUncacheBuffer = findLeastRecentlyUsedBuffer(); mBuffers.erase(outUncacheBuffer->id); } buffer->addDeathCallback(removeDeadBufferCallback, nullptr); Loading @@ -648,16 +650,13 @@ public: void uncache(uint64_t cacheId) { std::lock_guard<std::mutex> lock(mMutex); uncacheLocked(cacheId); } void uncacheLocked(uint64_t cacheId) REQUIRES(mMutex) { mBuffers.erase(cacheId); if (mBuffers.erase(cacheId)) { SurfaceComposerClient::doUncacheBufferTransaction(cacheId); } } private: void evictLeastRecentlyUsedBuffer() REQUIRES(mMutex) { client_cache_t findLeastRecentlyUsedBuffer() REQUIRES(mMutex) { auto itr = mBuffers.begin(); uint64_t minCounter = itr->second; auto minBuffer = itr; Loading @@ -671,7 +670,8 @@ private: } itr++; } uncacheLocked(minBuffer->first); return {.token = getToken(), .id = minBuffer->first}; } uint64_t getCounter() REQUIRES(mMutex) { Loading Loading @@ -809,6 +809,18 @@ status_t SurfaceComposerClient::Transaction::readFromParcel(const Parcel* parcel InputWindowCommands inputWindowCommands; inputWindowCommands.read(*parcel); count = static_cast<size_t>(parcel->readUint32()); if (count > parcel->dataSize()) { return BAD_VALUE; } std::vector<client_cache_t> uncacheBuffers(count); for (size_t i = 0; i < count; i++) { sp<IBinder> tmpBinder; SAFE_PARCEL(parcel->readStrongBinder, &tmpBinder); uncacheBuffers[i].token = tmpBinder; SAFE_PARCEL(parcel->readUint64, &uncacheBuffers[i].id); } // Parsing was successful. Update the object. mId = transactionId; mTransactionNestCount = transactionNestCount; Loading @@ -823,6 +835,7 @@ status_t SurfaceComposerClient::Transaction::readFromParcel(const Parcel* parcel mComposerStates = composerStates; mInputWindowCommands = inputWindowCommands; mApplyToken = applyToken; mUncacheBuffers = std::move(uncacheBuffers); return NO_ERROR; } Loading Loading @@ -874,6 +887,13 @@ status_t SurfaceComposerClient::Transaction::writeToParcel(Parcel* parcel) const } mInputWindowCommands.write(*parcel); SAFE_PARCEL(parcel->writeUint32, static_cast<uint32_t>(mUncacheBuffers.size())); for (const client_cache_t& uncacheBuffer : mUncacheBuffers) { SAFE_PARCEL(parcel->writeStrongBinder, uncacheBuffer.token.promote()); SAFE_PARCEL(parcel->writeUint64, uncacheBuffer.id); } return NO_ERROR; } Loading Loading @@ -940,6 +960,10 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Tr } } for (const auto& cacheId : other.mUncacheBuffers) { mUncacheBuffers.push_back(cacheId); } mInputWindowCommands.merge(other.mInputWindowCommands); mMayContainBuffer |= other.mMayContainBuffer; Loading @@ -958,6 +982,7 @@ void SurfaceComposerClient::Transaction::clear() { mDisplayStates.clear(); mListenerCallbacks.clear(); mInputWindowCommands.clear(); mUncacheBuffers.clear(); mMayContainBuffer = false; mTransactionNestCount = 0; mAnimation = false; Loading @@ -980,10 +1005,10 @@ void SurfaceComposerClient::doUncacheBufferTransaction(uint64_t cacheId) { uncacheBuffer.token = BufferCache::getInstance().getToken(); uncacheBuffer.id = cacheId; Vector<ComposerState> composerStates; status_t status = sf->setTransactionState(FrameTimelineInfo{}, composerStates, {}, ISurfaceComposer::eOneWay, Transaction::getDefaultApplyToken(), {}, systemTime(), true, uncacheBuffer, false, {}, generateId()); status_t status = sf->setTransactionState(FrameTimelineInfo{}, composerStates, {}, ISurfaceComposer::eOneWay, Transaction::getDefaultApplyToken(), {}, systemTime(), true, {uncacheBuffer}, false, {}, generateId()); if (status != NO_ERROR) { ALOGE_AND_TRACE("SurfaceComposerClient::doUncacheBufferTransaction - %s", strerror(-status)); Loading Loading @@ -1021,7 +1046,11 @@ void SurfaceComposerClient::Transaction::cacheBuffers() { s->bufferData->buffer = nullptr; } else { // Cache-miss. Include the buffer and send the new cacheId. cacheId = BufferCache::getInstance().cache(s->bufferData->buffer); std::optional<client_cache_t> uncacheBuffer; cacheId = BufferCache::getInstance().cache(s->bufferData->buffer, uncacheBuffer); if (uncacheBuffer) { mUncacheBuffers.push_back(*uncacheBuffer); } } s->bufferData->flags |= BufferData::BufferDataChange::cachedBufferChanged; s->bufferData->cachedBuffer.token = BufferCache::getInstance().getToken(); Loading Loading @@ -1154,8 +1183,7 @@ status_t SurfaceComposerClient::Transaction::apply(bool synchronous, bool oneWay sp<ISurfaceComposer> sf(ComposerService::getComposerService()); sf->setTransactionState(mFrameTimelineInfo, composerStates, displayStates, flags, applyToken, mInputWindowCommands, mDesiredPresentTime, mIsAutoTimestamp, {} /*uncacheBuffer - only set in doUncacheBufferTransaction*/, hasListenerCallbacks, listenerCallbacks, mId); mUncacheBuffers, hasListenerCallbacks, listenerCallbacks, mId); mId = generateId(); // Clear the current states and flags Loading
libs/gui/include/gui/ISurfaceComposer.h +3 −2 Original line number Diff line number Diff line Loading @@ -113,8 +113,9 @@ public: const FrameTimelineInfo& frameTimelineInfo, Vector<ComposerState>& state, const Vector<DisplayState>& displays, uint32_t flags, const sp<IBinder>& applyToken, const InputWindowCommands& inputWindowCommands, int64_t desiredPresentTime, bool isAutoTimestamp, const client_cache_t& uncacheBuffer, bool hasListenerCallbacks, const std::vector<ListenerCallbacks>& listenerCallbacks, uint64_t transactionId) = 0; bool isAutoTimestamp, const std::vector<client_cache_t>& uncacheBuffer, bool hasListenerCallbacks, const std::vector<ListenerCallbacks>& listenerCallbacks, uint64_t transactionId) = 0; }; // ---------------------------------------------------------------------------- Loading
libs/gui/include/gui/SurfaceComposerClient.h +1 −0 Original line number Diff line number Diff line Loading @@ -415,6 +415,7 @@ public: SortedVector<DisplayState> mDisplayStates; std::unordered_map<sp<ITransactionCompletedListener>, CallbackInfo, TCLHash> mListenerCallbacks; std::vector<client_cache_t> mUncacheBuffers; uint64_t mId; Loading
libs/gui/tests/Surface_test.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -701,7 +701,7 @@ public: const sp<IBinder>& /*applyToken*/, const InputWindowCommands& /*inputWindowCommands*/, int64_t /*desiredPresentTime*/, bool /*isAutoTimestamp*/, const client_cache_t& /*cachedBuffer*/, const std::vector<client_cache_t>& /*cachedBuffer*/, bool /*hasListenerCallbacks*/, const std::vector<ListenerCallbacks>& /*listenerCallbacks*/, uint64_t /*transactionId*/) override { Loading