/****************************************************************************
* I.MX6 Surfaceflinger 机制
* 说明:
* 最近需要去分析一下Surfaceflinger工作机制,记录一下相关的文档和主要的
* 处理函数。
*
* 2016-9-14 深圳 南山平山村 曾剑锋
***************************************************************************/ 一、参考文档:
. Android SurfaceFlinger服务启动过程源码分析
http://blog.csdn.net/yangwen123/article/details/11890941
. Android 开关机动画显示源码分析
http://blog.csdn.net/yangwen123/article/details/11680759
. 深入学习EGL
http://blog.sina.com.cn/s/blog_602f87700100p1e7.html
. Android hwcomposer模块接口
http://blog.sina.com.cn/s/blog_7213e0310102wmc0.html
. Android VSync信号产生过程源码分析
http://blog.csdn.net/yangwen123/article/details/16969907
. android HAL浅探
http://www.cnblogs.com/mr-nop/archive/2013/02/27/2935131.html
. Android: 显示系统模块加载以及调用流程
http://blog.csdn.net/hongzg1982/article/details/49681705 二、cat frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
......
status_t SurfaceFlinger::readyToRun()
{
ALOGI( "SurfaceFlinger's main thread ready to run. "
"Initializing graphics H/W..."); // initialize EGL for the default display
mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(mEGLDisplay, NULL, NULL); // Initialize the H/W composer object. There may or may not be an
// actual hardware composer underneath.
mHwc = new HWComposer(this,
*static_cast<HWComposer::EventHandler *>(this)); // initialize the config and context
EGLint format = mHwc->getVisualID();
mEGLConfig = selectEGLConfig(mEGLDisplay, format);
mEGLContext = createGLContext(mEGLDisplay, mEGLConfig); LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
"couldn't create EGLContext"); // initialize our non-virtual displays
for (size_t i= ; i<DisplayDevice::NUM_DISPLAY_TYPES ; i++) {
DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
mDefaultDisplays[i] = new BBinder();
wp<IBinder> token = mDefaultDisplays[i]; // set-up the displays that are already connected
if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
// All non-virtual displays are currently considered secure.
bool isSecure = true;
bool isSecure = true;
mCurrentState.displays.add(token, DisplayDeviceState(type));
sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i);
sp<SurfaceTextureClient> stc = new SurfaceTextureClient(
static_cast< sp<ISurfaceTexture> >(fbs->getBufferQueue()));
sp<DisplayDevice> hw = new DisplayDevice(this,
type, isSecure, token, stc, fbs, mEGLConfig);
if (i > DisplayDevice::DISPLAY_PRIMARY) {
// FIXME: currently we don't get blank/unblank requests
// for displays other than the main display, so we always
// assume a connected display is unblanked.
ALOGD("marking display %d as acquired/unblanked", i);
hw->acquireScreen();
}
mDisplays.add(token, hw);
}
} // we need a GL context current in a few places, when initializing
// OpenGL ES (see below), or creating a layer,
// or when a texture is (asynchronously) destroyed, and for that
// we need a valid surface, so it's convenient to use the main display
// for that.
sp<const DisplayDevice> hw(getDefaultDisplayDevice()); // initialize OpenGL ES
DisplayDevice::makeCurrent(mEGLDisplay, hw, mEGLContext);
initializeGL(mEGLDisplay); // start the EventThread
mEventThread = new EventThread(this);
mEventQueue.setEventThread(mEventThread); // initialize our drawing state
mDrawingState = mCurrentState; // We're now ready to accept clients...
mReadyToRunBarrier.open(); // set initial conditions (e.g. unblank default device)
initializeDisplays(); // start boot animation
startBootAnim(); return NO_ERROR;
}
...... 三、cat frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cpp
......
// Load and prepare the hardware composer module. Sets mHwc.
void HWComposer::loadHwcModule()
{
hw_module_t const* module; if (hw_get_module(HWC_HARDWARE_MODULE_ID, &module) != ) {
ALOGE("%s module not found", HWC_HARDWARE_MODULE_ID);
return;
} int err = hwc_open_1(module, &mHwc);
if (err) {
ALOGE("%s device failed to initialize (%s)",
HWC_HARDWARE_COMPOSER, strerror(-err));
return;
} if (!hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_0) ||
hwcHeaderVersion(mHwc) < MIN_HWC_HEADER_VERSION ||
hwcHeaderVersion(mHwc) > HWC_HEADER_VERSION) {
ALOGE("%s device version %#x unsupported, will not be used",
HWC_HARDWARE_COMPOSER, mHwc->common.version);
hwc_close_1(mHwc);
mHwc = NULL;
return;
}
}
...... 四、cat hardware/imx/mx6/hwcomposer/hwcomposer.cpp
static int hwc_device_open(const struct hw_module_t* module, const char* name,
struct hw_device_t** device)
{ printf("fsl hwc_device_open().\n");
int status = -EINVAL;
if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
struct hwc_context_t *dev;
dev = (hwc_context_t*)malloc(sizeof(*dev)); /* initialize our state here */
// memset(dev, 0, sizeof(*dev)); /* initialize the procs */
dev->device.common.tag = HARDWARE_DEVICE_TAG;
dev->device.common.module = const_cast<hw_module_t*>(module);
dev->device.common.close = hwc_device_close; dev->device.prepare = hwc_prepare;
dev->device.set = hwc_set;
dev->device.common.version = HWC_DEVICE_API_VERSION_1_1;
dev->device.registerProcs = hwc_registerProcs;
dev->device.eventControl = hwc_eventControl;
dev->device.query = hwc_query;
dev->device.blank = hwc_blank;
dev->device.getDisplayConfigs = hwc_getDisplayConfigs;
dev->device.getDisplayAttributes = hwc_getDisplayAttributes; /* our private state goes below here */
dev->m_vsync_thread = new VSyncThread(dev);
dev->m_vsync_thread = new VSyncThread(dev);
dev->m_uevent_thread = new UeventThread(dev);
hwc_get_display_info(dev); hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &dev->m_gralloc_module);
struct private_module_t *priv_m = (struct private_module_t *)dev->m_gralloc_module; for(int dispid=; dispid<HWC_NUM_DISPLAY_TYPES; dispid++) {
if(dev->mDispInfo[dispid].connected && dev->m_gralloc_module != NULL) {
int fbid = dev->mDispInfo[dispid].fb_num;
char fbname[HWC_STRING_LENGTH];
memset(fbname, , sizeof(fbname));
sprintf(fbname, "fb%d", fbid);
ALOGI("hwcomposer: open framebuffer %s", fbname);
dev->mFbDev[dispid] = (framebuffer_device_t*)fbid;
dev->m_gralloc_module->methods->open(dev->m_gralloc_module, fbname,
(struct hw_device_t**)&dev->mFbDev[dispid]);
}
} const hw_module_t *hwc_module;
if(hw_get_module(HWC_VIV_HARDWARE_MODULE_ID,
(const hw_module_t**)&hwc_module) < ) {
ALOGE("Error! hw_get_module viv_hwc failed");
goto nor_exit;
} if(hwc_open_1(hwc_module, &(dev->m_viv_hwc)) != ) {
ALOGE("Error! viv_hwc open failed");
goto nor_exit;
}
nor_exit: *device = &dev->device.common;
ALOGI("%s,%d", __FUNCTION__, __LINE__);
return ;
err_exit:
if(dev){
free(dev);
}
/****************************************/
}
return status;
}

