Mesa GL Dispatch分发分析与理解
引言
这篇博客的核心是从OpenGL应用程序的典型api入手,分析gl api 调用到用户态驱动后端的过程,进而总结出一个典型的调用栈。理解了这个典型调用栈,对后续任何一个API的调用过程分析,都是a piece of cake。
在正式分析相关分发流程之前,我们必须明确的一点就是现在的Mesa采用的是最新的gallium架构,下图的左侧调用栈是在gallium 架构之前采用的模式,右侧是gallium架构下的模式。可以看出gallium架构有比较明显的三个分层(夹心饼干):
-
state_tracker层:负责收集OpenGL状态;
-
GPU-specific层:厂商的用户态驱动核心部分;
-
OS WinSys层:操作系统对接层。
下面章节出现的build-android-aarch64目录是通过meson编译的out目录!
二. glClear和glFlush的调用栈分析
接下来以glClear的函数实现,来分析从应用程序到GPU-specific的调用栈。先把关键调用栈组织如下(省略了不相关的调用)。
glClear(GL_COLOR_BUFFER_BIT);
_mesa_Clear(GL_COLOR_BUFFER_BIT);
st_Clear(ctx, GL_COLOR_BUFFER_BIT);
st->pipe->Clear(...);
gpu_specific_Clear(...);
我们详细分析下glFlush的流程实现:
GL_API void GL_APIENTRY glFlush (void)