jni_gl_environment.cpp revision a935c0d2759dc11fc60e56d0b2751e8eaa0fac74
130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni/* 230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Copyright (C) 2011 The Android Open Source Project 330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * 430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Licensed under the Apache License, Version 2.0 (the "License"); 530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * you may not use this file except in compliance with the License. 630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * You may obtain a copy of the License at 730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * 830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * http://www.apache.org/licenses/LICENSE-2.0 930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * 1030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Unless required by applicable law or agreed to in writing, software 1130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * distributed under the License is distributed on an "AS IS" BASIS, 1230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * See the License for the specific language governing permissions and 1430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * limitations under the License. 1530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni */ 1630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 1730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni#include <stdint.h> 1830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni#include <android/native_window_jni.h> 1930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 2030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni#include "jni/jni_gl_environment.h" 2130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni#include "jni/jni_util.h" 2230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 2330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni#include "native/core/gl_env.h" 2430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 2530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniusing android::filterfw::GLEnv; 2630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniusing android::filterfw::WindowHandle; 2730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 2830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniclass NativeWindowHandle : public WindowHandle { 2930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public: 3030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni NativeWindowHandle(ANativeWindow* window) : window_(window) { 3130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 3230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 3330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni virtual ~NativeWindowHandle() { 3430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 3530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 3630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni virtual void Destroy() { 3730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni LOGI("Releasing ANativeWindow!"); 3830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni ANativeWindow_release(window_); 3930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 4030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 4130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni virtual const void* InternalHandle() const { 4230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return window_; 4330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 4430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 455b9eb6d686c439545dafcc8e25e9e3747281c3deEino-Ville Talvala virtual void* InternalHandle() { 465b9eb6d686c439545dafcc8e25e9e3747281c3deEino-Ville Talvala return window_; 475b9eb6d686c439545dafcc8e25e9e3747281c3deEino-Ville Talvala } 485b9eb6d686c439545dafcc8e25e9e3747281c3deEino-Ville Talvala 4930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni private: 5030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni ANativeWindow* window_; 5130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni}; 5230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 53edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeAllocate(JNIEnv* env, jobject thiz) { 5430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return ToJBool(WrapObjectInJava(new GLEnv(), env, thiz, true)); 5530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 5630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 57edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeDeallocate(JNIEnv* env, jobject thiz) { 5830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return ToJBool(DeleteNativeObject<GLEnv>(env, thiz)); 5930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 6030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 61edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeInitWithNewContext(JNIEnv* env, 62edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvala jobject thiz) { 6330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 6430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return gl_env ? ToJBool(gl_env->InitWithNewContext()) : JNI_FALSE; 6530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 6630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 67edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeInitWithCurrentContext(JNIEnv* env, 68edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvala jobject thiz) { 6930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 7030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return gl_env ? ToJBool(gl_env->InitWithCurrentContext()) : JNI_FALSE; 7130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 7230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 733fe79927824090988e0123781bec44f8a31779f8Marius Rennjboolean Java_android_filterfw_core_GLEnvironment_nativeIsActive(JNIEnv* env, jobject thiz) { 743fe79927824090988e0123781bec44f8a31779f8Marius Renn GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 753fe79927824090988e0123781bec44f8a31779f8Marius Renn return gl_env ? ToJBool(gl_env->IsActive()) : JNI_FALSE; 763fe79927824090988e0123781bec44f8a31779f8Marius Renn} 773fe79927824090988e0123781bec44f8a31779f8Marius Renn 78a935c0d2759dc11fc60e56d0b2751e8eaa0fac74Marius Rennjboolean Java_android_filterfw_core_GLEnvironment_nativeIsContextActive(JNIEnv* env, jobject thiz) { 79a935c0d2759dc11fc60e56d0b2751e8eaa0fac74Marius Renn GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 80a935c0d2759dc11fc60e56d0b2751e8eaa0fac74Marius Renn return gl_env ? ToJBool(gl_env->IsContextActive()) : JNI_FALSE; 81a935c0d2759dc11fc60e56d0b2751e8eaa0fac74Marius Renn} 82a935c0d2759dc11fc60e56d0b2751e8eaa0fac74Marius Renn 83a935c0d2759dc11fc60e56d0b2751e8eaa0fac74Marius Rennjboolean Java_android_filterfw_core_GLEnvironment_nativeIsAnyContextActive(JNIEnv* env, 84a935c0d2759dc11fc60e56d0b2751e8eaa0fac74Marius Renn jclass clazz) { 85a935c0d2759dc11fc60e56d0b2751e8eaa0fac74Marius Renn return ToJBool(GLEnv::IsAnyContextActive()); 86a935c0d2759dc11fc60e56d0b2751e8eaa0fac74Marius Renn} 87a935c0d2759dc11fc60e56d0b2751e8eaa0fac74Marius Renn 88edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeActivate(JNIEnv* env, jobject thiz) { 8930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 9030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return gl_env ? ToJBool(gl_env->Activate()) : JNI_FALSE; 9130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 9230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 93edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeDeactivate(JNIEnv* env, jobject thiz) { 9430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 9530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return gl_env ? ToJBool(gl_env->Deactivate()) : JNI_FALSE; 9630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 9730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 98edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeSwapBuffers(JNIEnv* env, jobject thiz) { 9930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 10030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return gl_env ? ToJBool(gl_env->SwapBuffers()) : JNI_FALSE; 10130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 10230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 10330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronijint Java_android_filterfw_core_GLEnvironment_nativeAddSurface(JNIEnv* env, 10430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni jobject thiz, 10530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni jobject surface) { 10630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 10730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni if (!surface) { 10830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni LOGE("GLEnvironment: Null Surface passed!"); 10930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return -1; 11030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } else if (gl_env) { 11130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Get the ANativeWindow 11230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni ANativeWindow* window = ANativeWindow_fromSurface(env, surface); 11330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni if (!window) { 11430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni LOGE("GLEnvironment: Error creating window!"); 11530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return -1; 11630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 11730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 11830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni NativeWindowHandle* winHandle = new NativeWindowHandle(window); 11930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni int result = gl_env->FindSurfaceIdForWindow(winHandle); 12030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni if (result == -1) { 12130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Configure surface 12230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni EGLConfig config; 12330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni EGLint numConfigs = -1; 12430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni EGLint configAttribs[] = { 12530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 12630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 12730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni EGL_NONE 12830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni }; 12930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 13030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni eglChooseConfig(gl_env->display(), configAttribs, &config, 1, &numConfigs); 13130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni if (numConfigs < 1) { 13230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni LOGE("GLEnvironment: No suitable EGL configuration found for surface!"); 13330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return -1; 13430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 13530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 13630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Create the EGL surface 13730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni EGLSurface egl_surface = eglCreateWindowSurface(gl_env->display(), 13830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni config, 13930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni window, 14030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni NULL); 14130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 14230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni if (GLEnv::CheckEGLError("eglCreateWindowSurface")) { 14330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni LOGE("GLEnvironment: Error creating window surface!"); 14417b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala return -1; 14517b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala } 14617b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala 14717b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala // Add it to GL Env and assign ID 14817b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala result = gl_env->AddWindowSurface(egl_surface, winHandle); 14917b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala } else { 15017b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala delete winHandle; 15117b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala } 15217b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala return result; 15317b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala } 15417b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala return -1; 15517b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala} 15617b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala 15717b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvalajint Java_android_filterfw_core_GLEnvironment_nativeAddSurfaceTexture(JNIEnv* env, 15817b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala jobject thiz, 15917b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala jobject surfaceTexture, 16017b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala jint width, 16117b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala jint height) { 16217b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 16317b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala if (!surfaceTexture) { 16417b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala LOGE("GLEnvironment: Null SurfaceTexture passed!"); 16517b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala return -1; 16617b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala } else if (gl_env) { 16717b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala // Get the ANativeWindow 16817b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala ANativeWindow* window = ANativeWindow_fromSurfaceTexture(env, surfaceTexture); 16917b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala if (!window) { 17017b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala LOGE("GLEnvironment: Error creating window!"); 17117b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala return -1; 17217b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala } 17317b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala 17417b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala // Don't care about format (will get overridden by SurfaceTexture 17517b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala // anyway), but do care about width and height 17617b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala ANativeWindow_setBuffersGeometry(window, width, height, 0); 17717b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala 17817b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala NativeWindowHandle* winHandle = new NativeWindowHandle(window); 17917b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala int result = gl_env->FindSurfaceIdForWindow(winHandle); 18017b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala if (result == -1) { 18117b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala // Configure surface 18217b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala EGLConfig config; 18317b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala EGLint numConfigs = -1; 18417b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala EGLint configAttribs[] = { 18517b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 18617b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 18717b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala EGL_NONE 18817b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala }; 18917b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala 19017b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala eglChooseConfig(gl_env->display(), configAttribs, &config, 1, &numConfigs); 19117b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala if (numConfigs < 1) { 19217b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala LOGE("GLEnvironment: No suitable EGL configuration found for surface texture!"); 19317b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala return -1; 19417b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala } 19517b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala 19617b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala // Create the EGL surface 19717b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala EGLSurface egl_surface = eglCreateWindowSurface(gl_env->display(), 19817b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala config, 19917b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala window, 20017b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala NULL); 20117b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala 20217b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala if (GLEnv::CheckEGLError("eglCreateWindowSurface")) { 20317b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala LOGE("GLEnvironment: Error creating window surface!"); 20430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return -1; 20530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 20630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 20730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Add it to GL Env and assign ID 20830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni result = gl_env->AddWindowSurface(egl_surface, winHandle); 20930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } else { 21030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni delete winHandle; 21130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 21230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return result; 21330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 21430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return -1; 21530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 21630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 21730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronijboolean Java_android_filterfw_core_GLEnvironment_nativeActivateSurfaceId(JNIEnv* env, 21830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni jobject thiz, 21930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni jint surfaceId) { 22030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 22130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return gl_env ? ToJBool(gl_env->SwitchToSurfaceId(surfaceId)) : JNI_FALSE; 22230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 22330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 22430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronijboolean Java_android_filterfw_core_GLEnvironment_nativeRemoveSurfaceId(JNIEnv* env, 22530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni jobject thiz, 22630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni jint surfaceId) { 22730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 22830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return gl_env ? ToJBool(gl_env->ReleaseSurfaceId(surfaceId)) : JNI_FALSE; 22930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 2305b9eb6d686c439545dafcc8e25e9e3747281c3deEino-Ville Talvala 2315b9eb6d686c439545dafcc8e25e9e3747281c3deEino-Ville Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeSetSurfaceTimestamp(JNIEnv* env, 2325b9eb6d686c439545dafcc8e25e9e3747281c3deEino-Ville Talvala jobject thiz, 2335b9eb6d686c439545dafcc8e25e9e3747281c3deEino-Ville Talvala jlong timestamp) { 2345b9eb6d686c439545dafcc8e25e9e3747281c3deEino-Ville Talvala GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 2355b9eb6d686c439545dafcc8e25e9e3747281c3deEino-Ville Talvala int64_t timestamp_native = timestamp; 2365b9eb6d686c439545dafcc8e25e9e3747281c3deEino-Ville Talvala return gl_env ? ToJBool(gl_env->SetSurfaceTimestamp(timestamp_native)) : JNI_FALSE; 2375b9eb6d686c439545dafcc8e25e9e3747281c3deEino-Ville Talvala} 238