diff options
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 57 |
1 files changed, 36 insertions, 21 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index eeac8e1d2d..c80270d4e7 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -5028,7 +5028,13 @@ bool SurfaceFlinger::shouldLatchUnsignaled(const layer_state_t& state, size_t nu return true; } -status_t SurfaceFlinger::setTransactionState(TransactionState&& transactionState) { +status_t SurfaceFlinger::setTransactionState( + const FrameTimelineInfo& frameTimelineInfo, Vector<ComposerState>& states, + Vector<DisplayState>& displays, uint32_t flags, const sp<IBinder>& applyToken, + InputWindowCommands inputWindowCommands, int64_t desiredPresentTime, bool isAutoTimestamp, + const std::vector<client_cache_t>& uncacheBuffers, bool hasListenerCallbacks, + const std::vector<ListenerCallbacks>& listenerCallbacks, uint64_t transactionId, + const std::vector<uint64_t>& mergedTransactionIds) { SFTRACE_CALL(); IPCThreadState* ipc = IPCThreadState::self(); @@ -5036,7 +5042,7 @@ status_t SurfaceFlinger::setTransactionState(TransactionState&& transactionState const int originUid = ipc->getCallingUid(); uint32_t permissions = LayerStatePermissions::getTransactionPermissions(originPid, originUid); ftl::Flags<adpf::Workload> queuedWorkload; - for (auto& composerState : transactionState.mComposerStates) { + for (auto& composerState : states) { composerState.state.sanitize(permissions); if (composerState.state.what & layer_state_t::COMPOSITION_EFFECTS) { queuedWorkload |= adpf::Workload::EFFECTS; @@ -5046,27 +5052,27 @@ status_t SurfaceFlinger::setTransactionState(TransactionState&& transactionState } } - for (DisplayState& display : transactionState.mDisplayStates) { + for (DisplayState& display : displays) { display.sanitize(permissions); } - if (!transactionState.mInputWindowCommands.empty() && + if (!inputWindowCommands.empty() && (permissions & layer_state_t::Permission::ACCESS_SURFACE_FLINGER) == 0) { ALOGE("Only privileged callers are allowed to send input commands."); - transactionState.mInputWindowCommands.clear(); + inputWindowCommands.clear(); } - if (transactionState.mFlags & (eEarlyWakeupStart | eEarlyWakeupEnd)) { + if (flags & (eEarlyWakeupStart | eEarlyWakeupEnd)) { const bool hasPermission = (permissions & layer_state_t::Permission::ACCESS_SURFACE_FLINGER) || callingThreadHasPermission(sWakeupSurfaceFlinger); if (!hasPermission) { ALOGE("Caller needs permission android.permission.WAKEUP_SURFACE_FLINGER to use " "eEarlyWakeup[Start|End] flags"); - transactionState.mFlags &= ~(eEarlyWakeupStart | eEarlyWakeupEnd); + flags &= ~(eEarlyWakeupStart | eEarlyWakeupEnd); } } - if (transactionState.mFlags & eEarlyWakeupStart) { + if (flags & eEarlyWakeupStart) { queuedWorkload |= adpf::Workload::WAKEUP; } mPowerAdvisor->setQueuedWorkload(queuedWorkload); @@ -5074,8 +5080,8 @@ status_t SurfaceFlinger::setTransactionState(TransactionState&& transactionState const int64_t postTime = systemTime(); std::vector<uint64_t> uncacheBufferIds; - uncacheBufferIds.reserve(transactionState.mUncacheBuffers.size()); - for (const auto& uncacheBuffer : transactionState.mUncacheBuffers) { + uncacheBufferIds.reserve(uncacheBuffers.size()); + for (const auto& uncacheBuffer : uncacheBuffers) { sp<GraphicBuffer> buffer = ClientCache::getInstance().erase(uncacheBuffer); if (buffer != nullptr) { uncacheBufferIds.push_back(buffer->getId()); @@ -5083,8 +5089,8 @@ status_t SurfaceFlinger::setTransactionState(TransactionState&& transactionState } std::vector<ResolvedComposerState> resolvedStates; - resolvedStates.reserve(transactionState.mComposerStates.size()); - for (auto& state : transactionState.mComposerStates) { + resolvedStates.reserve(states.size()); + for (auto& state : states) { resolvedStates.emplace_back(std::move(state)); auto& resolvedState = resolvedStates.back(); resolvedState.layerId = LayerHandle::getLayerId(resolvedState.state.surface); @@ -5095,7 +5101,7 @@ status_t SurfaceFlinger::setTransactionState(TransactionState&& transactionState layer->getDebugName() : std::to_string(resolvedState.state.layerId); resolvedState.externalTexture = getExternalTextureFromBufferData(*resolvedState.state.bufferData, - layerName.c_str(), transactionState.getId()); + layerName.c_str(), transactionId); if (resolvedState.externalTexture) { resolvedState.state.bufferData->buffer = resolvedState.externalTexture->getBuffer(); if (FlagManager::getInstance().monitor_buffer_fences()) { @@ -5123,12 +5129,22 @@ status_t SurfaceFlinger::setTransactionState(TransactionState&& transactionState } } - QueuedTransactionState state{std::move(transactionState), - std::move(resolvedStates), + QueuedTransactionState state{frameTimelineInfo, + resolvedStates, + displays, + flags, + applyToken, + std::move(inputWindowCommands), + desiredPresentTime, + isAutoTimestamp, std::move(uncacheBufferIds), postTime, + hasListenerCallbacks, + listenerCallbacks, originPid, - originUid}; + originUid, + transactionId, + mergedTransactionIds}; state.workloadHint = queuedWorkload; if (mTransactionTracing) { @@ -5151,16 +5167,16 @@ status_t SurfaceFlinger::setTransactionState(TransactionState&& transactionState for (const auto& [displayId, data] : mNotifyExpectedPresentMap) { if (data.hintStatus.load() == NotifyExpectedPresentHintStatus::ScheduleOnTx) { - scheduleNotifyExpectedPresentHint(displayId, VsyncId{state.frameTimelineInfo.vsyncId}); + scheduleNotifyExpectedPresentHint(displayId, VsyncId{frameTimelineInfo.vsyncId}); } } - setTransactionFlags(eTransactionFlushNeeded, schedule, state.applyToken, frameHint); + setTransactionFlags(eTransactionFlushNeeded, schedule, applyToken, frameHint); return NO_ERROR; } bool SurfaceFlinger::applyTransactionState( const FrameTimelineInfo& frameTimelineInfo, std::vector<ResolvedComposerState>& states, - std::span<DisplayState> displays, uint32_t flags, + Vector<DisplayState>& displays, uint32_t flags, const InputWindowCommands& inputWindowCommands, const int64_t desiredPresentTime, bool isAutoTimestamp, const std::vector<uint64_t>& uncacheBufferIds, const int64_t postTime, bool hasListenerCallbacks, const std::vector<ListenerCallbacks>& listenerCallbacks, @@ -5650,8 +5666,7 @@ void SurfaceFlinger::initializeDisplays() { auto layerStack = ui::DEFAULT_LAYER_STACK.id; for (const auto& [id, display] : FTL_FAKE_GUARD(mStateLock, mPhysicalDisplays)) { - state.displays.emplace_back( - DisplayState(display.token(), ui::LayerStack::fromValue(layerStack++))); + state.displays.push(DisplayState(display.token(), ui::LayerStack::fromValue(layerStack++))); } std::vector<QueuedTransactionState> transactions; |