• 【GPU驱动开发】- mesa编译与链接过程详细分析


    前言

    不必害怕未知,无需恐惧犯错,做一个Creator!

    一、总体框架图

    暂时无法在飞书文档外展示此内容
    在这里插入图片描述

    二、Mesa API 处理 OpenGL 函数调用

    Mesa API 负责实现 OpenGL 和其他图形 API 的函数接口。Mesa API 表是一个重要的数据结构,用于存储 OpenGL 函数的指针、版本信息、扩展支持等。_glapi_table 包含了大量的函数指针,每个指针对应于一个特定的 OpenGL 函数。这些指针在运行时被动态设置为对应的实现函数,例如 glCompileShader()、glLinkProgram() 等。
    暂时无法在飞书文档外展示此内容

    src/mesa/shaderapi.c:实现OpenGL API和Mesa函数接口的对应。

    三、State Tacker对GLSL代码链接处理

    在链接过程,state tracker层协调着色器程序的链接,将多个着色器链接为最终可执行的着色器程序,即NIR。并且将链接后的着色器程序最终传递给gallium驱动。ST层还管理着色器对象的状态,包括编译状态、链接状态等。
    暂时无法在飞书文档外展示此内容

    src/mesa/state_tracker/st_glsl_to_nir.c:在ST层主要实现了 GLSL 到 NIR 的转换功能,包括 GLSL 程序的链接、NIR 的最终化、优化以及统一变量的处理。

    四、GLSL 编译器对GLSL代码编译和链接处理

    在编译过程,当应用程序通过OpenGL函数调用提交GLSL着色器源代码时,Mesa API将GLSL代码传递给GLSL编译器,并进行编译生成Mesa IR中间表示。
    在链接过程,ST层负责将Mesa IR中间表示传递给GLSL编译器,GLSL编译器将Mesa IR转化成NIR并回传给ST层进行后续处理。
    1、编译过程,GLSL源码转化成IR

    • src/compiler/glsl/glsl_parser_extras.cpp :提供了对 GLSL 源代码的解析和语法分析所需的额外功能,包括处理预处理指令、处理注释、管理源代码中的位置信息
    • src/compiler/glsl/ast_to_hir.cpp: 将抽象语法树(AST)转换为高级中间表示(HIR)的过程。
      在这里插入图片描述

    2、链接过程,IR转化成NIR
    src/compiler/glsl/glsl_to_nir.cpp:在Compiler层负责将GLSL源码转化成NIR,包括GLSL IR的释放和NIR的创建和验证
    暂时无法在飞书文档外展示此内容

    五、NIR转换与优化

    GLSL IR 通常会被转换为 NIR(New Intermediate Representation)。st_glsl_to_nir.cpp 文件负责 GLSL 到 NIR 的转换,其中 NIR 提供了更抽象和可优化的中间表示。优化后的NIR将提供给gallium层供各个硬件驱动层进行转化。
    暂时无法在飞书文档外展示此内容

    GLSL编译器转化成NIR后,在ST还需进行以下处理和优化:

    • NIR 统一变量处理
    • 统一变量的位置分配
    • 顶点着色器输入位置分配
    • 变量位置的分配
    • NIR 向量化和坐标系变换
    • NIR 缓存加载和存储
    • 释放 NIR 变体

    六、核心数据结构

    _glapi_table 结构体:
    _glapi_table 结构体是 Mesa API 层的核心数据结构,包含了 OpenGL 函数的指针、版本信息、扩展支持等。它被用于表示 OpenGL API 的实现层次。

    struct _glapi_table {/* OpenGL function pointers */
        GET_DISPATCH_PTR();
    /* Version information */
        GLuint Version; 
    /* Extension support */
        GLuint Extensions[32];
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    st_context结构体:
    st_context 是一个表示Gallium3D状态跟踪上下文的结构体,负责跟踪和管理图形状态、与Gallium3D框架进行交互。

    struct st_context
    {
       struct st_context_iface iface;
    
       struct gl_context *ctx;
    
       struct pipe_context *pipe;
    
       struct draw_context *draw;  /< For selection/feedback/rastpos only */
    **   struct draw_stage *feedback_stage;  /**< For GL_FEEDBACK rendermode */
       struct draw_stage *selection_stage;  /< For GL_SELECT rendermode */
    **   struct draw_stage *rastpos_stage;  /**< For glRasterPos */
    // 省略
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    Python连接MYSQL、SQL Server、Oracle数据入库一网打尽
    CC2541蓝牙低功耗芯片中文资料提供
    VMware ifconfig ip报错解决记录
    Shell基础语法——流程控制、函数
    【贝叶斯分类2】朴素贝叶斯分类器
    canvas 基础 和 动图案例
    2022,开发转测试,会不会后悔?
    9.程序的机器级代码表示,CISC和RISC
    【信息系统项目管理师】 学习笔记 第2章 信息技术发展
    Pygame 精准检测图像碰撞
  • 原文地址:https://blog.csdn.net/weixin_44064233/article/details/136350523