【GPU驱动开发】-Mesa ST和GLSL编译器衔接源码分析

news/2025/2/12 23:19:33/

前言

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

(基于Mesa 22.2.5版本)

st_glsl_to_nir.c 主要实现了 GLSL 到 NIR 的转换功能,包括 GLSL 程序的链接、NIR 的最终化、优化以及统一变量的处理。以下是该文件主要实现的功能以及功能之间的实现流程:

链接 GLSL 到 NIR:
st_link_shader 函数是 GLSL 程序链接到 NIR 的入口函数。
根据着色器类型(GLSL 或 SPIR-V)调用相应的链接函数,如 gl_nir_link_glsl 或 gl_nir_link_spirv。
在链接过程中,执行了一系列的操作,包括清除着色器程序数据、创建着色器程序数据、判断着色器类型、链接着色器等。

GLSL 到 NIR 转换后的处理:
st_glsl_to_nir_post_opts 函数执行 GLSL 到 NIR 转换的链接后任务。
为使用的内建统一变量添加状态引用。

NIR 最终化和优化:
st_finalize_nir_before_variants 函数在生成变体之前最终化 NIR。
执行一系列 NIR 优化和变换,如分裂变量拷贝、降级纹理采样器、降级原子操作等。
设置受影响的状态标志(affected state flags)。

NIR 统一变量处理:
st_nir_lower_uniforms 函数用于降级 NIR 中的统一变量,根据配置使用压缩或非压缩方式。
如果启用了 lower_uniforms_to_ubo,还会将一些统一变量降级为 UBO。
最终将状态参数优化为 UBO。

统一变量的位置分配:
st_nir_lookup_parameter_index 函数根据变量在程序参数列表中的位置查找参数的索引。
st_nir_assign_uniform_locations 函数为 NIR 着色器中的统一变量分配驱动程序位置。
处理不同情况,包括无绑定和状态槽。

顶点着色器输入位置分配:
st_nir_assign_vs_in_locations 函数专门处理为顶点着色器输入分配输入位置的任务。
紧缩输入位置,删除未使用的输入,并相应调整位置。

变量位置的分配:
st_nir_assign_varying_locations 函数负责为着色器中的输入和输出变量分配位置。
对于顶点着色器,分配输出位置,并通过 st_nir_fixup_varying_slots 修正变量槽位。
对于几何着色器、Tessellation 控制着色器和 Tessellation 评估着色器,分配输入和输出位置,并修正变量槽位。
对于片段着色器,分配输入和输出位置。

NIR 向量化和坐标系变换:
st_nir_vectorize_io 函数向量化输入输出变量,特别对 Tessellation 控制着色器的 Tessellation 等级进行向量化。
st_nir_lower_wpos_ytransform 函数处理片段着色器的窗口坐标系转换。

NIR 缓存加载和存储:
st_load_nir_from_disk_cache 函数从磁盘缓存加载 NIR,以避免重新生成。
st_store_nir_in_disk_cache 函数将 NIR 存储到磁盘缓存中,以便将来重用。

释放 NIR 变体:
st_release_variants 函数释放着色器程序的变体。
在释放之前,将 NIR 存储到磁盘缓存中。

最终化着色器程序:
st_finalize_program 函数最终化着色器程序。
包括对 NIR 进行一系列最终化操作,如变量位置分配、采样器降级、统一变量降级等。
这些功能在 st_glsl_to_nir.c 文件中共同协作,完成了 GLSL 到 NIR 的转换和最终化过程,确保生成的 NIR 表示符合 Mesa 图形驱动的要求。


http://www.ppmy.cn/news/1332624.html

相关文章

Vue常用特性

1.0 表单相关 1.1 表单基本操作 获取文本框的值(略) 获取单选框中的值 通过v-model <!-- 1、 两个单选框需要同时通过v-model 双向绑定 一个值 2、 每一个单选框必须要有value属性 且value 值不能一样 3、 当某一个单选框选中的时候 v-model 会将当前的 value值 改变 d…

Fink CDC 1.0 至3.0的从古至今

本文主要分享Flink CDC 1.0 至3.0的发展历程,了解其背后的关键特性和发展趋势,探讨其在大数据领域的影响和价值。 一、CDC概述 CDC是一种用以掌控数据变化的软件架构(技术思路),用于捕获和传递数据库中发生的数据变化。当数据库中发生增(INSERT)/删(DELETE)/改(UPD…

【java面试】常见问题(超详细)

目录 一、java常见问题JDK和JRE的区别是什么&#xff1f;Java中的String类是可变的还是不可变的&#xff1f;Java中的equals方法和hashCode方法有什么关系&#xff1f;Java中什么是重载【Overloading】&#xff1f;什么是覆盖【Overriding】&#xff1f;它们有什么区别&#xf…

Spring SpEL在Flink中的应用-与FlatMap结合实现数据动态计算

文章目录 前言一、POM依赖二、主函数代码示例三、RichFlatMapFunction实现总结 前言 SpEL表达式与Flink FlatMapFunction或MapFunction结合可以实现基于表达式的简单动态计算。有关SpEL表达式的使用请参考Spring SpEL在Flink中的应用-SpEL详解。 可以将计算表达式放入数据库&a…

基于卡尔曼滤波的平面轨迹优化

文章目录 概要卡尔曼滤波代码主函数代码CMakeLists.txt概要 在进行目标跟踪时,算法实时测量得到的目标平面位置,是具有误差的,连续观测,所形成的轨迹如下图所示,需要对其进行噪声滤除。这篇博客将使用卡尔曼滤波,对轨迹进行优化。 优化的结果为黄色线。 卡尔曼滤波代码…

2024-01-25 力扣高频SQL50题目1174. 即时食物配送

题目如下&#xff1a; 配送表: Delivery -------------------------------------- | Column Name | Type | -------------------------------------- | delivery_id | int | | customer_id | int | | order_date…

在Excel把两个单元格的内容,合并后显示在第三个单元格

在Excel中&#xff0c;将两个单元格的内容合并显示到第三个单元格有几种方法&#xff1a; 1. 使用 CONCATENATE 函数&#xff08;在较早版本的 Excel 中&#xff09;&#xff1a; 在目标单元格&#xff08;例如 C1&#xff09;中输入以下公式&#xff1a; CONCATENATE(A…

活字格V9获取图片失败bug,报错404,了解存储路径,已改为批量上传和批量获取

项目场景&#xff1a; 问题描述 原因分析&#xff1a; 解决方案&#xff1a; 完成了批量上传功能&#xff0c;这插件真的很方便 于是写了个批量获取附件的js代码&#xff0c;我真厉害 项目场景&#xff1a; 活字格V9版本获取图片链接Upload 【9.0.103.0】图片上传的存储路…