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