Android T systemTrace 说明
- 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
- 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释放
- 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;
}
- unlockAsync
status_t GraphicBuffer::unlock()
{
status_t res = getBufferMapper().unlock(handle);
return res;
}
- 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的流程