2011-06-23 17 views
7

Estoy creando una aplicación para Android para niveles de API> = 7. Una pantalla usa GLSurfaceView con OpenGL ES 2.0 a través de ndk. ¿Cómo puedo detectar si opengl 2.0 está disponible? No puedo usar android:glEsVersion="0x00020000" en mi AndroidManifest.xml porque tengo que admitir todos los teléfonos con niveles de API> = 7. Si no hay soporte para 2.0, mostraré una pantalla estática.Detecta si OpenGl ES 2.0 está disponible o no

Estoy usando un código similar de la aplicación de ejemplo hello-gl2 que viene con el ndk. En GL2JNIView, cuando establece el contexto de OpenGL, si no encuentra una configuración OpenGL apropiada (en mi caso una configuración que requiere OpenGL es 2.0) arroja un IllegalArgumentException("No configs match configSpec") y la aplicación falla. No puedo encontrar una manera de interceptar esa excepción y hacer otra cosa en esa pantalla. ¿Algunas ideas?

Respuesta

7

Esto es lo que he encontrado en los Internet:

private boolean checkGL20Support(Context context) 
{ 
    EGL10 egl = (EGL10) EGLContext.getEGL();  
    EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); 

    int[] version = new int[2]; 
    egl.eglInitialize(display, version); 

    int EGL_OPENGL_ES2_BIT = 4; 
    int[] configAttribs = 
    { 
     EGL10.EGL_RED_SIZE, 4, 
     EGL10.EGL_GREEN_SIZE, 4, 
     EGL10.EGL_BLUE_SIZE, 4, 
     EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 
     EGL10.EGL_NONE 
    }; 

    EGLConfig[] configs = new EGLConfig[10]; 
    int[] num_config = new int[1]; 
    egl.eglChooseConfig(display, configAttribs, configs, 10, num_config);  
    egl.eglTerminate(display); 
    return num_config[0] > 0; 
} 

Fuente: http://www.badlogicgames.com/wordpress/?p=343

7

Tal vez esto puede ayudar

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    // Check if the system supports OpenGL ES 2.0. 
    final ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 
    final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo(); 
    final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000; 

    if (supportsEs2) 
    { 
    // Request an OpenGL ES 2.0 compatible context. 

    } 
    else 
    { 
    // This is where you could create an OpenGL ES 1.x compatible 
    // renderer if you wanted to support both ES 1 and ES 2. 

    } 
} 
1

desde (compatibilidad del conjunto de pruebas) de la CTS Android OpenGlEsVersionTest.java:

private static int getVersionFromPackageManager(Context context) { 
    PackageManager packageManager = context.getPackageManager(); 
    FeatureInfo[] featureInfos = packageManager.getSystemAvailableFeatures(); 
    if (featureInfos != null && featureInfos.length > 0) { 
     for (FeatureInfo featureInfo : featureInfos) { 
      // Null feature name means this feature is the open gl es version feature. 
      if (featureInfo.name == null) { 
       if (featureInfo.reqGlEsVersion != FeatureInfo.GL_ES_VERSION_UNDEFINED) { 
        return getMajorVersion(featureInfo.reqGlEsVersion); 
       } else { 
        return 1; // Lack of property means OpenGL ES version 1 
       } 
      } 
     } 
    } 
    return 1; 
} 

/** @see FeatureInfo#getGlEsVersion() */ 
private static int getMajorVersion(int glEsVersion) { 
    return ((glEsVersion & 0xffff0000) >> 16); 
} 

En realidad, proporciona algunas otras formas también y la prueba verifica que todos devuelven los mismos resultados.