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