2016-08-17 6 views
0

Ich schreibe ein OpenGL ES 3.1-Programm und möchte die maximale Größe der Arbeitsgruppe für das Gerät kennen, auf dem ich laufe (es läuft auf Android 6).Erhalten Sie maximale Arbeitsgruppengröße für Compute Shader?

Für PC-Abfrage GL_MAX_COMPUTE_WORK_GROUP_COUNT und GL_MAX_COMPUTE_WORK_GROUP_SIZE funktioniert gut, aber ich kann das Äquivalent für auf Android zu tun scheinen, ich OpenGL error: InvalidEnum, wenn ich etwas versuchen, wie

OpenTK Code:

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

Same mit nativer Android APIs:

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

(in beiden Fällen ist die GLGetInteger hebt den gleichen InvalidEnum Fehler) Ist das mit OpenGL ES 3.1 möglich?
Ich benutze ein Sony Xperia Z5

Antwort

1

In C müssen Sie glGetIntegeri_v aufrufen, die einen Index dauert. Für GL_MAX_COMPUTE_WORK_GROUP_COUNT ist der Index die Dimension, die Sie abfragen möchten. Es gibt immer nur einen Wert zurück.

Sie müssen das Java-Äquivalent dieser Funktion finden und verwenden.

+0

ich die Java-Äquivalent von meiner Funktion hinzugefügt haben, ihr die gleichen Fehler. Auch der Fehler ist auf der OpenGL-Seite, was mich denken lässt, dass ich die falsche API anrufe, nicht dass meine Syntax falsch ist, wie Sie vorgeschlagen haben. – sydd

+0

Das ist nicht die gleiche Funktion. Der "i_" -Teil ist wichtig. –

+0

Danke, du hast Recht. Ich habe den Arbeitscode als eine andere Antwort veröffentlicht. – sydd

2

Wie @NicolBoas darauf hingewiesen habe ich die falsche Funktion aufgerufen. Heres der Arbeitscode:

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

india 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); 
Verwandte Themen