當前位置:編程學習大全網 - 源碼下載 - 如何在Android上實現FrameBuffer和Overlay的blend

如何在Android上實現FrameBuffer和Overlay的blend

1.SurfaceFlinger是壹個服務,主要是負責合成各窗口的Surface,然後通過OpenGLES顯示到FrameBuffer上。

2.DisplayHardware是對顯示設備的抽象,包括FrameBuffer和Overlay。加載FrameBuffer和Overlay插件,並初始化OpenGLES:

view plain

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);

3.FramebufferNativeWindow 是framebuffer 的抽象,它負責加載libgralloc,並打開framebuffer設備。FramebufferNativeWindow並不直接使用 framebuffer,而是自己創建了兩個Buffer:

queueBuffer負責顯示壹個Buffer到屏幕上,它調用fb->post去顯示。

dequeueBuffer獲取壹個空閑的Buffer,用來在後臺繪制。

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

view plain

egl_window_surface_v2_t::swapBuffers:

nativeWindow->queueBuffer(nativeWindow, buffer);

nativeWindow->dequeueBuffer(nativeWindow, &buffer);

4.msm7k/liboverlay是Overlay的實現,與其它平臺不同的是,高通平臺上的Overlay並不是提供壹個framebuffer設備,而通過fb0的ioctl來實現的,ioctl分為兩類操作:

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

view plain

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:

view plain

bool OverlayDataChannel::queueBuffer(uint32_t offset) {

mOvData.data.offset = offset;

ioctl(mFD, MSMFB_OVERLAY_PLAY, odPtr))

}

5.msm7k/libgralloc 是顯示緩存的抽象,包括framebuffer和普通Surface的Buffer。framebuffer只是/dev/graphic/fb0的包 裝,Surface的Buffer則是對/dev/pmem、ashmem和GPU內存(msm_hw3dm)的包裝,它的目標主要是方便硬件加速,因為 DMA傳輸使用物理地址,要求內存在物理地址上連續。

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

copybit.cpp: 基於fb0的ioctl(MSMFB_BLIT)的實現。

copybit_c2d.cpp: 基於kgsl的實現,只是對libC2D2.so的包裝,libC2D2.so應該是不開源的。

7.pmem

misc/pmem.c: 對物理內存的管理,算法和用戶空間的接口。

board-msm7x27.c定義了物理內存的缺省大小:

view plain

#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 0x1C00

msm_msm7x2x_allocate_memory_regions分配幾大塊內存用於給pmem做二次分配。

8.KGSL

Kernel Graphics System Layer (KGSL),3D圖形加速驅動程序,源代碼drivers/gpu/msm目錄下,它是對GPU的包裝,給OpenGLES 2.0提供抽象的接口。

9.msm_hw3dm

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

10.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。

  • 上一篇:與天為敵
  • 下一篇:Jquery中常用的AJax的方法有哪幾個
  • copyright 2024編程學習大全網