获取计算着色器的最大工作组大小?

Get maximum workgroup size for compute shaders?

我正在编写一个 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

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

您需要找到并使用此函数的 Java 等价物。

正如@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]);

原生 Android:

        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);