2016-04-06 27 views
1

Her GLSurfaceView, her bir EGLContext ile üretilmiştir. Aynı dokuya erişim sağlamak için birden fazla GLSurfaceViews aynı bağlamı kullanarak tüm GPU'larda (here gösterildiği gibi) çalışmaz gibi görünüyor.Android: Ayrı EGL İçeriğinde GLSurfaceViews Arasındaki Dokuları Paylaşın

Sorum şu ki, GL_TEXTURE_EXTERNAL_OES dokusunu birden çok GLSurfaceViews numaralı belgede varsayılan, ayrı bağlamlarla paylaşmanın bir yolu olup olmadığını soruyor. Varsayılan olarak, yalnızca GL_TEXTURE_EXTERNAL_OES'u oluşturan iş parçacığı, dokuya erişebilirdi, ancak diğer dokuların ayrı EGL bağlamlarında bu dokudan okunmasına ve daha sonra ayrı ayrı GLSurfaceViews'a işlemesine izin vermenin bir yolunu arıyorum.

Herhangi bir rehberlik takdir edilecektir. Teşekkür ederim.

cevap

1

Birden çok GLSurfaceViews arasındaki bağlamları paylaşamazsınız, çünkü API bunu yapmanın bir yolunu sağlamamaktadır. Onu çekmeye çalışabilirsin, ama bu çok hoş olmayan şekillerde kırılabilir. Bunu işlemenin en iyi yolu düz bir SurfaceView kullanmaktır.

Bir GLSurfaceView öğesinin, iş parçacığı ve EGL bağlamlarını yöneten bazı yardımcı kodlarla yalnızca bir SurfaceView olduğunu unutmayın. Bu kısmı yazmayı bırakmazsanız (veya sadece Grafika'dan toptan çıkarmadan) SurfaceView ile çalışmak çok daha uygun olabilir.

Sorunun diğer kısmına göre, EGL bağlamlarında harici bir doku paylaşmak mümkündür, ancak risklidir. Grafika'nın "show + capture camera" etkinliği, MediaCodec için oluşturulmuş ikinci bir içerikle GLSurfaceView içeriğini paylaşıyor ve her iki dokudan da dokuya erişiyor. Maalesef, bu yanlış bir yarış koşuluna yol açıyor. A bug report sorunu ve önerilen bir çözümü açıklar ve ayrı iş parçacıklarındaki birden çok bağlam bir doku paylaştığında davranışı belirleyen EGL/GLES belgelerine bağlantılar içerir.

FWIW, söz konusu Etkinliğin basitçe çalışmadığı bir GPU görmedim, bu yüzden paylaşımda temel bir sorun olduğunu düşünmüyorum. Sadece engelleri doğru bir şekilde yapmak zorundasınız. Yine de tek bir bağlamla çalışmak çok daha kolay.

+0

Harika, teşekkürler Fadden! İlk kez 'GLSurfaceViews' kullanmayı denedim, ancak bu kodun yerleşik bir API desteği olmadığı için kod gerçekten dağınıktı. Sıradan 'SurfaceView' yaklaşımı ile devam edeceğim. Bu arada, benzer bir şey yapan herhangi bir açık kaynaklı projeden (yani, bir SurfaceView ile bir EGLContext oluşturmaktan) haberdar mısınız? En benzer Grafika'nın sunduğu yer https://github.com/google/grafika/blob/master/src/com/android/grafika/HardwareScalerActivity.java – Michael

+0

Grafika'nın, SurfaceView'e GLES ile işleyen çok sayıda etkinliği vardır. Tüm com.android.grafika.gles paketini kaldırmanızı öneririm; Dış dokular ile çalışıyorsanız, muhtemelen diğer bitlerin bir kısmını da isteyeceksiniz. "kameradan doku" ve "GL uygulamasını kaydet" diğer örneklerdir. – fadden

İlgili konular