jni_gl_environment.cpp revision 17b672fd95a037fefb3e06c2f214551a45a15954
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 4530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni private: 4630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni ANativeWindow* window_; 4730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni}; 4830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 49edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeAllocate(JNIEnv* env, jobject thiz) { 5030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return ToJBool(WrapObjectInJava(new GLEnv(), env, thiz, true)); 5130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 5230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 53edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeDeallocate(JNIEnv* env, jobject thiz) { 5430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return ToJBool(DeleteNativeObject<GLEnv>(env, thiz)); 5530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 5630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 57edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeInitWithNewContext(JNIEnv* env, 58edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvala jobject thiz) { 5930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 6030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return gl_env ? ToJBool(gl_env->InitWithNewContext()) : JNI_FALSE; 6130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 6230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 63edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeInitWithCurrentContext(JNIEnv* env, 64edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvala jobject thiz) { 6530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 6630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return gl_env ? ToJBool(gl_env->InitWithCurrentContext()) : JNI_FALSE; 6730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 6830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 693fe79927824090988e0123781bec44f8a31779f8Marius Rennjboolean Java_android_filterfw_core_GLEnvironment_nativeIsActive(JNIEnv* env, jobject thiz) { 703fe79927824090988e0123781bec44f8a31779f8Marius Renn GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 713fe79927824090988e0123781bec44f8a31779f8Marius Renn return gl_env ? ToJBool(gl_env->IsActive()) : JNI_FALSE; 723fe79927824090988e0123781bec44f8a31779f8Marius Renn} 733fe79927824090988e0123781bec44f8a31779f8Marius Renn 74edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeActivate(JNIEnv* env, jobject thiz) { 7530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 7630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return gl_env ? ToJBool(gl_env->Activate()) : JNI_FALSE; 7730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 7830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 79edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeDeactivate(JNIEnv* env, jobject thiz) { 8030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 8130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return gl_env ? ToJBool(gl_env->Deactivate()) : JNI_FALSE; 8230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 8330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 84edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajobject Java_android_filterfw_core_GLEnvironment_nativeActiveEnvironment(JNIEnv* env, 85edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvala jclass clazz) { 8630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* active = GLEnv::ActiveEnv(); 8730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return active ? WrapNewObjectInJava(active, env, false) : NULL; 8830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 8930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 90edfc0941e7a9480d2bbc70e842015e6fa56a2c3fEddy Talvalajboolean Java_android_filterfw_core_GLEnvironment_nativeSwapBuffers(JNIEnv* env, jobject thiz) { 9130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 9230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return gl_env ? ToJBool(gl_env->SwapBuffers()) : JNI_FALSE; 9330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 9430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 9530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronijint Java_android_filterfw_core_GLEnvironment_nativeAddSurface(JNIEnv* env, 9630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni jobject thiz, 9730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni jobject surface) { 9830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 9930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni if (!surface) { 10030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni LOGE("GLEnvironment: Null Surface passed!"); 10130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return -1; 10230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } else if (gl_env) { 10330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Get the ANativeWindow 10430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni ANativeWindow* window = ANativeWindow_fromSurface(env, surface); 10530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni if (!window) { 10630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni LOGE("GLEnvironment: Error creating window!"); 10730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return -1; 10830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 10930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 11030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni NativeWindowHandle* winHandle = new NativeWindowHandle(window); 11130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni int result = gl_env->FindSurfaceIdForWindow(winHandle); 11230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni if (result == -1) { 11330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Configure surface 11430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni EGLConfig config; 11530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni EGLint numConfigs = -1; 11630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni EGLint configAttribs[] = { 11730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 11830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 11930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni EGL_NONE 12030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni }; 12130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 12230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni eglChooseConfig(gl_env->display(), configAttribs, &config, 1, &numConfigs); 12330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni if (numConfigs < 1) { 12430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni LOGE("GLEnvironment: No suitable EGL configuration found for surface!"); 12530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return -1; 12630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 12730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 12830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Create the EGL surface 12930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni EGLSurface egl_surface = eglCreateWindowSurface(gl_env->display(), 13030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni config, 13130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni window, 13230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni NULL); 13330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 13430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni if (GLEnv::CheckEGLError("eglCreateWindowSurface")) { 13530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni LOGE("GLEnvironment: Error creating window surface!"); 13617b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala return -1; 13717b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala } 13817b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala 13917b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala // Add it to GL Env and assign ID 14017b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala result = gl_env->AddWindowSurface(egl_surface, winHandle); 14117b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala } else { 14217b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala delete winHandle; 14317b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala } 14417b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala return result; 14517b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala } 14617b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala return -1; 14717b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala} 14817b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala 14917b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvalajint Java_android_filterfw_core_GLEnvironment_nativeAddSurfaceTexture(JNIEnv* env, 15017b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala jobject thiz, 15117b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala jobject surfaceTexture, 15217b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala jint width, 15317b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala jint height) { 15417b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 15517b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala if (!surfaceTexture) { 15617b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala LOGE("GLEnvironment: Null SurfaceTexture passed!"); 15717b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala return -1; 15817b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala } else if (gl_env) { 15917b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala // Get the ANativeWindow 16017b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala ANativeWindow* window = ANativeWindow_fromSurfaceTexture(env, surfaceTexture); 16117b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala if (!window) { 16217b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala LOGE("GLEnvironment: Error creating window!"); 16317b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala return -1; 16417b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala } 16517b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala 16617b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala // Don't care about format (will get overridden by SurfaceTexture 16717b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala // anyway), but do care about width and height 16817b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala ANativeWindow_setBuffersGeometry(window, width, height, 0); 16917b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala 17017b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala NativeWindowHandle* winHandle = new NativeWindowHandle(window); 17117b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala int result = gl_env->FindSurfaceIdForWindow(winHandle); 17217b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala if (result == -1) { 17317b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala // Configure surface 17417b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala EGLConfig config; 17517b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala EGLint numConfigs = -1; 17617b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala EGLint configAttribs[] = { 17717b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 17817b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 17917b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala EGL_NONE 18017b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala }; 18117b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala 18217b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala eglChooseConfig(gl_env->display(), configAttribs, &config, 1, &numConfigs); 18317b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala if (numConfigs < 1) { 18417b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala LOGE("GLEnvironment: No suitable EGL configuration found for surface texture!"); 18517b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala return -1; 18617b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala } 18717b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala 18817b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala // Create the EGL surface 18917b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala EGLSurface egl_surface = eglCreateWindowSurface(gl_env->display(), 19017b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala config, 19117b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala window, 19217b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala NULL); 19317b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala 19417b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala if (GLEnv::CheckEGLError("eglCreateWindowSurface")) { 19517b672fd95a037fefb3e06c2f214551a45a15954Eino-Ville Talvala LOGE("GLEnvironment: Error creating window surface!"); 19630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return -1; 19730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 19830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 19930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Add it to GL Env and assign ID 20030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni result = gl_env->AddWindowSurface(egl_surface, winHandle); 20130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } else { 20230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni delete winHandle; 20330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 20430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return result; 20530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 20630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return -1; 20730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 20830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 20930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronijboolean Java_android_filterfw_core_GLEnvironment_nativeActivateSurfaceId(JNIEnv* env, 21030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni jobject thiz, 21130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni jint surfaceId) { 21230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 21330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return gl_env ? ToJBool(gl_env->SwitchToSurfaceId(surfaceId)) : JNI_FALSE; 21430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 21530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 21630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronijboolean Java_android_filterfw_core_GLEnvironment_nativeRemoveSurfaceId(JNIEnv* env, 21730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni jobject thiz, 21830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni jint surfaceId) { 21930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLEnv* gl_env = ConvertFromJava<GLEnv>(env, thiz); 22030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return gl_env ? ToJBool(gl_env->ReleaseSurfaceId(surfaceId)) : JNI_FALSE; 22130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 222