zoukankan      html  css  js  c++  java
  • DisplayHardware


    http://hi.baidu.com/aokikyon/blog/item/22945e6325f1c6710d33fae1.html

    DisplayHardware
     SurfaceFlinger调用DisplayHardware部分初始化Framebuffer、EGL和OpenGL ES。

    1 DisplayHardware的参数
     DIRECT_TEXTURE          = 0x00000002,  //
     COPY_BITS_EXTENSION     = 0x00000008, //
     NPOT_EXTENSION          = 0x00000100,  //
     DRAW_TEXTURE_EXTENSION  = 0x00000200, //
     BUFFER_PRESERVED        = 0x00010000,  //
     PARTIAL_UPDATES         = 0x00020000,    // 部分更新
     SLOW_CONFIG             = 0x00040000,    // 软件
     SWAP_RECTANGLE          = 0x00080000, // 矩形框交换
     CACHED_BUFFERS          = 0x00100000  //

     

    2 DisplayHardware初始化过程
    1)初始化DisplayHardwareBase结构
     new DisplayEventThread(flinger);
     new ConsoleManagerThread(flinger);
    2)DisplayEventThreadBase(flinger)
     读取"/sys/power/wait_for_fb_sleep"和"/sys/power/wait_for_fb_wake"判断系统状态。
    3)ConsoleManagerThread(flinger)
     (1)创建一个新的控制台;
     (2)进入text模式;
     (3)获取当前控制台;
     (4)切换至控制台7(X串口常用的串口);
     (5)打开新的控制台;
     (6)关闭控制台的行缓冲、回显等功能;
     (7)设置信号;
     (8)切换至图形模式;
    4)执行DisplayHardware::init(dpy)
     (1)new FramebufferNativeWindow(),调用libui.so初始化Framebuffer;
     (2)如果有Overlay模块,加载Overlay模块并打开控制接口;
     (3)调用libEGL.so,初始化EGL;
      eglGetDisplay(EGL_DEFAULT_DISPLAY);
      eglInitialize(display, NULL, NULL);
      eglGetConfigs(display, NULL, 0, &numConfigs);
      selectConfigForNativeWindow(display, attribs, mNativeWindow.get(), &config);
     (4)获取并打印EGL版本信息;
        LOGI("EGL informations:");
        LOGI("# of configs : %d", numConfigs);
        LOGI("vendor    : %s", eglQueryString(display, EGL_VENDOR));
        LOGI("version   : %s", eglQueryString(display, EGL_VERSION));
        LOGI("extensions: %s", egl_extensions);
        LOGI("Client API: %s", eglQueryString(display, EGL_CLIENT_APIS)?:"Not Supported");
        LOGI("EGLSurface: %d-%d-%d-%d, config=%p", r, g, b, a, config);
     (5)判断LCD是否支持局部更新功能(PARTIAL_UPDATES),如果LCD支持局部更新,则不需要保存backbuffer,并不需要使用SWAP_RECTANGLE。目前并不支持PARTIAL_UPDATES;
     (6)创建主界面;
     eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL);
     (7)获取DisplayHardware参数,目前支持的参数为:SWAP_RECTANGLE、CACHED_BUFFERS和SLOW_CONFIG;
     (8)读取LCD density参数;
        if (property_get("qemu.sf.lcd_density", property, NULL) <= 0) {
            if (property_get("ro.sf.lcd_density", property, NULL) <= 0) {
                LOGW("ro.sf.lcd_density not defined, using 160 dpi by default.");
                strcpy(property, "160");
            }
        } else {
            /* for the emulator case, reset the dpi values too */
            mDpiX = mDpiY = atoi(property);
        }
    mDensity = atoi(property) * (1.0f/160.0f);
    (9)创建OpenGL ES上下文;
    context = eglCreateContext(display, config, NULL, NULL);
    (10)将创建的上下文和EGL surface相绑定;
    eglMakeCurrent(display, surface, surface, context);
    (11)获取OpenGL参数,根据参数重新配置DisplayHardware参数;
        LOGI("OpenGL informations:");
        LOGI("vendor    : %s", glGetString(GL_VENDOR));
        LOGI("renderer  : %s", gl_renderer);
        LOGI("version   : %s", glGetString(GL_VERSION));
        LOGI("extensions: %s", gl_extensions);
     (12)暂时解除EGL与当前线程的绑定;
    eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);

     

    3 DisplayHardware::flip
    (1)flip有两条路线:
     A. SWAP_RECTANGLE路线
     调用eglSetSwapRectangleANDROID(dpy, surface, b.left, b.top, b.width(), b.height());
     B. PARTIAL_UPDATES路线
     调用mNativeWindow->setUpdateRectangle(dirty.getBounds());
    (2)调用eglSwapBuffers(dpy, surface)将数据贴到屏幕上;

     

     

    初始化LOG
    I/SurfaceFlinger(  831): SurfaceFlinger is starting
    I/SurfaceFlinger(  831): SurfaceFlinger's main thread ready to run. Initializing graphics H/W...
    E/SurfaceFlinger(  831): Couldn't open /sys/power/wait_for_fb_sleep or /sys/power/wait_for_fb_wake
    I/gralloc (  831): ky6410 grallocusing (fd=22)
    I/gralloc (  831): id           = s3cfb
    I/gralloc (  831): xres         = 480 px
    I/gralloc (  831): yres         = 272 px
    I/gralloc (  831): xres_virtual = 480 px
    I/gralloc (  831): yres_virtual = 544 px
    I/gralloc (  831): bpp          = 16
    I/gralloc (  831): r            = 11:5
    I/gralloc (  831): g            =  5:6
    I/gralloc (  831): b            =  0:5
    I/gralloc (  831): width        = 480 mm (25.400000 dpi)
    I/gralloc (  831): height       = 272 mm (25.400000 dpi)
    I/gralloc (  831): refresh rate = 0.83 Hz
    E/Overlay (  831): Overlay open!
    E/Overlay (  831):
    D/Overlay (  831):  overlay_device_open 1 : OVERLAY_HARDWARE_CONTROL
    D/libEGL  (  831): egl.cfg not found, using default config
    D/libEGL  (  831): loaded /system/lib/egl/libGLES_android.so
    I/SurfaceFlinger(  831): EGL informations:
    I/SurfaceFlinger(  831): # of configs : 8
    I/SurfaceFlinger(  831): vendor    : Android
    I/SurfaceFlinger(  831): version   : 1.4 Android META-EGL
    I/SurfaceFlinger(  831): extensions: EGL_KHR_image EGL_KHR_image_base EGL_KHR_image_pixmap EGL_ANDROID_image_native_buffer EGL_ANDROID_swap_rectangle EGL_ANDROID_get_render_buffer
    I/SurfaceFlinger(  831): Client API: OpenGL ES
    I/SurfaceFlinger(  831): EGLSurface: 5-6-5-0, config=0x1000000
    I/SurfaceFlinger(  831): flags     : 001c0000
    W/SurfaceFlinger(  831): ro.sf.lcd_density not defined, using 160 dpi by default.
    I/SurfaceFlinger(  831): OpenGL informations:
    I/SurfaceFlinger(  831): vendor    : Android
    I/SurfaceFlinger(  831): renderer  : Android PixelFlinger 1.2
    I/SurfaceFlinger(  831): version   : OpenGL ES-CM 1.0
    I/SurfaceFlinger(  831): extensions: GL_OES_byte_coordinates GL_OES_fixed_point GL_OES_single_precision GL_OES_read_format GL_OES_compressed_paletted_texture GL_OES_draw_texture GL_OES_matrix_get GL_OES_query_matrix GL_OES_EGL_image GL_ARB_texture_compression GL_ARB_texture_non_power_of_two GL_ANDROID_user_clip_plane GL_ANDROID_vertex_buffer_object GL_ANDROID_generate_mipmap

    Rockie Cheng


  • 相关阅读:
    “无法从http://XXX/XXX.svc?wsdl获取元数据”错误的解决方法
    闹洞房小游戏
    第3章 Oracle实例的管理
    公积金余额查询电话
    人要有忧患意识
    第0章 Oracle的安装及相关配置
    第5章 重做日志文件
    oracle体系结构视频学习笔记
    编写存储过程实现查询mysql数据库中的表名并删除表中的数据
    第6章 表空间和数据文件的管理
  • 原文地址:https://www.cnblogs.com/yuzaipiaofei/p/4124587.html
Copyright © 2011-2022 走看看