Android VSync信号产生过程源码分析

论坛 期权论坛     
选择匿名的用户   2021-5-30 00:19   344   0
<p>在上一篇<a href="http://blog.csdn.net/yangwen123/article/details/16344375" rel="noopener noreferrer" style="list-style:none; text-decoration:none; word-break:break-all; word-wrap:break-word; color:rgb(59,89,152); font-family:Verdana,&#39;Lucida Grande&#39;,Arial,Helvetica,sans-serif" target="_blank">Android Project Butter分析</a>中介绍了Android4.1通过引入VSync机制来改善显示效果,并分析了VSync机制的原理。本文主要分析VSync信号的产生过程。VSync信号产生有两种方式,一种是硬件中断产生,另一种是使用软件模拟产生,至于使用何种方式产生VSync信号,就和硬件系统配置有关。在Android4.1以后的版本中,定义了HWComposer硬件抽象模块来负责产生VSync信号。HWComposer硬件抽象层定义:</p>
<p>hardware\libhardware\modules\hwcomposer\hwcomposer.cpp<br> </p>
<p></p>
<pre class="blockcode"><code class="language-cpp">hwc_module_t HAL_MODULE_INFO_SYM &#61; {
    common: {
        tag: HARDWARE_MODULE_TAG,
        version_major: 1,
        version_minor: 0,
        id: HWC_HARDWARE_MODULE_ID,
        name: &#34;Sample hwcomposer module&#34;,
        author: &#34;The Android Open Source Project&#34;,
        methods: &amp;hwc_module_methods,
    }
};
</code></pre>注册的硬件抽象模块方法定义如下:
<p></p>
<p></p>
<pre class="blockcode"><code class="language-cpp">static struct hw_module_methods_t hwc_module_methods &#61; {
    open: hwc_device_open
};</code></pre>
<p>关于为硬件抽象模块HWComposer定义的数据结构之间的关系如下下图所示:</p>
<p style="text-align:center"><img alt="" height="445" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-1e2790af89291bba5bd4a2e7da0151ba" width="700"><br> </p>
<p>在初始化DisplayHardware对象时,会创建一个HWComposer对象:</p>
<p></p>
<p></p>
<pre class="blockcode"><code class="language-cpp">void DisplayHardware::init(uint32_t dpy)
{
...
    // initialize the H/W composer
    mHwc &#61; new HWComposer(mFlinger, *this, mRefreshPeriod);
    if (mHwc-&gt;initCheck() &#61;&#61; NO_ERROR) {
        mHwc-&gt;setFrameBuffer(mDisplay, mSurface);
    }
}</code></pre>这里使用SurfaceFlinger,DisplayHardware对象及屏幕刷新周期来构造HWComposer对象,HWComposer的构造过程如下:
<p></p>
<p>frameworks\native\services\surfaceflinger\DisplayHardware\HWComposer.cpp<br> </p>
<pre class="blockcode"><code class="language-cpp">HWComposer::HWComposer(const sp&lt;SurfaceFlinger&gt;&amp; flinger,EventHandler&amp; handler,nsecs_t refreshPeriod)
    : mFlinger(flinger),
      mModule(0), mHwc(0), mList(0), mCapacity(0),
      mNumOVLayers(0), mNumFBLayers(0),
      mDpy(EGL_NO_DISPLAY), mSur(EGL_NO_SURFACE),
      mEventHandler(handler),
      mRefreshPeriod(refreshPeriod),
      mVSyncCount(0), mDebugForceFakeVSync(false)
{
    char value[PROPERTY_VALUE_MAX];
    property_get(&#34;debug.sf.no_hw_vsync&#34;, value, &#34;0&#34;);
    mDebugForceFakeVSync &#61; atoi(value);
//是否需要软件模拟VSync
    bool needVSyncThread &#61; false;
//加载HWComposer硬件抽象模块
    int err &#61; hw_get_module(HWC_HARDWARE_MODULE_ID, &amp;mModule);
    ALOGW_IF(err, &#34;%s module not found&#34;, HWC_HARDWARE_MODULE_ID);
    if (err &#61;&#61; 0) {
  //打开HWComposer硬件抽象模块
        err &#61; hwc_open(mModule, &amp;mHwc);
        if (err &#61;&#61; 0) {
   //打开成功,注册回调函数
            if (mHwc-&gt;registerProcs) {
                mCBContext.hwc &#61; this;
                mCBContext.procs.invalidate &#61; &amp;hook_invalidate;
                mCBContext.procs.vsync &#61; &amp;hook_vsync;
                mHwc-&gt;registerProcs(mHwc, &amp;mCBContext.procs);
                memset(mCBContext.procs.zero, 0, sizeof(mCBContext.procs.zero));
            }
            if (mHwc-&gt;common.version &gt;&#61; HWC_DEVICE_API_VERSION_0_3) {
                if (mDebugForceFakeVSync) {
                    // make sure to turn h/w vsync off in &#34;fake vsync&#34; mode
                    mHwc-&gt;methods-&gt;eventControl(mHwc, HWC_EVENT_VSYNC, 0);
                }
            } else {
                needVSyncThread &#61; true;
            }
        }
    } else {
        needVSyncThread &#61; true;
    }
//如果HWComposer硬件抽象模块打开失败或者HWComposer硬件抽象模块的版本小于HWC_DEVICE_API_VERSION_0_3,则采用软件模拟产生VSync信号
    if (needVSyncThread) {
        //创建VSync产生线程VSyncThread
        mVSyncThread &#61; new VSyncThread(*this);
    }
}</code></pre>
<p>在构造HWComposer对象时,选择了VSync信号产生方式:1.硬件产生;2.软件模拟产生;假如当前系统可以成功加载HWC_HARDWARE_MODULE_ID&#61;hwcomposer,并且通过这个库能顺利打开设备(hwc_composer_device_t),并且其版本号又大于HWC_DEVICE_API_VERSION_0_3的话,我们就采用硬件方式产生VSync,否则需要创建一个新的VSync线程来模拟产生信号。</p>
<p><br> </p>
<h2>1.硬件产生VSync信号过程</h2>
<div>
<br>
</div>
<div>
Android定义了hwcomposer硬件抽象模块来负责产生VSync信号,因此在使用硬件方式产生VSync信号时,需要首先加载并打开hwcomposer硬件抽象模块
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP