1. ホーム
  2. android

[解決済み] なぜeglMakeCurrent()はEGL_BAD_MATCHで失敗するのでしょうか?

2022-02-10 01:51:15

質問

opengl/eglを使用してAndroid向けに開発しています。私のアプリは、2番目のスレッドからテクスチャをロードするための2番目のコンテキストを必要とします。

私のコードはアンドロイド2.3では問題なく動作しますが、4.0.3のアンドロイドデバイスまたはエミュレータでコードを試すと、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 device(HTC Desire)では、上記の初期化コードは完全に動作し、AuxContextをcurrentにして、テクスチャをうまくロードすることができました。

しかし、私のアンドロイド4.0.3デバイス(Samsung Nexus S)とアンドロイド4.1デバイス(Galaxy Note 2)では、初期化に成功した後、EGL_BAD_MATCHでeglMakeCurrent()は失敗しました。

なぜこのようなエラーが発生するのか、ご存知の方はいらっしゃいますか?

解決方法を教えてください。

ああ、私が実際に知っていることだ ;) [様々なEGLの実装に5年の大半を費やしてきたのですから]。

あなたの surface は、実際の表示面とは異なる形式です。何が違うのか、何を変更する必要があるのか、正確にはわかりません。EGL_DEPTH_SIZEでしょうか?利用可能なモードを列挙して、どれかが"可能性がありそうであるかどうかを確認することができます。私はそれが少し苦痛であることを知っているが、私は過去に数回それをやったことがある - 私は通常、EGLのソースコードに目を通し、私が間違って何をしたかを理解することができるという違いで... ;) 。