【问题标题】:How can I find out whether my GLSL compiler optimizes the following?如何确定我的 GLSL 编译器是否优化了以下内容?
【发布时间】:2023-03-25 14:05:01
【问题描述】:

我确信 GLSL 编译器做了很多优化。我想知道是否有办法(可能使用 GL 调试上下文或某些扩展?)获取给定 GLSL 源字符串的“优化版本”就在它被翻译成无法理解的 ASM 或直接的 GPU 机器码。

举个例子:

vec3 fx_Noop (const in vec3 vCol) {
    return vCol;
}
vec3 fx_Tex2D (const in vec3 vCol) {
    return fx_Noop(texture(uni_Tex2D, var_Tex2D).rgb);
}

这里应该消除整个 fx_Noop() 定义和对它的所有调用,但更重要的是 fx_Tex2D() 应该这样重写:

vec3 fx_Tex2D () {
    return texture(uni_Tex2D, var_Tex2D).rgb;
}

因为 vec3 vCol 中的 const 没有被使用。

现在我意识到每个 GL 驱动程序和 GLSL 实现的行为都不同。我仍然想深入了解驱动程序在汇编/编译/链接之前对给定的 GLSL 源字符串究竟做了什么。

我也意识到 GLSL 编码器不应该编写像上面这样的代码,但是在一个有点实验性的代码生成场景中,当可以安全地做出某些权衡时,事情会得到很多简化,因为知道大多数编译器/实现都适用无论如何,一个很好的清洁......

【问题讨论】:

  • 优化永远不会发生在源字符串上,而是发生在后面的步骤中,通常是抽象语法树,或者一些中间代码。
  • OK 猜想仍然能够输出/检查... ;)
  • 好吧,至少使用基于 MesaGL/DRI2/DRM 的开源驱动程序您可以做到这一点。但是没有官方的 OpenGL API 来获取或设置着色器程序的 AST。不过,这将是一个很酷的扩展,允许实现除 GLSL 之外的其他着色器编程语言(我想要像 Lisp 或 ML 这样的着色器语言)。

标签: opengl code-generation glsl shader compiler-optimization


【解决方案1】:

不,如果不分析不同的着色器,就无法确定某种方式。

【讨论】:

    猜你喜欢
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2014-05-23
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多