【问题标题】:Get maximum workgroup size for compute shaders?获取计算着色器的最大工作组大小?
【发布时间】:2016-08-17 19:35:16
【问题描述】:

我正在编写一个 OpenGL ES 3.1 程序,并且想知道我正在运行的设备(在 Android 6 上运行)的最大工作组大小。

对于 PC 查询 GL_MAX_COMPUTE_WORK_GROUP_COUNTGL_MAX_COMPUTE_WORK_GROUP_SIZE 工作正常,但我似乎无法在 Android 上执行等效操作,当我尝试类似的操作时得到 OpenGL error: InvalidEnum

OpenTK 代码:

int[] work_grp_cnt = new int[3];
GL.GetInteger(All.MaxComputeWorkGroupCount, work_grp_cnt);

与原生 Android API 相同:

int[] work_grp_cnt = new int[3];
IntBuffer maxCount = IntBuffer.Allocate(3);
GLES20.GlGetIntegerv(GLES31.GlMaxComputeWorkGroupCount, maxCount);
maxCount.Get(work_grp_cnt);

(在这两种情况下 GLGetInteger 都会引发相同的 InvalidEnum 错误) OpenGL ES 3.1 可以做到这一点吗?
我使用的是索尼 Xperia Z5

【问题讨论】:

    标签: android opengl-es compute-shader


    【解决方案1】:

    正如@NicolBoas 指出的那样,我调用了错误的函数。这是工作代码:

    OpenTK:

            GL.GetInteger(All.MaxComputeWorkGroupCount, 0, out work_grp_cnt[0]);
            GL.GetInteger(All.MaxComputeWorkGroupCount, 1, out work_grp_cnt[1]);
            GL.GetInteger(All.MaxComputeWorkGroupCount, 2, out work_grp_cnt[2]);
    
            GL.GetInteger(All.MaxComputeWorkGroupSize, 0, out work_grp_size[0]);
            GL.GetInteger(All.MaxComputeWorkGroupSize, 1, out work_grp_size[1]);
            GL.GetInteger(All.MaxComputeWorkGroupSize, 2, out work_grp_size[2]);
    

    原生安卓:

            GLES31.GlGetIntegeri_v(GLES31.GlMaxComputeWorkGroupCount, 0, work_grp_cnt, 0);
            GLES31.GlGetIntegeri_v(GLES31.GlMaxComputeWorkGroupCount, 1, work_grp_cnt, 1);
            GLES31.GlGetIntegeri_v(GLES31.GlMaxComputeWorkGroupCount, 2, work_grp_cnt, 2);
    
            GLES31.GlGetIntegeri_v(GLES31.GlMaxComputeWorkGroupSize, 0, work_grp_size, 0);
            GLES31.GlGetIntegeri_v(GLES31.GlMaxComputeWorkGroupSize, 1, work_grp_size, 1);
            GLES31.GlGetIntegeri_v(GLES31.GlMaxComputeWorkGroupSize, 2, work_grp_size, 2);
    

    【讨论】:

      【解决方案2】:

      在 C 中,您必须调用 glGetIntegeri_v,它需要一个索引。对于GL_MAX_COMPUTE_WORK_GROUP_COUNT,索引就是要查询的维度。它一次只返回一个值。

      您需要找到并使用此函数的 Java 等效项。

      【讨论】:

      • 我已经添加了我的函数的 Java 等效项,它的错误相同。错误也出现在 OpenGL 方面,这让我觉得我调用了错误的 API,而不是你建议的我的语法错误。
      • 这不是同一个功能。 “i_”部分很重要。
      • 谢谢,你是对的。我发布了工作代码作为另一个答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多