[解決済み] なぜeglMakeCurrent()はEGL_BAD_MATCHで失敗するのでしょうか?
質問
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のソースコードに目を通し、私が間違って何をしたかを理解することができるという違いで... ;) 。
関連
-
[解決済み】Android Intent コンストラクタを解決できない
-
[解決済み】コンテンツには、id属性が「android.R.id.list」であるListViewが必要です。
-
[解決済み】Android Studioで最新バージョンのgradleを使用する方法
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] C++で仮想関数が必要な理由とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】まだ警告が出る:設定 'compile' は時代遅れで 'implementation' に置き換わった。
-
[解決済み】Android ADB デバイスがオフラインで、コマンドを発行できない。
-
[解決済み】「ArrayAdapterはリソースIDがTextViewであることが必要」XMLの問題点
-
[解決済み】シンボル 'AppCompatActivity' を解決できない。
-
[解決済み】Android Studioです。「プロジェクトが C ドライブに作成されている場合、「タスク ':app:mergeDebugResources' の実行に失敗しました。
-
[解決済み】Android Studio 3.2 - com.android.tools.build:aapt2:3.2.0-4818971 を見つけられませんでした。
-
[解決済み】android.content.ActivityNotFoundException: 明示的なアクティビティクラスを見つけることができません。
-
[解決済み】SDKの場所がandroid studioで見つからない。
-
[解決済み】googleコンソールエラー`OR-IEH-01`について
-
[解決済み] Gradle DSL メソッドが見つかりません:'compile()'