SurfaceFlinger 上帧后 releaseBuffer 完整流程分析

11 阅读21分钟

SurfaceFlinger 上帧后 releaseBuffer 完整流程分析

概述

本文档详细分析 Android 14 (AOSP) 中 SurfaceFlinger 上帧后 releaseBuffer 的完整流程,涵盖 SurfaceFlinger 端和 App 端的整个链路。

流程概览图

┌─────────────────────────────────────────────────────────────────────────────────────────┐
│                                    App 进程                                              │
│  ┌──────────────┐    ┌────────────────────┐    ┌─────────────────────────────────────┐  │
│  │   Producer   │───▶│   BLASTBufferQueue  │───▶│ TransactionCompletedListener        │  │
│  │ ( dequeue    │    │ (releaseBufferCallback)│   │ (onReleaseBuffer callback)         │  │
│  │   queueBuffer)│   └────────────────────┘    └─────────────────────────────────────┘  │
│  └──────────────┘                                                                      │
└─────────────────────────────────────────────────────────────────────────────────────────┘
                                        │
                                        │ Binder IPC (ITransactionCompletedListener)
                                        ▼
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│                                 SurfaceFlinger 进程                                     │
│  ┌──────────────┐    ┌────────────────────┐    ┌─────────────────────────────────────┐  │
│  │    Layer     │───▶│ TransactionCallback│───▶│     ITransactionCompletedListener   │  │
│  │(onLayerDisplayed) │    Invoker         │    │     (onReleaseBuffer)               │  │
│  │(callReleaseBuffer │  (sendCallbacks)   │    │                                     │  │
│  │   Callback)       │                    │    │                                     │  │
│  └──────────────┘    └────────────────────┘    └─────────────────────────────────────┘  │
│         │                                                                              │
│         ▼                                                                              │
│  ┌──────────────┐    ┌────────────────────┐    ┌─────────────────────────────────────┐  │
│  │ BufferQueue  │───▶│ BufferQueueConsumer│───▶│        IProducerListener            │  │
│  │   (Core)     │    │  (releaseBuffer)   │    │    (onBufferReleased)               │  │
│  └──────────────┘    └────────────────────┘    └─────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────────────────────────────┘

第零部分:SurfaceFlinger 主循环完整流程

在深入 releaseBuffer 流程之前,先了解 SurfaceFlinger 的主循环,这对于理解 releaseBuffer 的触发时机至关重要。

0.1 主循环入口:Scheduler::onFrameSignal

SurfaceFlinger 的主循环由 VSync 信号驱动,当 VSync 到来时,Scheduler 会调用 onFrameSignal

文件路径: frameworks/native/services/surfaceflinger/Scheduler/Scheduler.cpp

// 第 173-220 行
void Scheduler::onFrameSignal(ICompositor& compositor, VsyncId vsyncId,
                              TimePoint expectedVsyncTime) {
    const FrameTargeter::BeginFrameArgs beginFrameArgs = {
            .frameBeginTime = SchedulerClock::now(),
            .vsyncId = vsyncId,
            .expectedVsyncTime = expectedVsyncTime,
            .sfWorkDuration = mVsyncModulator->getVsyncConfig().sfWorkDuration
    };

    // ... 省略部分代码 ...

    // 第一步:commit - 处理 transaction,latch buffer
    if (!compositor.commit(pacesetterId, targets)) return;

    // 第二步:composite - 合成并输出到显示设备
    const auto resultsPerDisplay = compositor.composite(pacesetterId, targeters);
    
    // 第三步:sample - 采样统计
    compositor.sample();

    // ... 省略部分代码 ...
}

0.2 SurfaceFlinger::commit - 处理 Transaction 和 Latch Buffer

文件路径: frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

// 第 2337-2470 行
bool SurfaceFlinger::commit(PhysicalDisplayId pacesetterId,
                            const scheduler::FrameTargets& frameTargets) {
    // ... 省略部分代码 ...

    // 1. 处理 transactions
    commitTransactions();

    // 2. Latch buffers - 将新 buffer 从 Layer 的 drawing state 取出
    latchBuffers();

    // 3. 发送 onCommit 回调
    if (transactionsAreEmpty) {
        mTransactionCallbackInvoker.sendCallbacks(false /* onCommitOnly */);
    } else {
        mTransactionCallbackInvoker.sendCallbacks(true /* onCommitOnly */);
    }

    // ... 省略部分代码 ...
    
    return mustComposite && CC_LIKELY(mBootStage != BootStage::BOOTLOADER);
}

0.3 SurfaceFlinger::latchBuffers - Latch Layer 的 Buffer

文件路径: frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

// 第 4080-4130 行
bool SurfaceFlinger::latchBuffers() {
    ATRACE_CALL();
    const nsecs_t latchTime = systemTime();
    bool visibleRegions = false;
    bool frameQueued = false;
    bool newDataLatched = false;

    // ... 省略部分代码 ...

    // 对于有新帧的 layer,调用 latchBuffer
    for (const auto& layer : mLayersWithQueuedFrames) {
        if (layer->willReleaseBufferOnLatch()) {
            mLayersWithBuffersRemoved.emplace(layer);
        }
        if (layer->latchBuffer(visibleRegions, latchTime)) {
            mLayersPendingRefresh.push_back(layer);
            newDataLatched = true;
        }
        layer->useSurfaceDamage();
    }

    // 对于离屏 layer,调用 latchAndReleaseBuffer 释放 buffer
    for (Layer* offscreenLayer : mOffscreenLayers) {
        offscreenLayer->traverse(LayerVector::StateSet::Drawing,
                                 [&](Layer* l) { l->latchAndReleaseBuffer(); });
    }

    // ... 省略部分代码 ...
}

0.4 SurfaceFlinger::composite - 合成并显示

文件路径: frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

// 第 2530-2650 行
CompositeResultsPerDisplay SurfaceFlinger::composite(
        PhysicalDisplayId pacesetterId, const scheduler::FrameTargeters& frameTargeters) {
    // ... 省略部分代码 ...

    // 构造 CompositionRefreshArgs
    compositionengine::CompositionRefreshArgs refreshArgs;
    // ... 填充 refreshArgs ...

    // 调用 CompositionEngine::present 进行合成
    mCompositionEngine->present(refreshArgs);

    // ... 省略部分代码 ...
}

0.5 CompositionEngine::present - 遍历所有 Output 进行合成

文件路径: frameworks/native/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp

// 第 103-120 行
void CompositionEngine::present(CompositionRefreshArgs& args) {
    ATRACE_CALL();

    preComposition(args);

    {
        LayerFESet latchedLayers;
        for (const auto& output : args.outputs) {
            output->prepare(args, latchedLayers);
        }
    }

    // 对每个 Output 调用 present
    for (const auto& output : args.outputs) {
        output->present(args);
    }
}

0.6 Output::present - 单个 Output 的合成流程

文件路径: frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp

// 第 432-460 行
void Output::present(const compositionengine::CompositionRefreshArgs& refreshArgs) {
    ATRACE_FORMAT("%s for %s", __func__, mNamePlusId.c_str());

    updateColorProfile(refreshArgs);
    updateCompositionState(refreshArgs);
    planComposition();
    writeCompositionState(refreshArgs);
    setColorTransform(refreshArgs);
    beginFrame();

    // ... GPU 合成相关 ...

    devOptRepaintFlash(refreshArgs);
    finishFrame(std::move(result));
    
    // 关键:postFramebuffer 会触发 release fence 的传递
    postFramebuffer();
    
    renderCachedSets(refreshArgs);
}

第一部分:SurfaceFlinger 端的 releaseBuffer 流程

1.1 触发点:Output::postFramebuffer

当 SurfaceFlinger 完成一帧的合成后,会调用 Output::postFramebuffer,在这里会触发 release fence 的传递。

文件路径: frameworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp

// 第 1523-1575 行
void Output::postFramebuffer() {
    ATRACE_FORMAT("%s for %s", __func__, mNamePlusId.c_str());

    if (!getState().isEnabled) {
        return;
    }

    auto& outputState = editState();
    outputState.dirtyRegion.clear();

    // 获取这一帧的 fence
    auto frame = presentAndGetFrameFences();
    mRenderSurface->onPresentDisplayCompleted();

    // 对于每个显示的 Layer,传递 release fence
    for (auto* layer : getOutputLayersOrderedByZ()) {
        sp<Fence> releaseFence = Fence::NO_FENCE;

        // 从 HWC 获取 release fence
        if (auto hwcLayer = layer->getHwcLayer()) {
            if (auto f = frame.layerFences.find(hwcLayer); f != frame.layerFences.end()) {
                releaseFence = f->second;
            }
        }

        // 如果使用客户端合成,需要合并 client target acquire fence
        if (outputState.usesClientComposition) {
            releaseFence = Fence::merge("LayerRelease", releaseFence, 
                                        frame.clientTargetAcquireFence);
        }
        
        // 关键调用:通知 LayerFE 已显示完成,传递 release fence
        layer->getLayerFE()
                .onLayerDisplayed(ftl::yield<FenceResult>(std::move(releaseFence)).share(),
                                  outputState.layerFilter.layerStack);
    }

    // 对于已释放的 Layer,传递 present fence
    for (auto& weakLayer : mReleasedLayers) {
        if (const auto layer = weakLayer.promote()) {
            layer->onLayerDisplayed(ftl::yield<FenceResult>(frame.presentFence).share(),
                                    outputState.layerFilter.layerStack);
        }
    }

    mReleasedLayers.clear();
}

1.2 LayerFE::onLayerDisplayed - 存储 Release Fence

LayerFE (Layer Front-End) 接收 release fence 并存储到 CompositionResult 中。

文件路径: frameworks/native/services/surfaceflinger/LayerFE.cpp

// 第 328-332 行
void LayerFE::onLayerDisplayed(ftl::SharedFuture<FenceResult> futureFenceResult,
                               ui::LayerStack layerStack) {
    // 将 release fence 存储到 CompositionResult 中
    mCompositionResult.releaseFences.emplace_back(std::move(futureFenceResult), layerStack);
}

1.3 SurfaceFlinger::composite 中处理 CompositionResult

SurfaceFlinger::composite 中,调用 mCompositionEngine->present 后,会处理每个 Layer 的 CompositionResult,将 release fence 传递给 Layer。

文件路径: frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

// 第 2606-2620 行
mCompositionEngine->present(refreshArgs);
moveSnapshotsFromCompositionArgs(refreshArgs, layers);

// 处理每个 Layer 的 CompositionResult
for (auto [layer, layerFE] : layers) {
    CompositionResult compositionResult{layerFE->stealCompositionResult()};
    layer->onPreComposition(compositionResult.refreshStartTime);
    
    // 关键:将 release fence 传递给 Layer
    for (auto& [releaseFence, layerStack] : compositionResult.releaseFences) {
        Layer* clonedFrom = layer->getClonedFrom().get();
        auto owningLayer = clonedFrom ? clonedFrom : layer;
        owningLayer->onLayerDisplayed(std::move(releaseFence), layerStack);
    }
    
    if (compositionResult.lastClientCompositionFence) {
        layer->setWasClientComposed(compositionResult.lastClientCompositionFence);
    }
}

1.4 Layer::onLayerDisplayed - 关联 Release Fence 到 CallbackHandle

Layer 接收到 release fence 后,会将其关联到对应的 CallbackHandle。

文件路径: frameworks/native/services/surfaceflinger/Layer.cpp

// 第 2839-2895 行
void Layer::onLayerDisplayed(ftl::SharedFuture<FenceResult> futureFenceResult,
                             ui::LayerStack layerStack) {
    // 处理多显示情况下的 client composition fence
    if (mClearClientCompositionFenceOnLayerDisplayed) {
        mLastClientCompositionFence = nullptr;
    } else {
        mClearClientCompositionFenceOnLayerDisplayed = true;
    }

    // 查找需要 release fence 的 callback handle
    // releasePreviousBuffer 标志表示这个 transaction 需要前一个 buffer 的 release fence
    sp<CallbackHandle> ch;
    for (auto& handle : mDrawingState.callbackHandles) {
        if (handle->releasePreviousBuffer && 
            mPreviousReleaseBufferEndpoint == handle->listener) {
            ch = handle;
            break;
        }
    }

    // 防止重复追踪
    if (mPreviousFrameNumber != mPreviousReleasedFrameNumber) {
        mPreviousReleasedFrameNumber = mPreviousFrameNumber;
    }

    if (ch != nullptr) {
        // 将 release fence 关联到 callback handle
        ch->previousReleaseCallbackId = mPreviousReleaseCallbackId;
        ch->previousReleaseFences.emplace_back(std::move(futureFenceResult));
        ch->name = mName;
    }
    
    mPreviouslyPresentedLayerStacks.push_back(layerStack);
}

1.5 SurfaceFlinger::postComposition - 调用 releasePendingBuffer

SurfaceFlinger::composite 完成后,会调用 postComposition,在这里会调用 Layer::releasePendingBuffer

文件路径: frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

// 第 2796-2900 行
void SurfaceFlinger::postComposition(PhysicalDisplayId pacesetterId,
                                     const scheduler::FrameTargeters& frameTargeters,
                                     TimePoint presentTime) {
    // ... 省略部分代码 ...

    // 处理 mLayersWithBuffersRemoved (buffer 被移除的 layer)
    for (auto layer : mLayersWithBuffersRemoved) {
        std::vector<ui::LayerStack> previouslyPresentedLayerStacks =
                std::move(layer->mPreviouslyPresentedLayerStacks);
        layer->mPreviouslyPresentedLayerStacks.clear();
        
        for (auto layerStack : previouslyPresentedLayerStacks) {
            auto optDisplay = layerStackToDisplay.get(layerStack);
            if (optDisplay && !optDisplay->get()->isVirtual()) {
                auto fence = getHwComposer().getPresentFence(optDisplay->get()->getPhysicalId());
                layer->onLayerDisplayed(ftl::yield<FenceResult>(fence).share(),
                                        ui::INVALID_LAYER_STACK);
            }
        }
        // 关键调用:释放 pending buffer
        layer->releasePendingBuffer(presentTime.ns());
    }
    mLayersWithBuffersRemoved.clear();

    // 处理 mLayersWithQueuedFrames (有新帧的 layer)
    for (const auto& layer: mLayersWithQueuedFrames) {
        layer->onPostComposition(pacesetterDisplay.get(), pacesetterGpuCompositionDoneFenceTime,
                                 pacesetterPresentFenceTime, compositorTiming);
        // 关键调用:释放 pending buffer
        layer->releasePendingBuffer(presentTime.ns());
    }

    // ... 省略部分代码 ...

    // 发送回调给客户端
    mTransactionCallbackInvoker.sendCallbacks(false /* onCommitOnly */);
    mTransactionCallbackInvoker.clearCompletedTransactions();
}

1.6 Layer::releasePendingBuffer - 发送 Callback 给 TransactionCallbackInvoker

文件路径: frameworks/native/services/surfaceflinger/Layer.cpp

// 第 2908-2935 行
void Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
    // 设置 callback handle 的各种信息
    for (const auto& handle : mDrawingState.callbackHandles) {
        if (mFlinger->mLayerLifecycleManagerEnabled) {
            handle->transformHint = mTransformHint;
        } else {
            handle->transformHint = mSkipReportingTransformHint
                    ? std::nullopt
                    : std::make_optional<uint32_t>(mTransformHintLegacy);
        }
        handle->dequeueReadyTime = dequeueReadyTime;
        handle->currentMaxAcquiredBufferCount =
                mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(mOwnerUid);
        ATRACE_FORMAT_INSTANT("releasePendingBuffer %s - %" PRIu64, getDebugName(),
                              handle->previousReleaseCallbackId.framenumber);
    }

    // 处理 releasePreviousBuffer 的情况
    for (auto& handle : mDrawingState.callbackHandles) {
        if (handle->releasePreviousBuffer && 
            mPreviousReleaseBufferEndpoint == handle->listener) {
            handle->previousReleaseCallbackId = mPreviousReleaseCallbackId;
            break;
        }
    }

    // 收集 jank 数据
    std::vector<JankData> jankData;
    transferAvailableJankData(mDrawingState.callbackHandles, jankData);

    // 关键调用:将 callback handles 发送给 TransactionCallbackInvoker
    mFlinger->getTransactionCallbackInvoker().addCallbackHandles(mDrawingState.callbackHandles,
                                                                 jankData);
    mDrawingState.callbackHandles = {};
}

1.7 TransactionCallbackInvoker::addCallbackHandle - 添加回调信息

文件路径: frameworks/native/services/surfaceflinger/TransactionCallbackInvoker.cpp

// 第 112-170 行
status_t TransactionCallbackInvoker::addCallbackHandle(const sp<CallbackHandle>& handle,
        const std::vector<JankData>& jankData) {
    // 查找或创建 TransactionStats
    TransactionStats* transactionStats;
    status_t err = findOrCreateTransactionStats(handle->listener, handle->callbackIds, 
                                                &transactionStats);
    if (err != NO_ERROR) {
        return err;
    }

    transactionStats->latchTime = handle->latchTime;

    sp<IBinder> surfaceControl = handle->surfaceControl.promote();
    if (surfaceControl) {
        sp<Fence> prevFence = nullptr;

        // 合并多个 release fence
        for (const auto& future : handle->previousReleaseFences) {
            sp<Fence> currentFence = future.get().value_or(Fence::NO_FENCE);
            // ... 合并逻辑 ...
        }
        handle->previousReleaseFence = prevFence;
        handle->previousReleaseFences.clear();

        // 构造 SurfaceStats,包含 release fence
        FrameEventHistoryStats eventStats(...);
        transactionStats->surfaceStats.emplace_back(
                surfaceControl, 
                handle->acquireTimeOrFence,
                handle->previousReleaseFence,  // release fence
                handle->transformHint,
                handle->currentMaxAcquiredBufferCount,
                eventStats, 
                jankData,
                handle->previousReleaseCallbackId);
    }

    return NO_ERROR;
}