I.MX6 Surfaceflinger 机制的更多相关文章

  1. Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析

    参考:Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析 一句话概括一下Android应用程序显示的过程:Android应用程序调用SurfaceFlin ...

  2. [转]Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划

    转自:Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划 前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了Surfa ...

  3. Android系统Surface机制的SurfaceFlinger服务的线程模型分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8062945 在前面两篇文章中,我们分析了Sur ...

  4. Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8046659 在前文中,我们分析了Surface ...

  5. Android系统Surface机制的SurfaceFlinger服务的启动过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8022957 在前面一篇文章中,我们简要介绍了A ...

  6. Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8010977 前面我们从Android应用程序与 ...

  7. Surface机制(SurfaceFlinger服务)

    Android系统Surface机制的SurfaceFlinger服务的线程模型分析http://blog.csdn.net/luoshengyang/article/details/8062945

  8. Android 12(S) 图形显示系统 - SurfaceFlinger的启动和消息队列处理机制(四)

    1 前言 SurfaceFlinger作为Android图形显示系统处理逻辑的核心单元,我们有必要去了解其是如何启动,初始化及进行消息处理的.这篇文章我们就来简单分析SurfaceFlinger这个B ...

  9. 11.4 Android显示系统框架_APP与SurfaceFlinger内部机制分析

    4.1 APP跟SurfaceFlinger之间的重要数据结构 一个应用程序有一个或者多个surface(一般只有一个),一个surface有一个或者多个buffer,这些buffer需要应用向sur ...

