20

opengl/egl を使用して Android 用に開発しています。私のアプリでは、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 を現在の状態にして、テクスチャを問題なくロードできます。

しかし、Android 4.0.3 デバイス (Samsung Nexus S) と Android 4.1 デバイス (Galaxy Note 2) では、初期化が成功した後、eglMakeCurrent() が EGL_BAD_MATCH で失敗します。

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

4

3 に答える 3

12

ああ、私は実際に何かを知っています。;) [5 年間の大半をさまざまな EGL 実装に費やしてきました]。

surface実際の表示面とは異なるフォーマットであると確信しています。違いが何であるか、または何を変更する必要があるかは正確にはわかりません。EGL_DEPTH_SIZE おそらく?利用可能なモードを列挙してみて、どれかが「可能性が高い」かどうかを確認してください。少し面倒ですが、過去に何度か行ったことがありますが、通常は EGL ソースコードを調べて、どこが間違っていたのかを突き止めることができました... ;)

于 2012-12-28T00:04:41.100 に答える