void SurfaceFlinger::setVsyncEnabledInternal(bool enabled) { ATRACE_CALL(); //TDOO: qcom build error on beta2 //Mutex::Autolock lock(mStateLock); std::lock_guard<std::recursive_mutex> lockVsync(mVsyncLock); mHWCVsyncPendingState = enabled ? hal::Vsync::ENABLE : hal::Vsync::DISABLE; //TODO aosp RC delete getInternalDisplayIdLocked, //auto displayId = getInternalDisplayIdLocked(); auto displayId = getPrimaryDisplayIdLocked(); if (mNextVsyncSource) { // Disable current vsync source before enabling the next source if (mActiveVsyncSource) { displayId = mActiveVsyncSource->getPhysicalId(); setHWCVsyncEnabled(displayId, hal::Vsync::DISABLE); } displayId = mNextVsyncSource->getPhysicalId(); } else if (mActiveVsyncSource) { displayId = mActiveVsyncSource->getPhysicalId(); } setHWCVsyncEnabled(displayId, mHWCVsyncPendingState); if (mNextVsyncSource) { mActiveVsyncSource = mNextVsyncSource; mNextVsyncSource = NULL; } }
时间: 2024-03-28 21:37:40 浏览: 30
这段代码是SurfaceFlinger中的一个函数,用于设置垂直同步(Vsync)的开启或关闭状态。函数首先获取锁保证线程安全,然后根据参数设置 mHWCVsyncPendingState 的值,表示开启或关闭状态。接着,函数会根据当前的 Vsync 源(mActiveVsyncSource)和下一个 Vsync 源(mNextVsyncSource)来决定设置哪个显示器的 Vsync 状态,并将状态设置为 mHWCVsyncPendingState 表示的状态。最后,如果下一个 Vsync 源存在,则更新当前 Vsync 源为下一个 Vsync 源。
相关问题
Android 中void SurfaceFlinger::setVsyncEnabled(bool enabled) { #ifdef OPLUS_SF_PERFORMANCE if (enabled) { mLastHWVsyncEnabled = systemTime(); } #endif ATRACE_CALL(); // On main thread to avoid race conditions with display power state. static_cast<void>(mScheduler->schedule([=]() FTL_FAKE_GUARD(mStateLock) { mHWCVsyncPendingState = enabled ? hal::Vsync::ENABLE : hal::Vsync::DISABLE; if (const auto display = getDefaultDisplayDeviceLocked(); display && display->isPoweredOn()) { setHWCVsyncEnabled(display->getPhysicalId(), mHWCVsyncPendingState); } })); }这段代码作用,请逐行解释一下
这段代码是 Android 中 SurfaceFlinger 模块的一个函数 setVsyncEnabled(bool enabled),其作用是控制垂直同步(VSync)是否启用。下面逐行解释其作用:
1. #ifdef OPLUS_SF_PERFORMANCE: 这是一个条件编译指令,如果定义了 OPLUS_SF_PERFORMANCE 宏,则会编译下面的代码,否则会被忽略。
2. if (enabled) { mLastHWVsyncEnabled = systemTime(); }: 如果 VSync 启用,则记录当前系统时间。
3. ATRACE_CALL(): 用于记录函数调用的性能跟踪信息。
4. static_cast<void>(mScheduler->schedule([=]() FTL_FAKE_GUARD(mStateLock): 使用 SurfaceFlinger 内部的线程池 mScheduler 来异步调度一个 lambda 函数。
5. mHWCVsyncPendingState = enabled ? hal::Vsync::ENABLE : hal::Vsync::DISABLE;: 根据 VSync 是否启用来设置 mHWCVsyncPendingState 变量,其值为 hal::Vsync::ENABLE 或 hal::Vsync::DISABLE。
6. if (const auto display = getDefaultDisplayDeviceLocked(); display && display->isPoweredOn()) { }: 获取默认的显示设备,并判断是否已经开启电源。
7. setHWCVsyncEnabled(display->getPhysicalId(), mHWCVsyncPendingState);: 如果显示设备已经开启电源,则调用 setHWCVsyncEnabled 函数来设置显示设备的 VSync 启用状态。其中,display->getPhysicalId() 获取显示设备的物理 ID,mHWCVsyncPendingState 是上面步骤 5 中设置的变量。
Android void SurfaceFlinger::computeLayerBounds()
这是一个 Android 系统中 SurfaceFlinger 模块的函数,用于计算一个图层的边界。SurfaceFlinger 模块是 Android 系统中负责显示管理的核心组件之一,它负责将应用程序的图形界面渲染到屏幕上。computeLayerBounds() 函数的作用是计算一个图层的边界,也就是图层在屏幕上所占的矩形区域。在显示管理过程中,这个边界信息会被用来进行图层的合成和裁剪。具体实现可以参考 Android 源码。