1.8 TransactionCallbackInvoker::sendCallbacks - 发送回调给客户端

文件路径: frameworks/native/services/surfaceflinger/TransactionCallbackInvoker.cpp

// 第 179-243 行
void TransactionCallbackInvoker::sendCallbacks(bool onCommitOnly) {
    auto completedTransactionsItr = mCompletedTransactions.begin();
    BackgroundExecutor::Callbacks callbacks;

    while (completedTransactionsItr != mCompletedTransactions.end()) {
        auto& [listener, transactionStatsDeque] = *completedTransactionsItr;
        ListenerStats listenerStats;
        listenerStats.listener = listener;

        auto transactionStatsItr = transactionStatsDeque.begin();
        while (transactionStatsItr != transactionStatsDeque.end()) {
            auto& transactionStats = *transactionStatsItr;

            if (onCommitOnly && !containsOnCommitCallbacks(transactionStats.callbackIds)) {
                transactionStatsItr++;
                continue;
            }

            // 设置 present fence
            if (transactionStats.latchTime >= 0 &&
                !containsOnCommitCallbacks(transactionStats.callbackIds)) {
                transactionStats.presentFence = mPresentFence;
            }

            listenerStats.transactionStats.push_back(std::move(transactionStats));
            transactionStatsItr = transactionStatsDeque.erase(transactionStatsItr);
        }

        // 发送回调给客户端
        if (!listenerStats.transactionStats.empty()) {
            if (listener->isBinderAlive()) {
                callbacks.emplace_back([stats = std::move(listenerStats)]() {
                    // 通过 Binder IPC 调用客户端的 onTransactionCompleted
                    interface_cast<ITransactionCompletedListener>(stats.listener)
                            ->onTransactionCompleted(stats);
                });
            }
        }
        completedTransactionsItr++;
    }

    // 在后台线程执行回调
    BackgroundExecutor::getInstance().sendCallbacks(std::move(callbacks));
}

1.9 Layer::callReleaseBufferCallback - 直接释放 Buffer

当需要单独释放 buffer 时(如 buffer 被覆盖、layer 销毁等),会直接调用此方法,不经过 TransactionCallbackInvoker。

文件路径: frameworks/native/services/surfaceflinger/Layer.cpp

// 第 2825-2837 行
void Layer::callReleaseBufferCallback(const sp<ITransactionCompletedListener>& listener,
                                      const sp<GraphicBuffer>& buffer, uint64_t framenumber,
                                      const sp<Fence>& releaseFence) {
    if (!listener) {
        return;
    }

    ATRACE_FORMAT_INSTANT("callReleaseBufferCallback %s - %" PRIu64, getDebugName(), framenumber);

    uint32_t currentMaxAcquiredBufferCount =
            mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(mOwnerUid);

    // 通过 Binder IPC 直接调用客户端的 onReleaseBuffer
    listener->onReleaseBuffer({buffer->getId(), framenumber},
                              releaseFence ? releaseFence : Fence::NO_FENCE,
                              currentMaxAcquiredBufferCount);
}

1.10 调用 callReleaseBufferCallback 的场景

文件路径: frameworks/native/services/surfaceflinger/Layer.cpp

// 场景1: setBuffer 时发现已有 buffer 且将被覆盖 (第 3090-3105 行)
bool Layer::setBuffer(const sp<GraphicBuffer>& buffer, ...) {
    if (mDrawingState.buffer) {
        mReleasePreviousBuffer = true;
        if (!mBufferInfo.mBuffer ||
            (!mDrawingState.buffer->hasSameBuffer(*mBufferInfo.mBuffer) ||
             mDrawingState.frameNumber != mBufferInfo.mFrameNumber)) {
            // 前一个 buffer 被丢弃,立即释放
            callReleaseBufferCallback(mDrawingState.releaseBufferListener,
                                      mDrawingState.buffer->getBuffer(), 
                                      mDrawingState.frameNumber,
                                      mDrawingState.acquireFence);
            decrementPendingBufferCount();
            // ... 
        }
    }
    // ...
}

// 场景2: Layer 销毁时 (第 230-240 行)
Layer::~Layer() {
    if (mBufferInfo.mBuffer != nullptr) {
        callReleaseBufferCallback(mDrawingState.releaseBufferListener,
                                  mBufferInfo.mBuffer->getBuffer(), 
                                  mBufferInfo.mFrameNumber,
                                  mBufferInfo.mFence);
    }
    // ...
}

// 场景3: latchAndReleaseBuffer - 用于离屏 layer (第 4129-4137 行)
void Layer::latchAndReleaseBuffer() {
    if (hasReadyFrame()) {
        bool ignored = false;
        latchBuffer(ignored, systemTime());
    }
    releasePendingBuffer(systemTime());
}

第二部分:App 端的 releaseBuffer 回调处理

2.0 ReleaseBufferCallback 的注册流程(关键前置步骤)

在理解 onTransactionCompletedonReleaseBuffer 之前,必须先了解 ReleaseBufferCallback 是如何注册的。

2.0.1 App 端调用 Transaction::setBuffer 时注册回调

文件路径: frameworks/native/libs/gui/SurfaceComposerClient.cpp

// 第 1686-1710 行
SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBuffer(
        const sp<SurfaceControl>& sc, const sp<GraphicBuffer>& buffer,
        const std::optional<sp<Fence>>& fence, const std::optional<uint64_t>& optFrameNumber,
        uint32_t producerId, ReleaseBufferCallback callback) {
    layer_state_t* s = getLayerState(sc);
    if (!s) {
        mStatus = BAD_INDEX;
        return *this;
    }

    releaseBufferIfOverwriting(*s);

    std::shared_ptr<BufferData> bufferData = std::make_shared<BufferData>();
    bufferData->buffer = buffer;
    if (buffer) {
        uint64_t frameNumber = sc->resolveFrameNumber(optFrameNumber);
        bufferData->frameNumber = frameNumber;
        bufferData->producerId = producerId;
        // ... 设置其他字段 ...
        
        // 关键:设置 releaseBufferEndpoint,用于标识回调接收端
        bufferData->releaseBufferEndpoint =
                IInterface::asBinder(TransactionCompletedListener::getIInstance());
        
        // 关键:注册 release buffer callback
        setReleaseBufferCallback(bufferData.get(), callback);
    }
    // ...
}
2.0.2 setReleaseBufferCallback 的实现

文件路径: frameworks/native/libs/gui/SurfaceComposerClient.cpp

// 第 1753-1767 行
void SurfaceComposerClient::Transaction::setReleaseBufferCallback(BufferData* bufferData,
                                                                  ReleaseBufferCallback callback) {
    if (!callback) {
        return;
    }

    if (!bufferData->buffer) {
        ALOGW("Transaction::setReleaseBufferCallback ignored trying to set a callback on a null buffer.");
        return;
    }

    // 关键步骤1:设置 releaseBufferListener 为 TransactionCompletedListener
    // 这个 listener 会被传递到 SurfaceFlinger,用于发送回调
    bufferData->releaseBufferListener = TransactionCompletedListener::getIInstance();

    // 关键步骤2:在 TransactionCompletedListener 中注册 callback
    // 使用 ReleaseCallbackId (bufferId + frameNumber) 作为 key
    auto listener = TransactionCompletedListener::getInstance();
    listener->setReleaseBufferCallback(bufferData->generateReleaseCallbackId(), callback);
}
2.0.3 TransactionCompletedListener::setReleaseBufferCallback - 存储回调

文件路径: frameworks/native/libs/gui/SurfaceComposerClient.cpp

// 第 298-301 行
void TransactionCompletedListener::setReleaseBufferCallback(const ReleaseCallbackId& callbackId,
                                                            ReleaseBufferCallback listener) {
    std::scoped_lock<std::mutex> lock(mMutex);
    // 关键:将 callback 存储在 map 中,key 是 ReleaseCallbackId
    mReleaseBufferCallbacks[callbackId] = listener;
}
2.0.4 ReleaseCallbackId 的生成

文件路径: frameworks/native/libs/gui/include/gui/LayerState.h

// BufferData 中的方法
ReleaseCallbackId generateReleaseCallbackId() const {
    return ReleaseCallbackId(buffer->getId(), frameNumber);
}

关键理解

  • ReleaseCallbackId = bufferId + frameNumber
  • 这个 ID 在 App 端生成并注册到 mReleaseBufferCallbacks map
  • 同时通过 Transaction 传递给 SurfaceFlinger
  • SurfaceFlinger 在释放 buffer 时,会使用这个 ID 来标识要释放的是哪个 buffer

2.1 SurfaceFlinger 端如何设置 previousReleaseCallbackId

