summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/SurfaceFlinger.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp57
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;