2016-04-06 5 views
1

Jeder ist mit einem eigenen EGLContext konstruiert. Die Verwendung desselben Kontexts über mehrere GLSurfaceViews hinweg, um Zugriff auf die gleichen Texturen zu haben, scheint nicht auf allen GPUs zu funktionieren (wie gezeigt here).Android: Eine Textur zwischen GLSurfaceViews in separaten EGL-Kontexten freigeben

Meine Frage ist, ob es eine Möglichkeit gibt, eine GL_TEXTURE_EXTERNAL_OES Textur über mehrere GLSurfaceViews mit ihren Standardkontexten zu teilen. Standardmäßig ist nur der Thread, der die GL_TEXTURE_EXTERNAL_OES erstellt, in der Lage, auf die Textur zuzugreifen, aber ich suche nach einer Möglichkeit, die anderen Threads in separaten EGL-Kontexten aus dieser Textur lesen zu lassen und sie dann in ihre separate GLSurfaceViews zu rendern.

Jede Anleitung wäre willkommen. Vielen Dank.

Antwort

1

Sie können keine Kontexte zwischen mehreren GLSurfaceViews freigeben, da die API keine Möglichkeit bietet, dies zu tun. Sie können versuchen, es zu klauen, aber das wird wahrscheinlich auf unangenehme Weise brechen. Der beste Weg, dies zu umgehen, ist ein einfaches SurfaceView.

Bedenken Sie, dass ein GLSurfaceView nur ein SurfaceView mit einem Hilfscode ist, der Threading- und EGL-Kontexte verwaltet. Wenn es Ihnen nichts ausmacht, diesen Teil zu schreiben (oder ihn einfach aus Grafika herauszunehmen), kann es viel bequemer sein, mit SurfaceView zu arbeiten.

Zum anderen Teil Ihrer Frage ist es möglich, eine externe Textur über EGL-Kontexte zu teilen, aber es ist riskant. Grafika's "show + capture camera" -Aktivität teilt einen GLSurfaceView-Kontext mit einem zweiten Kontext, der für MediaCodec erstellt wurde, und greift von beiden auf die Textur zu. Leider tut es das falsch, was zu einer Wettlaufsituation führt. A bug report erläutert das Problem und eine vorgeschlagene Lösung und enthält Verknüpfungen zu den EGL/GLES-Dokumenten, die das Verhalten angeben, wenn mehrere Kontexte in separaten Threads eine Textur gemeinsam nutzen.

FWIW, ich habe keine GPU gesehen, wo die betreffende Aktivität einfach nicht funktioniert hat, also glaube ich nicht, dass es ein grundlegendes Problem beim Teilen gibt. Sie müssen nur die Barrieren richtig machen. Es ist jedoch viel einfacher, mit einem einzigen Kontext zu arbeiten.

+0

Super, danke Fadden! Ich habe zuerst versucht, 'GLSurfaceViews' zu verwenden, aber der Code war wirklich unordentlich, da es keine integrierte API-Unterstützung dafür gibt. Ich werde mit dem üblichen "SurfaceView" -Ansatz fortfahren. Übrigens, kennen Sie Open-Source-Projekte, die etwas ähnliches tun (z. B. einen EGLC-Text mit einem ordenartigen SurfaceView erstellen)? Das ähnlichste, was Grafika zu bieten scheint, ist https://github.com/google/grafika/blob/master/src/com/android/grafika/HardwareScalerActivity.java – Michael

+0

Grafika verfügt über mehrere Aktivitäten, die auf SurfaceView mit GLES gerendert werden. Ich würde empfehlen, nur das gesamte com.android.grafika.gles Paket anzuheben; Wenn Sie mit externen Texturen arbeiten, werden Sie wahrscheinlich auch einige der anderen Bits haben wollen. "Textur von Kamera" und "Record GL App" sind weitere Beispiele. – fadden

Verwandte Themen