2.1.1 Layer::gatherBufferInfo - 记录前一个 buffer 的 ReleaseCallbackId

文件路径: frameworks/native/services/surfaceflinger/Layer.cpp

// 第 3512-3525 行
void Layer::gatherBufferInfo() {
    // 关键:在 latch 新 buffer 之前,先记录当前 buffer 的 ReleaseCallbackId
    // 这个 ID 对应的是"即将被释放的 buffer"
    mPreviousReleaseCallbackId = {getCurrentBufferId(), mBufferInfo.mFrameNumber};
    mPreviousReleaseBufferEndpoint = mBufferInfo.mReleaseBufferEndpoint;
    
    if (!mDrawingState.buffer) {
        mBufferInfo = {};
        return;
    }

    // 更新 mBufferInfo 为新 latch 的 buffer
    mBufferInfo.mBuffer = mDrawingState.buffer;
    mBufferInfo.mReleaseBufferEndpoint = mDrawingState.releaseBufferEndpoint;
    // ...
}

关键理解

  • mPreviousReleaseCallbackId 记录的是当前正在显示的 buffer(即将被释放)
  • 当新 buffer 被 latch 时,当前显示的 buffer 就变成了"前一个 buffer"
  • 这个 ID 会被传递给客户端,用于查找对应的 callback
2.1.2 Layer::releasePendingBuffer - 传递 previousReleaseCallbackId

文件路径: frameworks/native/services/surfaceflinger/Layer.cpp

// 第 2908-2935 行
void Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
    // ... 设置其他字段 ...

    // 关键:将 previousReleaseCallbackId 传递给 callback handle
    for (auto& handle : mDrawingState.callbackHandles) {
        if (handle->releasePreviousBuffer && 
            mPreviousReleaseBufferEndpoint == handle->listener) {
            handle->previousReleaseCallbackId = mPreviousReleaseCallbackId;
            break;
        }
    }

    // 发送给 TransactionCallbackInvoker
    mFlinger->getTransactionCallbackInvoker().addCallbackHandles(mDrawingState.callbackHandles,
                                                                 jankData);
    mDrawingState.callbackHandles = {};
}

2.2 TransactionCompletedListener::onTransactionCompleted - 处理回调

App 端通过 ITransactionCompletedListener 接收 transaction 完成回调,其中包含 release fence 和 previousReleaseCallbackId

文件路径: frameworks/native/libs/gui/SurfaceComposerClient.cpp

// 第 336-460 行
void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) {
    // 构建回调 map
    std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> callbacksMap;
    std::multimap<int32_t, sp<JankDataListener>> jankListenersMap;
    {
        std::lock_guard<std::mutex> lock(mMutex);
        callbacksMap = mCallbacks;
        jankListenersMap = mJankListeners;
        // 清理已处理的 callback
        for (const auto& transactionStats : listenerStats.transactionStats) {
            for (auto& callbackId : transactionStats.callbackIds) {
                mCallbacks.erase(callbackId);
            }
        }
    }

    // 处理每个 transaction
    for (const auto& transactionStats : listenerStats.transactionStats) {
        for (auto callbackId : transactionStats.callbackIds) {
            if (callbackId.type != CallbackId::Type::ON_COMPLETE) {
                continue;
            }
            // ... 处理 transaction callback ...

            // 处理每个 surface 的统计信息
            for (const auto& surfaceStats : transactionStats.surfaceStats) {
                // ... 构造 SurfaceControlStats ...

                // 关键:检查是否有 release buffer callback 需要处理
                // previousReleaseCallbackId 标识了需要释放的 buffer
                if (surfaceStats.previousReleaseCallbackId != ReleaseCallbackId::INVALID_ID) {
                    ReleaseBufferCallback callback;
                    {
                        std::scoped_lock<std::mutex> lock(mMutex);
                        // 关键:从 mReleaseBufferCallbacks map 中查找对应的 callback
                        // 使用 SurfaceFlinger 传来的 previousReleaseCallbackId 作为 key
                        callback = popReleaseBufferCallbackLocked(
                                surfaceStats.previousReleaseCallbackId);
                    }
                    if (callback) {
                        // 找到 callback,直接调用
                        // 这是一个性能优化:避免额外的 IPC 调用
                        callback(surfaceStats.previousReleaseCallbackId,
                                 surfaceStats.previousReleaseFence
                                         ? surfaceStats.previousReleaseFence
                                         : Fence::NO_FENCE,
                                 surfaceStats.currentMaxAcquiredBufferCount);
                    }
                }
            }
        }
    }
}

关键理解

  • surfaceStats.previousReleaseCallbackId 是 SurfaceFlinger 传来的,标识需要释放的 buffer
  • 使用这个 ID 从 mReleaseBufferCallbacks map 中查找对应的 callback
  • 如果找到,直接在 onTransactionCompleted 中调用,避免额外的 IPC

2.3 TransactionCompletedListener::onReleaseBuffer - 单独的释放路径

当 SurfaceFlinger 直接调用 onReleaseBuffer 时(通过 Layer::callReleaseBufferCallback),会走这个路径。

文件路径: frameworks/native/libs/gui/SurfaceComposerClient.cpp

// 第 511-530 行
void TransactionCompletedListener::onReleaseBuffer(ReleaseCallbackId callbackId,
                                                   sp<Fence> releaseFence,
                                                   uint32_t currentMaxAcquiredBufferCount) {
    ReleaseBufferCallback callback;
    {
        std::scoped_lock<std::mutex> lock(mMutex);
        // 同样从 mReleaseBufferCallbacks map 中查找 callback
        callback = popReleaseBufferCallbackLocked(callbackId);
    }

    if (!callback) {
        ALOGE("Could not call release buffer callback, buffer not found %s",
              callbackId.to_string().c_str());
        return;
    }

    std::optional<uint32_t> optionalMaxAcquiredBufferCount =
            currentMaxAcquiredBufferCount == UINT_MAX
            ? std::nullopt
            : std::make_optional<uint32_t>(currentMaxAcquiredBufferCount);

    // 执行回调
    callback(callbackId, releaseFence, optionalMaxAcquiredBufferCount);
}

2.4 popReleaseBufferCallbackLocked - 从 map 中取出回调

文件路径: frameworks/native/libs/gui/SurfaceComposerClient.cpp

// 第 531-540 行
ReleaseBufferCallback TransactionCompletedListener::popReleaseBufferCallbackLocked(
        const ReleaseCallbackId& callbackId) {
    ReleaseBufferCallback callback;
    // 在 mReleaseBufferCallbacks map 中查找
    auto itr = mReleaseBufferCallbacks.find(callbackId);
    if (itr == mReleaseBufferCallbacks.end()) {
        return nullptr;  // 没找到,可能已经被处理过
    }
    callback = itr->second;
    // 取出后从 map 中删除,避免重复调用
    mReleaseBufferCallbacks.erase(itr);
    return callback;
}

2.5 两种 Release 路径的对比

┌─────────────────────────────────────────────────────────────────────────────────────┐
│                        ReleaseBufferCallback 的两条路径                              │
├─────────────────────────────────────────────────────────────────────────────────────┤
│                                                                                     │
│  路径1: 通过 onTransactionCompleted (正常流程,性能优化)                             │
│  ─────────────────────────────────────────────────────────────────────────────────  │
│                                                                                     │
│  SurfaceFlinger:                                                                    │
│    Layer::gatherBufferInfo() → 设置 mPreviousReleaseCallbackId                      │
│    Layer::releasePendingBuffer() → 传递 previousReleaseCallbackId 到 CallbackHandle │
│    TransactionCallbackInvoker → 将 previousReleaseCallbackId 放入 SurfaceStats      │
│    sendCallbacks() → 调用 onTransactionCompleted                                    │
│                                                                                     │
│  App:                                                                               │
│    onTransactionCompleted() → 检查 surfaceStats.previousReleaseCallbackId           │
│      → popReleaseBufferCallbackLocked(previousReleaseCallbackId)                    │
│      → 直接调用 callback (避免额外 IPC)                                              │
│                                                                                     │
├─────────────────────────────────────────────────────────────────────────────────────┤
│                                                                                     │
│  路径2: 通过 onReleaseBuffer (快速路径,用于 buffer 被覆盖等场景)                    │
│  ─────────────────────────────────────────────────────────────────────────────────  │
│                                                                                     │
│  SurfaceFlinger:                                                                    │
│    Layer::setBuffer() 发现 buffer 被覆盖                                            │
│      → callReleaseBufferCallback() → 直接调用 onReleaseBuffer                       │
│                                                                                     │
│  App:                                                                               │
│    onReleaseBuffer() → popReleaseBufferCallbackLocked(callbackId)                   │
│      → 调用 callback                                                                │
│                                                                                     │
└─────────────────────────────────────────────────────────────────────────────────────┘

