diff options
-rw-r--r-- | core/jni/android_opengl_EGL15.cpp | 139 | ||||
-rw-r--r-- | opengl/java/android/opengl/EGL15.java | 23 |
2 files changed, 93 insertions, 69 deletions
diff --git a/core/jni/android_opengl_EGL15.cpp b/core/jni/android_opengl_EGL15.cpp index 99bdce274f3e..717b50579325 100644 --- a/core/jni/android_opengl_EGL15.cpp +++ b/core/jni/android_opengl_EGL15.cpp @@ -25,6 +25,7 @@ #include <utils/misc.h> #include <assert.h> +#include <vector> #include <EGL/egl.h> #include <ui/ANativeObjectBase.h> @@ -206,6 +207,24 @@ 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; + } + } +}; + // -------------------------------------------------------------------------- /* EGLSync eglCreateSync ( EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list ) */ static jobject @@ -216,9 +235,9 @@ android_eglCreateSync const char * _exceptionMessage = NULL; EGLSync _returnValue = (EGLSync) 0; EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); - 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; @@ -233,14 +252,14 @@ android_eglCreateSync 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 = eglCreateSync( (EGLDisplay)dpy_native, (EGLenum)type, - (EGLAttrib *)attrib_list + attrib_list.attribs ); exit: @@ -255,38 +274,6 @@ exit: return toEGLHandle(_env, eglsyncClass, eglsyncConstructor, _returnValue); } -/* EGLBoolean eglDestroySync ( EGLDisplay dpy, EGLSync sync ) */ -static jboolean -android_eglDestroySync - (JNIEnv *_env, jobject _this, jobject dpy, jobject sync) { - EGLBoolean _returnValue = (EGLBoolean) 0; - EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); - EGLSync sync_native = (EGLSync) fromEGLHandle(_env, eglsyncGetHandleID, sync); - - _returnValue = eglDestroySync( - (EGLDisplay)dpy_native, - (EGLSync)sync_native - ); - return (jboolean)_returnValue; -} - -/* EGLint eglClientWaitSync ( EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout ) */ -static jint -android_eglClientWaitSync - (JNIEnv *_env, jobject _this, jobject dpy, jobject sync, jint flags, jlong timeout) { - EGLint _returnValue = (EGLint) 0; - EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); - EGLSync sync_native = (EGLSync) fromEGLHandle(_env, eglsyncGetHandleID, sync); - - _returnValue = eglClientWaitSync( - (EGLDisplay)dpy_native, - (EGLSync)sync_native, - (EGLint)flags, - (EGLTime)timeout - ); - return (jint)_returnValue; -} - /* EGLBoolean eglGetSyncAttrib ( EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value ) */ static jboolean android_eglGetSyncAttrib @@ -297,9 +284,9 @@ android_eglGetSyncAttrib EGLBoolean _returnValue = (EGLBoolean) 0; EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); EGLSync sync_native = (EGLSync) fromEGLHandle(_env, eglsyncGetHandleID, sync); - EGLAttrib *value_base = (EGLAttrib *) 0; + jlong *value_base = (jlong *) 0; jint _remaining; - EGLAttrib *value = (EGLAttrib *) 0; + EGLAttrib value; if (!value_ref) { _exception = 1; @@ -314,17 +301,20 @@ android_eglGetSyncAttrib goto exit; } _remaining = _env->GetArrayLength(value_ref) - offset; - value_base = (EGLAttrib *) + value_base = (jlong *) _env->GetLongArrayElements(value_ref, (jboolean *)0); - value = value_base + offset; _returnValue = eglGetSyncAttrib( (EGLDisplay)dpy_native, (EGLSync)sync_native, (EGLint)attribute, - (EGLAttrib *)value + &value ); + if (value_base && _returnValue == EGL_TRUE) { + *(value_base + offset) = (jlong) value; + } + exit: if (value_base) { _env->ReleaseLongArrayElements(value_ref, (jlong*)value_base, @@ -337,6 +327,38 @@ exit: return (jboolean)_returnValue; } +/* EGLBoolean eglDestroySync ( EGLDisplay dpy, EGLSync sync ) */ +static jboolean +android_eglDestroySync + (JNIEnv *_env, jobject _this, jobject dpy, jobject sync) { + EGLBoolean _returnValue = (EGLBoolean) 0; + EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); + EGLSync sync_native = (EGLSync) fromEGLHandle(_env, eglsyncGetHandleID, sync); + + _returnValue = eglDestroySync( + (EGLDisplay)dpy_native, + (EGLSync)sync_native + ); + return (jboolean)_returnValue; +} + +/* EGLint eglClientWaitSync ( EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout ) */ +static jint +android_eglClientWaitSync + (JNIEnv *_env, jobject _this, jobject dpy, jobject sync, jint flags, jlong timeout) { + EGLint _returnValue = (EGLint) 0; + EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); + EGLSync sync_native = (EGLSync) fromEGLHandle(_env, eglsyncGetHandleID, sync); + + _returnValue = eglClientWaitSync( + (EGLDisplay)dpy_native, + (EGLSync)sync_native, + (EGLint)flags, + (EGLTime)timeout + ); + return (jint)_returnValue; +} + /* EGLDisplay eglGetPlatformDisplay ( EGLenum platform, EGLAttrib native_display, const EGLAttrib *attrib_list ) */ static jobject android_eglGetPlatformDisplay @@ -345,9 +367,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; @@ -362,14 +384,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: @@ -398,9 +420,9 @@ android_eglCreatePlatformWindowSurface EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config); jint _native_windowRemaining; void *native_window = (void *) 0; - EGLAttrib *attrib_list_base = (EGLAttrib *) 0; + jlong *attrib_list_base = (jlong *) 0; jint _attrib_listRemaining; - EGLAttrib *attrib_list = (EGLAttrib *) 0; + WrappedEGLAttribs attrib_list; if (!native_window_buf) { _exception = 1; @@ -422,9 +444,9 @@ android_eglCreatePlatformWindowSurface goto exit; } _attrib_listRemaining = _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, _attrib_listRemaining); if (native_window == NULL) { char * _native_windowBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0); @@ -434,7 +456,7 @@ android_eglCreatePlatformWindowSurface (EGLDisplay)dpy_native, (EGLConfig)config_native, (void *)native_window, - (EGLAttrib *)attrib_list + attrib_list.attribs ); exit: @@ -487,9 +509,9 @@ android_eglCreateImage EGLImage _returnValue = (EGLImage) 0; EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); EGLContext context_native = (EGLContext) fromEGLHandle(_env, eglcontextGetHandleID, context); - 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; @@ -504,16 +526,16 @@ android_eglCreateImage 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 = eglCreateImage( (EGLDisplay)dpy_native, (EGLContext)context_native, (EGLenum)target, (EGLClientBuffer)buffer, - (EGLAttrib *)attrib_list + attrib_list.attribs ); exit: @@ -527,7 +549,6 @@ exit: } return toEGLHandle(_env, eglimageClass, eglimageConstructor, _returnValue); } - /* EGLBoolean eglDestroyImage ( EGLDisplay dpy, EGLImage image ) */ static jboolean android_eglDestroyImage @@ -548,9 +569,9 @@ static const char *classPathName = "android/opengl/EGL15"; static const JNINativeMethod methods[] = { {"_nativeClassInit", "()V", (void*)nativeClassInit }, {"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 }, {"eglDestroySync", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSync;)Z", (void *) android_eglDestroySync }, {"eglClientWaitSync", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSync;IJ)I", (void *) android_eglClientWaitSync }, -{"eglGetSyncAttrib", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSync;I[JI)Z", (void *) android_eglGetSyncAttrib }, {"eglGetPlatformDisplay", "(IJ[JI)Landroid/opengl/EGLDisplay;", (void *) android_eglGetPlatformDisplay }, {"eglCreatePlatformWindowSurface", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/nio/Buffer;[JI)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePlatformWindowSurface }, {"eglCreatePlatformPixmapSurface", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/nio/Buffer;[JI)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePlatformPixmapSurface }, diff --git a/opengl/java/android/opengl/EGL15.java b/opengl/java/android/opengl/EGL15.java index bd845e7ec1a0..93acc674a4b7 100644 --- a/opengl/java/android/opengl/EGL15.java +++ b/opengl/java/android/opengl/EGL15.java @@ -85,6 +85,19 @@ public final class EGL15 { 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 + ); + // C function EGLBoolean eglDestroySync ( EGLDisplay dpy, EGLSync sync ) public static native boolean eglDestroySync( @@ -101,16 +114,6 @@ public final class EGL15 { long timeout ); - // 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 - ); - // C function EGLDisplay eglGetPlatformDisplay ( EGLenum platform, EGLAttrib native_display, const EGLAttrib *attrib_list ) public static native EGLDisplay eglGetPlatformDisplay( |