2012-06-13 11 views
8

Sto cercando di ottenere il limite massimo di dimensioni texture in Android per OpenGL 2.0. Ma ho scoperto che la prossima istruzione funziona solo se sono attualmente nel contesto OpenGL, in altre parole devo avere una GL Surface e un GL Renderer, ecc., Che non voglio.Ottieni il limite massimo di dimensioni texture OpenGL ES 2.0 in Android

int[] maxTextureSize = new int[1]; 
GLES20.glGetIntegerv(GLES20.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0); 

Così sono venuto con la prossima algoritmo, che mi dà la dimensione massima della texture senza dover creare qualsiasi superficie o renderer. Funziona correttamente, quindi la mia domanda è se questo funzionerà con tutti i dispositivi Android, e se qualcuno può individuare eventuali bug, nel caso in cui.

public int getMaximumTextureSize() 
{ 
    EGL10 egl = (EGL10)EGLContext.getEGL(); 
    EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); 

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

    // Query total number of configurations 
    int[] totalConfigurations = new int[1]; 
    egl.eglGetConfigs(display, null, 0, totalConfigurations); 

    // Query actual list configurations 
    EGLConfig[] configurationsList = new EGLConfig[totalConfigurations[0]]; 
    egl.eglGetConfigs(display, configurationsList, totalConfigurations[0], totalConfigurations); 

    int[] textureSize = new int[1]; 
    int maximumTextureSize = 0; 

    // Iterate through all the configurations to located the maximum texture size 
    for (int i = 0; i < totalConfigurations[0]; i++) 
    { 
     // Only need to check for width since opengl textures are always squared 
     egl.eglGetConfigAttrib(display, configurationsList[i], EGL10.EGL_MAX_PBUFFER_WIDTH, textureSize); 

     // Keep track of the maximum texture size 
     if (maximumTextureSize < textureSize[0]) 
     { 
      maximumTextureSize = textureSize[0]; 
     } 

     Log.i("GLHelper", Integer.toString(textureSize[0])); 
    } 

    // Release 
    egl.eglTerminate(display); 
    Log.i("GLHelper", "Maximum GL texture size: " + Integer.toString(maximumTextureSize)); 

    return maximumTextureSize; 

} 
+1

Sei sicuro che la dimensione della trama GL sia associata alla dimensione del pbuffer EGL? Questo è contenuto nella specifica EGL 1.0 da qualche parte? –

risposta

6

La dimensione massima di PBUFFER non è purtroppo correlata alla dimensione massima della trama (ma potrebbe essere la stessa).

Credo che il modo migliore per ottenere la dimensione massima della trama sia creare il contesto GL (nello stesso contesto in cui si utilizzano effettivamente queste trame) e chiedere GL_MAX_TEXTURE_SIZE.

C'è una forte ragione alla base di ciò: il driver ogl non è inizializzato per il processo corrente prima della creazione della superficie (e del contesto). Alcuni driver eseguono il rilevamento HW/SKU sottostante all'inizializzazione e calcolano le dimensioni massime della superficie in base alle capacità HW.

Inoltre, la dimensione massima della trama può variare in base al contesto (e il contesto EGLConfig è stato creato in).

E ancora una cosa: eglGetConfigs ti porterà tutti EGLconfigs, anche questi da impostazione predefinita, il software renderer Android, o theese dal driver OpenGL ES 1.1CM HW (se ci sono driver separati per 1.1 e 2.0 sulla piattaforma di destinazione). I driver sono una specie di stack grafico indipendente e possono restituire valori massimi diversi.