为什么需要两条路径?

  1. 路径1 (onTransactionCompleted)

    • 正常的 buffer 显示完成后释放
    • release fence 和 transaction callback 一起发送,减少 IPC 次数
    • 性能优化:一次 IPC 完成两件事
  2. 路径2 (onReleaseBuffer)

    • buffer 被覆盖、layer 销毁等异常场景
    • 没有 transaction callback 关联
    • 需要单独的 IPC 调用

2.6 BLASTBufferQueue::releaseBufferCallback

BLASTBufferQueue 是 App 端管理 buffer 的核心类,它注册了 releaseBuffer callback。

文件路径: frameworks/native/libs/gui/BLASTBufferQueue.cpp

// 第 392-420 行
// 静态回调函数
static void releaseBufferCallbackThunk(wp<BLASTBufferQueue> context, 
                                       const ReleaseCallbackId& id,
                                       const sp<Fence>& releaseFence,
                                       std::optional<uint32_t> currentMaxAcquiredBufferCount) {
    sp<BLASTBufferQueue> blastBufferQueue = context.promote();
    if (blastBufferQueue) {
        blastBufferQueue->releaseBufferCallback(id, releaseFence, currentMaxAcquiredBufferCount);
    }
}

// 第 412-420 行
void BLASTBufferQueue::releaseBufferCallback(
        const ReleaseCallbackId& id, const sp<Fence>& releaseFence,
        std::optional<uint32_t> currentMaxAcquiredBufferCount) {
    std::lock_guard _lock{mMutex};
    BBQ_TRACE();
    releaseBufferCallbackLocked(id, releaseFence, currentMaxAcquiredBufferCount,
                                false /* fakeRelease */);
}

// 第 421-470 行
void BLASTBufferQueue::releaseBufferCallbackLocked(
        const ReleaseCallbackId& id, const sp<Fence>& releaseFence,
        std::optional<uint32_t> currentMaxAcquiredBufferCount, bool fakeRelease) {
    ATRACE_CALL();
    BQA_LOGV("releaseBufferCallback %s", id.to_string().c_str());

    // 计算 EGL 客户端需要持有的 buffer 数量
    const auto it = mSubmitted.find(id);
    const bool isEGL = it != mSubmitted.end() && it->second.mApi == NATIVE_WINDOW_API_EGL;

    if (currentMaxAcquiredBufferCount) {
        mCurrentMaxAcquiredBufferCount = *currentMaxAcquiredBufferCount;
    }

    const uint32_t numPendingBuffersToHold =
            isEGL ? std::max(0, mMaxAcquiredBuffers - (int32_t)mCurrentMaxAcquiredBufferCount) : 0;

    // 将 buffer 加入待释放队列
    auto rb = ReleasedBuffer{id, releaseFence};
    if (std::find(mPendingRelease.begin(), mPendingRelease.end(), rb) == mPendingRelease.end()) {
        mPendingRelease.emplace_back(rb);
    }

    // 释放超出持有数量的 buffer
    while (mPendingRelease.size() > numPendingBuffersToHold) {
        const auto releasedBuffer = mPendingRelease.front();
        mPendingRelease.pop_front();
        releaseBuffer(releasedBuffer.callbackId, releasedBuffer.releaseFence);

        if (mSyncedFrameNumbers.empty()) {
            acquireNextBufferLocked(std::nullopt);
        }
    }
}

2.4 BLASTBufferQueue::releaseBuffer - 实际释放 Buffer

文件路径: frameworks/native/libs/gui/BLASTBufferQueue.cpp

// 第 471-485 行
void BLASTBufferQueue::releaseBuffer(const ReleaseCallbackId& callbackId,
                                     const sp<Fence>& releaseFence) {
    // 从 mSubmitted map 中查找对应的 buffer
    auto it = mSubmitted.find(callbackId);
    if (it == mSubmitted.end()) {
        BQA_LOGE("ERROR: releaseBufferCallback without corresponding submitted buffer %s",
                 callbackId.to_string().c_str());
        return;
    }

    mNumAcquired--;
    BBQ_TRACE("frame=%" PRIu64, callbackId.framenumber);
    BQA_LOGV("released %s", callbackId.to_string().c_str());

    // 关键调用:通过 BufferItemConsumer 释放 buffer
    mBufferItemConsumer->releaseBuffer(it->second, releaseFence);

    mSubmitted.erase(it);
    mSyncedFrameNumbers.erase(callbackId.framenumber);
}

2.5 BufferItemConsumer::releaseBuffer

BufferItemConsumer 封装了 buffer 的释放操作。

文件路径: frameworks/native/libs/gui/BufferItemConsumer.cpp

// 第 88-105 行
status_t BufferItemConsumer::releaseBuffer(const BufferItem &item,
        const sp<Fence>& releaseFence) {
    status_t err;

    Mutex::Autolock _l(mMutex);

    // 添加 release fence
    err = addReleaseFenceLocked(item.mSlot, item.mGraphicBuffer, releaseFence);
    if (err != OK) {
        BI_LOGE("Failed to addReleaseFenceLocked");
    }

    // 调用父类的 releaseBufferLocked
    err = releaseBufferLocked(item.mSlot, item.mGraphicBuffer, EGL_NO_DISPLAY,
            EGL_NO_SYNC_KHR);
    if (err != OK && err != IGraphicBufferConsumer::STALE_BUFFER_SLOT) {
        BI_LOGE("Failed to release buffer: %s (%d)",
                strerror(-err), err);
    }
    return err;
}

2.6 ConsumerBase::releaseBufferLocked

ConsumerBase 是 BufferItemConsumer 的父类,实现了通用的 buffer 释放逻辑。

文件路径: frameworks/native/libs/gui/ConsumerBase.cpp

// 第 480-510 行
status_t ConsumerBase::releaseBufferLocked(
        int slot, const sp<GraphicBuffer> graphicBuffer,
        EGLDisplay display, EGLSyncKHR eglFence) {
    if (mAbandoned) {
        CB_LOGE("releaseBufferLocked: ConsumerBase is abandoned!");
        return NO_INIT;
    }

    // 检查是否仍在跟踪这个 buffer
    if (!stillTracking(slot, graphicBuffer)) {
        return OK;
    }

    CB_LOGV("releaseBufferLocked: slot=%d/%" PRIu64,
            slot, mSlots[slot].mFrameNumber);

    // 关键调用:通过 IGraphicBufferConsumer 释放 buffer
    status_t err = mConsumer->releaseBuffer(slot, mSlots[slot].mFrameNumber,
            display, eglFence, mSlots[slot].mFence);

    if (err == IGraphicBufferConsumer::STALE_BUFFER_SLOT) {
        freeBufferLocked(slot);
    }

    mPrevFinalReleaseFence = mSlots[slot].mFence;
    mSlots[slot].mFence = Fence::NO_FENCE;

    return err;
}

2.7 BufferQueueConsumer::releaseBuffer - 归还 Buffer 给 Producer

BufferQueueConsumer 是 BufferQueue 的消费者端,负责将 buffer 归还给生产者。

文件路径: frameworks/native/libs/gui/BufferQueueConsumer.cpp

// 第 443-505 行
status_t BufferQueueConsumer::releaseBuffer(int slot, uint64_t frameNumber,
        const sp<Fence>& releaseFence, EGLDisplay eglDisplay,
        EGLSyncKHR eglFence) {
    ATRACE_CALL();
    ATRACE_BUFFER_INDEX(slot);

    if (slot < 0 || slot >= BufferQueueDefs::NUM_BUFFER_SLOTS ||
            releaseFence == nullptr) {
        BQ_LOGE("releaseBuffer: slot %d out of range or fence %p NULL", slot,
                releaseFence.get());
        return BAD_VALUE;
    }

    sp<IProducerListener> listener;
    {
        std::lock_guard<std::mutex> lock(mCore->mMutex);

        // 检查 frame number 是否匹配
        if (frameNumber != mSlots[slot].mFrameNumber &&
                !mSlots[slot].mBufferState.isShared()) {
            return STALE_BUFFER_SLOT;
        }

        if (!mSlots[slot].mBufferState.isAcquired()) {
            BQ_LOGE("releaseBuffer: attempted to release buffer slot %d "
                    "but its state was %s", slot,
                    mSlots[slot].mBufferState.string());
            return BAD_VALUE;
        }

        // 更新 slot 状态
        mSlots[slot].mEglDisplay = eglDisplay;
        mSlots[slot].mEglFence = eglFence;
        mSlots[slot].mFence = releaseFence;
        mSlots[slot].mBufferState.release();  // ACQUIRED -> RELEASED

        // 处理 shared buffer mode
        if (!mCore->mSharedBufferMode && mSlots[slot].mBufferState.isFree()) {
            mSlots[slot].mBufferState.mShared = false;
        }

        // 将 slot 从 active 移到 free
        if (!mSlots[slot].mBufferState.isShared()) {
            mCore->mActiveBuffers.erase(slot);
            mCore->mFreeBuffers.push_back(slot);
        }

        // 获取 producer listener
        if (mCore->mBufferReleasedCbEnabled) {
            listener = mCore->mConnectedProducerListener;
        }

        BQ_LOGV("releaseBuffer: releasing slot %d", slot);

        // 通知等待 dequeue 的线程
        mCore->mDequeueCondition.notify_all();
    }

    // 在锁外调用回调,通知 Producer buffer 已释放
    if (listener != nullptr) {
        listener->onBufferReleased();
    }

    return NO_ERROR;
}

