diff options
12 files changed, 292 insertions, 6 deletions
diff --git a/opengl/tools/glgen/specs/egl/EGL15.spec b/opengl/tools/glgen/specs/egl/EGL15.spec index e0aad30f3c..5c48a15092 100644 --- a/opengl/tools/glgen/specs/egl/EGL15.spec +++ b/opengl/tools/glgen/specs/egl/EGL15.spec @@ -1,7 +1,8 @@ EGLSync eglCreateSync ( EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list ) +// eglGetSyncAttrib pulled in with eglCreateSync stubs +// EGLBoolean eglGetSyncAttrib ( EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value ) EGLBoolean eglDestroySync ( EGLDisplay dpy, EGLSync sync ) EGLint eglClientWaitSync ( EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout ) -EGLBoolean eglGetSyncAttrib ( EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value ) // NOTE: native_display isn't actually an EGLAttrib. Using EGLAttrib // so that the generate creates mostly correct code (do not want a buffer) // have to manually change cast to (void *) in generated code that calls diff --git a/opengl/tools/glgen/stubs/egl/EGL15cHeader.cpp b/opengl/tools/glgen/stubs/egl/EGL15cHeader.cpp index 1c53c9e8e2..8bb0c6a04f 100644 --- a/opengl/tools/glgen/stubs/egl/EGL15cHeader.cpp +++ b/opengl/tools/glgen/stubs/egl/EGL15cHeader.cpp @@ -25,6 +25,7 @@ #include <utils/misc.h> #include <assert.h> +#include <vector> #include <EGL/egl.h> #include <ui/ANativeObjectBase.h> @@ -206,4 +207,22 @@ toEGLHandle(JNIEnv *_env, jclass cls, jmethodID con, void *handle) { return _env->NewObject(cls, con, reinterpret_cast<jlong>(handle)); } +struct WrappedEGLAttribs { +private: + std::vector<EGLAttrib> backing; // only for 32-bit +public: + EGLAttrib *attribs; + WrappedEGLAttribs(): attribs(nullptr) { }; + void init(jlong *array, jint size) { + if (sizeof(EGLAttrib) != sizeof(jlong)) { + for (jint i = 0; i < size; ++i) { + backing.push_back(array[i]); + } + attribs = backing.data(); + } else { + attribs = (EGLAttrib*)array; + } + } +}; + // -------------------------------------------------------------------------- diff --git a/opengl/tools/glgen/stubs/egl/eglCreateImage.cpp b/opengl/tools/glgen/stubs/egl/eglCreateImage.cpp new file mode 100644 index 0000000000..f93815cbba --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglCreateImage.cpp @@ -0,0 +1,50 @@ +/* EGLImage eglCreateImage ( EGLDisplay dpy, EGLContext context, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list ) */ +static jobject +android_eglCreateImage + (JNIEnv *_env, jobject _this, jobject dpy, jobject context, jint target, jlong buffer, jlongArray attrib_list_ref, jint offset) { + jint _exception = 0; + const char * _exceptionType = NULL; + const char * _exceptionMessage = NULL; + EGLImage _returnValue = (EGLImage) 0; + EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); + EGLContext context_native = (EGLContext) fromEGLHandle(_env, eglcontextGetHandleID, context); + jlong *attrib_list_base = (jlong *) 0; + jint _remaining; + WrappedEGLAttribs attrib_list; + + if (!attrib_list_ref) { + _exception = 1; + _exceptionType = "java/lang/IllegalArgumentException"; + _exceptionMessage = "attrib_list == null"; + goto exit; + } + if (offset < 0) { + _exception = 1; + _exceptionType = "java/lang/IllegalArgumentException"; + _exceptionMessage = "offset < 0"; + goto exit; + } + _remaining = _env->GetArrayLength(attrib_list_ref) - offset; + attrib_list_base = (jlong *) + _env->GetLongArrayElements(attrib_list_ref, (jboolean *)0); + attrib_list.init(attrib_list_base + offset, _remaining); + + _returnValue = eglCreateImage( + (EGLDisplay)dpy_native, + (EGLContext)context_native, + (EGLenum)target, + (EGLClientBuffer)buffer, + attrib_list.attribs + ); + +exit: + if (attrib_list_base) { + _env->ReleaseLongArrayElements(attrib_list_ref, (jlong*)attrib_list_base, + JNI_ABORT); + } + if (_exception) { + jniThrowException(_env, _exceptionType, _exceptionMessage); + return nullptr; + } + return toEGLHandle(_env, eglimageClass, eglimageConstructor, _returnValue); +} diff --git a/opengl/tools/glgen/stubs/egl/eglCreateImage.java b/opengl/tools/glgen/stubs/egl/eglCreateImage.java new file mode 100644 index 0000000000..06a04bb30d --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglCreateImage.java @@ -0,0 +1,11 @@ + // C function EGLImage eglCreateImage ( EGLDisplay dpy, EGLContext context, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list ) + + public static native EGLImage eglCreateImage( + EGLDisplay dpy, + EGLContext context, + int target, + long buffer, + long[] attrib_list, + int offset + ); + diff --git a/opengl/tools/glgen/stubs/egl/eglCreateImage.nativeReg b/opengl/tools/glgen/stubs/egl/eglCreateImage.nativeReg new file mode 100644 index 0000000000..da5687d507 --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglCreateImage.nativeReg @@ -0,0 +1 @@ +{"eglCreateImage", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLContext;IJ[JI)Landroid/opengl/EGLImage;", (void *) android_eglCreateImage }, diff --git a/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.cpp b/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.cpp new file mode 100644 index 0000000000..48dbd35f76 --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.cpp @@ -0,0 +1,68 @@ +/* EGLSurface eglCreatePlatformWindowSurface ( EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list ) */ +static jobject +android_eglCreatePlatformWindowSurface + (JNIEnv *_env, jobject _this, jobject dpy, jobject config, jobject native_window_buf, jlongArray attrib_list_ref, jint offset) { + jint _exception = 0; + const char * _exceptionType = NULL; + const char * _exceptionMessage = NULL; + jarray _array = (jarray) 0; + jint _bufferOffset = (jint) 0; + EGLSurface _returnValue = (EGLSurface) 0; + EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); + EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config); + jint _native_windowRemaining; + void *native_window = (void *) 0; + jlong *attrib_list_base = (jlong *) 0; + jint _attrib_listRemaining; + WrappedEGLAttribs attrib_list; + + if (!native_window_buf) { + _exception = 1; + _exceptionType = "java/lang/IllegalArgumentException"; + _exceptionMessage = "native_window == null"; + goto exit; + } + native_window = (void *)getPointer(_env, native_window_buf, (jarray*)&_array, &_native_windowRemaining, &_bufferOffset); + if (!attrib_list_ref) { + _exception = 1; + _exceptionType = "java/lang/IllegalArgumentException"; + _exceptionMessage = "attrib_list == null"; + goto exit; + } + if (offset < 0) { + _exception = 1; + _exceptionType = "java/lang/IllegalArgumentException"; + _exceptionMessage = "offset < 0"; + goto exit; + } + _attrib_listRemaining = _env->GetArrayLength(attrib_list_ref) - offset; + attrib_list_base = (jlong *) + _env->GetLongArrayElements(attrib_list_ref, (jboolean *)0); + attrib_list.init(attrib_list_base + offset, _attrib_listRemaining); + + if (native_window == NULL) { + char * _native_windowBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0); + native_window = (void *) (_native_windowBase + _bufferOffset); + } + _returnValue = eglCreatePlatformWindowSurface( + (EGLDisplay)dpy_native, + (EGLConfig)config_native, + (void *)native_window, + attrib_list.attribs + ); + +exit: + if (attrib_list_base) { + _env->ReleaseLongArrayElements(attrib_list_ref, (jlong*)attrib_list_base, + JNI_ABORT); + } + if (_array) { + releasePointer(_env, _array, native_window, _exception ? JNI_FALSE : JNI_TRUE); + } + if (_exception) { + jniThrowException(_env, _exceptionType, _exceptionMessage); + return nullptr; + } + return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue); +} + diff --git a/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.java b/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.java new file mode 100644 index 0000000000..dda37f83a8 --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.java @@ -0,0 +1,10 @@ + // C function EGLSurface eglCreatePlatformWindowSurface ( EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list ) + + public static native EGLSurface eglCreatePlatformWindowSurface( + EGLDisplay dpy, + EGLConfig config, + java.nio.Buffer native_window, + long[] attrib_list, + int offset + ); + diff --git a/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.nativeReg b/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.nativeReg new file mode 100644 index 0000000000..ce464e829a --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglCreatePlatformWindowSurface.nativeReg @@ -0,0 +1 @@ +{"eglCreatePlatformWindowSurface", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/nio/Buffer;[JI)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePlatformWindowSurface }, diff --git a/opengl/tools/glgen/stubs/egl/eglCreateSync.cpp b/opengl/tools/glgen/stubs/egl/eglCreateSync.cpp new file mode 100644 index 0000000000..c53afeaf12 --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglCreateSync.cpp @@ -0,0 +1,101 @@ +/* EGLSync eglCreateSync ( EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list ) */ +static jobject +android_eglCreateSync + (JNIEnv *_env, jobject _this, jobject dpy, jint type, jlongArray attrib_list_ref, jint offset) { + jint _exception = 0; + const char * _exceptionType = NULL; + const char * _exceptionMessage = NULL; + EGLSync _returnValue = (EGLSync) 0; + EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); + jlong *attrib_list_base = (jlong *) 0; + jint _remaining; + WrappedEGLAttribs attrib_list; + + if (!attrib_list_ref) { + _exception = 1; + _exceptionType = "java/lang/IllegalArgumentException"; + _exceptionMessage = "attrib_list == null"; + goto exit; + } + if (offset < 0) { + _exception = 1; + _exceptionType = "java/lang/IllegalArgumentException"; + _exceptionMessage = "offset < 0"; + goto exit; + } + _remaining = _env->GetArrayLength(attrib_list_ref) - offset; + attrib_list_base = (jlong *) + _env->GetLongArrayElements(attrib_list_ref, (jboolean *)0); + attrib_list.init(attrib_list_base + offset, _remaining); + + _returnValue = eglCreateSync( + (EGLDisplay)dpy_native, + (EGLenum)type, + attrib_list.attribs + ); + +exit: + if (attrib_list_base) { + _env->ReleaseLongArrayElements(attrib_list_ref, (jlong*)attrib_list_base, + JNI_ABORT); + } + if (_exception) { + jniThrowException(_env, _exceptionType, _exceptionMessage); + return nullptr; + } + return toEGLHandle(_env, eglsyncClass, eglsyncConstructor, _returnValue); +} + +/* EGLBoolean eglGetSyncAttrib ( EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value ) */ +static jboolean +android_eglGetSyncAttrib + (JNIEnv *_env, jobject _this, jobject dpy, jobject sync, jint attribute, jlongArray value_ref, jint offset) { + jint _exception = 0; + const char * _exceptionType = NULL; + const char * _exceptionMessage = NULL; + EGLBoolean _returnValue = (EGLBoolean) 0; + EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); + EGLSync sync_native = (EGLSync) fromEGLHandle(_env, eglsyncGetHandleID, sync); + jlong *value_base = (jlong *) 0; + jint _remaining; + EGLAttrib value; + + if (!value_ref) { + _exception = 1; + _exceptionType = "java/lang/IllegalArgumentException"; + _exceptionMessage = "value == null"; + goto exit; + } + if (offset < 0) { + _exception = 1; + _exceptionType = "java/lang/IllegalArgumentException"; + _exceptionMessage = "offset < 0"; + goto exit; + } + _remaining = _env->GetArrayLength(value_ref) - offset; + value_base = (jlong *) + _env->GetLongArrayElements(value_ref, (jboolean *)0); + + _returnValue = eglGetSyncAttrib( + (EGLDisplay)dpy_native, + (EGLSync)sync_native, + (EGLint)attribute, + &value + ); + + if (value_base && _returnValue == EGL_TRUE) { + *(value_base + offset) = (jlong) value; + } + +exit: + if (value_base) { + _env->ReleaseLongArrayElements(value_ref, (jlong*)value_base, + _exception ? JNI_ABORT: 0); + } + if (_exception) { + jniThrowException(_env, _exceptionType, _exceptionMessage); + return JNI_FALSE; + } + return (jboolean)_returnValue; +} + diff --git a/opengl/tools/glgen/stubs/egl/eglCreateSync.java b/opengl/tools/glgen/stubs/egl/eglCreateSync.java new file mode 100644 index 0000000000..db8f728ca6 --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglCreateSync.java @@ -0,0 +1,22 @@ + // C function EGLSync eglCreateSync ( EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list ) + + public static native EGLSync eglCreateSync( + EGLDisplay dpy, + int type, + long[] attrib_list, + int offset + ); + + /** + * C function EGLBoolean eglGetSyncAttrib ( EGLDisplay dpy, EGLSync sync, EGLint attribute, + * EGLAttrib *value ) + */ + + public static native boolean eglGetSyncAttrib( + EGLDisplay dpy, + EGLSync sync, + int attribute, + long[] value, + int offset + ); + diff --git a/opengl/tools/glgen/stubs/egl/eglCreateSync.nativeReg b/opengl/tools/glgen/stubs/egl/eglCreateSync.nativeReg new file mode 100644 index 0000000000..c99e7fe8ec --- /dev/null +++ b/opengl/tools/glgen/stubs/egl/eglCreateSync.nativeReg @@ -0,0 +1,2 @@ +{"eglCreateSync", "(Landroid/opengl/EGLDisplay;I[JI)Landroid/opengl/EGLSync;", (void *) android_eglCreateSync }, +{"eglGetSyncAttrib", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSync;I[JI)Z", (void *) android_eglGetSyncAttrib }, diff --git a/opengl/tools/glgen/stubs/egl/eglGetPlatformDisplay.cpp b/opengl/tools/glgen/stubs/egl/eglGetPlatformDisplay.cpp index 3a6176f09c..6acb32ae6b 100644 --- a/opengl/tools/glgen/stubs/egl/eglGetPlatformDisplay.cpp +++ b/opengl/tools/glgen/stubs/egl/eglGetPlatformDisplay.cpp @@ -6,9 +6,9 @@ android_eglGetPlatformDisplay const char * _exceptionType = NULL; const char * _exceptionMessage = NULL; EGLDisplay _returnValue = (EGLDisplay) 0; - EGLAttrib *attrib_list_base = (EGLAttrib *) 0; + jlong *attrib_list_base = (jlong *) 0; jint _remaining; - EGLAttrib *attrib_list = (EGLAttrib *) 0; + WrappedEGLAttribs attrib_list; if (!attrib_list_ref) { _exception = 1; @@ -23,14 +23,14 @@ android_eglGetPlatformDisplay goto exit; } _remaining = _env->GetArrayLength(attrib_list_ref) - offset; - attrib_list_base = (EGLAttrib *) + attrib_list_base = (jlong *) _env->GetLongArrayElements(attrib_list_ref, (jboolean *)0); - attrib_list = attrib_list_base + offset; + attrib_list.init(attrib_list_base + offset, _remaining); _returnValue = eglGetPlatformDisplay( (EGLenum)platform, (void *)native_display, - (EGLAttrib *)attrib_list + attrib_list.attribs ); exit: |