3

I'm implementing my own EGLConfigChooser to pass to setEGLConfigChooser() in order to select the best available configuration for the current device according to the needs I have for the application.

To be more specific I'm querying all the available configurations and selecting the one with the biggest depth buffer size (and between those with the same depth buffer size I want the one with the biggest colour depth), wall of code follows:

 @Override
 public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display)
 {
  //Querying number of configurations
  int[] num_conf = new int[1];
  egl.eglGetConfigs(display, null, 0, num_conf);  //if configuration array is null it still returns the number of configurations
  int configurations = num_conf[0];

  //Querying actual configurations
  EGLConfig[] conf = new EGLConfig[configurations];
  egl.eglGetConfigs(display, conf, configurations, num_conf);

  EGLConfig result = null;

  for(int i = 0; i < configurations; i++)
  {
   Log.v("EGLConfigChooser", "Configuration #" + i );
   print(egl, display, conf[i]);
   result = better(result, conf[i], egl, display);
  }

  Log.v("EGLConfigChooser", "Chosen EGLConfig:");
  print(egl, display, result);

  return result;
 }

 /**
  * Returns the best of the two EGLConfig passed according to depth and colours
  * @param a The first candidate
  * @param b The second candidate
  * @return The chosen candidate
  */
 private EGLConfig better(EGLConfig a, EGLConfig b, EGL10 egl, EGLDisplay display)
 {
  if(a == null) return b;

  EGLConfig result = null;

  int[] value = new int[1];

  egl.eglGetConfigAttrib(display, a, EGL10.EGL_DEPTH_SIZE, value);
  int depthA = value[0];

  egl.eglGetConfigAttrib(display, b, EGL10.EGL_DEPTH_SIZE, value);
  int depthB = value[0];

  if(depthA > depthB)
   result = a;
  else if(depthA < depthB)
   result = b;
  else //if depthA == depthB
  {
   egl.eglGetConfigAttrib(display, a, EGL10.EGL_RED_SIZE, value);
   int redA = value[0];

   egl.eglGetConfigAttrib(display, b, EGL10.EGL_RED_SIZE, value);
   int redB = value[0];

   if(redA > redB)
    result = a;
   else if(redA < redB)
    result = b;
   else //if redA == redB
   {
    //Don't care
    result = a;
   }
  }

  return result;
 }

(The print method prints EGLConfig values to the Logger)

Now, it appears to work fine, it selects the following configuration:

01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): Chosen EGLConfig:
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_RED_SIZE  = 8
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_BLUE_SIZE  = 8
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_GREEN_SIZE  = 8
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_ALPHA_SIZE  = 8
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_DEPTH_SIZE  = 24
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_ALPHA_FORMAT  = 24
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_ALPHA_MASK_SIZE  = 0
01-30 18:57:04.424: VERBOSE/EGLConfigChooser(1093): EGL_STENCIL_SIZE  = 8

The problem is that when this configuration is used the phone screen turns green with purple artifacts (the scene is supposed to be black with a wooden table), it completely hangs and stops responding to any kind of input, all I can do is to terminate my process via the debugger and when I do so the device reboots(?!!).

How come that eglGetConfigs is returning a configuration which causes this kind of issues? Has anyone of you experienced something similar or can find some kind of flaw in my code? I double checked it but it looks ok to me (it has been inspired by http://brandnewreality.com/blog/android-egl-querying-your-gl-driver )

Thanks for your help.

capitano666
  • 656
  • 1
  • 9
  • 24
  • Link for print() method is broken. Here it is from the wayback machine: https://web.archive.org/web/20111230060315/http://brandnewreality.com/blog/android-egl-querying-your-gl-driver – kurtzmarc Aug 16 '16 at 14:18

1 Answers1

14

Try adding:

getHolder( ).setFormat( PixelFormat.RGBA_8888 );

To your surfaces constructor, after setting the GL config chooser. Basically I was getting a crash when selecting format 8,8,8,0,0,0 (R8, G8, B8, A0, Z0, Stencil0) until I added that line...

Steve

Steven Craft
  • 156
  • 1
  • 3