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
|