如何判断我的图形卡在Linux上支持哪个版本的OpenGL

时间:2017-11-07 06:32:56

标签: linux opengl

我正在试图弄清楚我的显卡和驱动程序当前支持哪个版本的OpenGL。

This answer建议运行glxinfo | grep OpenGL如果正常,但这里有(某些)输出:

OpenGL vendor string: NVIDIA Corporation                                                                                                                                                                                                                                                                                                                                              
OpenGL core profile version string: 4.5.0 NVIDIA 387.22                                                                                                                                                                                                                                                                                                                                               
OpenGL version string: 4.6.0 NVIDIA 387.22   

所以很难说,是4.5还是4.6?

official documentation from nVidia也没有提到答案!

1 个答案:

答案 0 :(得分:4)

OpenGL version string: 4.6.0 NVIDIA 387.22   

这是实现支持的最高 legacy 版本。这里有几种可能性:

  1. 对于不支持现代OpenGL配置文件(在3.2中引入)的OpenGL实现,此数字将<= 3.1。
  2. 如果实现支持兼容性配置文件并且在被要求提供旧式上下文时实际返回兼容性配置文件上下文,则它可能是支持的最高兼容性配置文件版本
  3. 即使在兼容性配置文件中支持GL&gt; = 3.2的实现,它也可能<= 3.1,但在被要求提供遗留上下文时选择不公开它。
  4. nvidia专有驱动程序属于第2类。

    对于核心配置文件,根本没有办法询问实现它可以支持什么,如中所述 this answer

    OpenGL core profile version string: 4.5.0 NVIDIA 387.22  
    

    glxinfo输出意味着你的驱动程序不能做4.6核心。 (它实际上可以)。这只是意味着glxinfo现在不知道GL 4.6的存在,只检查最多4.5。

    The source code for glxinfo 将揭示以下逻辑:

       if (coreProfile) {
          /* Try to create a core profile, starting with the newest version of
           * GL that we're aware of.  If we don't specify the version
           */
          int i;
          for (i = 0; gl_versions[i].major > 0; i++) {
              /* don't bother below GL 3.0 */
              if (gl_versions[i].major == 3 &&
                  gl_versions[i].minor == 0)
                 return 0;
             ctx = create_context_flags(dpy, config,
                                        gl_versions[i].major,
                                        gl_versions[i].minor,
                                        0x0,
                                        GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
                                        direct);
             if (ctx)
                return ctx;
          }
          /* couldn't get core profile context */
          return 0;
       }
    

    所以它只是迭代数组gl_versions并检查是否可以创建具有该版本的上下文。

    2017年10月11日,OpenGL 4.6被添加到该阵列in this commit

    diff --git a/src/xdemos/glinfo_common.h b/src/xdemos/glinfo_common.h
    index 0024f85..4d07f66 100644
    --- a/src/xdemos/glinfo_common.h
    +++ b/src/xdemos/glinfo_common.h
    @@ -86,6 +86,7 @@ struct options
    
     /** list of known OpenGL versions */
     static const struct { int major, minor; } gl_versions[] = {
    +   {4, 6},
        {4, 5},
        {4, 4},
        {4, 3},
    

    因此,如果您使用在10月11日之前在源代码版本上编译的glxinfo(这意味着现在基本上每个发行版本),即使您的驱动程序可以执行此操作,它也不会显示4.6。

      

    所以很难说,是4.5还是4.6?

    兼容性和核心配置文件均为4.6。但我只知道,因为我知道那个司机。