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