diff options
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 5364adfa45..a6e8ff9c55 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -3268,7 +3268,6 @@ void SurfaceFlinger::flushTransactionQueues() { if (!transactionIsReadyToBeApplied(transaction.isAutoTimestamp, transaction.desiredPresentTime, transaction.states, - false /* updateTransactionCounters*/, pendingBuffers)) { setTransactionFlags(eTransactionFlushNeeded); break; @@ -3293,13 +3292,9 @@ void SurfaceFlinger::flushTransactionQueues() { const auto& transaction = mTransactionQueue.front(); bool pendingTransactions = mPendingTransactionQueues.find(transaction.applyToken) != mPendingTransactionQueues.end(); - // Call transactionIsReadyToBeApplied first in case we need to - // incrementPendingBufferCount and keep track of pending buffers - // if the transaction contains a buffer. if (!transactionIsReadyToBeApplied(transaction.isAutoTimestamp, transaction.desiredPresentTime, transaction.states, - true /* updateTransactionCounters */, pendingBuffers) || pendingTransactions) { mPendingTransactionQueues[transaction.applyToken].push(transaction); @@ -3331,7 +3326,6 @@ bool SurfaceFlinger::transactionFlushNeeded() { bool SurfaceFlinger::transactionIsReadyToBeApplied( bool isAutoTimestamp, int64_t desiredPresentTime, const Vector<ComposerState>& states, - bool updateTransactionCounters, std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>>& pendingBuffers) { const nsecs_t expectedPresentTime = mExpectedPresentTime.load(); bool ready = true; @@ -3366,10 +3360,6 @@ bool SurfaceFlinger::transactionIsReadyToBeApplied( ATRACE_NAME("!isVsyncValidForUid"); ready = false; } - if (updateTransactionCounters) { - // See BufferStateLayer::mPendingBufferTransactions - layer->incrementPendingBufferCount(); - } // If backpressure is enabled and we already have a buffer to commit, keep the transaction // in the queue. @@ -3460,6 +3450,13 @@ status_t SurfaceFlinger::setTransactionState( const std::vector<ListenerCallbacks>& listenerCallbacks, uint64_t transactionId) { ATRACE_CALL(); + // Check for incoming buffer updates and increment the pending buffer count. + for (const auto& state : states) { + if ((state.state.what & layer_state_t::eAcquireFenceChanged) && (state.state.surface)) { + mBufferCountTracker.increment(state.state.surface->localBinder()); + } + } + uint32_t permissions = callingThreadHasUnscopedSurfaceFlingerAccess() ? Permission::ACCESS_SURFACE_FLINGER : 0; // Avoid checking for rotation permissions if the caller already has ACCESS_SURFACE_FLINGER @@ -4037,10 +4034,16 @@ status_t SurfaceFlinger::createLayer(const String8& name, const sp<Client>& clie std::move(metadata), format, handle, gbp, &layer); break; - case ISurfaceComposerClient::eFXSurfaceBufferState: + case ISurfaceComposerClient::eFXSurfaceBufferState: { result = createBufferStateLayer(client, std::move(uniqueName), w, h, flags, std::move(metadata), handle, &layer); - break; + std::atomic<int32_t>* pendingBufferCounter = layer->getPendingBufferCounter(); + if (pendingBufferCounter) { + std::string counterName = layer->getPendingBufferCounterName(); + mBufferCountTracker.add((*handle)->localBinder(), counterName, + pendingBufferCounter); + } + } break; case ISurfaceComposerClient::eFXSurfaceEffect: // check if buffer size is set for color layer. if (w > 0 || h > 0) { @@ -4207,6 +4210,7 @@ void SurfaceFlinger::onHandleDestroyed(sp<Layer>& layer) { auto it = mLayersByLocalBinderToken.begin(); while (it != mLayersByLocalBinderToken.end()) { if (it->second == layer) { + mBufferCountTracker.remove(it->first->localBinder()); it = mLayersByLocalBinderToken.erase(it); } else { it++; |