Mesa GLX 实现
GLX
GLX 是 Mesa 中实现的三大支持平台(EGL, GLX, GBM)之一, 原来 GLX 在 Mesa 中有 xlib, gallium-xlib 和 dri 三种实现,自从 Delete Mesa Classic 后就只剩下 xlib,dri 两种实现,其中 dri 使用得比较多一些。
flowchart TD
A[xlib or gallium-xlib]
A --> x11
A --> xext
A --> xcb
B[dri]
B --> x11
B --> xext
B --> xfixes
B --> xcb-glx
B --> xcb-shm
如果是xlib, 它的源码位于
- mesa/drivers/x11
如果是gallium-xlib, 它的源码位于
- gallium/winsys/sw/xlib
- gallium/frontends/glx/xlib
- gallium/targets/libgl-xlib
xlib
dri
glXMakeCurrent()
sequenceDiagram
autonumber
participant GLX
participant Gallium
GLX ->> GLX : MakeContextCurrent()
GLX ->> Gallium : driUnbindContext()
Gallium ->> Gallium : st_api_make_current()
Gallium ->> Gallium : st_glFlush()
opt not the first time MakeCurrent()
GLX ->> Gallium : driBindContext()
Gallium ->> Gallium : st_api_make_current()
Gallium ->> Gallium : st_glFlush()
GLX ->> Gallium : driDestroyContext()
Gallium ->> Gallium : st_glFlush()
Gallium ->> Gallium : st_context_destroy()
end
glXSwapBuffers()
flowchart TD
A["glXSwapBuffers()"]
B["driswSwapBuffers()"]
C["drisw_swap_buffers_with_damage()"]
D["drisw_copy_to_front()"]
E["drisw_present_texture()"]
F["llvmpipe_flush_frontbuffer()"]
G["dri_sw_displaytarget_display()"]
H["drisw_put_image_shm()"]
I["drisw_put_image()"]
B2["dri3_swap_buffers()"]
C2["loader_dri3_swap_buffer_msc()"]
D2["glx_dri3_flush_drawable()"]
E2["dri3_flush_present_events()"]
F2["xcb_present_pixmap()"]
G2["xcb_flush()"]
H2["dri2_invalidate_drawable()"]
A --> B --> C --> D --> E --> F --> G --is_shm--> H
G --> I
A --> B2 --> C2 --> D2 --> E2 --> F2 --> G2 --> H2
GLVND(Vendor Neutral GL dispatch library)
Source Directory | Shared libraray | APT Package |
---|---|---|
GLDispatch | libGLdispatch.so.0.0.0 | libglvnd0_1.3.2-1~kylin0.20.04.2_arm64 |
GLX | libGLX.so.0.0.0 | libglx0_1.3.2-1~kylin0.20.04.2_arm64 |
EGL | libEGL.so.1.1.0 | libegl1_1.3.2-1~kylin0.20.04.2_arm64 |
OpenGL | libOpenGL.so.0.0.0 | libopengl0_1.3.2-1~kylin0.20.04.2_arm64 |
GLESv1 | libGLESv1_CM.so.1.2.0 | libgles1_1.3.2-1~kylin0.20.04.2_arm64 |
GLESv2 | libGLESv2.so.2.1.0 | libgles2_1.3.2-1~kylin0.20.04.2_arm64 |
GL | libGL.so.1.7.0 | libgl1_1.3.2-1~kylin0.20.04.2_arm64 |
上面这些包和动态库文件都来自同一个源码库 glvnd/libglvnd, 但它们并不是真正的 OpenGL 实现 (驱动), 它们只是一个 Dispatch Layer, 利用 Dynamic Tag DT_FILTER
实现多个 Vendor 的 OpenGL 驱动能在同一个系统上共存。 libglvnd 向用户提供环境变量
__GLX_VENDOR_LIBRARY_NAME
或
__EGL_VENDOR_LIBRARY_FILENAMES
__EGL_VENDOR_LIBRARY_DIRS
来指定运行时到底是哪个 vendor 的驱动被调用。
Mesa
APT Package | Target | Description |
---|---|---|
libglapi-mesa | libglapi.so | free implementation of GL API |
libgles2-mesa | transitional dummy package |