как проверить наличие текущего контекста OpenGL ES при использовании Android NDK?

Есть ли простой способ проверить, есть ли текущий контекст в Android NDK?

Если контекст EGL связан на java-стороне границы jni, действительна ли привязка на исходной стороне границы jni? Как насчет наоборот? Если привязка работает двунаправленно, могу ли я выдавать команды GL по своему усмотрению по обе стороны границы без дополнительной логики?

Указатели на пример кода с настройкой контекста приветствуются по обе стороны границы. Не уверен, как взаимодействие поверхности/EGL будет выглядеть на стороне JNI.

Спасибо.


person user501138    schedule 15.06.2016    source источник


Ответы (1)


Чтобы проверить, есть ли текущий контекст в нативном коде, вы можете вызвать eglGetCurrentContext():

if (eglGetCurrentContext() != EGL_NO_CONTEXT) {
    // There is a current context.
}

Да, контексты остаются текущими за пределами JNI. Поэтому, если у вас есть текущий контекст в вашем коде Java (например, управляемый GLSurfaceView), вы можете делать вызовы JNI, а затем делать вызовы OpenGL в реализации нативной функции без какого-либо специального рассмотрения. Я ответил на вопрос, связанный с этим, более подробно здесь: FrameBuffers с шаблоном GLSurfaceView в OpenGLES 1.1 на android ndk.

Нет веской причины, по которой обратное не было бы правдой. Вы должны иметь возможность создать контекст в собственном коде, сделать его текущим, и он должен оставаться актуальным в вашем Java-коде после возврата вызова JNI. Это кажется гораздо менее полезным, но если у вас есть для этого веская причина, ничто не должно вас останавливать.

Если вы действительно хотите создавать контексты в собственном коде, я разместил полный пример того, как это сделать, в ответе здесь: GLES10.glGetIntegerv возвращает 0 только в Lollipop.

ИМХО, безусловно, самый простой способ использовать собственный код с вызовами OpenGL — это использовать GLSurfaceView, позволить ему обрабатывать все создание и управление контекстом и выполнять вызовы JNI в реализации Renderer. Затем в нативном коде вы просто выполняете вызовы OpenGL, не беспокоясь об управлении контекстом.

person Reto Koradi    schedule 16.06.2016