随机推荐

  1. GO --微服务框架(二) goa

    之前用过go语言的反射来做一些代码生成,参考这篇. 但是这种方式,入侵太强,需要执行对应的申明调用, 所以对GOA框架的自动生成非常感兴趣,于是仔细研究了一下,发现用的比较巧妙, 这里先卖个关子,先看 ...

  2. IOS开发退出应用程序的代码

    IOS 开发中.我知道的两个退出程序的方法: 1. exit(0); 2. if([[UIApplication sharedApplication] respondsToSelector:@sele ...

  3. Lazarus安装使用

    Lazarus安装使用 最后还是安装了Lazarus: 安装之后,新建了项目,还引入了Unit,就可以跑了: 学习:http://tieba.baidu.com/p/3164001113 progra ...

  4. USACO 1.2 Milking Cows (枚举)

    标记数组(哈希) 1e6的范围,开一个char数组全然能够,有人为1,无人为0,注意边界就可以.最后线性扫描就可以. 时间复杂度,应该是O(n),n为最后结束的时间. 缺点就是--比較慢 /* ID: ...

  5. VC++的窗口句柄和窗口ID

    原文地址:VC++的窗口句柄和窗口ID作者:放放 句柄是窗口资源的标识,它标识资源在系统中所占用的内存块,应用程序通过窗口句柄对窗口进行操作.除了窗口句柄之外,任何一种资源都有它自己的句柄,比如光标句 ...

  6. 微博达人硅谷之歌:Testin云測移动搜索性能測试非常是让人信服

    微博达人硅谷之歌:Testin云測移动搜索性能測试非常是让人信服 2014/10/08 · Testin · 开发人员訪谈 2013年11月1日,谷歌运行董事长施密特(Eric Emerson Sch ...

  7. 【iOS开发-79】利用Modal方式实现控制器之间的跳转

    利用Modal方法.事实上就是以下两个方法的运用. Modal方式的切换效果是从底部呈现. -(void)clickModal{ WPViewController *wp=[[WPViewContro ...

  8. 分布式开源调度框架TBSchedule原理与应用

    主要内容: 第一部分 TBSchedule基本概念及原理 1. 概念介绍 2. 工作原理 3. 源代码分析 4. 与其它开源调度框架对照 第二部分 TBSchedule分布式调度演示样例 1. TBS ...

  9. Linux把查询结果写入到文本

    在Linux命令模式下,可以将查询结果写入文件.大概有两种方式,增量写入和覆盖写入. 增量写入: #iostat -m >> /tmp/iostat.txt 覆盖写入: #iostat - ...

  10. Android-基本控件和详解四种布局方式

    转自:https://www.cnblogs.com/ludashi/p/4883915.html 一.常用基本控件 1.TextView 看到Android中的TextView, 我不禁的想到了iO ...