涉及到的文件:
frameworks/native/services/surfaceflinger/layer.h
frameworks/native/services/surfaceflinger/layer.cpp
frameworks/native/libs/ui/Transform.cpp
frameworks/native/libs/ui/Transform.h
Layer::State的设置流程
SurfaceControl.setPosition -> android_view_SurfaceControl: setPosition -> SurfaceComposerClient: nativeSetPosition -> SurfaceComposerClient:setPosition
入口为SurfaceControl.Transaction的setPosition
SurfaceControl.java /** * Sets the SurfaceControl to the specified position relative to the parent * SurfaceControl * * @param sc The SurfaceControl to change position * @param x the X position * @param y the Y position * @return this transaction */ @NonNull public Transaction setPosition(@NonNull SurfaceControl sc, float x, float y) { checkPreconditions(sc); if (sc.toString().contains("com.tencent.qqlive")){ Slog.d("jinyanmeilayer","setPosition sc:"+ sc); Slog.d("jinyanmeilayer","setPosition x:" + x + " y: "+ y, new RuntimeException("jinyanmeilayer")); } nativeSetPosition(mNativeObject, sc.mNativeObject, x, y); return this; }
/missi_t_mtk/frameworks/base/core/jni/android_view_SurfaceControl.cpp static void nativeSetPosition(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject, jfloat x, jfloat y) { auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj); SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); transaction->setPosition(ctrl, x, y); }
每一层layer的属性暂存到layer_state_t中
frameworks/native/libs/gui/SurfaceComposerClient.cpp SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPosition( const sp<SurfaceControl>& sc, float x, float y) { layer_state_t* s = getLayerState(sc); if (!s) { mStatus = BAD_INDEX; return *this; } s->what |= layer_state_t::ePositionChanged; s->x = x; s->y = y; registerSurfaceControlForCallback(sc); return *this; }
std::unordered_map<sp<IBinder>, ComposerState, IBinderHash> mComposerStates;
struct ComposerState { layer_state_t state; status_t write(Parcel& output) const; status_t read(const Parcel& input); };
frameworks/native/libs/gui/SurfaceComposerClient.cpp 1133layer_state_t* SurfaceComposerClient::Transaction::getLayerState(const sp<SurfaceControl>& sc) { 1134 auto handle = sc->getLayerStateHandle(); 1135 1136 if (mComposerStates.count(handle) == 0) { 1137 // we don't have it, add an initialized layer_state to our list 1138 ComposerState s; 1139 1140 s.state.surface = handle; 1141 s.state.layerId = sc->getLayerId(); 1142 1143 mComposerStates[handle] = s; 1144 } 1145 1146 return &(mComposerStates[handle].state); 1147}
state生效过程
在SurfaceControl.Transaction的apply
SurfaceControl.apply
→SurfaceControl.apply
→android_view_SurfaceControl::nativeApplyTransaction
→SurfaceComposerClient::apply(sync)
→SurfaceFlinger::setTransactionState
→SurfaceFlinger::waitForSynchronousTransaction
→SurfaceFlinger::applyTransactionState
→SurfaceFlinger::setClientStateLocked
SurfaceControl.java public void apply() { apply(false); } public void apply(boolean sync) { applyResizedSurfaces(); notifyReparentedSurfaces(); nativeApplyTransaction(mNativeObject, sync); }
frameworks/base/core/jni/android_view_SurfaceControl.cpp 557static void nativeApplyTransaction(JNIEnv* env, jclass clazz, jlong transactionObj, jboolean sync) { 558 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj); 559 transaction->apply(sync); 560}
frameworks/native/libs/gui/SurfaceComposerClient.cpp status_t SurfaceComposerClient::Transaction::apply(bool synchronous, bool oneWay) { if (mStatus != NO_ERROR) { return mStatus; } std::shared_ptr<SyncCallback> syncCallback = std::make_shared<SyncCallback>(); if (synchronous) { syncCallback->init(); addTransactionCommittedCallback(SyncCallback::getCallback(syncCallback), /*callbackContext=*/nullptr); } bool hasListenerCallbacks = !mListenerCallbacks.empty(); std::vector<ListenerCallbacks> listenerCallbacks; // For every listener with registered callbacks for (const auto& [listener, callbackInfo] : mListenerCallbacks) { auto& [callbackIds, surfaceControls] = callbackInfo; if (callbackIds.empty()) { continue; } if (surfaceControls.empty()) { listenerCallbacks.emplace_back(IInterface::asBinder(listener), std::move(callbackIds)); } else { // If the listener has any SurfaceControls set on this Transaction update the surface // state for (const auto& surfaceControl : surfaceControls) { layer_state_t* s = getLayerState(surfaceControl); if (!s) { ALOGE("failed to get layer state"); continue; } std::vector<CallbackId> callbacks(callbackIds.begin(), callbackIds.end()); s->what |= layer_state_t::eHasListenerCallbacksChanged; s->listeners.emplace_back(IInterface::asBinder(listener), callbacks); } } } cacheBuffers(); Vector<ComposerState> composerStates; Vector<DisplayState> displayStates; uint32_t flags = 0; for (auto const& kv : mComposerStates) { composerStates.add(kv.second); } displayStates = std::move(mDisplayStates); if (mAnimation) { flags |= ISurfaceComposer::eAnimation; } if (oneWay) { if (synchronous) { ALOGE("Transaction attempted to set synchronous and one way at the same time" " this is an invalid request. Synchronous will win for safety"); } else { flags |= ISurfaceComposer::eOneWay; } } // If both mEarlyWakeupStart and mEarlyWakeupEnd are set // it is equivalent for none if (mEarlyWakeupStart && !mEarlyWakeupEnd) { flags |= ISurfaceComposer::eEarlyWakeupStart; } if (mEarlyWakeupEnd && !mEarlyWakeupStart) { flags |= ISurfaceComposer::eEarlyWakeupEnd; } sp<IBinder> applyToken = mApplyToken ? mApplyToken : sApplyToken; sp<ISurfaceComposer> sf(ComposerService::getComposerService()); sf->setTransactionState(mFrameTimelineInfo, composerStates, displayStates, flags, applyToken, mInputWindowCommands, mDesiredPresentTime, mIsAutoTimestamp, mUncacheBuffers, hasListenerCallbacks, listenerCallbacks, mId, mMergedTransactionIds); mId = generateId(); // Clear the current states and flags clear(); if (synchronous) { syncCallback->wait(); } mStatus = NO_ERROR; return NO_ERROR; }
SurfaceFlinger.cpp status_t SurfaceFlinger::setTransactionState( const FrameTimelineInfo& frameTimelineInfo, Vector<ComposerState>& states, const 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) { ATRACE_CALL(); IPCThreadState* ipc = IPCThreadState::self(); const int originPid = ipc->getCallingPid(); const int originUid = ipc->getCallingUid(); uint32_t permissions = LayerStatePermissions::getTransactionPermissions(originPid, originUid); for (auto composerState : states) { composerState.state.sanitize(permissions); } for (DisplayState display : displays) { display.sanitize(permissions); } if (!inputWindowCommands.empty() && (permissions & layer_state_t::Permission::ACCESS_SURFACE_FLINGER) == 0) { ALOGE("Only privileged callers are allowed to send input commands."); inputWindowCommands.clear(); } 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"); flags &= ~(eEarlyWakeupStart | eEarlyWakeupEnd); } } const int64_t postTime = systemTime(); std::vector<uint64_t> uncacheBufferIds; uncacheBufferIds.reserve(uncacheBuffers.size()); for (const auto& uncacheBuffer : uncacheBuffers) { sp<GraphicBuffer> buffer = ClientCache::getInstance().erase(uncacheBuffer); if (buffer != nullptr) { uncacheBufferIds.push_back(buffer->getId()); } } std::vector<ResolvedComposerState> resolvedStates; resolvedStates.reserve(states.size()); for (auto& state : states) { resolvedStates.emplace_back(std::move(state)); auto& resolvedState = resolvedStates.back(); if (resolvedState.state.hasBufferChanges() && resolvedState.state.hasValidBuffer() && resolvedState.state.surface) { sp<Layer> layer = LayerHandle::getLayer(resolvedState.state.surface); std::string layerName = (layer) ? layer->getDebugName() : std::to_string(resolvedState.state.layerId); resolvedState.externalTexture = getExternalTextureFromBufferData(*resolvedState.state.bufferData, layerName.c_str(), transactionId); mBufferCountTracker.increment(resolvedState.state.surface->localBinder()); } resolvedState.layerId = LayerHandle::getLayerId(resolvedState.state.surface); if (resolvedState.state.what & layer_state_t::eReparent) { resolvedState.parentId = getLayerIdFromSurfaceControl(resolvedState.state.parentSurfaceControlForChild); } if (resolvedState.state.what & layer_state_t::eRelativeLayerChanged) { resolvedState.relativeParentId = getLayerIdFromSurfaceControl(resolvedState.state.relativeLayerSurfaceControl); } if (resolvedState.state.what & layer_state_t::eInputInfoChanged) { wp<IBinder>& touchableRegionCropHandle = resolvedState.state.windowInfoHandle->editInfo()->touchableRegionCropHandle; resolvedState.touchCropId = LayerHandle::getLayerId(touchableRegionCropHandle.promote()); } } TransactionState state{frameTimelineInfo, resolvedStates, displays, flags, applyToken, std::move(inputWindowCommands), desiredPresentTime, isAutoTimestamp, std::move(uncacheBufferIds), postTime, hasListenerCallbacks, listenerCallbacks, originPid, originUid, transactionId, mergedTransactionIds}; if (mTransactionTracing) { mTransactionTracing->addQueuedTransaction(state); } const auto schedule = [](uint32_t flags) { if (flags & eEarlyWakeupEnd) return TransactionSchedule::EarlyEnd; if (flags & eEarlyWakeupStart) return TransactionSchedule::EarlyStart; return TransactionSchedule::Late; }(state.flags); const auto frameHint = state.isFrameActive() ? FrameHint::kActive : FrameHint::kNone; mTransactionHandler.queueTransaction(std::move(state)); setTransactionFlags(eTransactionFlushNeeded, schedule, applyToken, frameHint); return NO_ERROR; }
调用了applyTransactionState
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp bool SurfaceFlinger::applyTransactionState(const FrameTimelineInfo& frameTimelineInfo, std::vector<ResolvedComposerState>& states, 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, int originPid, int originUid, uint64_t transactionId) { uint32_t transactionFlags = 0; if (!mLayerLifecycleManagerEnabled) { for (DisplayState& display : displays) { transactionFlags |= setDisplayStateLocked(display); } } // start and end registration for listeners w/ no surface so they can get their callback. Note // that listeners with SurfaceControls will start registration during setClientStateLocked // below. for (const auto& listener : listenerCallbacks) { mTransactionCallbackInvoker.addEmptyTransaction(listener); } uint32_t clientStateFlags = 0; for (auto& resolvedState : states) { if (mLegacyFrontEndEnabled) { clientStateFlags |= setClientStateLocked(frameTimelineInfo, resolvedState, desiredPresentTime, isAutoTimestamp, postTime, transactionId); } else /*mLayerLifecycleManagerEnabled*/ { clientStateFlags |= updateLayerCallbacksAndStats(frameTimelineInfo, resolvedState, desiredPresentTime, isAutoTimestamp, postTime, transactionId); } if ((flags & eAnimation) && resolvedState.state.surface) { if (const auto layer = LayerHandle::getLayer(resolvedState.state.surface)) { const auto layerProps = scheduler::LayerProps{ .visible = layer->isVisible(), .bounds = layer->getBounds(), .transform = layer->getTransform(), .setFrameRateVote = layer->getFrameRateForLayerTree(), .frameRateSelectionPriority = layer->getFrameRateSelectionPriority(), }; layer->recordLayerHistoryAnimationTx(layerProps); } } } transactionFlags |= clientStateFlags; transactionFlags |= addInputWindowCommands(inputWindowCommands); for (uint64_t uncacheBufferId : uncacheBufferIds) { mBufferIdsToUncache.push_back(uncacheBufferId); } // If a synchronous transaction is explicitly requested without any changes, force a transaction // anyway. This can be used as a flush mechanism for previous async transactions. // Empty animation transaction can be used to simulate back-pressure, so also force a // transaction for empty animation transactions. if (transactionFlags == 0 && (flags & eAnimation)) { transactionFlags = eTransactionNeeded; } bool needsTraversal = false; if (transactionFlags) { // We are on the main thread, we are about to perform a traversal. Clear the traversal bit // so we don't have to wake up again next frame to perform an unnecessary traversal. if (transactionFlags & eTraversalNeeded) { transactionFlags = transactionFlags & (~eTraversalNeeded); needsTraversal = true; } if (transactionFlags) { setTransactionFlags(transactionFlags); } } return needsTraversal; }
setClientStateLocked 将暂存的属性设置到layer中 uint32_t SurfaceFlinger::setClientStateLocked(const FrameTimelineInfo& frameTimelineInfo, ComposerState& composerState, int64_t desiredPresentTime, bool isAutoTimestamp, int64_t postTime, uint32_t permissions) { layer_state_t& s = composerState.state; s.sanitize(permissions); std::vector<ListenerCallbacks> filteredListeners; for (auto& listener : s.listeners) { // Starts a registration but separates the callback ids according to callback type. This // allows the callback invoker to send on latch callbacks earlier. // note that startRegistration will not re-register if the listener has // already be registered for a prior surface control ListenerCallbacks onCommitCallbacks = listener.filter(CallbackId::Type::ON_COMMIT); if (!onCommitCallbacks.callbackIds.empty()) { filteredListeners.push_back(onCommitCallbacks); } ListenerCallbacks onCompleteCallbacks = listener.filter(CallbackId::Type::ON_COMPLETE); if (!onCompleteCallbacks.callbackIds.empty()) { filteredListeners.push_back(onCompleteCallbacks); } } const uint64_t what = s.what; uint32_t flags = 0; sp<Layer> layer = nullptr; if (s.surface) { layer = fromHandle(s.surface).promote(); } else { // The client may provide us a null handle. Treat it as if the layer was removed. ALOGW("Attempt to set client state with a null layer handle"); } if (layer == nullptr) { for (auto& [listener, callbackIds] : s.listeners) { mTransactionCallbackInvoker.registerUnpresentedCallbackHandle( new CallbackHandle(listener, callbackIds, s.surface)); } return 0; } // Only set by BLAST adapter layers if (what & layer_state_t::eProducerDisconnect) { layer->onDisconnect(); } if (what & layer_state_t::ePositionChanged) { if (layer->setPosition(s.x, s.y)) { //调用到setPositon flags |= eTraversalNeeded; } } bool Layer::setPosition(float x, float y) { if (mDrawingState.transform.tx() == x && mDrawingState.transform.ty() == y) return false; mDrawingState.sequence++; mDrawingState.transform.set(x, y); mDrawingState.modified = true; setTransactionFlags(eTransactionNeeded); return true; }
将值设置到mDrawingState的transform中
frameworks/native/include/ui/Transform.cpp void Transform::set(float tx, float ty) { mMatrix[2][0] = tx; mMatrix[2][1] = ty; mMatrix[2][2] = 1.0f; if (isZero(tx) && isZero(ty)) { mType &= ~TRANSLATE; } else { mType |= TRANSLATE; } }
transform通过平移旋转等进行计算visibleRegion
frameworks/native/include/ui/Transform.cpp void SurfaceFlinger::setTransactionFlags(uint32_t mask, TransactionSchedule schedule, const sp<IBinder>& applyToken, FrameHint frameHint) { modulateVsync(&VsyncModulator::setTransactionSchedule, schedule, applyToken); if (const bool scheduled = mTransactionFlags.fetch_or(mask) & mask; !scheduled) { scheduleCommit(frameHint); } }
frameworks/native/services/surfaceflinger/SurfaceFlinger.h 603 void modulateVsync(Handler handler, Args... args) { 604 if (const auto config = (*mVsyncModulator.*handler)(args...)) { 605 const auto vsyncPeriod = mScheduler->getVsyncPeriodFromRefreshRateConfigs(); 606 setVsyncConfig(*config, vsyncPeriod); 607 } 608 }
然后等待vsync的信号到来
Vsync信号到来时VisibleRegion的计算过程
Layer 属性发生变化做的操作
SurfaceFlinger::commit
→SurfaceFlinger::commitTransactions
→SurfaceFlinger::commitTransactionsLocked
→SurfaceFlinger::doCommitTransactions
→SurfaceFlinger::commitOffscreenLayers
→SurfaceFlinger::doTransaction(0)
→layer::doTransaction
→layer::commitTransaction
→layer::setPresentState 赋值mPresentState = presentState;
- 根据Layer的size是否变化,改变buffer大小
- mCurrentSate.active=mCurrentSate.requested(一般情况下都会赋值,除非flags设置了eDontUpdateGeometryState),
- 修改flags(使之重新计算visibelRegion的值)
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp bool SurfaceFlinger::commit(TimePoint frameTime, VsyncId vsyncId, TimePoint expectedVsyncTime) FTL_FAKE_GUARD(kMainThreadContext) { const bool shouldCommit = (getTransactionFlags() & ~eTransactionFlushNeeded) || needsTraversal; if (shouldCommit) { commitTransactions(); } updateLayerGeometry(); //计算bounds
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp void SurfaceFlinger::commitTransactions() { ATRACE_CALL(); // Keep a copy of the drawing state (that is going to be overwritten // by commitTransactionsLocked) outside of mStateLock so that the side // effects of the State assignment don't happen with mStateLock held, // which can cause deadlocks. State drawingState(mDrawingState); Mutex::Autolock lock(mStateLock); mDebugInTransaction = systemTime(); // Here we're guaranteed that some transaction flags are set // so we can call commitTransactionsLocked unconditionally. // We clear the flags with mStateLock held to guarantee that // mCurrentState won't change until the transaction is committed. modulateVsync(&VsyncModulator::onTransactionCommit); commitTransactionsLocked(clearTransactionFlags(eTransactionMask)); mDebugInTransaction = 0; }
mPresentState = presentState;
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp void SurfaceFlinger::commitTransactionsLocked(uint32_t transactionFlags) { // some layers might have been removed, so // we need to update the regions they're exposing. if (mLayersRemoved) { mLayersRemoved = false; mVisibleRegionsDirty = true; mUpdateInputInfo = true; mDrawingState.traverseInZOrder([&](Layer* layer) { if (mLayersPendingRemoval.indexOf(sp<Layer>::fromExisting(layer)) >= 0) { // this layer is not visible anymore Region visibleReg; visibleReg.set(layer->getScreenBounds()); invalidateLayerStack(layer->getOutputFilter(), visibleReg); } }); } doCommitTransactions();
void SurfaceFlinger::doCommitTransactions() { ATRACE_CALL(); commitOffscreenLayers(); } void SurfaceFlinger::commitOffscreenLayers() { for (Layer* offscreenLayer : mOffscreenLayers) { offscreenLayer->traverse(LayerVector::StateSet::Drawing, [](Layer* layer) { if (layer->clearTransactionFlags(eTransactionNeeded)) { layer->doTransaction(0); layer->commitChildList(); } }); } }
Layer.cpp uint32_t Layer::doTransaction(uint32_t flags) { ATRACE_CALL(); // TODO: This is unfortunate. mDrawingStateModified = mDrawingState.modified; mDrawingState.modified = false; const State& s(getDrawingState()); if (updateGeometry()) { // invalidate and recompute the visible regions if needed flags |= Layer::eVisibleRegion; } if (s.sequence != mLastCommittedTxSequence) { // invalidate and recompute the visible regions if needed mLastCommittedTxSequence = s.sequence; flags |= eVisibleRegion; this->contentDirty = true; // we may use linear filtering, if the matrix scales us mNeedsFiltering = getActiveTransform(s).needsBilinearFiltering(); } if (!mPotentialCursor && (flags & Layer::eVisibleRegion)) { mFlinger->mUpdateInputInfo = true; } commitTransaction(mDrawingState); return flags; } void Layer::commitTransaction(State&) { // Set the present state for all bufferlessSurfaceFramesTX to Presented. The // bufferSurfaceFrameTX will be presented in latchBuffer. for (auto& [token, surfaceFrame] : mDrawingState.bufferlessSurfaceFramesTX) { if (surfaceFrame->getPresentState() != PresentState::Presented) { // With applyPendingStates, we could end up having presented surfaceframes from previous // states surfaceFrame->setPresentState(PresentState::Presented, mLastLatchTime); mFlinger->mFrameTimeline->addSurfaceFrame(surfaceFrame); } } mDrawingState.bufferlessSurfaceFramesTX.clear(); }
frameworks/native/services/surfaceflinger/FrameTimeline/FrameTimeline.cpp void SurfaceFrame::setPresentState(PresentState presentState, nsecs_t lastLatchTime) { std::scoped_lock lock(mMutex); LOG_ALWAYS_FATAL_IF(mPresentState != PresentState::Unknown, "setPresentState called on a SurfaceFrame from Layer - %s, that has a " "PresentState - %s set already.", mDebugName.c_str(), toString(mPresentState).c_str()); mPresentState = presentState; mLastLatchTime = lastLatchTime; }
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp void SurfaceFlinger::updateLayerGeometry() { ATRACE_CALL(); if (mVisibleRegionsDirty) { computeLayerBounds(); } for (auto& layer : mLayersPendingRefresh) { Region visibleReg; visibleReg.set(layer->getScreenBounds()); invalidateLayerStack(layer, visibleReg); } setDisplayAnimating(); mLayersPendingRefresh.clear(); }
计算region
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) { for (const auto& [token, displayDevice] : FTL_FAKE_GUARD(mStateLock, mDisplays)) { auto display = displayDevice->getCompositionDisplay(); if (display->includesLayer(layer->getOutputFilter())) { display->editState().dirtyRegion.orSelf(dirty); } } }
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp void SurfaceFlinger::computeLayerBounds() { const FloatRect maxBounds = getMaxDisplayBounds(); for (const auto& layer : mDrawingState.layersSortedByZ) { layer->computeBounds(maxBounds, ui::Transform(), 0.f /* shadowRadius */); if (layer->getName().find("com.tencent.qqlive") != std::string::npos) { ALOGD("jinyanmeilayer computeLayerBounds 0000 maxBounds=(%f,%f,%f,%f) :", maxBounds.left, maxBounds.top, maxBounds.right, maxBounds.bottom); ALOGD("jinyanmeilayer computeLayerBounds 0000 getDebugName: %s ",layer->getName().c_str()); } } }
frameworks/native/services/surfaceflinger/Layer.h inline State& getDrawingState() { return mDrawingState; } ui::Transform getActiveTransform(const Layer::State& s) const { return s.transform; } virtual FloatRect computeSourceBounds(const FloatRect& parentBounds) const { return parentBounds; } virtual Rect getCrop(const Layer::State& s) const { return s.crop; }
frameworks/native/services/surfaceflinger/Layer.cpp void Layer::computeBounds(FloatRect parentBounds, ui::Transform parentTransform, float parentShadowRadius) { const State& s(getDrawingState()); //根据保存的State if (getName().find("com.tencent.qqlive") != std::string::npos) { ALOGD("jinyanmeilayer computeBounds ---- parentTransform=parentTransform %f parentTransform.ty %f, sx %f, tx() %f, ty %f, sy:%f, det %f, getScaleX %f, getScaleY %f " ,parentTransform.tx(), parentTransform.ty(), parentTransform.dsdx(), parentTransform.dtdx(), parentTransform.dtdy(), parentTransform.dsdy(), parentTransform.det(),parentTransform.getScaleX(), parentTransform.getScaleY()); // ALOGD("jinyanmeilayer computeBounds ---- parentTransform=(%s) ", parentTransform.transformToString(parentTransform)); ALOGD("jinyanmeilayer computeBounds ---- parentBounds=(%f,%f,%f,%f) :", parentBounds.left, parentBounds.top, parentBounds.right, parentBounds.bottom); ALOGD("jinyanmeilayer computeBounds ---- getDebugName: %s ",getDebugName()); android::CallStack stack("jinyanmeilayer"); } // Calculate effective layer transform mEffectiveTransform = parentTransform * getActiveTransform(s);//getActiveTransform(s)得到s.transform; if (getName().find("com.tencent.qqlive") != std::string::npos) { ALOGD("jinyanmeilayer computeBounds ---- getActiveTransform(s) %f getActiveTransform(s).ty %f, sx %f, tx() %f, ty %f, sy:%f, det %f, getScaleX %f, getScaleY %f " , getActiveTransform(s).tx(), getActiveTransform(s).ty(), getActiveTransform(s).dsdx(), getActiveTransform(s).dtdx(), getActiveTransform(s).dtdy(), getActiveTransform(s).dsdy(), getActiveTransform(s).det(), getActiveTransform(s).getScaleX(), getActiveTransform(s).getScaleY()); ALOGD("jinyanmeilayer computeBounds ---- mEffectiveTransform=mEffectiveTransform %f mEffectiveTransform.ty %f, sx %f, tx() %f, ty %f, sy:%f, det %f, getScaleX %f, getScaleY %f " ,mEffectiveTransform.tx(), mEffectiveTransform.ty(), mEffectiveTransform.dsdx(), mEffectiveTransform.dtdx(), mEffectiveTransform.dtdy(), mEffectiveTransform.dsdy(), mEffectiveTransform.det(),mEffectiveTransform.getScaleX(), mEffectiveTransform.getScaleY()); } if (CC_UNLIKELY(!isTransformValid())) { ALOGW("Stop computing bounds for %s because it has invalid transformation.", getDebugName()); return; } // Transform parent bounds to layer space if (getName().find("com.tencent.qqlive") != std::string::npos) { ALOGD("jinyanmeilayer computeBounds 0000 parentBounds=(%f,%f,%f,%f) :", parentBounds.left, parentBounds.top, parentBounds.right, parentBounds.bottom); ALOGD("jinyanmeilayer computeBounds 0000 getDebugName: %s ",getDebugName()); } parentBounds = getActiveTransform(s).inverse().transform(parentBounds); if (getName().find("com.tencent.qqlive") != std::string::npos) { ALOGD("jinyanmeilayer computeBounds ---- getActiveTransform(s)() %f getActiveTransform.ty %f, sx %f, tx() %f, ty %f, sy:%f, det %f, getScaleX %f, getScaleY %f " ,getActiveTransform(s).tx(), getActiveTransform(s).ty(), getActiveTransform(s).dsdx(), getActiveTransform(s).dtdx(), getActiveTransform(s).dtdy(), getActiveTransform(s).dsdy(), getActiveTransform(s).det(),getActiveTransform(s).getScaleX(), getActiveTransform(s).getScaleY()); ALOGD("jinyanmeilayer computeBounds ---- getActiveTransform(s).inverse() %f mEffectiveTransform.ty %f, sx %f, tx() %f, ty %f, sy:%f, det %f, getScaleX %f, getScaleY %f " ,getActiveTransform(s).inverse().tx(), getActiveTransform(s).inverse().ty(), getActiveTransform(s).inverse().dsdx(), getActiveTransform(s).inverse().dtdx(), getActiveTransform(s).inverse().dtdy(), getActiveTransform(s).inverse().dsdy(), getActiveTransform(s).inverse().det(),getActiveTransform(s).inverse().getScaleX(), getActiveTransform(s).inverse().getScaleY()); } if (getName().find("com.tencent.qqlive") != std::string::npos) { ALOGD("jinyanmeilayer computeBounds 1111 parentBounds=(%f,%f,%f,%f) :", parentBounds.left, parentBounds.top, parentBounds.right, parentBounds.bottom); ALOGD("jinyanmeilayer computeBounds 11111 getDebugName: %s ",getDebugName()); } // Calculate source bounds mSourceBounds = computeSourceBounds(parentBounds); if (getName().find("com.tencent.qqlive") != std::string::npos) { ALOGD("jinyanmeilayer computeBounds 222 mSourceBounds=(%f,%f,%f,%f) :", mSourceBounds.left, mSourceBounds.top, mSourceBounds.right, mSourceBounds.bottom); ALOGD("jinyanmeilayer computeBounds 222 getDebugName: %s ",getDebugName()); } // Calculate bounds by croping diplay frame with layer crop and parent bounds FloatRect bounds = mSourceBounds; const Rect layerCrop = getCrop(s); #if MI_SCREEN_PROJECTION if (!MiSurfaceFlingerStub::continueComputeBounds(this)) return; #endif if (!layerCrop.isEmpty()) { bounds = mSourceBounds.intersect(layerCrop.toFloatRect()); } if (getName().find("com.tencent.qqlive") != std::string::npos) { ALOGD("jinyanmeilayer computeBounds 333 bounds=(%f,%f,%f,%f) :", bounds.left, bounds.top, bounds.right, bounds.bottom); ALOGD("jinyanmeilayer computeBounds 333 getDebugName: %s ",getDebugName()); } bounds = bounds.intersect(parentBounds); mBounds = bounds; if (getName().find("com.tencent.qqlive") != std::string::npos) { ALOGD("jinyanmeilayer computeBounds 444 parentBounds=(%f,%f,%f,%f) :", mBounds.left, mBounds.top, mBounds.right, mBounds.bottom); ALOGD("jinyanmeilayer computeBounds 444 getDebugName: %s ",getDebugName()); } mScreenBounds = mEffectiveTransform.transform(mBounds); if (getName().find("com.tencent.qqlive") != std::string::npos) { ALOGD("jinyanmeilayer computeBounds 555 mScreenBounds=(%f,%f,%f,%f) :", mScreenBounds.left, mScreenBounds.top, mScreenBounds.right, mScreenBounds.bottom); ALOGD("jinyanmeilayer computeBounds 555 getDebugName: %s ",getDebugName()); } // Use the layer's own shadow radius if set. Otherwise get the radius from // parent. if (s.shadowRadius > 0.f) { mEffectiveShadowRadius = s.shadowRadius; } else { mEffectiveShadowRadius = parentShadowRadius; } // Shadow radius is passed down to only one layer so if the layer can draw shadows, // don't pass it to its children. const float childShadowRadius = canDrawShadows() ? 0.f : mEffectiveShadowRadius; for (const sp<Layer>& child : mDrawingChildren) { child->computeBounds(mBounds, mEffectiveTransform, childShadowRadius); } }