获取计算着色器的最大工作组大小?
Get maximum workgroup size for compute shaders?
我正在编写一个 OpenGL ES 3.1 程序,想知道我 运行 使用的设备的最大工作组大小(它的 运行 在 Android 6 上)。
对于 PC 查询 GL_MAX_COMPUTE_WORK_GROUP_COUNT
和 GL_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);
我正在编写一个 OpenGL ES 3.1 程序,想知道我 运行 使用的设备的最大工作组大小(它的 运行 在 Android 6 上)。
对于 PC 查询 GL_MAX_COMPUTE_WORK_GROUP_COUNT
和 GL_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);