2016-04-06 28 views
1

GLSurfaceViewは独自のEGLContextで構築されます。 GLSurfaceViews複数の同じコンテキストを使用して同じテクスチャにアクセスすると、(hereのように)すべてのGPUで機能しないようです。Android:別々のEGLコンテキストでGLSurfaceViews間のテクスチャを共有

質問GL_TEXTURE_EXTERNAL_OESのテクスチャを複数のGLSurfaceViewsのデフォルトの別々のコンテキストで共有する方法があるかどうかです。デフォルトでは、GL_TEXTURE_EXTERNAL_OESを作成するスレッドのみがテクスチャにアクセスできますが、別のEGLコンテキストの他のスレッドにこのテクスチャを読み込ませ、別のGLSurfaceViewsにレンダリングさせる方法を探しています。

ガイダンスをいただければ幸いです。ありがとうございました。

答えて

1

複数のGLSurfaceView間でコンテキストを共有することはできません。これは、APIがそうしないためです。あなたはそれを固めようとすることができますが、それは不愉快な方法で壊れそうです。これを処理する最善の方法は、プレーンなSurfaceViewを使用することです。

GLSurfaceViewは、SurfaceViewであり、スレッドとEGLコンテキストを管理するいくつかのヘルパーコードがあることに注意してください。あなたがその部分を書くのを気にしないならば(またはそれを卸売りをGrafikaの外に持ち上げる)、SurfaceViewで作業するほうがはるかに便利です。

質問の他の部分では、EGLコンテキスト全体で外部テクスチャを共有することは可能ですが、それは危険です。 Grafikaの "show + capture camera"アクティビティは、MediaCodec用に作成された第2のコンテキストとGLSurfaceViewコンテキストを共有し、両方からテクスチャにアクセスします。残念ながら、これは間違って行い、競合状態に陥ります。 A bug reportは問題と推奨される解決方法を説明し、EGL/GLESドキュメントへのリンクを持ち、別々のスレッド上の複数のコンテキストがテクスチャを共有するときの動作を指定します。

FWIWでは、問題のアクティビティがうまくいきませんでしたので、共有に関する根本的な問題はないと思います。あなたは障壁を正しくしなければなりません。しかし、単一のコンテキストで作業する方がはるかに簡単です。

+0

恐ろしい、おかげです!私は最初に 'GLSurfaceViews'を使用しようとしていましたが、コードは本当に面倒でした。なぜなら、このためのAPIサポートが組み込まれていないからです。私は通常の 'SurfaceView'アプローチを進めます。ちなみに、何か似たようなことをしている(つまり、orindary SurfaceViewでEGLContextを作成する)オープンソースプロジェクトは何ですか? Grafikaが提供する最も似ているのは、https://github.com/google/grafika/blob/master/src/com/android/grafika/HardwareScalerActivity.java – Michael

+0

です。Grafikaには、GLESを使用してSurfaceViewにレンダリングする複数のアクティビティがあります。 com.android.grafika.glesパッケージ全体を単に持ち上げることをお勧めします。あなたが外部のテクスチャを使って作業しているなら、おそらく他のビットのいくつかが欲しいでしょう。 「カメラからのテクスチャ」と「レコードGLアプリ」は別の例です。 – fadden

関連する問題