後藤 浩昭(GORRY)です。
ソースを読んだ結果での推測です。間違いあればご指摘を。
EGL10#eglMakeCurrent()は、最終的にはframework/base/opengl/libagl/egl.cppの
makeCurrent()を実行します。
> static int makeCurrent(ogles_context_t* gl)
> {
> ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
> if (gl) {
> egl_context_t* c = egl_context_t::context(gl);
> if (c->flags & egl_context_t::IS_CURRENT) {
> if (current != gl) {
> // it is an error to set a context current, if it's already
> // current to another thread
> return -1;
> }
「指定したGLコンテキストを他のスレッドが所有している(Currentに
している)場合はエラー」ということになります。
通常、このGLコンテキストはGLSurfaceView内のGLThreadクラスを
実行しているスレッドが所有していて手放すことはないため、
他のスレッドがこのGLコンテキストを所有することはできないと
いうことになります。
他スレッドからGLコンテキストを使った処理を行いたい場合、
その処理をGLSurfaceView#queueEvent()で登録して、GLThreadの
スレッドにあとで実行してもらうという方法をとることになります。
In message <
cc34282a-02d3-4b8f...@to5g2000pbc.googlegroups.com>
"[android-group-japan: 18024] OpenGL ES 2.0のマルチスレッドの扱い"
--
Hiroaki GOTO as "GORRY" : 後藤 浩昭
EMAIL:
gorr...@gmail.com