¿Cómo implementar la mezcla de FrameBuffer y Overlay en Android?
2.DisplayHardware es una abstracción del dispositivo de visualización, incluidos FrameBuffer y Overlay.
3. Cargue los complementos FrameBuffer y Overlay e inicialice OpenGLES:
vista simple
mNativeWindow = new FramebufferNativeWindow(); >framebuffer_device_t const * fbDev = mNativeWindow-gt; getDevice();
if (hw_get_module(OVERLAY_ HARDWARE_MODULE_ID, amp; módulo) == 0) {
overlay_control_open(módulo, amp; mOverlayEngine);
}
framebuffer_device_t const * fbDev = mNativeWindow-gt; getDevice().
surface = eglCreateWindowSurface(display, config, mNativeWindow.get( ), NULL );
eglMakeCurrent(display, Surface, Surface, Context);
3. FramebufferNativeWindow es la abstracción de framebuffer, que es responsable de cargar libgralloc y abrir el dispositivo framebuffer. . FramebufferNativeWindow no usa framebuffer directamente, sino que crea dos propios Buffers:
queueBuffer es responsable de mostrar un Buffer en la pantalla y llama a fb-gt;post para completar este trabajo.
dequeueBuffer obtiene un búfer gratuito y dibuja en segundo plano.
eglSwapBuffers llama a estas dos funciones para
Ver normal
egl_window_surface_v2_t::swapBuffers:
NativeWindow-gt;queueBuffer(nativeWindow, buffer );
NativeWindow-gt; dequeueBuffer(nativeWindow, amp; buffer);
4.msm7k/liboverlay es la implementación de Overlay, a diferencia de otras plataformas, en la plataforma Qualcomm. no proporciona un dispositivo de búfer de fotogramas, pero se implementa a través del ioctl de fb0, que se divide en dos tipos de operaciones:
OverlayControlChannel se utiliza para establecer parámetros, como establecer la posición, el ancho y la altura de la Superposición:
vista simple
bool OverlayControlChannel::setPosition(int x, int y, uint32_t w, uint32_t h) {
ov.
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, amp; ov);
}
.
OverlayDataChannel es se utiliza para mostrar la superposición, la función más importante es queueBuffer:
vista simple
bool OverlayDataChannel::queueBuffer(uint32_t offset) {
mOvData.data .offset = desplazamiento;
ioctl(mFD, MSMFB_OVERLAY_PLAY, odPtr))
}
5.
5. es una abstracción del caché de visualización, que incluye el búfer de cuadros y el búfer de superficie normal. framebuffer es solo un contenedor alrededor de /dev/graphic/fb0, mientras que Surface's Buffer es un contenedor alrededor de /dev/pmem, ashmem y la memoria GPU (msm_hw3dm). Su objetivo es principalmente facilitar la aceleración del hardware, ya que las transferencias DMA utilizan direcciones físicas y requieren que la memoria sea contigua a las direcciones físicas.
6.msm7k/libcopybit Esta es una biblioteca de aceleración 2D, principalmente responsable de las operaciones de estiramiento, rotación y síntesis de superficies. Tiene dos implementaciones:
copybit.cpp: implementación ioctl(MSMFB_BLIT) basada en fb0.
copybit_c2d.cpp: basado en la implementación de kgsl, solo un contenedor de libC2D2.so, libC2D2.so no debería ser de código abierto.
7.pmem
misc/pmem.c: Gestión de memoria física, algoritmos e interfaz de espacio de usuario.
board-msm7x27.c define el tamaño predeterminado de la memoria física:
vista simple
#define MSM_PMEM_MDP_SIZE 0x1B76000
#define MSM_PMEM_ADSP_SIZE 0xB71000
#define MSM_PMEM_AUDIO_SIZE 0x5B000
#define MSM_FB_SIZE 0x177000
#defineMSM_GPU_PHYS_SIZE SZ_2M
#define PMEM_KERNEL_EBI1_SIZE 0x1 C00
msm_msm7x2x_allocate_memory_regions asigna varios bloques grandes de memoria para la asignación secundaria de pmem.
8.KGSL
Capa del sistema de gráficos del kernel (KGSL), controlador de aceleración de gráficos 3D, directorio de código fuente drivers/gpu/msm, es un contenedor de GPU para OpenGLES 2.0 Proporciona una interfaz abstracta .
9.msm_hw3dm
No encontré ningún código relevante en el kernel para este controlador.
10.msm_fb
msm_fb.c: Interfaz de usuario para framebuffer, overlay y blit.
mdp_dma.c: un contenedor para un dispositivo de visualización específico, que proporciona dos métodos de actualización del búfer de fotogramas:
mdp_refresh_screen: actualización programada.
mdp_dma_pan_update: Actualización activa mediante desplazamiento de la pantalla.
mdp_dma_lcdc.c: mdp_lcdc_update actualiza el frame buffer a través de la pantalla LCD.
mdp_dma_lcdc.c: mdp_lcdc_update actualiza el frame buffer.