第三部分:mDequeueCondition.notify_all() 的作用详解

3.1 核心问题解答

是的,mCore->mDequeueCondition.notify_all() 表示这个 buffer 又可以被 dequeue 了。

当 Consumer 调用 releaseBuffer 释放 buffer 后,这个 buffer 从 ACQUIRED 状态变为 FREE 状态,并被加入到 mFreeBuffers 列表中。此时调用 notify_all() 会唤醒正在等待的 Producer 线程,让它们可以 dequeueBuffer 获取这个 buffer。

3.2 mDequeueCondition 的定义

文件路径: frameworks/native/libs/gui/include/gui/BufferQueueCore.h

// 第 218-220 行
// mDequeueCondition is a condition variable used for dequeueBuffer in
// synchronous mode.
mutable std::condition_variable mDequeueCondition;

关键数据结构

// 第 193-210 行
// mFreeSlots contains all of the slots which are FREE and do not currently
// have a buffer attached.
std::set<int> mFreeSlots;

// mFreeBuffers contains all of the slots which are FREE and currently have
// a buffer attached.
std::list<int> mFreeBuffers;

// mActiveBuffers contains all slots which have a non-FREE buffer attached.
std::set<int> mActiveBuffers;

3.3 Producer 端:dequeueBuffer 等待 Free Buffer

文件路径: frameworks/native/libs/gui/BufferQueueProducer.cpp

// 第 281-380 行
status_t BufferQueueProducer::waitForFreeSlotThenRelock(FreeSlotCaller caller,
        std::unique_lock<std::mutex>& lock, int* found) const {
    auto callerString = (caller == FreeSlotCaller::Dequeue) ?
            "dequeueBuffer" : "attachBuffer";
    bool tryAgain = true;
    while (tryAgain) {
        // ... 检查 buffer 状态 ...

        *found = BufferQueueCore::INVALID_BUFFER_SLOT;

        // 检查是否 too many buffers queued
        const int maxBufferCount = mCore->getMaxBufferCountLocked();
        bool tooManyBuffers = mCore->mQueue.size()
                            > static_cast<size_t>(maxBufferCount);
        if (tooManyBuffers) {
            BQ_LOGV("%s: queue size is %zu, waiting", callerString,
                    mCore->mQueue.size());
        } else {
            // 尝试从 mFreeBuffers 获取一个 free buffer
            if (caller == FreeSlotCaller::Dequeue) {
                int slot = getFreeBufferLocked();
                if (slot != BufferQueueCore::INVALID_BUFFER_SLOT) {
                    *found = slot;
                } else if (mCore->mAllowAllocation) {
                    *found = getFreeSlotLocked();
                }
            }
            // ...
        }

        // 关键:如果没有找到 free buffer,或者 too many buffers,则等待
        // 注释明确说明:wait for a buffer to be acquired or released
        tryAgain = (*found == BufferQueueCore::INVALID_BUFFER_SLOT) ||
                   tooManyBuffers;
        if (tryAgain) {
            // 非阻塞模式直接返回
            if ((mCore->mDequeueBufferCannotBlock || mCore->mAsyncMode) &&
                    (acquiredCount <= mCore->mMaxAcquiredBufferCount)) {
                return WOULD_BLOCK;
            }
            
            // 关键:等待 mDequeueCondition
            // 当 Consumer releaseBuffer 时会被唤醒
            if (mDequeueTimeout >= 0) {
                std::cv_status result = mCore->mDequeueCondition.wait_for(lock,
                        std::chrono::nanoseconds(mDequeueTimeout));
                if (result == std::cv_status::timeout) {
                    return TIMED_OUT;
                }
            } else {
                // 无限等待,直到被 notify
                mCore->mDequeueCondition.wait(lock);
            }
        }
    } // while (tryAgain)

    return NO_ERROR;
}

3.4 getFreeBufferLocked - 从 mFreeBuffers 获取 Free Buffer

文件路径: frameworks/native/libs/gui/BufferQueueProducer.cpp

// 第 265-272 行
int BufferQueueProducer::getFreeBufferLocked() const {
    if (mCore->mFreeBuffers.empty()) {
        return BufferQueueCore::INVALID_BUFFER_SLOT;  // 没有 free buffer
    }
    // 从 mFreeBuffers 列表头部取出一个 slot
    int slot = mCore->mFreeBuffers.front();
    mCore->mFreeBuffers.pop_front();
    return slot;
}

3.5 Consumer 端:releaseBuffer 释放 Buffer 并唤醒等待者

文件路径: frameworks/native/libs/gui/BufferQueueConsumer.cpp

// 第 443-505 行
status_t BufferQueueConsumer::releaseBuffer(int slot, uint64_t frameNumber,
        const sp<Fence>& releaseFence, EGLDisplay eglDisplay,
        EGLSyncKHR eglFence) {
    ATRACE_CALL();
    ATRACE_BUFFER_INDEX(slot);

    // ... 参数检查 ...

    sp<IProducerListener> listener;
    {
        std::lock_guard<std::mutex> lock(mCore->mMutex);

        // ... 状态检查 ...

        // 关键步骤1:更新 buffer 状态
        // BufferState::release() 会减少 mAcquireCount
        // 当 mAcquireCount 变为 0 时,isAcquired() 返回 false
        // 此时 isFree() 返回 true(因为 !isAcquired() && !isDequeued() && !isQueued())
        mSlots[slot].mBufferState.release();

        // 关键步骤2:处理 shared buffer mode
        if (!mCore->mSharedBufferMode && mSlots[slot].mBufferState.isFree()) {
            mSlots[slot].mBufferState.mShared = false;
        }

        // 关键步骤3:将 slot 从 mActiveBuffers 移到 mFreeBuffers
        // 这样 dequeueBuffer 就可以获取这个 buffer 了
        if (!mSlots[slot].mBufferState.isShared()) {
            mCore->mActiveBuffers.erase(slot);      // 从 active 移除
            mCore->mFreeBuffers.push_back(slot);    // 加入 free 列表
        }

        if (mCore->mBufferReleasedCbEnabled) {
            listener = mCore->mConnectedProducerListener;
        }

        BQ_LOGV("releaseBuffer: releasing slot %d", slot);

        // 关键步骤4:通知等待 dequeue 的线程
        // 这会唤醒在 waitForFreeSlotThenRelock 中 wait 的 Producer 线程
        mCore->mDequeueCondition.notify_all();
        
        VALIDATE_CONSISTENCY();
    } // Autolock scope

    // 在锁外调用回调,通知 Producer buffer 已释放
    if (listener != nullptr) {
        listener->onBufferReleased();
    }

    return NO_ERROR;
}

3.6 BufferState::release() - 状态转换

文件路径: frameworks/native/libs/gui/include/gui/BufferSlot.h

// 第 100-110 行
// ACQUIRED indicates that the buffer has been acquired by the consumer. As
// with QUEUED, the contents must not be accessed by the consumer until the
// acquire fence is signaled. The slot is "owned" by the consumer. It
// transitions to FREE when releaseBuffer (or detachBuffer) is called. A
// detached buffer can also enter the ACQUIRED state via attachBuffer.

// 第 130-140 行
inline bool isFree() const {
    return !isAcquired() && !isDequeued() && !isQueued();
}

inline bool isAcquired() const {
    return mAcquireCount > 0;
}

// 第 165-170 行
inline void release() {
    if (mAcquireCount > 0) {
        mAcquireCount--;
    }
}

3.7 完整的 Buffer 状态流转图

┌─────────────────────────────────────────────────────────────────────────────────────┐
│                              Buffer 状态流转                                         │
├─────────────────────────────────────────────────────────────────────────────────────┤
│                                                                                     │
│   ┌──────────┐    dequeueBuffer    ┌──────────┐    queueBuffer    ┌──────────┐     │
│   │   FREE   │ ─────────────────▶ │ DEQUEUED │ ───────────────▶ │  QUEUED  │     │
│   └──────────┘                     └──────────┘                   └──────────┘     │
│        ▲                                                                │          │
│        │                                                                │          │
│        │                         cancelBuffer                           │          │
│        └────────────────────────────────────────────────────────────────┘          │
│        │                                                                │          │
│        │                                                                ▼          │
│        │                                                          ┌──────────┐     │
│        │                                                          │ ACQUIRED │     │
│        │                                                          └──────────┘     │
│        │                                                                │          │
│        │                         releaseBuffer                          │          │
│        └────────────────────────────────────────────────────────────────┘          │
│                                                                                     │
│   关键操作:                                                                        │
│   - releaseBuffer: ACQUIRED → FREE                                                 │
│     1. mBufferState.release() → mAcquireCount--                                    │
│     2. mActiveBuffers.erase(slot)                                                  │
│     3. mFreeBuffers.push_back(slot)                                                │
│     4. mDequeueCondition.notify_all() ← 唤醒等待的 dequeueBuffer                    │
│                                                                                     │
└─────────────────────────────────────────────────────────────────────────────────────┘

