Android T systemTrace 说明

Android T systemTrace 说明

  1. dequeueBuffer
    在这里插入图片描述
        *outSlot = found;
        ATRACE_BUFFER_INDEX(found);
        #define ATRACE_BUFFER_INDEX(index)                                                         \
    do {                                                                                   \
        if (ATRACE_ENABLED()) {                                                            \
            char ___traceBuf[1024];                                                        \
            snprintf(___traceBuf, 1024, "%s: %d", mCore->mConsumerName.string(), (index)); \
            android::ScopedTrace ___bufTracer(ATRACE_TAG, ___traceBuf);                    \
        }                                                                                  \
    } while (false)

这里:2 表示slot buffer index 2

  1. waitForever
    在这里插入图片描述
        sp<Fence> releaseFence(new Fence(releaseFenceFd));
        int waitResult = releaseFence->waitForever("dequeueBuffer_EmptyNative");
        if (waitResult != OK) {
            ALOGE("dequeueBuffer_EmptyNative: Fence::wait returned an error: %d", waitResult);
            break;
        }
status_t Fence::waitForever(const char* logname) {
    ATRACE_CALL();
    if (mFenceFd == -1) {
        return NO_ERROR;
    }
    int warningTimeout = 3000;
    int err = sync_wait(mFenceFd, warningTimeout);
    ..

等待fence释放

  1. lockAsync
    在这里插入图片描述
    buffer lock
status_t GraphicBuffer::lock(uint32_t inUsage, void** vaddr, int32_t* outBytesPerPixel,
                             int32_t* outBytesPerStride) {
    const Rect lockBounds(width, height);
    status_t res = lock(inUsage, lockBounds, vaddr, outBytesPerPixel, outBytesPerStride);
    return res;
}
  1. unlockAsync
    在这里插入图片描述
status_t GraphicBuffer::unlock()
{
    status_t res = getBufferMapper().unlock(handle);
    return res;
}
  1. queueBuffer
    在这里插入图片描述
    id =1,he前面dequeueBuffer是同一个id
    // Update and get FrameEventHistory.
    nsecs_t postedTime = systemTime(SYSTEM_TIME_MONOTONIC);
    NewFrameEventsEntry newFrameEventsEntry = {
        currentFrameNumber,
        postedTime,
        requestedPresentTimestamp,
        std::move(acquireFenceTime)
    };
    addAndGetFrameTimestamps(&newFrameEventsEntry,
            getFrameTimestamps ? &output->frameTimestamps : nullptr);
...
void BufferQueueProducer::addAndGetFrameTimestamps(
        const NewFrameEventsEntry* newTimestamps,
        FrameEventHistoryDelta* outDelta) {
    if (newTimestamps == nullptr && outDelta == nullptr) {
        return;
    }

    ATRACE_CALL();
    BQ_LOGV("addAndGetFrameTimestamps");
    sp<IConsumerListener> listener;
    {
        std::lock_guard<std::mutex> lock(mCore->mMutex);
        listener = mCore->mConsumerListener;
    }
    if (listener != nullptr) {
        listener->addAndGetFrameTimestamps(newTimestamps, outDelta);
    }
}

BLASTBufferQueue::queueBuffer 成功后,通过 listener->addAndGetFrameTimestamps 通知Queue成功时间

android::BufferQueueConsumer::acquireBuffer BufferQueueConsumer.cpp:85
android::ConsumerBase::acquireBufferLocked ConsumerBase.cpp:392
android::BufferItemConsumer::acquireBuffer BufferItemConsumer.cpp:66
android::BLASTBufferQueue::acquireNextBufferLocked BLASTBufferQueue.cpp:474
android::BLASTBufferQueue::onFrameAvailable BLASTBufferQueue.cpp:694
android::ConsumerBase::onFrameAvailable ConsumerBase.cpp:157
android::BufferQueue::ProxyConsumerListener::onFrameAvailable BufferQueue.cpp:71
android::BufferQueueProducer::queueBuffer BufferQueueProducer.cpp:1054
android::Surface::queueBuffer Surface.cpp:1190

从上面栈可以看到,BLASTBufferQueue::onFrameAvailable 在监听有一帧ready
在这里插入图片描述
在这里插入图片描述

        ATRACE_INT(mQueuedBufferTrace.c_str(),
                  mNumFrameAvailable + mNumAcquired - mPendingRelease.size());

这个值代表了当前可以被消费的graph buffer数目这里是2,表示有两个可供消费,一个mNumFrameAvailable, 一个mNumAcquired
mPendingRelease 是已释放但尚未被处理的缓冲区帧,为0
在这里插入图片描述
这里再说明一下 bbq-adapter

status_t BufferQueueProducer::queueBuffer(int slot,
        const QueueBufferInput &input, QueueBufferOutput *output) {
        ...
                if (mCore->mQueue.empty()) {
            // When the queue is empty, we can ignore mDequeueBufferCannotBlock
            // and simply queue this buffer
            mCore->mQueue.push_back(item);
            
                    ATRACE_INT(mCore->mConsumerName.string(),
                static_cast<int32_t>(mCore->mQueue.size()));

这里数值表示mQueue 排队等待被acquireBuffer 的数量,这里1表示生产了一个buffer,等待被 acquire

status_t BufferQueueConsumer::acquireBuffer(BufferItem* outBuffer,
...
                mCore->mQueue.erase(front);

还是看这个堆栈:

android::BufferQueueConsumer::acquireBuffer BufferQueueConsumer.cpp:85
android::ConsumerBase::acquireBufferLocked ConsumerBase.cpp:392
android::BufferItemConsumer::acquireBuffer BufferItemConsumer.cpp:66
android::BLASTBufferQueue::acquireNextBufferLocked BLASTBufferQueue.cpp:474
android::BLASTBufferQueue::onFrameAvailable BLASTBufferQueue.cpp:694
android::ConsumerBase::onFrameAvailable ConsumerBase.cpp:157
android::BufferQueue::ProxyConsumerListener::onFrameAvailable BufferQueue.cpp:71
android::BufferQueueProducer::queueBuffer BufferQueueProducer.cpp:1054
android::Surface::queueBuffer Surface.cpp:1190

onFrameAvailable trigger acquireNextBufferLocked
acquireNextBufferLocked 会取出刚生成好的bufferItem (acquireBuffer)
通过transaction,setbuff ,通知surfaceFlinger

void BLASTBufferQueue::acquireNextBufferLocked(
...
    auto releaseBufferCallback =
            std::bind(releaseBufferCallbackThunk, wp<BLASTBufferQueue>(this) /* callbackContext */,
                      std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
    sp<Fence> fence = bufferItem.mFence ? new Fence(bufferItem.mFence->dup()) : Fence::NO_FENCE;
    t->setBuffer(mSurfaceControl, buffer, fence, bufferItem.mFrameNumber, releaseBufferCallback);
    t->setDataspace(mSurfaceControl, static_cast<ui::Dataspace>(bufferItem.mDataSpace));
    t->setHdrMetadata(mSurfaceControl, bufferItem.mHdrMetadata);
    t->setSurfaceDamageRegion(mSurfaceControl, bufferItem.mSurfaceDamage);
    t->addTransactionCompletedCallback(transactionCallbackThunk, static_cast<void*>(this));
...
        t->setApplyToken(mApplyToken).apply(false, true);
}

对应的trace:
在这里插入图片描述
trace tag:
BBQ_TRACE(“frame=%” PRIu64, bufferItem.mFrameNumber);
bufferItem.mFrameNumber 来自:

    // mFrameCounter is the free running counter, incremented on every
    // successful queueBuffer call and buffer allocation.
    uint64_t mFrameCounter;

表示生产出来的第几帧,bufferItem 会传递给SF,此标记可以用来调试

关于 FenceMonitor
在这里插入图片描述
在这里插入图片描述
从抓trace 第一帧开始计数 会单独开一个显示去检测 dequeueBuffer fence 信号情况
queueBuffer 出来的fence信号情况,也就是GPU completion, id 值表示记录trace开始的第几个

1.dequeueBuffer 2. queueBuffer
android::Surface::onBufferQueuedLocked Surface.cpp:1155
android::Surface::queueBuffer Surface.cpp:1196
在这里插入图片描述
在这里插入图片描述
都是从0开始计数,出现不一致,应该就是丢帧了
如果提示 has signaled, 表明拿到的buffer 已经拿到fence signal.

补充一下 release buffer 流程

注册地:
android::BLASTBufferQueue::acquireNextBufferLocked BLASTBufferQueue.cpp:474
    auto releaseBufferCallback =
            std::bind(releaseBufferCallbackThunk, wp<BLASTBufferQueue>(this) /* callbackContext */,
                      std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
..
  t->setBuffer(mSurfaceControl, buffer, fence, bufferItem.mFrameNumber, releaseBufferCallback);

回调堆栈:
android::BufferQueueConsumer::releaseBuffer BufferQueueConsumer.cpp:446
android::ConsumerBase::releaseBufferLocked ConsumerBase.cpp:496
android::BufferItemConsumer::releaseBuffer BufferItemConsumer.cpp:99
android::BLASTBufferQueue::releaseBuffer BLASTBufferQueue.cpp:443
android::BLASTBufferQueue::releaseBufferCallback BLASTBufferQueue.cpp:418
android::releaseBufferCallbackThunk BLASTBufferQueue.cpp:375
std::__1::__invoke<void (*&)(android::wp<android::BLASTBufferQueue>, android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>), android::wp<android::BLASTBufferQueue>&, android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int> > type_traits:4353
std::__1::__apply_functor<void (*)(android::wp<android::BLASTBufferQueue>, android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>), std::__1::tuple<android::wp<android::BLASTBufferQueue>, std::__1::placeholders::__ph<1>, std::__1::placeholders::__ph<2>, std::__1::placeholders::__ph<3> >, 0ul, 1ul, 2ul, 3ul, std::__1::tuple<android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>&&> > functional:2644
std::__1::__bind<void (&)(android::wp<android::BLASTBufferQueue>, android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>), android::wp<android::BLASTBufferQueue>, std::__1::placeholders::__ph<1> const&, std::__1::placeholders::__ph<2> const&, std::__1::placeholders::__ph<3> const&>::operator()<android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int> > functional:2677
std::__1::__invoke<std::__1::__bind<void (&)(android::wp<android::BLASTBufferQueue>, android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>), android::wp<android::BLASTBufferQueue>, std::__1::placeholders::__ph<1> const&, std::__1::placeholders::__ph<2> const&, std::__1::placeholders::__ph<3> const&>&, android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int> > type_traits:4353
std::__1::__invoke_void_return_wrapper<void>::__call<std::__1::__bind<void (&)(android::wp<android::BLASTBufferQueue>, android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>), android::wp<android::BLASTBufferQueue>, std::__1::placeholders::__ph<1> const&, std::__1::placeholders::__ph<2> const&, std::__1::placeholders::__ph<3> const&>&, android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int> > __functional_base:349
std::__1::__function::__alloc_func<std::__1::__bind<void (&)(android::wp<android::BLASTBufferQueue>, android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>), android::wp<android::BLASTBufferQueue>, std::__1::placeholders::__ph<1> const&, std::__1::placeholders::__ph<2> const&, std::__1::placeholders::__ph<3> const&>, std::__1::allocator<std::__1::__bind<void (&)(android::wp<android::BLASTBufferQueue>, android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>), android::wp<android::BLASTBufferQueue>, std::__1::placeholders::__ph<1> const&, std::__1::placeholders::__ph<2> const&, std::__1::placeholders::__ph<3> const&> >, void (android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>)>::operator()(android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>&&) functional:1527
std::__1::__function::__func<std::__1::__bind<void (&)(android::wp<android::BLASTBufferQueue>, android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>), android::wp<android::BLASTBufferQueue>, std::__1::placeholders::__ph<1> const&, std::__1::placeholders::__ph<2> const&, std::__1::placeholders::__ph<3> const&>, std::__1::allocator<std::__1::__bind<void (&)(android::wp<android::BLASTBufferQueue>, android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>), android::wp<android::BLASTBufferQueue>, std::__1::placeholders::__ph<1> const&, std::__1::placeholders::__ph<2> const&, std::__1::placeholders::__ph<3> const&> >, void (android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>)>::operator()(android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>&&) functional:1651
std::__1::__function::__value_func<void (android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>)>::operator()(android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>&&) const functional:1799
std::__1::function<void (android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>)>::operator()(android::ReleaseCallbackId const&, android::sp<android::Fence> const&, std::__1::optional<unsigned int>) const functional:2347
android::TransactionCompletedListener::onTransactionCompleted SurfaceComposerClient.cpp:398
android::SafeBnInterface<android::ITransactionCompletedListener>::MethodCaller<std::__1::tuple<android::ListenerStats> >::callVoidHelper<android::SafeBnInterface<android::ITransactionCompletedListener>, void (android::ITransactionCompletedListener::*)(android::ListenerStats), std::__1::tuple<android::ListenerStats>, 0ul> SafeInterface.h:658
android::SafeBnInterface<android::ITransactionCompletedListener>::MethodCaller<std::__1::tuple<android::ListenerStats> >::callVoid<android::SafeBnInterface<android::ITransactionCompletedListener>, void (android::ITransactionCompletedListener::*)(android::ListenerStats), std::__1::tuple<android::ListenerStats> > SafeInterface.h:646
android::SafeBnInterface<android::ITransactionCompletedListener>::callLocalAsync<void (android::ITransactionCompletedListener::*)(android::ListenerStats)> SafeInterface.h:509
android::BBinder::transact Binder.cpp:393
android::IPCThreadState::executeCommand IPCThreadState.cpp:1318
android::IPCThreadState::getAndExecuteCommand IPCThreadState.cpp:559
android::IPCThreadState::joinThreadPool IPCThreadState.cpp:647
android::PoolThread::threadLoop ProcessState.cpp:74
android::Thread::_threadLoop Threads.cpp:740
__pthread_start pthread_create.cpp:378
__start_thread clone.cpp:53

下一节分析setbuffer 在SF的流程
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值