2016-08-17 116 views
0

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

回答

1

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

您将需要找到并使用此功能的Java等价物。

+0

我已经添加了相当于Java我的功能,其同样的错误。另外,错误出现在OpenGL端,这让我认为我调用了错误的API,而不是像我们所说的那样,我的语法错了。 – sydd

+0

这不一样的功能。 “i_”部分很重要。 –

+0

谢谢,你说得对。我发布了工作代码作为另一个答案。 – sydd

2

由于@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);