3.8 时序图:releaseBuffer 唤醒 dequeueBuffer

┌─────────────────┐                    ┌─────────────────┐                    ┌─────────────────┐
│    Producer     │                    │   BufferQueue   │                    │    Consumer     │
│   (App 端)      │                    │     (Core)      │                    │ (SurfaceFlinger)│
└────────┬────────┘                    └────────┬────────┘                    └────────┬────────┘
         │                                      │                                      │
         │ dequeueBuffer()                      │                                      │
         │─────────────────────────────────────▶│                                      │
         │                                      │                                      │
         │                                      │ mFreeBuffers.empty()?                │
         │                                      │ ────┐                                │
         │                                      │     │ 是 → wait(mDequeueCondition)   │
         │                                      │ <───┘                                │
         │                                      │                                      │
         │         (Producer 线程阻塞等待)       │                                      │
         │                                      │                                      │
         │                                      │                   acquireBuffer()    │
         │                                      │◀─────────────────────────────────────│
         │                                      │                                      │
         │                                      │                   ... 显示 buffer ... │
         │                                      │                                      │
         │                                      │                   releaseBuffer()    │
         │                                      │◀─────────────────────────────────────│
         │                                      │                                      │
         │                                      │ mBufferState.release()               │
         │                                      │   → mAcquireCount--                  │
         │                                      │                                      │
         │                                      │ mActiveBuffers.erase(slot)           │
         │                                      │ mFreeBuffers.push_back(slot)         │
         │                                      │                                      │
         │                                      │ mDequeueCondition.notify_all()       │
         │                                      │ ────┐                                │
         │◀─────────────────────────────────────│     │ 唤醒等待的 Producer 线程          │
         │                                      │ <───┘                                │
         │                                      │                                      │
         │ 从 mFreeBuffers 获取 slot            │                                      │
         │◀─────────────────────────────────────│                                      │
         │                                      │                                      │
         │ 返回 free buffer slot                │                                      │
         │                                      │                                      │

3.9 为什么需要 notify_all 而不是 notify_one?

使用 notify_all() 而不是 notify_one() 的原因:

  1. 可能有多个 Producer 线程在等待:在多线程应用中,可能有多个线程同时尝试 dequeue buffer

  2. 条件变量唤醒后需要重新检查条件:被唤醒的线程会重新检查 mFreeBuffers.empty() 和其他条件,只有真正有 free buffer 的线程才能继续执行

  3. 其他状态变化也需要通知mDequeueCondition 不仅用于 buffer 释放,还用于:

    • setMaxDequeuedBufferCount 改变时
    • setAsyncMode 改变时
    • disconnect
    • buffer allocation 完成时

3.10 其他调用 mDequeueCondition.notify_all() 的场景

文件路径: frameworks/native/libs/gui/BufferQueueConsumer.cpp

// 场景1: connect (第 299 行)
status_t BufferQueueConsumer::connect(...) {
    // ...
    mCore->mDequeueCondition.notify_all();
}

// 场景2: disconnect (第 553 行)
status_t BufferQueueConsumer::disconnect() {
    // ...
    mCore->mIsAbandoned = true;
    mCore->mQueue.clear();
    mCore->freeAllBuffersLocked();
    mCore->mDequeueCondition.notify_all();  // 唤醒等待的线程,让它们返回错误
}

文件路径: frameworks/native/libs/gui/BufferQueueProducer.cpp

// 场景3: setMaxDequeuedBufferCount (第 200 行)
status_t BufferQueueProducer::setMaxDequeuedBufferCount(...) {
    // ...
    mCore->mDequeueCondition.notify_all();
}

// 场景4: setAsyncMode (第 252 行)
status_t BufferQueueProducer::setAsyncMode(...) {
    // ...
    mCore->mDequeueCondition.notify_all();
}

// 场景5: queueBuffer (第 702 行)
status_t BufferQueueProducer::queueBuffer(...) {
    // ...
    mCore->mDequeueCondition.notify_all();
}

// 场景6: cancelBuffer (第 1039 行)
status_t BufferQueueProducer::cancelBuffer(...) {
    // ...
    mCore->mDequeueCondition.notify_all();
}

// 场景7: disconnect (第 1176 行)
status_t BufferQueueProducer::disconnect(...) {
    // ...
    mCore->mDequeueCondition.notify_all();
}

第四部分:完整流程时序图

┌──────────────┐ ┌────────────┐ ┌───────────────┐ ┌──────────────┐ ┌──────────────┐ ┌─────────────┐
│   VSync      │ │ Scheduler  │ │SurfaceFlinger │ │   Output     │ │    Layer     │ │  App Process│
│   Signal     │ │            │ │               │ │              │ │              │ │             │
└──────┬───────┘ └─────┬──────┘ └──────┬────────┘ └──────┬───────┘ └──────┬───────┘ └──────┬──────┘
       │               │               │                 │                │                │
       │ VSync         │               │                 │                │                │
       │──────────────▶│               │                 │                │                │
       │               │               │                 │                │                │
       │               │ onFrameSignal │                 │                │                │
       │               │──────────────▶│                 │                │                │
       │               │               │                 │                │                │
       │               │               │ commit()        │                │                │
       │               │               │────────────────▶│                │                │
       │               │               │                 │                │                │
       │               │               │                 │ latchBuffer()  │                │
       │               │               │                 │───────────────▶│                │
       │               │               │                 │                │                │
       │               │               │ composite()     │                │                │
       │               │               │────────────────▶│                │                │
       │               │               │                 │                │                │
       │               │               │                 │ present()      │                │
       │               │               │                 │───────────────▶│                │
       │               │               │                 │                │                │
       │               │               │                 │ postFramebuffer()              │
       │               │               │                 │───────────────▶│                │
       │               │               │                 │                │                │
       │               │               │                 │ onLayerDisplayed()             │
       │               │               │                 │───────────────▶│                │
       │               │               │                 │                │                │
       │               │               │ postComposition()                │                │
       │               │               │─────────────────────────────────▶│                │
       │               │               │                 │                │                │
       │               │               │                 │                │ releasePendingBuffer()
       │               │               │                 │                │────────────────▶
       │               │               │                 │                │                │
       │               │               │                 │                │ TransactionCallbackInvoker
       │               │               │                 │                │ .sendCallbacks()│
       │               │               │                 │                │────────────────▶
       │               │               │                 │                │                │
       │               │               │                 │                │                │ ▼
       │               │               │                 │                │                │ onTransactionCompleted
       │               │               │                 │                │                │ (with release fence)
       │               │               │                 │                │                │
       │               │               │                 │                │                │ ▼
       │               │               │                 │                │                │ BLASTBufferQueue
       │               │               │                 │                │                │ .releaseBufferCallback
       │               │               │                 │                │                │
       │               │               │                 │                │                │ ▼
       │               │               │                 │                │                │ BufferItemConsumer
       │               │               │                 │                │                │ .releaseBuffer
       │               │               │                 │                │                │
       │               │               │                 │                │                │ ▼
       │               │               │                 │                │                │ BufferQueueConsumer
       │               │               │                 │                │                │ .releaseBuffer
       │               │               │                 │                │                │
       │               │               │                 │                │                │ ▼
       │               │               │                 │                │                │ IProducerListener
       │               │               │                 │                │                │ .onBufferReleased
       │               │               │                 │                │                │
       │               │               │                 │                │                │ ▼
       │               │               │                 │                │                │ Producer can
       │               │               │                 │                │                │ dequeueBuffer

第四部分:关键数据结构

4.1 ReleaseCallbackId

文件路径: frameworks/native/libs/gui/include/gui/ITransactionCompletedListener.h

struct ReleaseCallbackId {
    uint64_t bufferId;
    uint64_t framenumber;

    ReleaseCallbackId() : bufferId(0), framenumber(0) {}
    ReleaseCallbackId(uint64_t bufferId, uint64_t framenumber)
        : bufferId(bufferId), framenumber(framenumber) {}
        
    std::string to_string() const {
        return "bufferId:" + std::to_string(bufferId) +
                " framenumber:" + std::to_string(framenumber);
    }
};

4.2 CallbackHandle

文件路径: frameworks/native/services/surfaceflinger/Layer.h

class CallbackHandle {
public:
    sp<IBinder> listener;           // ITransactionCompletedListener
    std::vector<CallbackId> callbackIds;
    wp<IBinder> surfaceControl;

    // Release buffer 相关字段
    ReleaseCallbackId previousReleaseCallbackId;
    sp<Fence> previousReleaseFence;
    std::vector<ftl::SharedFuture<FenceResult>> previousReleaseFences;
    bool releasePreviousBuffer = false;

