From c86393510c8747519fe34e5aa38ce5218593c19c Mon Sep 17 00:00:00 2001 From: Jesse Hall Date: Tue, 30 Apr 2013 13:45:14 -0700 Subject: [PATCH] Generate new EGLExt class Initially populated with EGL_ANDROID_presentation_time (moved from the EGL14 class) and the ES-relevant parts of EGL_KHR_create_context. Bug: 8678160 Change-Id: Ifed2ee3da264ca701ae1f4b309a0758f7fcc3acc --- opengl/tools/glgen/gen | 3 +- opengl/tools/glgen/specs/egl/EGL14.spec | 1 - opengl/tools/glgen/specs/egl/EGLExt.spec | 1 + opengl/tools/glgen/src/GenerateEGL.java | 42 +++--- .../tools/glgen/stubs/egl/EGL14Header.java-if | 2 +- opengl/tools/glgen/stubs/egl/EGL14cHeader.cpp | 1 + .../glgen/stubs/egl/EGLExtHeader.java-if | 36 +++++ .../tools/glgen/stubs/egl/EGLExtcHeader.cpp | 133 ++++++++++++++++++ 8 files changed, 195 insertions(+), 24 deletions(-) create mode 100644 opengl/tools/glgen/specs/egl/EGLExt.spec create mode 100644 opengl/tools/glgen/stubs/egl/EGLExtHeader.java-if create mode 100644 opengl/tools/glgen/stubs/egl/EGLExtcHeader.cpp diff --git a/opengl/tools/glgen/gen b/opengl/tools/glgen/gen index 29212c0ec..d236c1e91 100755 --- a/opengl/tools/glgen/gen +++ b/opengl/tools/glgen/gen @@ -96,6 +96,7 @@ rm src/*.class pushd out > /dev/null mkdir classes javac -d classes android/opengl/EGL14.java \ + android/opengl/EGLExt.java \ com/google/android/gles_jni/GLImpl.java \ javax/microedition/khronos/opengles/GL10.java \ javax/microedition/khronos/opengles/GL10Ext.java \ @@ -154,7 +155,7 @@ do compareGenerated ../../../../base/opengl/java/javax/microedition/khronos/opengles generated/javax/microedition/khronos/opengles $x done -for x in EGL14 GLES10 GLES10Ext GLES11 GLES11Ext GLES20 GLES30 +for x in EGL14 EGLExt GLES10 GLES10Ext GLES11 GLES11Ext GLES20 GLES30 do compareGenerated ../../../../base/opengl/java/android/opengl generated/android/opengl ${x}.java compareGenerated ../../../../base/core/jni generated/C android_opengl_${x}.cpp diff --git a/opengl/tools/glgen/specs/egl/EGL14.spec b/opengl/tools/glgen/specs/egl/EGL14.spec index aef0bcb43..828e11485 100644 --- a/opengl/tools/glgen/specs/egl/EGL14.spec +++ b/opengl/tools/glgen/specs/egl/EGL14.spec @@ -31,4 +31,3 @@ EGLBoolean eglWaitGL ( void ) EGLBoolean eglWaitNative ( EGLint engine ) EGLBoolean eglSwapBuffers ( EGLDisplay dpy, EGLSurface surface ) EGLBoolean eglCopyBuffers ( EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target ) -EGLBoolean eglPresentationTimeANDROID ( EGLDisplay dpy, EGLSurface sur, EGLnsecsANDROID time ) diff --git a/opengl/tools/glgen/specs/egl/EGLExt.spec b/opengl/tools/glgen/specs/egl/EGLExt.spec new file mode 100644 index 000000000..e4fc3378e --- /dev/null +++ b/opengl/tools/glgen/specs/egl/EGLExt.spec @@ -0,0 +1 @@ +EGLBoolean eglPresentationTimeANDROID ( EGLDisplay dpy, EGLSurface sur, EGLnsecsANDROID time ) diff --git a/opengl/tools/glgen/src/GenerateEGL.java b/opengl/tools/glgen/src/GenerateEGL.java index aaa748cb6..2ef397029 100644 --- a/opengl/tools/glgen/src/GenerateEGL.java +++ b/opengl/tools/glgen/src/GenerateEGL.java @@ -84,26 +84,26 @@ public class GenerateEGL { ParameterChecker checker = new ParameterChecker(checksReader); - BufferedReader specReader = - new BufferedReader(new FileReader("specs/egl/EGL14.spec")); - - String egljFilename = "android/opengl/EGL14.java"; - String eglcFilename = "android_opengl_EGL14.cpp"; - PrintStream egljStream = - new PrintStream(new FileOutputStream("out/" + egljFilename)); - PrintStream eglcStream = - new PrintStream(new FileOutputStream("out/" + eglcFilename)); - egljStream.println("/*"); - eglcStream.println("/*"); - copy("stubs/egl/EGL14Header.java-if", egljStream); - copy("stubs/egl/EGL14cHeader.cpp", eglcStream); - EGLCodeEmitter emitter = new EGLCodeEmitter( - "android/opengl/EGL14", - checker, egljStream, eglcStream); - emit(emitter, specReader, egljStream, eglcStream); - emitter.emitNativeRegistration("register_android_opengl_jni_EGL14"); - egljStream.println("}"); - egljStream.close(); - eglcStream.close(); + for(String suffix: new String[] {"EGL14", "EGLExt"}) { + BufferedReader specReader = new BufferedReader(new FileReader( + "specs/egl/" + suffix + ".spec")); + String egljFilename = "android/opengl/" + suffix + ".java"; + String eglcFilename = "android_opengl_" + suffix + ".cpp"; + PrintStream egljStream = + new PrintStream(new FileOutputStream("out/" + egljFilename)); + PrintStream eglcStream = + new PrintStream(new FileOutputStream("out/" + eglcFilename)); + copy("stubs/egl/" + suffix + "Header.java-if", egljStream); + copy("stubs/egl/" + suffix + "cHeader.cpp", eglcStream); + EGLCodeEmitter emitter = new EGLCodeEmitter( + "android/opengl/" + suffix, + checker, egljStream, eglcStream); + emit(emitter, specReader, egljStream, eglcStream); + emitter.emitNativeRegistration( + "register_android_opengl_jni_" + suffix); + egljStream.println("}"); + egljStream.close(); + eglcStream.close(); + } } } diff --git a/opengl/tools/glgen/stubs/egl/EGL14Header.java-if b/opengl/tools/glgen/stubs/egl/EGL14Header.java-if index 0c29d5c38..f3bf220bf 100644 --- a/opengl/tools/glgen/stubs/egl/EGL14Header.java-if +++ b/opengl/tools/glgen/stubs/egl/EGL14Header.java-if @@ -1,4 +1,4 @@ -** +/* ** Copyright 2012, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/opengl/tools/glgen/stubs/egl/EGL14cHeader.cpp b/opengl/tools/glgen/stubs/egl/EGL14cHeader.cpp index 5fda9f8e2..54de1e7b7 100644 --- a/opengl/tools/glgen/stubs/egl/EGL14cHeader.cpp +++ b/opengl/tools/glgen/stubs/egl/EGL14cHeader.cpp @@ -1,3 +1,4 @@ +/* ** Copyright 2012, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/opengl/tools/glgen/stubs/egl/EGLExtHeader.java-if b/opengl/tools/glgen/stubs/egl/EGLExtHeader.java-if new file mode 100644 index 000000000..a5a8968a9 --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/EGLExtHeader.java-if @@ -0,0 +1,36 @@ +/* +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +// This source file is automatically generated + +package android.opengl; + +/** + * EGL Extensions + */ +public class EGLExt { + + // EGL_KHR_create_context + public static final int EGL_CONTEXT_MAJOR_VERSION_KHR = 0x3098; + public static final int EGL_CONTEXT_MINOR_VERSION_KHR = 0x30FB; + public static final int EGL_CONTEXT_FLAGS_KHR = 0x30FC; + public static final int EGL_OPENGL_ES3_BIT_KHR = 0x0040; + + native private static void _nativeClassInit(); + static { + _nativeClassInit(); + } + diff --git a/opengl/tools/glgen/stubs/egl/EGLExtcHeader.cpp b/opengl/tools/glgen/stubs/egl/EGLExtcHeader.cpp new file mode 100644 index 000000000..5e1ffa101 --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/EGLExtcHeader.cpp @@ -0,0 +1,133 @@ +/* +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +// This source file is automatically generated + +#include "jni.h" +#include "JNIHelp.h" +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include + +static int initialized = 0; + +static jclass egldisplayClass; +static jclass eglcontextClass; +static jclass eglsurfaceClass; +static jclass eglconfigClass; + +static jmethodID egldisplayGetHandleID; +static jmethodID eglcontextGetHandleID; +static jmethodID eglsurfaceGetHandleID; +static jmethodID eglconfigGetHandleID; + +static jmethodID egldisplayConstructor; +static jmethodID eglcontextConstructor; +static jmethodID eglsurfaceConstructor; +static jmethodID eglconfigConstructor; + +static jobject eglNoContextObject; +static jobject eglNoDisplayObject; +static jobject eglNoSurfaceObject; + + + +/* Cache method IDs each time the class is loaded. */ + +static void +nativeClassInit(JNIEnv *_env, jclass glImplClass) +{ + jclass egldisplayClassLocal = _env->FindClass("android/opengl/EGLDisplay"); + egldisplayClass = (jclass) _env->NewGlobalRef(egldisplayClassLocal); + jclass eglcontextClassLocal = _env->FindClass("android/opengl/EGLContext"); + eglcontextClass = (jclass) _env->NewGlobalRef(eglcontextClassLocal); + jclass eglsurfaceClassLocal = _env->FindClass("android/opengl/EGLSurface"); + eglsurfaceClass = (jclass) _env->NewGlobalRef(eglsurfaceClassLocal); + jclass eglconfigClassLocal = _env->FindClass("android/opengl/EGLConfig"); + eglconfigClass = (jclass) _env->NewGlobalRef(eglconfigClassLocal); + + egldisplayGetHandleID = _env->GetMethodID(egldisplayClass, "getHandle", "()I"); + eglcontextGetHandleID = _env->GetMethodID(eglcontextClass, "getHandle", "()I"); + eglsurfaceGetHandleID = _env->GetMethodID(eglsurfaceClass, "getHandle", "()I"); + eglconfigGetHandleID = _env->GetMethodID(eglconfigClass, "getHandle", "()I"); + + + egldisplayConstructor = _env->GetMethodID(egldisplayClass, "", "(I)V"); + eglcontextConstructor = _env->GetMethodID(eglcontextClass, "", "(I)V"); + eglsurfaceConstructor = _env->GetMethodID(eglsurfaceClass, "", "(I)V"); + eglconfigConstructor = _env->GetMethodID(eglconfigClass, "", "(I)V"); + + jobject localeglNoContextObject = _env->NewObject(eglcontextClass, eglcontextConstructor, (jint)EGL_NO_CONTEXT); + eglNoContextObject = _env->NewGlobalRef(localeglNoContextObject); + jobject localeglNoDisplayObject = _env->NewObject(egldisplayClass, egldisplayConstructor, (jint)EGL_NO_DISPLAY); + eglNoDisplayObject = _env->NewGlobalRef(localeglNoDisplayObject); + jobject localeglNoSurfaceObject = _env->NewObject(eglsurfaceClass, eglsurfaceConstructor, (jint)EGL_NO_SURFACE); + eglNoSurfaceObject = _env->NewGlobalRef(localeglNoSurfaceObject); + + + jclass eglClass = _env->FindClass("android/opengl/EGL14"); + jfieldID noContextFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_CONTEXT", "Landroid/opengl/EGLContext;"); + _env->SetStaticObjectField(eglClass, noContextFieldID, eglNoContextObject); + + jfieldID noDisplayFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_DISPLAY", "Landroid/opengl/EGLDisplay;"); + _env->SetStaticObjectField(eglClass, noDisplayFieldID, eglNoDisplayObject); + + jfieldID noSurfaceFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_SURFACE", "Landroid/opengl/EGLSurface;"); + _env->SetStaticObjectField(eglClass, noSurfaceFieldID, eglNoSurfaceObject); +} + +static void * +fromEGLHandle(JNIEnv *_env, jmethodID mid, jobject obj) { + if (obj == NULL){ + jniThrowException(_env, "java/lang/IllegalArgumentException", + "Object is set to null."); + } + + return (void*) (_env->CallIntMethod(obj, mid)); +} + +static jobject +toEGLHandle(JNIEnv *_env, jclass cls, jmethodID con, void * handle) { + if (cls == eglcontextClass && + (EGLContext)handle == EGL_NO_CONTEXT) { + return eglNoContextObject; + } + + if (cls == egldisplayClass && + (EGLDisplay)handle == EGL_NO_DISPLAY) { + return eglNoDisplayObject; + } + + if (cls == eglsurfaceClass && + (EGLSurface)handle == EGL_NO_SURFACE) { + return eglNoSurfaceObject; + } + + return _env->NewObject(cls, con, (jint)handle); +} + +// --------------------------------------------------------------------------