Android 中的 framebuffer

來源:互聯網
上載者:User
作者: 李先靜 xianjimli@gmail.com 日期: 2010-01-14 本文介紹了 Android 的 framebuffer 的整體架構,圖文並茂,比較清晰。文章轉自 http://www.limodev.cn/blog
簡介

FrameBuffer 在Android中並不像在其它GUI那樣直觀,抽象的層次比較多,加上GUI的更新是通過OpenGLES來做的。所以讓人很難搞清GUI更新的整個流程,最近要準備一個講稿,所以花了一些去研究,這裡做點筆記供大家參考,原始碼是基於高通平台的,這些代碼在網上都可以下載。

FrameBuffer 的相關組件如所示:

  • SurfaceFlinger是一個服務,主要是負責合成各視窗的Surface,然後通過OpenGLES顯示到FrameBuffer上。SurfaceFlinger本身比較重要而且比較複雜,以後專門寫一篇吧。
  • DisplayHardware是對顯示裝置的抽象,包括FrameBuffer和Overlay。它載入FrameBuffer和Overlay外掛程式,並初始化OpenGLES:
    mNativeWindow = new FramebufferNativeWindow();    framebuffer_device_t const * fbDev = mNativeWindow->getDevice();    if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) {       overlay_control_open(module, &mOverlayEngine);    }    surface = eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL);    eglMakeCurrent(display, surface, surface, context);
  • FramebufferNativeWindow 是framebuffer 的抽象,它負責載入libgralloc,並開啟framebuffer裝置。FramebufferNativeWindow並不直接使用 framebuffer,而是自己建立了兩個Buffer:

    1. queueBuffer負責顯示一個Buffer到螢幕上,它調用fb->post去顯示。
    2. dequeueBuffer擷取一個閒置Buffer,用來在後台繪製。

這兩個函數由eglSwapBuffers調過來,調到:

egl_window_surface_v2_t::swapBuffers:    nativeWindow->queueBuffer(nativeWindow, buffer);    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
  • msm7k/liboverlay是Overlay的實現,與其它平台不同的是,高通平台上的Overlay並不是提供一個framebuffer裝置,而通過fb0的ioctl來實現的,ioctl分為兩類操作:

OverlayControlChannel用於設定參數,比如設定Overlay的位置,寬度和高度:

bool OverlayControlChannel::setPosition(int x, int y, uint32_t w, uint32_t h) {    ov.dst_rect.x = x;    ov.dst_rect.y = y;    ov.dst_rect.w = w;    ov.dst_rect.h = h;    ioctl(mFD, MSMFB_OVERLAY_SET, &ov);}

OverlayDataChannel用於顯示Overlay,其中最重要的函數就是queueBuffer:

bool OverlayDataChannel::queueBuffer(uint32_t offset) {mOvData.data.offset = offset;ioctl(mFD, MSMFB_OVERLAY_PLAY, odPtr))}
  • msm7k/libgralloc 是顯示緩衝的抽象,包括framebuffer和普通Surface的Buffer。

framebuffer只是/dev/graphic/fb0的封裝,Surface的Buffer則是對/dev/pmem、ashmem和GPU記憶體(msm_hw3dm)的封裝,它的目標主要是方便硬體加速,因為 DMA傳輸使用物理地址,要求記憶體在物理地址上連續。

  • msm7k/libcopybit這是2D加速庫,主要負責Surface的展開、旋轉和合成等操作。它有兩種實現方式:

    1. copybit.cpp: 基於fb0的ioctl(MSMFB_BLIT)的實現。
    2. copybit_c2d.cpp: 基於kgsl的實現,只是對libC2D2.so的封裝,libC2D2.so應該是不開源的。
  • pmem
  1. misc/pmem.c: 對實體記憶體的管理,演算法和使用者空間的介面。
  2. board-msm7x27.c定義了實體記憶體的預設大小:
#define MSM_PMEM_MDP_SIZE   0x1B76000#define MSM_PMEM_ADSP_SIZE  0xB71000#define MSM_PMEM_AUDIO_SIZE 0x5B000#define MSM_FB_SIZE     0x177000#define MSM_GPU_PHYS_SIZE   SZ_2M#define PMEM_KERNEL_EBI1_SIZE   0x1C000

msm_msm7x2x_allocate_memory_regions分配幾大塊記憶體用於給pmem做二次分配。

  • KGSL

Kernel Graphics System Layer (KGSL),3D圖形加速驅動程式,原始碼drivers/gpu/msm目錄下,它是對GPU的封裝,給OpenGLES 2.0提供抽象的介面。

  • msm_hw3dm

這個我在核心中沒有找到相關代碼。

  • msm_fb

msm_fb.c: framebuffer, overlay和blit的使用者介面。

mdp_dma.c: 對具體顯示裝置的封裝,提供兩種framebuffer更新的方式:

mdp_refresh_screen: 定時更新。

mdp_dma_pan_update: 通過pan display主動更新。

mdp_dma_lcdc.c:針對LCD實現的顯示裝置,mdp_lcdc_update用更新framebuffer。

SeeAlso
  1. Android中的FrameBuffer
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.