    // 其他字段
    nsecs_t latchTime = -1;
    std::variant<nsecs_t, sp<Fence>> acquireTimeOrFence;
    std::optional<uint32_t> transformHint;
    uint32_t currentMaxAcquiredBufferCount = 0;
    nsecs_t dequeueReadyTime = -1;
    uint64_t frameNumber = 0;
    std::string name;
};

4.3 Layer::State 中的 releaseBuffer 相关字段

文件路径: frameworks/native/services/surfaceflinger/Layer.h

struct State {
    // ... 其他字段 ...
    
    // Release buffer listener - 用于接收 buffer 释放通知
    sp<ITransactionCompletedListener> releaseBufferListener;
    
    // Release buffer endpoint - 用于标识回调的接收端
    sp<IBinder> releaseBufferEndpoint;
};

4.4 SurfaceStats - 包含 release fence 的统计信息

文件路径: frameworks/native/libs/gui/include/gui/ITransactionCompletedListener.h

class SurfaceStats : public Parcelable {
public:
    sp<IBinder> surfaceControl;
    std::variant<nsecs_t, sp<Fence>> acquireTimeOrFence = -1;
    sp<Fence> previousReleaseFence;           // release fence
    std::optional<uint32_t> transformHint = 0;
    uint32_t currentMaxAcquiredBufferCount = 0;
    FrameEventHistoryStats eventStats;
    std::vector<JankData> jankData;
    ReleaseCallbackId previousReleaseCallbackId;  // 用于匹配 callback
};

第五部分:ReleaseBufferCallback 的注册流程

5.1 App 端注册回调

文件路径: frameworks/native/libs/gui/SurfaceComposerClient.cpp

// 第 1753-1767 行
void SurfaceComposerClient::Transaction::setReleaseBufferCallback(BufferData* bufferData,
                                                                  ReleaseBufferCallback callback) {
    if (!callback) {
        return;
    }

    if (!bufferData->buffer) {
        ALOGW("Transaction::setReleaseBufferCallback"
              "ignored trying to set a callback on a null buffer.");
        return;
    }

    // 设置 releaseBufferListener 为 TransactionCompletedListener
    bufferData->releaseBufferListener = TransactionCompletedListener::getIInstance();

    // 在 TransactionCompletedListener 中注册回调
    auto listener = TransactionCompletedListener::getInstance();
    listener->setReleaseBufferCallback(bufferData->generateReleaseCallbackId(), callback);
}

5.2 BLASTBufferQueue 注册回调

文件路径: frameworks/native/libs/gui/BLASTBufferQueue.cpp

// 第 589-594 行
auto releaseBufferCallback =
        std::bind(releaseBufferCallbackThunk, wp<BLASTBufferQueue>(this) /* callbackContext */,
                  std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);

// 在 setBuffer 时注册回调
t->setBuffer(mSurfaceControl, buffer, fence, bufferItem.mFrameNumber, mProducerId,
             releaseBufferCallback);

第六部分:特殊情况处理

6.1 Buffer 被覆盖时的立即释放

当一个 buffer 还没被显示就被新的 buffer 覆盖时,会立即释放。

文件路径: frameworks/native/services/surfaceflinger/Layer.cpp

// 第 3090-3105 行
if (mDrawingState.buffer) {
    mReleasePreviousBuffer = true;
    if (!mBufferInfo.mBuffer ||
        (!mDrawingState.buffer->hasSameBuffer(*mBufferInfo.mBuffer) ||
         mDrawingState.frameNumber != mBufferInfo.mFrameNumber)) {
        // Buffer 被丢弃,立即调用 release callback
        callReleaseBufferCallback(mDrawingState.releaseBufferListener,
                                  mDrawingState.buffer->getBuffer(), 
                                  mDrawingState.frameNumber,
                                  mDrawingState.acquireFence);
        decrementPendingBufferCount();
    }
}

6.2 离屏 Layer 的 Buffer 释放

对于不在屏幕上显示的 Layer,需要主动释放 buffer 以避免 dequeueBuffer 阻塞。

文件路径: frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

// 第 4115-4120 行
for (Layer* offscreenLayer : mOffscreenLayers) {
    offscreenLayer->traverse(LayerVector::StateSet::Drawing,
                             [&](Layer* l) { l->latchAndReleaseBuffer(); });
}

6.3 Layer 销毁时的 Buffer 释放

文件路径: frameworks/native/services/surfaceflinger/Layer.cpp

// 第 230-240 行
Layer::~Layer() {
    if (mBufferInfo.mBuffer != nullptr) {
        callReleaseBufferCallback(mDrawingState.releaseBufferListener,
                                  mBufferInfo.mBuffer->getBuffer(), 
                                  mBufferInfo.mFrameNumber,
                                  mBufferInfo.mFence);
    }
    // ...
}

第七部分:关键文件路径汇总

SurfaceFlinger 端

文件路径主要功能
SurfaceFlinger.cppframeworks/native/services/surfaceflinger/SurfaceFlinger.cpp主流程控制,commit/composite/postComposition
Scheduler.cppframeworks/native/services/surfaceflinger/Scheduler/Scheduler.cppVSync 驱动,onFrameSignal
Output.cppframeworks/native/services/surfaceflinger/CompositionEngine/src/Output.cpp合成输出,postFramebuffer 触发 release fence
CompositionEngine.cppframeworks/native/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp合成引擎,present 遍历 Output
Layer.cppframeworks/native/services/surfaceflinger/Layer.cppLayer 状态管理,release callback 处理
LayerFE.cppframeworks/native/services/surfaceflinger/LayerFE.cppLayer Front-End,接收 release fence
TransactionCallbackInvoker.cppframeworks/native/services/surfaceflinger/TransactionCallbackInvoker.cpp回调管理,发送回调给客户端

App 端 (libs/gui)

文件路径主要功能
SurfaceComposerClient.cppframeworks/native/libs/gui/SurfaceComposerClient.cpp客户端接口,回调注册和处理
BLASTBufferQueue.cppframeworks/native/libs/gui/BLASTBufferQueue.cppBuffer 队列管理,release callback 处理
BufferItemConsumer.cppframeworks/native/libs/gui/BufferItemConsumer.cppBuffer 消费者封装
ConsumerBase.cppframeworks/native/libs/gui/ConsumerBase.cpp消费者基类
BufferQueueConsumer.cppframeworks/native/libs/gui/BufferQueueConsumer.cppBufferQueue 消费者端实现
ITransactionCompletedListener.cppframeworks/native/libs/gui/ITransactionCompletedListener.cppBinder 接口定义

头文件

文件路径
Layer.hframeworks/native/services/surfaceflinger/Layer.h
ITransactionCompletedListener.hframeworks/native/libs/gui/include/gui/ITransactionCompletedListener.h
SurfaceComposerClient.hframeworks/native/libs/gui/include/gui/SurfaceComposerClient.h
BLASTBufferQueue.hframeworks/native/libs/gui/include/gui/BLASTBufferQueue.h
BufferQueueConsumer.hframeworks/native/libs/gui/include/gui/BufferQueueConsumer.h

第八部分:总结

ReleaseBuffer 流程核心要点

  1. 触发时机

    • 正常流程:Buffer 显示完成后,通过 present fence 触发
    • 异常流程:Buffer 被覆盖、Layer 销毁、离屏 Layer 处理
  2. 核心调用链

    VSync Signal
      → Scheduler::onFrameSignal
        → SurfaceFlinger::commit
          → latchBuffers
        → SurfaceFlinger::composite
          → CompositionEngine::present
            → Output::present
              → Output::postFramebuffer
                → LayerFE::onLayerDisplayed (存储 release fence)
          → 处理 CompositionResult
            → Layer::onLayerDisplayed (关联 release fence 到 CallbackHandle)
        → SurfaceFlinger::postComposition
          → Layer::releasePendingBuffer
            → TransactionCallbackInvoker::addCallbackHandles
          → TransactionCallbackInvoker::sendCallbacks
            → ITransactionCompletedListener::onTransactionCompleted (Binder IPC)
    
  3. App 端处理链

    TransactionCompletedListener::onTransactionCompleted
      → ReleaseBufferCallback
        → BLASTBufferQueue::releaseBufferCallback
          → BLASTBufferQueue::releaseBuffer
            → BufferItemConsumer::releaseBuffer
              → ConsumerBase::releaseBufferLocked
                → BufferQueueConsumer::releaseBuffer
                  → IProducerListener::onBufferReleased
    
  4. Buffer 状态流转

    • ACQUIRED → RELEASED → FREE
    • 释放后 Producer 可以重新 dequeue 该 buffer
  5. 两种 Release 路径

    • 正常路径:通过 TransactionCallbackInvoker,在 onTransactionCompleted 中携带 release fence
    • 快速路径:通过 callReleaseBufferCallback,直接调用 onReleaseBuffer(用于 buffer 被覆盖等场景)