什么是 EGL?
EGL 是 OpenGL ES 渲染 API 和本地窗口系统(native platform window system)之间的一个中间接口层,它主要由系统制造商实现。EGL提供如下机制:
- 与设备的原生窗口系统通信
- 查询绘图表面的可用类型和配置
- 创建绘图表面
- 在OpenGL ES 和其他图形渲染API之间同步渲染
- 管理纹理贴图等渲染资源
为了让OpenGL ES能够绘制在当前设备上,我们需要EGL作为OpenGL ES与设备的桥梁。
1.2版本以前的规范名称为OpenGL ES Native Platform Graphics Interface,有些开发组织认定是Embedded-System Graphics Library,定义是类似库,而非语言
OpenGL ES:EGL接口解析与理解_egl native_window 参数详解-CSDN博客
一.EGL 介绍
通俗上讲,OpenGL是一个操作GPU的API,它通过驱动向GPU发送相关指令,控制图形渲染管线状态机的运行状态。但OpenGL需要本地视窗系统进行交互,这就需要一个中间控制层,最好与平台无关。
EGL——因此被独立的设计出来,它作为OpenGL ES和本地窗口的桥梁。
EGL 是 OpenGL ES(嵌入式)和底层 Native 平台视窗系统之间的接口。EGL API 是独立于OpenGL ES各版本标准的独立API ,其主要作用是为OpenGL指令创建 Context 、绘制目标Surface 、配置Framebuffer属性、Swap提交绘制结果等。此外,EGL为GPU厂商和OS窗口系统之间提供了一个标准配置接口。
一般来说,OpenGL ES 图形管线的状态被存储于 EGL 管理的一个Context中。而Frame Buffers 和其他绘制 Surfaces 通过 EGL API进行创建、管理和销毁。 EGL 同时也控制和提供了对设备显示和可能的设备渲染配置的访问。
EGL标准是C的,在Android系统Java层封装了相关API。
https://www.khronos.org/registry/EGL/sdk/docs/man/html/indexflat.php
https://www.cnblogs.com/lenomirei/p/11379535.html
EGL
EGL是由Khronos Group提供的一组平台无关的API,它的主要功能如下:
- 和本地窗口系统(native windowing system)通讯;
- 查询可用的配置;
- 创建OpenGL ES可用的“绘图表面”(drawing surface);
- 同步不同类别的API之间的渲染,比如在OpenGL ES和OpenVG之间同步,或者在OpenGL和本地窗口的绘图命令之间;
- 管理“渲染资源”,比如纹理映射(rendering map)。
可以看出EGL和OpenGL是有关联的,EGL能给OpenGL的使用提供一些帮助。EGL是位于OpenGL和本地平台窗口系统(例如X11或者wayland)之间的一层接口。用于帮助OpenGL绘制的图形显示在窗口系统中。
GBM(Generic Buffer Management)
了解到GBM还是在Chromium的开源项目中,它和EGL功能类似,但是比EGL功能多一些。
gbm(通用缓冲区管理),它提供了一种为Mesa绑定的图形渲染分配缓冲区的机制。GBM旨在被当做一个本地平台为了工作在DRM上的EGL或者openwfd。它创建的句柄可用于初始化EGL和创建渲染目标缓冲区。
Mesa GBM是图形驱动程序特定缓冲区管理API(例如各种libdrm_ *库)的抽象,通过调用Mesa GPU驱动程序在内部实现。
例如,Wayland合成器 Weston使用OpenGL ES 2进行渲染,它通过调用EGL进行初始化。由于服务器在“裸KMS驱动程序 ”上运行,因此它使用EGL DRM平台,它可以真正称为GBM平台,因为它依赖于Mesa GBM接口。
在XDC2014,Nvidia员工Andy Ritger提议增强EGL以取代GBM。
这么理解会比较好,EGL对于OpenGL就相当于Mesa GBM对于Mesa。
GBM
SeVirt ™: Make it secure - Mesa Generic Buffer Management (GBM)
Mesa Generic Buffer Management (GBM)
Sep162016
Introduction
GBM is an minimalist API which provides a mechanism for allocating buffers for graphics rendering tied to Mesa. GBM is intended to be used as a native platform for EGL on drm. The handle it creates can be used to initialize EGL and to create render target buffers.
Traits
EGL/GBM does not support Pbuffers and Pixmaps.
Off-screen surface should be created by invocation of eglCreateWindowSurface and it would be always off-screen since GBM does not provide window management.
If you want to move it to the display you would need to use kernel KMS API.
Basic code
There is a simple example of application using DRM, GBM and EGL for initialization and cleanup of graphics state.
#include <stdlib.h>
#include <assert.h>
#include <fcntl.h>
#include <unistd.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <gbm.h>
int main()
{
assert( eglBindAPI( EGL_OPENGL_API ) == EGL_TRUE );
int fd = open("/dev/dri/card0", O_RDWR);
struct gbm_device * gbm = gbm_create_device( fd );
struct gbm_surface * gbm_surf = gbm_surface_create( gbm, 256, 256, GBM_FORMAT_XRGB8888, GBM_BO_USE_RENDERING);
EGLDisplay dpy = eglGetPlatformDisplayEXT( EGL_PLATFORM_GBM_MESA, gbm, NULL );
eglInitialize( dpy , NULL , NULL );
EGLConfig config;
EGLint n_of_configs;
assert( eglGetConfigs( dpy , &config , 1 , &n_of_configs ) == EGL_TRUE );
EGLSurface srf = eglCreatePlatformWindowSurfaceEXT( dpy, config, gbm_surf, NULL );
assert( srf != EGL_NO_SURFACE );
EGLContext ctx = eglCreateContext( dpy , config , EGL_NO_CONTEXT , NULL );
assert( ctx != EGL_NO_CONTEXT );
assert( eglMakeCurrent( dpy , srf , srf , ctx ) == EGL_TRUE );
eglDestroySurface( dpy , srf );
eglDestroyContext( dpy , ctx );
eglTerminate( dpy );
gbm_device_destroy( gbm );
close( fd );
return EXIT_SUCCESS;
}
https://blog.csdn.net/weixin_45730790/article/details/130830789
GBM概念
Mesa GBM ( Generic Buffer Manager) 基本上提供了 EGL native window类型(就像 Wayland 和 X11),因此可以获得真实的 EGL 表面并创建渲染目标缓冲区。然后,GL 可用于渲染这些缓冲区,这些缓冲区将通过 KMS/DRM API 排队翻页显示在显示器上。
用户应用程序直接对内存进行管理,通过 EGL 可以获取真实的 EGL 表面并创建渲染目标缓冲区
gbm(通用缓冲区管理),它提供了一种为 Mesa 绑定的图形渲染分配缓冲区的机制。GBM 旨在被当做一个本地平台为了工作在 DRM 上的 EGL 或者 openwfd。它创建的句柄可用于初始化 EGL 和创建渲染目标缓冲区。
Mesa GBM(Generic Buffer Management)是一个开源图形缓冲区管理库,用于管理图形内存缓冲区。它是Mesa 3D图形库的一部分。GBM主要用于Linux平台,为Direct Rendering Manager (DRM)内核子系统提供了一个用户空间API。它提供了一种统一的接口,用于在Linux系统中管理图形缓冲区和设备之间的交互。
GBM的主要功能包括:
分配图形内存缓冲区:GBM提供了一种简单的方法来分配图形内存缓冲区,这些缓冲区可以用于存储图像数据、纹理等。它支持多种像素格式和布局,以满足不同的图形需求。GBM提供了一套函数和数据结构,用于创建、管理和销毁图形缓冲区。它支持不同的图像格式和属性,并且可以与不同的图形设备(如显卡)进行交互。
管理缓冲区对象:GBM提供了缓冲区对象(buffer objects)的概念,用于表示分配的图形内存缓冲区。缓冲区对象可以与DRM内核子系统进行交互,以便进行模式设置、页面翻转等操作。
设备抽象:GBM提供了一种抽象接口,用于与底层图形设备(如DRM设备)进行交互。它隐藏了底层设备的细节,并提供了一致的接口,使上层组件(如EGL和显卡驱动程序)能够以统一的方式使用不同的设备。
内存映射:GBM允许对图形缓冲区进行内存映射,以便在需要时可以直接访问缓冲区的内容。这对于一些图形处理任务(如渲染、纹理操作)非常有用,可以提高性能和效率。
上下文管理:GBM提供了上下文管理的功能,可以创建和管理与图形缓冲区相关的上下文。这些上下文用于进行渲染和图形操作,并可以在不同的线程或进程之间共享。
提供与EGL的集成:EGL是一个用于管理OpenGL和OpenGL ES上下文的平台无关API。GBM提供了与EGL的集成,使得开发者可以在使用GBM管理图形内存的同时,使用EGL来创建和管理OpenGL上下文。
提供与Wayland和X11的集成:GBM可以与Wayland和X11这样的显示服务器进行集成,以便在这些平台上进行图形渲染。这使得GBM成为了Linux平台上的一个通用图形内存管理解决方案。
Mesa GBM在Linux图形堆栈中扮演着重要的角色,它作为一个中间层,连接了底层的图形设备和上层的图形组件。它为应用程序、窗口系统和驱动程序提供了一种统一的接口,使它们能够协同工作,实现图形渲染、显示和交互等功能。
GBM相关函数解析
我们先从原理上对GBM进行推导。GBM的本质:硬件无关的显存申请与管理。为什么需要这么一个库:DRM自带的DUMB缓冲区不能申请GPU显存,不能使用3D加速。因此,GBM的基本操作就是显存的申请与释放。但是这个管理必有一个上下文,很明显不可能是全局的,因为哪怕是作为用户的我们,也肯定希望申请出的GPU显存是与某个GPU绑定的。这个上下文由struct gbm_device进行抽象,且必定是与DRM设备绑定的。
————————————————
版权声明:本文为CSDN博主「Backlight~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45730790/article/details/130830789
wayland浅析之EGL、Opengles、GBM_gbm和egl分别是什么-CSDN博客
EGL
EGL是Khronos渲染API(如OpenGL、OpenGL ES或OpenVG)与底层本地平台(窗口)系统之间的接口。
简单理解:OpenGL是图形渲染的API,提供了一套统一的接口来达到跨平台的目的,但是光有OpenGL渲染的API还是不行,还需要有渲染环境的支持,而每个不同的操作系统(如windows、 linux、 android等)都有自己的一套窗口管理系统;
假如对不同操作系统都适配一套接口,那就和OpenGL的跨平台初衷相违背了。
所以EGL就是定义了一套标准,来构建不同平台的窗口系统的渲染环境。
EGL主要功能:处理图形上下文管理、Buffer管理和渲染同步
简介:
Display (EGLDisplay): 对实际显示设备/窗口系统的抽象;
Surface (EGLSurface): 存储图像的内存区域;
Context (EGLContext): 存储渲染API的状态信息;
一套标准的EGL绘制流程简介:
这里只考虑标准绘制情况,还不考虑扩展等特殊情况,特殊情况后面会详解;
————————————————
版权声明:本文为CSDN博主「种瓜大爷」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/czg13548930186/article/details/131103472