Chinaunix首页 | 论坛 | 博客
  • 博客访问: 279962
  • 博文数量: 95
  • 博客积分: 2047
  • 博客等级: 大尉
  • 技术积分: 1022
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-14 16:18
文章分类

全部博文(95)

文章存档

2013年(1)

2011年(94)

我的朋友

分类: 嵌入式

2011-08-30 23:08:09

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

阅读(1037) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~