2014-12-17 28 views
5

Android NDK'da hızlı OpenGL ES 2.0 doku piksel erişimi elde etmek için, eglCreateImageKHR() uzantısını kullanmak istiyorum. EGL_NATIVE_BUFFER_ANDROIDdocs göre ANativeWindow_Buffer öğesinden ANativeWindowBuffer alma

:

Eklenti, EGLImage kaynağı olarak bir robot cam tamponu (yapı ANativeWindowBuffer) kullanılmasını sağlar.

ANativeWindowBufferGraphicBuffer gibi doğal çerçeve sınıfları tarafından kullanılan bir iç struct olup. Maalesef, NDK'dayım çünkü bu sınıflara doğrudan erişimim yok.

NDK native_window arabirimi, bir Java Surface nesnesini NDK'ya geçirmeme izin veriyor. Daha sonra ANativeWindow* tutamacını almak için ANativeWindow_fromSurface()'u kullanabilirim. Bu işaretçi ile ANativeWindow_Buffer türünü doldurmak için ANativeWindow_lock()'u arayabilirim (Not _).

Bu &ANativeWindow_Buffer nesnesini eglCreateImageKHR() ile kullanmayı denerseniz, EGL_BAD_NATIVE_WINDOW ile başarısız olur.

Sorum şu: Nasıl ANativeWindow_Buffer veya ANativeWindow* bir ANativeWindowBuffer nasıl alternatif eglCreateImageKHR() veya ANativeWindow_Buffer kullanabilirsiniz.

cevap

2

Bu yoldan aşağı inerken anladığım kadarıyla, ANativeWindow_Buffer ve ANativeWindowBuffer tamamen farklı türlerdir. Eh, biraz benzerler, ama kesinlikle birbirinden çok farklı olarak kullanılamazlar.

Onların ortak bir kaç alanları (width sahip olduğunu göreceksiniz, height, stride, format). Büyük fark, ANativeWindow_Buffer'un gerçek verilere bir işaretçi içermesidir; ANativeWindowBuffer ise buffer_handle_t türünde opak bir tutamacı içerir.

ANativeWindow_Buffer'u nasıl alacağınızı öğrendiyseniz ve bir ANativeWindowBuffer yolunda olduğunuzu umuyorsanız, muhtemelen ... siz değilsiniz. En azından bu benim sonucumdu. Bence çok benzer isimler sadece bir alay.

NDK kodundan ANativeWindowBuffer oluşturmanın bir yolunu bulamadım. En azından desteklenen API'ları kullanarak, bunun mümkün olmadığına inanıyorum. Araştırmam KitKat ile yapıldı.

+0

Gerçekten de, "ANativeWindow_Buffer" yapısı yalnızca, orada iade edilmesi gereken alanları kapsüllemek için kamu API'sında kullanılır ve arayan tarafından ayrılır, böylece yapının adresi gerçek nesneler hakkında hiçbir şey söylemez arkasında. Bunların birbiriyle nasıl ilişkilendiğine ilişkin bir örnek için https: //android.googlesource adresindeki 'Surface :: lock' yöntemine bakın.com/platform/frameworks/native/+/033f7e8e/libs/gui/Surface.cpp (satırlar 792-884, özellikle satırlar 876-880). – mstorsjo

İlgili konular