Use long for pointers in opengl/EGL classes
EGL classes in frameworks/base have to be updated to support 64-bit platforms. Key changes in the EGL classes include [x] EGLObjectHandle class - EGLObjectHandle class has two public methods (constructor and getHandle) that assume handles are 32-bit. They have not been changed. Instead, two new hidden methods (EGLObjectHandle(long) and getNativeHandle) have been added. [x] EG14 class - Two public methods eglGetDisplay and eglCreatePbufferFromClientBuffer assume that handles are 32-bit. They have been changed to throw unsupported operation exception on non 32-bit machines. Two new methods eglGetDisplay(long) and eglCreatePbufferFromClientBuffer(...long buffer..) have been added to support 64-bit handles. To allow the above changes in frameworks/base EGL classes, corresponding code generation mechanism in frameworks/native has been updated. Change-Id: I5d0a62e10c20ccf05f610d6608b8dfb6414b5116 Signed-off-by: Ashok Bhat <ashok.bhat@arm.com>
This commit is contained in:
parent
d1c87d3702
commit
ab6fc2a86f
@ -57,8 +57,8 @@ public class JType {
|
||||
typeMapping.put(new CType("EGLenum"), new JType("int"));
|
||||
typeMapping.put(new CType("EGLNativePixmapType"), new JType("int"));
|
||||
typeMapping.put(new CType("EGLNativeWindowType"), new JType("int"));
|
||||
typeMapping.put(new CType("EGLNativeDisplayType"), new JType("int"));
|
||||
typeMapping.put(new CType("EGLClientBuffer"), new JType("int"));
|
||||
typeMapping.put(new CType("EGLNativeDisplayType"), new JType("long"));
|
||||
typeMapping.put(new CType("EGLClientBuffer"), new JType("long"));
|
||||
typeMapping.put(new CType("EGLnsecsANDROID"), new JType("long"));
|
||||
|
||||
// EGL nonprimitive types
|
||||
|
@ -22,7 +22,7 @@ package android.opengl;
|
||||
*
|
||||
*/
|
||||
public class EGLConfig extends EGLObjectHandle {
|
||||
private EGLConfig(int handle) {
|
||||
private EGLConfig(long handle) {
|
||||
super(handle);
|
||||
}
|
||||
|
||||
@ -32,6 +32,6 @@ public class EGLConfig extends EGLObjectHandle {
|
||||
if (!(o instanceof EGLConfig)) return false;
|
||||
|
||||
EGLConfig that = (EGLConfig) o;
|
||||
return getHandle() == that.getHandle();
|
||||
return getNativeHandle() == that.getNativeHandle();
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ package android.opengl;
|
||||
*
|
||||
*/
|
||||
public class EGLContext extends EGLObjectHandle {
|
||||
private EGLContext(int handle) {
|
||||
private EGLContext(long handle) {
|
||||
super(handle);
|
||||
}
|
||||
|
||||
@ -32,6 +32,6 @@ public class EGLContext extends EGLObjectHandle {
|
||||
if (!(o instanceof EGLContext)) return false;
|
||||
|
||||
EGLContext that = (EGLContext) o;
|
||||
return getHandle() == that.getHandle();
|
||||
return getNativeHandle() == that.getNativeHandle();
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ package android.opengl;
|
||||
*
|
||||
*/
|
||||
public class EGLDisplay extends EGLObjectHandle {
|
||||
private EGLDisplay(int handle) {
|
||||
private EGLDisplay(long handle) {
|
||||
super(handle);
|
||||
}
|
||||
|
||||
@ -32,6 +32,6 @@ public class EGLDisplay extends EGLObjectHandle {
|
||||
if (!(o instanceof EGLDisplay)) return false;
|
||||
|
||||
EGLDisplay that = (EGLDisplay) o;
|
||||
return getHandle() == that.getHandle();
|
||||
return getNativeHandle() == that.getNativeHandle();
|
||||
}
|
||||
}
|
||||
|
@ -22,12 +22,20 @@ package android.opengl;
|
||||
*
|
||||
*/
|
||||
public abstract class EGLObjectHandle {
|
||||
private final int mHandle;
|
||||
private final long mHandle;
|
||||
|
||||
// TODO Deprecate EGLObjectHandle(int) method
|
||||
protected EGLObjectHandle(int handle) {
|
||||
mHandle = handle;
|
||||
}
|
||||
|
||||
// TODO Unhide the EGLObjectHandle(long) method
|
||||
/**
|
||||
* {@hide}
|
||||
*/
|
||||
protected EGLObjectHandle(long handle) {
|
||||
mHandle = handle;
|
||||
}
|
||||
// TODO Deprecate getHandle() method in favor of getNativeHandle()
|
||||
/**
|
||||
* Returns the native handle of the wrapped EGL object. This handle can be
|
||||
* cast to the corresponding native type on the native side.
|
||||
@ -37,11 +45,27 @@ public abstract class EGLObjectHandle {
|
||||
* @return the native handle of the wrapped EGL object.
|
||||
*/
|
||||
public int getHandle() {
|
||||
return mHandle;
|
||||
if ((mHandle & 0xffffffffL) != mHandle) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
return (int)mHandle;
|
||||
}
|
||||
|
||||
// TODO Unhide getNativeHandle() method
|
||||
/**
|
||||
* {@hide}
|
||||
*/
|
||||
public long getNativeHandle() {
|
||||
return mHandle;
|
||||
}
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return getHandle();
|
||||
/*
|
||||
* Based on the algorithm suggested in
|
||||
* http://developer.android.com/reference/java/lang/Object.html
|
||||
*/
|
||||
int result = 17;
|
||||
result = 31 * result + (int) (mHandle ^ (mHandle >>> 32));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ package android.opengl;
|
||||
*
|
||||
*/
|
||||
public class EGLSurface extends EGLObjectHandle {
|
||||
private EGLSurface(int handle) {
|
||||
private EGLSurface(long handle) {
|
||||
super(handle);
|
||||
}
|
||||
|
||||
@ -32,6 +32,6 @@ public class EGLSurface extends EGLObjectHandle {
|
||||
if (!(o instanceof EGLSurface)) return false;
|
||||
|
||||
EGLSurface that = (EGLSurface) o;
|
||||
return getHandle() == that.getHandle();
|
||||
return getNativeHandle() == that.getNativeHandle();
|
||||
}
|
||||
}
|
||||
|
@ -69,22 +69,22 @@ nativeClassInit(JNIEnv *_env, jclass glImplClass)
|
||||
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");
|
||||
egldisplayGetHandleID = _env->GetMethodID(egldisplayClass, "getNativeHandle", "()J");
|
||||
eglcontextGetHandleID = _env->GetMethodID(eglcontextClass, "getNativeHandle", "()J");
|
||||
eglsurfaceGetHandleID = _env->GetMethodID(eglsurfaceClass, "getNativeHandle", "()J");
|
||||
eglconfigGetHandleID = _env->GetMethodID(eglconfigClass, "getNativeHandle", "()J");
|
||||
|
||||
|
||||
egldisplayConstructor = _env->GetMethodID(egldisplayClass, "<init>", "(I)V");
|
||||
eglcontextConstructor = _env->GetMethodID(eglcontextClass, "<init>", "(I)V");
|
||||
eglsurfaceConstructor = _env->GetMethodID(eglsurfaceClass, "<init>", "(I)V");
|
||||
eglconfigConstructor = _env->GetMethodID(eglconfigClass, "<init>", "(I)V");
|
||||
egldisplayConstructor = _env->GetMethodID(egldisplayClass, "<init>", "(J)V");
|
||||
eglcontextConstructor = _env->GetMethodID(eglcontextClass, "<init>", "(J)V");
|
||||
eglsurfaceConstructor = _env->GetMethodID(eglsurfaceClass, "<init>", "(J)V");
|
||||
eglconfigConstructor = _env->GetMethodID(eglconfigClass, "<init>", "(J)V");
|
||||
|
||||
jobject localeglNoContextObject = _env->NewObject(eglcontextClass, eglcontextConstructor, (jint)EGL_NO_CONTEXT);
|
||||
jobject localeglNoContextObject = _env->NewObject(eglcontextClass, eglcontextConstructor, reinterpret_cast<jlong>(EGL_NO_CONTEXT));
|
||||
eglNoContextObject = _env->NewGlobalRef(localeglNoContextObject);
|
||||
jobject localeglNoDisplayObject = _env->NewObject(egldisplayClass, egldisplayConstructor, (jint)EGL_NO_DISPLAY);
|
||||
jobject localeglNoDisplayObject = _env->NewObject(egldisplayClass, egldisplayConstructor, reinterpret_cast<jlong>(EGL_NO_DISPLAY));
|
||||
eglNoDisplayObject = _env->NewGlobalRef(localeglNoDisplayObject);
|
||||
jobject localeglNoSurfaceObject = _env->NewObject(eglsurfaceClass, eglsurfaceConstructor, (jint)EGL_NO_SURFACE);
|
||||
jobject localeglNoSurfaceObject = _env->NewObject(eglsurfaceClass, eglsurfaceConstructor, reinterpret_cast<jlong>(EGL_NO_SURFACE));
|
||||
eglNoSurfaceObject = _env->NewGlobalRef(localeglNoSurfaceObject);
|
||||
|
||||
|
||||
@ -106,7 +106,8 @@ fromEGLHandle(JNIEnv *_env, jmethodID mid, jobject obj) {
|
||||
"Object is set to null.");
|
||||
}
|
||||
|
||||
return (void*) (_env->CallIntMethod(obj, mid));
|
||||
jlong handle = _env->CallLongMethod(obj, mid);
|
||||
return reinterpret_cast<void*>(handle);
|
||||
}
|
||||
|
||||
static jobject
|
||||
@ -126,7 +127,7 @@ toEGLHandle(JNIEnv *_env, jclass cls, jmethodID con, void * handle) {
|
||||
return eglNoSurfaceObject;
|
||||
}
|
||||
|
||||
return _env->NewObject(cls, con, (jint)handle);
|
||||
return _env->NewObject(cls, con, reinterpret_cast<jlong>(handle));
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
@ -70,22 +70,22 @@ nativeClassInit(JNIEnv *_env, jclass glImplClass)
|
||||
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");
|
||||
egldisplayGetHandleID = _env->GetMethodID(egldisplayClass, "getNativeHandle", "()J");
|
||||
eglcontextGetHandleID = _env->GetMethodID(eglcontextClass, "getNativeHandle", "()J");
|
||||
eglsurfaceGetHandleID = _env->GetMethodID(eglsurfaceClass, "getNativeHandle", "()J");
|
||||
eglconfigGetHandleID = _env->GetMethodID(eglconfigClass, "getNativeHandle", "()J");
|
||||
|
||||
|
||||
egldisplayConstructor = _env->GetMethodID(egldisplayClass, "<init>", "(I)V");
|
||||
eglcontextConstructor = _env->GetMethodID(eglcontextClass, "<init>", "(I)V");
|
||||
eglsurfaceConstructor = _env->GetMethodID(eglsurfaceClass, "<init>", "(I)V");
|
||||
eglconfigConstructor = _env->GetMethodID(eglconfigClass, "<init>", "(I)V");
|
||||
egldisplayConstructor = _env->GetMethodID(egldisplayClass, "<init>", "(J)V");
|
||||
eglcontextConstructor = _env->GetMethodID(eglcontextClass, "<init>", "(J)V");
|
||||
eglsurfaceConstructor = _env->GetMethodID(eglsurfaceClass, "<init>", "(J)V");
|
||||
eglconfigConstructor = _env->GetMethodID(eglconfigClass, "<init>", "(J)V");
|
||||
|
||||
jobject localeglNoContextObject = _env->NewObject(eglcontextClass, eglcontextConstructor, (jint)EGL_NO_CONTEXT);
|
||||
jobject localeglNoContextObject = _env->NewObject(eglcontextClass, eglcontextConstructor, reinterpret_cast<jlong>(EGL_NO_CONTEXT));
|
||||
eglNoContextObject = _env->NewGlobalRef(localeglNoContextObject);
|
||||
jobject localeglNoDisplayObject = _env->NewObject(egldisplayClass, egldisplayConstructor, (jint)EGL_NO_DISPLAY);
|
||||
jobject localeglNoDisplayObject = _env->NewObject(egldisplayClass, egldisplayConstructor, reinterpret_cast<jlong>(EGL_NO_DISPLAY));
|
||||
eglNoDisplayObject = _env->NewGlobalRef(localeglNoDisplayObject);
|
||||
jobject localeglNoSurfaceObject = _env->NewObject(eglsurfaceClass, eglsurfaceConstructor, (jint)EGL_NO_SURFACE);
|
||||
jobject localeglNoSurfaceObject = _env->NewObject(eglsurfaceClass, eglsurfaceConstructor, reinterpret_cast<jlong>(EGL_NO_SURFACE));
|
||||
eglNoSurfaceObject = _env->NewGlobalRef(localeglNoSurfaceObject);
|
||||
|
||||
|
||||
@ -107,7 +107,7 @@ fromEGLHandle(JNIEnv *_env, jmethodID mid, jobject obj) {
|
||||
"Object is set to null.");
|
||||
}
|
||||
|
||||
return (void*) (_env->CallIntMethod(obj, mid));
|
||||
return reinterpret_cast<void*>(_env->CallLongMethod(obj, mid));
|
||||
}
|
||||
|
||||
static jobject
|
||||
@ -127,7 +127,7 @@ toEGLHandle(JNIEnv *_env, jclass cls, jmethodID con, void * handle) {
|
||||
return eglNoSurfaceObject;
|
||||
}
|
||||
|
||||
return _env->NewObject(cls, con, (jint)handle);
|
||||
return _env->NewObject(cls, con, reinterpret_cast<jlong>(handle));
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
74
opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.cpp
Executable file
74
opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.cpp
Executable file
@ -0,0 +1,74 @@
|
||||
/* EGLSurface eglCreatePbufferFromClientBuffer ( EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list ) */
|
||||
static jobject
|
||||
android_eglCreatePbufferFromClientBuffer
|
||||
(JNIEnv *_env, jobject _this, jobject dpy, jint buftype, jlong buffer, jobject config, jintArray attrib_list_ref, jint offset) {
|
||||
jint _exception = 0;
|
||||
const char * _exceptionType = NULL;
|
||||
const char * _exceptionMessage = NULL;
|
||||
EGLSurface _returnValue = (EGLSurface) 0;
|
||||
EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy);
|
||||
EGLConfig config_native = (EGLConfig) fromEGLHandle(_env, eglconfigGetHandleID, config);
|
||||
bool attrib_list_sentinel = false;
|
||||
EGLint *attrib_list_base = (EGLint *) 0;
|
||||
jint _remaining;
|
||||
EGLint *attrib_list = (EGLint *) 0;
|
||||
|
||||
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 = (EGLint *)
|
||||
_env->GetPrimitiveArrayCritical(attrib_list_ref, (jboolean *)0);
|
||||
attrib_list = attrib_list_base + offset;
|
||||
attrib_list_sentinel = false;
|
||||
for (int i = _remaining - 1; i >= 0; i--) {
|
||||
if (attrib_list[i] == EGL_NONE){
|
||||
attrib_list_sentinel = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (attrib_list_sentinel == false) {
|
||||
_exception = 1;
|
||||
_exceptionType = "java/lang/IllegalArgumentException";
|
||||
_exceptionMessage = "attrib_list must contain EGL_NONE!";
|
||||
goto exit;
|
||||
}
|
||||
|
||||
_returnValue = eglCreatePbufferFromClientBuffer(
|
||||
(EGLDisplay)dpy_native,
|
||||
(EGLenum)buftype,
|
||||
reinterpret_cast<EGLClientBuffer>(buffer),
|
||||
(EGLConfig)config_native,
|
||||
(EGLint *)attrib_list
|
||||
);
|
||||
|
||||
exit:
|
||||
if (attrib_list_base) {
|
||||
_env->ReleasePrimitiveArrayCritical(attrib_list_ref, attrib_list_base,
|
||||
JNI_ABORT);
|
||||
}
|
||||
if (_exception) {
|
||||
jniThrowException(_env, _exceptionType, _exceptionMessage);
|
||||
}
|
||||
return toEGLHandle(_env, eglsurfaceClass, eglsurfaceConstructor, _returnValue);
|
||||
}
|
||||
|
||||
static jobject
|
||||
android_eglCreatePbufferFromClientBufferInt
|
||||
(JNIEnv *_env, jobject _this, jobject dpy, jint buftype, jint buffer, jobject config, jintArray attrib_list_ref, jint offset) {
|
||||
if(sizeof(void*) != sizeof(uint32_t)) {
|
||||
jniThrowException(_env, "java/lang/UnsupportedOperationException", "eglCreatePbufferFromClientBuffer");
|
||||
return 0;
|
||||
}
|
||||
return android_eglCreatePbufferFromClientBuffer(_env, _this, dpy, buftype, buffer, config, attrib_list_ref, offset);
|
||||
}
|
||||
|
23
opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.java
Executable file
23
opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.java
Executable file
@ -0,0 +1,23 @@
|
||||
// C function EGLSurface eglCreatePbufferFromClientBuffer ( EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list )
|
||||
// TODO Deprecate the below method
|
||||
public static native EGLSurface eglCreatePbufferFromClientBuffer(
|
||||
EGLDisplay dpy,
|
||||
int buftype,
|
||||
int buffer,
|
||||
EGLConfig config,
|
||||
int[] attrib_list,
|
||||
int offset
|
||||
);
|
||||
// TODO Unhide the below method
|
||||
/**
|
||||
* {@hide}
|
||||
*/
|
||||
public static native EGLSurface eglCreatePbufferFromClientBuffer(
|
||||
EGLDisplay dpy,
|
||||
int buftype,
|
||||
long buffer,
|
||||
EGLConfig config,
|
||||
int[] attrib_list,
|
||||
int offset
|
||||
);
|
||||
|
2
opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.nativeReg
Executable file
2
opengl/tools/glgen/stubs/egl/eglCreatePbufferFromClientBuffer.nativeReg
Executable file
@ -0,0 +1,2 @@
|
||||
{"eglCreatePbufferFromClientBuffer", "(Landroid/opengl/EGLDisplay;IILandroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePbufferFromClientBufferInt },
|
||||
{"eglCreatePbufferFromClientBuffer", "(Landroid/opengl/EGLDisplay;IJLandroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;", (void *) android_eglCreatePbufferFromClientBuffer },
|
23
opengl/tools/glgen/stubs/egl/eglGetDisplay.cpp
Executable file
23
opengl/tools/glgen/stubs/egl/eglGetDisplay.cpp
Executable file
@ -0,0 +1,23 @@
|
||||
/* EGLDisplay eglGetDisplay ( EGLNativeDisplayType display_id ) */
|
||||
static jobject
|
||||
android_eglGetDisplay
|
||||
(JNIEnv *_env, jobject _this, jlong display_id) {
|
||||
EGLDisplay _returnValue = (EGLDisplay) 0;
|
||||
_returnValue = eglGetDisplay(
|
||||
reinterpret_cast<EGLNativeDisplayType>(display_id)
|
||||
);
|
||||
return toEGLHandle(_env, egldisplayClass, egldisplayConstructor, _returnValue);
|
||||
}
|
||||
|
||||
/* EGLDisplay eglGetDisplay ( EGLNativeDisplayType display_id ) */
|
||||
static jobject
|
||||
android_eglGetDisplayInt
|
||||
(JNIEnv *_env, jobject _this, jint display_id) {
|
||||
|
||||
if (sizeof(void*) != sizeof(uint32_t)) {
|
||||
jniThrowException(_env, "java/lang/UnsupportedOperationException", "eglGetDisplay");
|
||||
return 0;
|
||||
}
|
||||
return android_eglGetDisplay(_env, _this, display_id);
|
||||
}
|
||||
|
14
opengl/tools/glgen/stubs/egl/eglGetDisplay.java
Executable file
14
opengl/tools/glgen/stubs/egl/eglGetDisplay.java
Executable file
@ -0,0 +1,14 @@
|
||||
// C function EGLDisplay eglGetDisplay ( EGLNativeDisplayType display_id )
|
||||
// TODO Deprecate the eglGetDisplay(int) API method
|
||||
|
||||
public static native EGLDisplay eglGetDisplay(
|
||||
int display_id
|
||||
);
|
||||
// TODO Unhide the eglGetDisplay(long) API method
|
||||
/**
|
||||
* {@hide}
|
||||
*/
|
||||
public static native EGLDisplay eglGetDisplay(
|
||||
long display_id
|
||||
);
|
||||
|
2
opengl/tools/glgen/stubs/egl/eglGetDisplay.nativeReg
Executable file
2
opengl/tools/glgen/stubs/egl/eglGetDisplay.nativeReg
Executable file
@ -0,0 +1,2 @@
|
||||
{"eglGetDisplay", "(I)Landroid/opengl/EGLDisplay;", (void *) android_eglGetDisplayInt },
|
||||
{"eglGetDisplay", "(J)Landroid/opengl/EGLDisplay;", (void *) android_eglGetDisplay },
|
Loading…
Reference in New Issue
Block a user