2011-01-30 10 views
3

EGLConfigChooserをに渡して実装していますので、アプリケーションのニーズに応じて現在のデバイスに最適な設定を選択できます。HTC DesireのEGLConfigでデバイスをハングアップする

より具体的には、使用可能なすべての設定を照会して、最も深いバッファサイズ(最も深いバッファサイズを持つものと最大の色深度を持つものの間)と、壁のコード次の:

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 

@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値)今

、それが正常に動作するように見える、それは次のような構成を選択し、

この設定を使用すると、電話画面が紫色のアーティファクトで緑色に変わり(シーンは木製のテーブルで黒く見えます)、完全にハングしてあらゆる種類の入力に応答しなくなります。デバッガ経由で私のプロセスを終了し、そうするとデバイスが再起動します(?!!)。

どうすればこのような問題の原因となる設定を返すのですか。eglGetConfigsあなたの誰かが何か似たような経験をしていますか、私のコードに何らかの欠陥がありますか?私はそれを二重にチェックしましたが、それは私には大丈夫です(それはhttp://brandnewreality.com/blog/android-egl-querying-your-gl-driverに触発されています)

ありがとうございます。追加

+0

リンクprint()メソッドが壊れています。ここはウェイバックマシンからです:https://web.archive.org/web/20111230060315/http://brandnewreality.com/blog/android-egl-querying-your-gl-driver – kurtzmarc

答えて

14

試行:

getHolder().setFormat(PixelFormat.RGBA_8888)。

GLコンフィグレータを設定した後にサーフェスコンストラクタに渡します。私はその行を追加するまで、フォーマット8,8,8,0,0,0(R8、G8、B8、A0、Z0、Stencil0)を選択する際に基本的に私は...

をクラッシュを得ていたスティーブ・

+0

ありがとう、それは解決します私の問題。私はあなたの答えを投票することができますが、私はまだ十分な評判がない:( – capitano666

関連する問題