2014-12-17 7 views
5

Per ottenere velocemente l'accesso pixel di trama OpenGL ES 2.0 su Android NDK, voglio utilizzare l'estensione eglCreateImageKHR().Ottenere un ANativeWindowBuffer da ANativeWindow_Buffer

Secondo il EGL_NATIVE_BUFFER_ANDROIDdocs:

Questa estensione consente utilizzando un buffer finestra Android (struct ANativeWindowBuffer) come fonte EGLImage.

ANativeWindowBuffer è un interno struct usato dalle classi del framework native come GraphicBuffer. Sfortunatamente, dato che sono su NDK, non ho accesso diretto a queste classi.

L'interfaccia NDK native_window mi consente di passare un oggetto Java Surface tramite NDK. Posso quindi utilizzare ANativeWindow_fromSurface() per ottenere un handle opaco ANativeWindow*. Con questo puntatore posso chiamare ANativeWindow_lock() per riempire una struttura di tipo ANativeWindow_Buffer (Nota lo _).

Se si tenta di utilizzare questo oggetto &ANativeWindow_Buffer con eglCreateImageKHR() non riesce con EGL_BAD_NATIVE_WINDOW.

La mia domanda è: come posso utilizzare ANativeWindow_Buffer con eglCreateImageKHR() o in alternativa come ottenere un ANativeWindowBuffer da ANativeWindow_Buffer o da ANativeWindow*.

risposta

2

Da quello che ho scoperto mentre percorrevo questa strada, ANativeWindow_Buffer e ANativeWindowBuffer sono tipi completamente diversi. Beh, sono in qualche modo simili, ma sicuramente così diversi da non poter essere usati in modo intercambiabile.

Se si desidera confrontare, qui sono le definizioni:

Si noterà che hanno pochi campi in comune (width, height, stride, format). La grande differenza è che ANativeWindow_Buffer contiene un puntatore ai dati effettivi, mentre ANativeWindowBuffer contiene un handle opaco di tipo buffer_handle_t.

Quindi, se hai scoperto come ottenere un ANativeWindow_Buffer, e speravi di essere sulla buona strada per un ANativeWindowBuffer, probabilmente ... non lo sei. Almeno quella fu la mia conclusione. Penso che i nomi molto simili siano solo una presa in giro.

Non ho trovato un modo per creare un ANativeWindowBuffer dal codice NDK. Almeno con l'utilizzo delle sole API supportate, credo che non sia possibile. La mia ricerca è stata con KitKat.

+0

Infatti, la struttura 'ANativeWindow_Buffer' è utilizzata solo nell'API pubblica, per incapsulare i campi che devono essere restituiti lì, ed è allocata dal chiamante, quindi l'indirizzo della struttura stessa non dice nulla sugli oggetti reali Dietro. Per un esempio su come questi si relazionano tra loro, dai un'occhiata al metodo 'Surface :: lock' in https: //android.googlesource.com/platform/frameworks/native/+/033f7e8e/libs/gui/Surface.cpp (righe 792-884, in particolare, righe 876-880). – mstorsjo