web-dev-qa-db-ja.com

eglMakeCurrent()がEGL_BAD_MATCHで失敗するのはなぜですか?

Android opengl/eglを使用して開発しています。私のアプリでは、2番目のスレッドからテクスチャを読み込むために2番目のコンテキストが必要です。

私のコードはAndroid 2.3で正常に動作しますが、4.0.3 Androidデバイスまたはエミュレータでコードを試すと、eglMakeCurrent()がEGL_BAD_MATCHで失敗します。

2番目のコンテキストとそのピクセルバッファーの初期化もすべて正常に機能するため、このエラーの検索をどこから始めればよいかわかりません。

これは初期化コードです:

ANativeWindow *window = (ANativeWindow*)displaySurface;

EGLint dummy, format;

display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

eglInitialize(display, 0, 0);

EGLint contextAttribs[] =
{
    EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE
};

const EGLint configAttribs[] =
{
    EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
    EGL_BLUE_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_RED_SIZE, 8,
    EGL_ALPHA_SIZE, 8,
    EGL_BUFFER_SIZE, 32,
    EGL_DEPTH_SIZE, 24,
    EGL_NONE
};

EGLint numConfigs;
EGLConfig config;

eglChooseConfig(display, configAttribs, &config, 1, &numConfigs);
eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
ANativeWindow_setBuffersGeometry(window, 0, 0, format);

surface = eglCreateWindowSurface(display, config, window, NULL);
if(surface == NULL)
    Trace("error creating window surface: " + GetEglError());

context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
if(context == NULL)
    Trace("error creating main context: " + GetEglError());

const EGLint auxConfigAttribs[] =
{
    EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
    EGL_BLUE_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_RED_SIZE, 8,
    EGL_ALPHA_SIZE, 8,
    EGL_DEPTH_SIZE, 0,
    EGL_STENCIL_SIZE, 0,
    EGL_NONE
};

EGLint pbufferAttribs[] =
{
    EGL_WIDTH, 1,
    EGL_HEIGHT, 1,
    EGL_TEXTURE_TARGET, EGL_NO_TEXTURE,
    EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE,
    EGL_NONE
};

EGLint auxNumConfigs;
EGLConfig auxConfig;

eglChooseConfig(display, auxConfigAttribs, &auxConfig, 1, &auxNumConfigs);

auxSurface = eglCreatePbufferSurface(display, auxConfig, pbufferAttribs);
if(auxSurface == NULL)
    Trace("error creating pbuffer surface: " + GetEglError());

auxContext = eglCreateContext(display, auxConfig, context, contextAttribs);
if(auxSurface == NULL)
    Trace("error creating auxilliary context: " + GetEglError());

if(!eglMakeCurrent(display, surface, surface, context))
    Trace("could not make main context current: " + GetEglError());

私のAndroid 2.3デバイス(HTC Desire))では、上記の初期化コードは完全に機能し、auxContextを現在にして、テクスチャを正常にロードできます。

しかし、my Android 4.0.3 device(Samsung Nexus S)およびmy Android 4.1 device(Galaxy Note 2))では、eglMakeCurrent()は、EGL_BAD_MATCHで失敗します。初期化に成功しました。

このエラーが発生する理由を誰かが知っていますか?

19
CuriousGeorge

ああ、私が実際に知っていること。 ;)[5年間の大部分をさまざまなEGL実装に取り​​組んできました]。

あなたのsurfaceは実際の表示面とは異なるフォーマットだと思います。違いが何であるか、または何を変更する必要があるのか​​正確にはわかりません。 EGL_DEPTH_SIZEでしょうか?使用可能なモードを列挙して、「可能性が高い」と思われるものがないか確認してください。私は知っています、それは少し苦痛ですが、私は過去に何度かそれを行ったことがあります-通常、EGLソースコードを調べて、自分が間違ったことを理解できるという違いがあります... ;)

11
Mats Petersson

このエラーが発生してもこの表面やテクスチャに関するものを処理できない場合は、実行して.Android go to AVDと入力し、現在のエミュレータが通常.imgファイルにあるユーザー日付ファイルを削除してから、エミュレータを再起動してテストします。これは私にとっては機能しますが、デバイスでのテスト中に発生した場合は、データを消去してアプリを再起動します。これが役に立ったと思っている人たちに乾杯。

5
ralphgabb