10c79d808cb66894434e78052c66a0f81e5419176Jesse Hall/*
20c79d808cb66894434e78052c66a0f81e5419176Jesse Hall** Copyright 2013, The Android Open Source Project
30c79d808cb66894434e78052c66a0f81e5419176Jesse Hall**
40c79d808cb66894434e78052c66a0f81e5419176Jesse Hall** Licensed under the Apache License, Version 2.0 (the "License");
50c79d808cb66894434e78052c66a0f81e5419176Jesse Hall** you may not use this file except in compliance with the License.
60c79d808cb66894434e78052c66a0f81e5419176Jesse Hall** You may obtain a copy of the License at
70c79d808cb66894434e78052c66a0f81e5419176Jesse Hall**
80c79d808cb66894434e78052c66a0f81e5419176Jesse Hall**     http://www.apache.org/licenses/LICENSE-2.0
90c79d808cb66894434e78052c66a0f81e5419176Jesse Hall**
100c79d808cb66894434e78052c66a0f81e5419176Jesse Hall** Unless required by applicable law or agreed to in writing, software
110c79d808cb66894434e78052c66a0f81e5419176Jesse Hall** distributed under the License is distributed on an "AS IS" BASIS,
120c79d808cb66894434e78052c66a0f81e5419176Jesse Hall** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130c79d808cb66894434e78052c66a0f81e5419176Jesse Hall** See the License for the specific language governing permissions and
140c79d808cb66894434e78052c66a0f81e5419176Jesse Hall** limitations under the License.
150c79d808cb66894434e78052c66a0f81e5419176Jesse Hall*/
160c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
170c79d808cb66894434e78052c66a0f81e5419176Jesse Hall// This source file is automatically generated
180c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
190c79d808cb66894434e78052c66a0f81e5419176Jesse Hall#include "jni.h"
200c79d808cb66894434e78052c66a0f81e5419176Jesse Hall#include "JNIHelp.h"
210c79d808cb66894434e78052c66a0f81e5419176Jesse Hall#include <android_runtime/AndroidRuntime.h>
220c79d808cb66894434e78052c66a0f81e5419176Jesse Hall#include <android_runtime/android_view_Surface.h>
230c79d808cb66894434e78052c66a0f81e5419176Jesse Hall#include <android_runtime/android_graphics_SurfaceTexture.h>
240c79d808cb66894434e78052c66a0f81e5419176Jesse Hall#include <utils/misc.h>
250c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
260c79d808cb66894434e78052c66a0f81e5419176Jesse Hall#include <assert.h>
270c79d808cb66894434e78052c66a0f81e5419176Jesse Hall#include <EGL/egl.h>
280c79d808cb66894434e78052c66a0f81e5419176Jesse Hall#include <EGL/eglext.h>
290c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
300c79d808cb66894434e78052c66a0f81e5419176Jesse Hall#include <gui/Surface.h>
310c79d808cb66894434e78052c66a0f81e5419176Jesse Hall#include <gui/GLConsumer.h>
320c79d808cb66894434e78052c66a0f81e5419176Jesse Hall#include <gui/Surface.h>
330c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
340c79d808cb66894434e78052c66a0f81e5419176Jesse Hall#include <ui/ANativeObjectBase.h>
350c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
360c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic int initialized = 0;
370c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
380c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jclass egldisplayClass;
390c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jclass eglcontextClass;
400c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jclass eglsurfaceClass;
410c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jclass eglconfigClass;
420c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
430c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jmethodID egldisplayGetHandleID;
440c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jmethodID eglcontextGetHandleID;
450c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jmethodID eglsurfaceGetHandleID;
460c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jmethodID eglconfigGetHandleID;
470c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
480c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jmethodID egldisplayConstructor;
490c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jmethodID eglcontextConstructor;
500c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jmethodID eglsurfaceConstructor;
510c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jmethodID eglconfigConstructor;
520c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
530c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jobject eglNoContextObject;
540c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jobject eglNoDisplayObject;
550c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jobject eglNoSurfaceObject;
560c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
570c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
580c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
590c79d808cb66894434e78052c66a0f81e5419176Jesse Hall/* Cache method IDs each time the class is loaded. */
600c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
610c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic void
620c79d808cb66894434e78052c66a0f81e5419176Jesse HallnativeClassInit(JNIEnv *_env, jclass glImplClass)
630c79d808cb66894434e78052c66a0f81e5419176Jesse Hall{
640c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    jclass egldisplayClassLocal = _env->FindClass("android/opengl/EGLDisplay");
650c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    egldisplayClass = (jclass) _env->NewGlobalRef(egldisplayClassLocal);
660c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    jclass eglcontextClassLocal = _env->FindClass("android/opengl/EGLContext");
670c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    eglcontextClass = (jclass) _env->NewGlobalRef(eglcontextClassLocal);
680c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    jclass eglsurfaceClassLocal = _env->FindClass("android/opengl/EGLSurface");
690c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    eglsurfaceClass = (jclass) _env->NewGlobalRef(eglsurfaceClassLocal);
700c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    jclass eglconfigClassLocal = _env->FindClass("android/opengl/EGLConfig");
710c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    eglconfigClass = (jclass) _env->NewGlobalRef(eglconfigClassLocal);
720c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
730c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    egldisplayGetHandleID = _env->GetMethodID(egldisplayClass, "getHandle", "()I");
740c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    eglcontextGetHandleID = _env->GetMethodID(eglcontextClass, "getHandle", "()I");
750c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    eglsurfaceGetHandleID = _env->GetMethodID(eglsurfaceClass, "getHandle", "()I");
760c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    eglconfigGetHandleID = _env->GetMethodID(eglconfigClass, "getHandle", "()I");
770c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
780c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
790c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    egldisplayConstructor = _env->GetMethodID(egldisplayClass, "<init>", "(I)V");
800c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    eglcontextConstructor = _env->GetMethodID(eglcontextClass, "<init>", "(I)V");
810c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    eglsurfaceConstructor = _env->GetMethodID(eglsurfaceClass, "<init>", "(I)V");
820c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    eglconfigConstructor = _env->GetMethodID(eglconfigClass, "<init>", "(I)V");
830c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
840c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    jobject localeglNoContextObject = _env->NewObject(eglcontextClass, eglcontextConstructor, (jint)EGL_NO_CONTEXT);
850c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    eglNoContextObject = _env->NewGlobalRef(localeglNoContextObject);
860c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    jobject localeglNoDisplayObject = _env->NewObject(egldisplayClass, egldisplayConstructor, (jint)EGL_NO_DISPLAY);
870c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    eglNoDisplayObject = _env->NewGlobalRef(localeglNoDisplayObject);
880c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    jobject localeglNoSurfaceObject = _env->NewObject(eglsurfaceClass, eglsurfaceConstructor, (jint)EGL_NO_SURFACE);
890c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    eglNoSurfaceObject = _env->NewGlobalRef(localeglNoSurfaceObject);
900c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
910c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
920c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    jclass eglClass = _env->FindClass("android/opengl/EGL14");
930c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    jfieldID noContextFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_CONTEXT", "Landroid/opengl/EGLContext;");
940c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    _env->SetStaticObjectField(eglClass, noContextFieldID, eglNoContextObject);
950c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
960c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    jfieldID noDisplayFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_DISPLAY", "Landroid/opengl/EGLDisplay;");
970c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    _env->SetStaticObjectField(eglClass, noDisplayFieldID, eglNoDisplayObject);
980c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
990c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    jfieldID noSurfaceFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_SURFACE", "Landroid/opengl/EGLSurface;");
1000c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    _env->SetStaticObjectField(eglClass, noSurfaceFieldID, eglNoSurfaceObject);
1010c79d808cb66894434e78052c66a0f81e5419176Jesse Hall}
1020c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
1030c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic void *
1040c79d808cb66894434e78052c66a0f81e5419176Jesse HallfromEGLHandle(JNIEnv *_env, jmethodID mid, jobject obj) {
1050c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    if (obj == NULL){
1060c79d808cb66894434e78052c66a0f81e5419176Jesse Hall        jniThrowException(_env, "java/lang/IllegalArgumentException",
1070c79d808cb66894434e78052c66a0f81e5419176Jesse Hall                          "Object is set to null.");
1080c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    }
1090c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
1100c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    return (void*) (_env->CallIntMethod(obj, mid));
1110c79d808cb66894434e78052c66a0f81e5419176Jesse Hall}
1120c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
1130c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jobject
1140c79d808cb66894434e78052c66a0f81e5419176Jesse HalltoEGLHandle(JNIEnv *_env, jclass cls, jmethodID con, void * handle) {
1150c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    if (cls == eglcontextClass &&
1160c79d808cb66894434e78052c66a0f81e5419176Jesse Hall       (EGLContext)handle == EGL_NO_CONTEXT) {
1170c79d808cb66894434e78052c66a0f81e5419176Jesse Hall           return eglNoContextObject;
1180c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    }
1190c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
1200c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    if (cls == egldisplayClass &&
1210c79d808cb66894434e78052c66a0f81e5419176Jesse Hall       (EGLDisplay)handle == EGL_NO_DISPLAY) {
1220c79d808cb66894434e78052c66a0f81e5419176Jesse Hall           return eglNoDisplayObject;
1230c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    }
1240c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
1250c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    if (cls == eglsurfaceClass &&
1260c79d808cb66894434e78052c66a0f81e5419176Jesse Hall       (EGLSurface)handle == EGL_NO_SURFACE) {
1270c79d808cb66894434e78052c66a0f81e5419176Jesse Hall           return eglNoSurfaceObject;
1280c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    }
1290c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
1300c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    return _env->NewObject(cls, con, (jint)handle);
1310c79d808cb66894434e78052c66a0f81e5419176Jesse Hall}
1320c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
1330c79d808cb66894434e78052c66a0f81e5419176Jesse Hall// --------------------------------------------------------------------------
1340c79d808cb66894434e78052c66a0f81e5419176Jesse Hall/* EGLBoolean eglPresentationTimeANDROID ( EGLDisplay dpy, EGLSurface sur, EGLnsecsANDROID time ) */
1350c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic jboolean
1360c79d808cb66894434e78052c66a0f81e5419176Jesse Hallandroid_eglPresentationTimeANDROID
1370c79d808cb66894434e78052c66a0f81e5419176Jesse Hall  (JNIEnv *_env, jobject _this, jobject dpy, jobject sur, jlong time) {
1380c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    EGLBoolean _returnValue = (EGLBoolean) 0;
1390c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
1400c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    EGLSurface sur_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, sur);
1410c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
1420c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    _returnValue = eglPresentationTimeANDROID(
1430c79d808cb66894434e78052c66a0f81e5419176Jesse Hall        (EGLDisplay)dpy_native,
1440c79d808cb66894434e78052c66a0f81e5419176Jesse Hall        (EGLSurface)sur_native,
1450c79d808cb66894434e78052c66a0f81e5419176Jesse Hall        (EGLnsecsANDROID)time
1460c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    );
1470c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    return (jboolean)_returnValue;
1480c79d808cb66894434e78052c66a0f81e5419176Jesse Hall}
1490c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
1500c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic const char *classPathName = "android/opengl/EGLExt";
1510c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
1520c79d808cb66894434e78052c66a0f81e5419176Jesse Hallstatic JNINativeMethod methods[] = {
1530c79d808cb66894434e78052c66a0f81e5419176Jesse Hall{"_nativeClassInit", "()V", (void*)nativeClassInit },
1540c79d808cb66894434e78052c66a0f81e5419176Jesse Hall{"eglPresentationTimeANDROID", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;J)Z", (void *) android_eglPresentationTimeANDROID },
1550c79d808cb66894434e78052c66a0f81e5419176Jesse Hall};
1560c79d808cb66894434e78052c66a0f81e5419176Jesse Hall
1570c79d808cb66894434e78052c66a0f81e5419176Jesse Hallint register_android_opengl_jni_EGLExt(JNIEnv *_env)
1580c79d808cb66894434e78052c66a0f81e5419176Jesse Hall{
1590c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    int err;
1600c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods));
1610c79d808cb66894434e78052c66a0f81e5419176Jesse Hall    return err;
1620c79d808cb66894434e78052c66a0f81e5419176Jesse Hall}
163