EGLConfig на HTC Desire, в доступной конфигурации зависает устройство - PullRequest
3 голосов
/ 30 января 2011

Я реализую свой собственный EGLConfigChooser для перехода на setEGLConfigChooser(), чтобы выбрать наилучшую доступную конфигурацию для текущего устройства в соответствии с потребностями, которые у меня есть для приложения.

Чтобы быть более точным, я запрашиваю все доступные конфигурации и выбираю ту, которая имеет самый большой размер буфера глубины (и между теми, у которых тот же самый размер буфера глубины, я хочу ту, которая имеет самую большую глубину цвета), следует стена кода :

 @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;
 }

(Метод печати печатает значения EGLConfig в Logger)

Теперь, похоже, он работает нормально, он выбирает следующую конфигурацию:

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

Проблема в том, что при использовании этой конфигурации экран телефона становится зеленым с фиолетовыми артефактами (сцена должна быть черной с деревянным столом), он полностью зависает и перестает отвечать на любые входные данные, все, что я могу сделать завершить мой процесс через отладчик, и когда я это сделаю, устройство перезагрузится (? !!).

Почему eglGetConfigs возвращает конфигурацию, которая вызывает такие проблемы? Кто-нибудь из вас испытывал нечто подобное или может найти какой-то недостаток в моем коде? Я дважды проверил это, но это выглядит нормально для меня (это было вдохновлено http://brandnewreality.com/blog/android-egl-querying-your-gl-driver)

Спасибо за вашу помощь.

1 Ответ

14 голосов
/ 09 марта 2011

Попробуйте добавить:

getHolder () .setFormat (PixelFormat.RGBA_8888);

Для вашего конструктора поверхностей после настройки GL config config chooser.В основном я получал сбой при выборе формата 8,8,8,0,0,0 (R8, G8, B8, A0, Z0, Stencil0), пока не добавил эту строку ...

Стив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...