系列文章请扫关注公众号!
Android Display Graphics系列文章-汇总
本文主要包括部分:
1、BufferQueue
1.1 BufferQueue Common Tag
1.2 GPU Compostion & HWC release Tag
1.3 BufferQueue Rotate
1.4 dequeueBuffer & queueBuffer
1.5 BufferQueue DebugLog
1.6 HWC dequeueBuffer
本文主要讲解BufferQueue相关的调试技巧,通过图文详解各个关键分析点。1.5 根据源码增加debug信息,快速定位Buffer情况。
1.1 BufferQueue Common Tag
BufferQueue是贯穿整个显示运作的:
● 前面介绍过dequeue和queue的位置,S版上由BlastBufferQueue总管整个BufferQueue的运作,Consumer也被拔到了上层
● 图中可以看到在queueBuffer的同时,就已经会发起acquireBuffer
● SF将这块Buffer拿走处理以后,会透过releaseBufferCallback将另外一块前面已经用完的Buffer release出来
从上面介绍可知,BufferQueue会有N块Buffer在轮转使用,在某个场景下使用多少块Buffer才能轮转流畅,需要根据场景的情况来调整,
看问题时首先要快速知道这个场景使用了多少个Buffer:
1.2 GPU Compostion & HWC release Tag
要点概述:
这两个Tag是Monitor LayerFence(acquireFence/releaseFence)状态的
1,前面介绍过,这两个Tag通常和BufferQueue一起出现,对于理解BufferQueue的行为和分析问题,正确理解这两个Tag非常重要:
GPU completion: 字面上理解就是等GPU绘制完成,Signal AcquireFence
HWC release: 字面上理解就是等HWC合成使用完毕,Signal ReleaseFence
2,由代码可知这两个Tag填入的出处在GUI Surface的dequeueBuffer和queueBuffer:
- 而真正打印这个Trace是在FenceMonitor的Thread中:
● 由此可以知道这两个Tag并不是代表真正的Fence,而是一个monitor Fence,track Fence状态的Tag
● 它monitor的是某一个Surface所用Buffer的Fence,也就是LayerFence的状态
● 如果在这个monitor thread开始之前LayerFence已经被Signal了,则这两个Tag就不会出现
a) dequeueBuffer或queueBuffer最后出现(fence %u has signaled),GPU completion & HWC release里就不会出现waiting
b) dequeueBuffer或queueBuffer最后出现(Trace %s fence %u), GPU completion & HWC release里就会出现waiting
● waiting for GPU completion和waiting for HWC release后面的数字是Fence计数的idx, 但互相之间相同的数字并没有直接固定的对应关系,
还是要通过dequeueBuffer和queueBuffer最后带的Tag来对应
1.3 BufferQueue Rotate
要点概述:
BufferQueue的核心逻辑就是Buffer的轮转使用,分析问题必须要学会通过Trace看BufferQueue轮转的状况
- 在对BufferQueue的Tag有了清楚的认知以后,需要了解BufferQueue的轮转会怎样体现出来
1,如下图就是典型的体现轮转的Trace,第一个圈的 #4 Buffer 被SF使用,一直到A点才被显示到panel上
2,按照我们对A点意义的认知,到下一帧被显示出来的B点,#4 才不需要在被用到,presentfence被放掉,
其用到的Buffer的LayerFence才能被signal
3,可以看到在第二个圈 #4 Buffer第二次dequeue的时候,还没有到B点,所以出现了H1的waiting for HWC release的等待
- 所以通过分析我们可以知道,出现waiting for HWC release是BufferQueue开始出现轮转压力的标志
一旦出现轮转压力,当次后面dequeueBuffer的waiting for GPU completion很容易被影响到,
所以常常看见HWC release先出现后一定会同时出现GPU completion
- 如果是由于GPU绘制慢影响到整体的,那么应当是先单独出现waiting for GPU completion(谁先出现问题很重要)
BufferQueue轮转Buffer的数量是如何决定的?
完整文章请关注移步公众号。