com_google_android_gles_jni_EGLImpl.cpp revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <EGL/egl.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES/gl.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/EGLNativeWindowSurface.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/Surface.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <SkBitmap.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <SkPixelRef.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jclass gDisplay_class;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jclass gContext_class;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jclass gSurface_class;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jclass gConfig_class;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jmethodID gConfig_ctorID;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gDisplay_EGLDisplayFieldID;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gContext_EGLContextFieldID;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gSurface_EGLSurfaceFieldID;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gSurface_NativePixelRefFieldID;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gConfig_EGLConfigFieldID;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gSurface_SurfaceFieldID;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gBitmap_NativeBitmapFieldID;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic __attribute__((noinline))
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid doThrow(JNIEnv* env, const char* exc, const char* msg = NULL)
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass npeClazz = env->FindClass(exc);
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ThrowNew(npeClazz, msg);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic __attribute__((noinline))
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool hasException(JNIEnv *env) {
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (env->ExceptionCheck() != 0) {
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ExceptionDescribe();
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic __attribute__((noinline))
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjclass make_globalref(JNIEnv* env, const char classname[]) {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass c = env->FindClass(classname);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jclass)env->NewGlobalRef(c);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline EGLDisplay getDisplay(JNIEnv* env, jobject o) {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!o) return EGL_NO_DISPLAY;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (EGLDisplay)env->GetIntField(o, gDisplay_EGLDisplayFieldID);
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline EGLSurface getSurface(JNIEnv* env, jobject o) {
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!o) return EGL_NO_SURFACE;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (EGLSurface)env->GetIntField(o, gSurface_EGLSurfaceFieldID);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline EGLContext getContext(JNIEnv* env, jobject o) {
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!o) return EGL_NO_CONTEXT;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (EGLContext)env->GetIntField(o, gContext_EGLContextFieldID);
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline EGLConfig getConfig(JNIEnv* env, jobject o) {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!o) return 0;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (EGLConfig)env->GetIntField(o, gConfig_EGLConfigFieldID);
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void nativeClassInit(JNIEnv *_env, jclass eglImplClass)
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gDisplay_class = make_globalref(_env, "com/google/android/gles_jni/EGLDisplayImpl");
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gContext_class = make_globalref(_env, "com/google/android/gles_jni/EGLContextImpl");
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gSurface_class = make_globalref(_env, "com/google/android/gles_jni/EGLSurfaceImpl");
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gConfig_class  = make_globalref(_env, "com/google/android/gles_jni/EGLConfigImpl");
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gConfig_ctorID  = _env->GetMethodID(gConfig_class,  "<init>", "(I)V");
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gDisplay_EGLDisplayFieldID = _env->GetFieldID(gDisplay_class, "mEGLDisplay", "I");
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gContext_EGLContextFieldID = _env->GetFieldID(gContext_class, "mEGLContext", "I");
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gSurface_EGLSurfaceFieldID = _env->GetFieldID(gSurface_class, "mEGLSurface", "I");
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gSurface_NativePixelRefFieldID = _env->GetFieldID(gSurface_class, "mNativePixelRef", "I");
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gConfig_EGLConfigFieldID   = _env->GetFieldID(gConfig_class,  "mEGLConfig",  "I");
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass surface_class = _env->FindClass("android/view/Surface");
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gSurface_SurfaceFieldID = _env->GetFieldID(surface_class, "mSurface", "I");
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass bitmap_class = _env->FindClass("android/graphics/Bitmap");
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gBitmap_NativeBitmapFieldID = _env->GetFieldID(bitmap_class, "mNativeBitmap", "I");
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean jni_eglInitialize(JNIEnv *_env, jobject _this, jobject display,
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jintArray major_minor) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jboolean success = eglInitialize(dpy, NULL, NULL);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (success && major_minor) {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int len = _env->GetArrayLength(major_minor);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (len) {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we're exposing only EGL 1.0
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jint* base = (jint *)_env->GetPrimitiveArrayCritical(major_minor, (jboolean *)0);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (len >= 1) base[0] = 1;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (len >= 2) base[1] = 0;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            _env->ReleasePrimitiveArrayCritical(major_minor, base, JNI_ABORT);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return success;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean jni_eglQueryContext(JNIEnv *_env, jobject _this, jobject display,
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobject context, jint attribute, jintArray value) {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext ctx = getContext(_env, context);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (value == NULL) {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        doThrow(_env, "java/lang/NullPointerException");
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jboolean success = JNI_FALSE;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int len = _env->GetArrayLength(value);
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (len) {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jint* base = (jint *)_env->GetPrimitiveArrayCritical(value, (jboolean *)0);
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        success = eglQueryContext(dpy, ctx, attribute, base);
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _env->ReleasePrimitiveArrayCritical(value, base, JNI_ABORT);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return success;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean jni_eglQuerySurface(JNIEnv *_env, jobject _this, jobject display,
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobject surface, jint attribute, jintArray value) {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext sur = getSurface(_env, surface);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (value == NULL) {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        doThrow(_env, "java/lang/NullPointerException");
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jboolean success = JNI_FALSE;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int len = _env->GetArrayLength(value);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (len) {
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jint* base = (jint *)_env->GetPrimitiveArrayCritical(value, (jboolean *)0);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        success = eglQuerySurface(dpy, sur, attribute, base);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _env->ReleasePrimitiveArrayCritical(value, base, JNI_ABORT);
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return success;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean jni_eglChooseConfig(JNIEnv *_env, jobject _this, jobject display,
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jintArray attrib_list, jobjectArray configs, jint config_size, jintArray num_config) {
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrib_list==NULL || configs==NULL || num_config==NULL) {
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        doThrow(_env, "java/lang/NullPointerException");
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jboolean success = JNI_FALSE;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* attrib_base  = (jint *)_env->GetPrimitiveArrayCritical(attrib_list, (jboolean *)0);
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* num_base     = (jint *)_env->GetPrimitiveArrayCritical(num_config, (jboolean *)0);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLConfig nativeConfigs[config_size];
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    success = eglChooseConfig(dpy, attrib_base, nativeConfigs, config_size, num_base);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int num = num_base[0];
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _env->ReleasePrimitiveArrayCritical(num_config, num_base, JNI_ABORT);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _env->ReleasePrimitiveArrayCritical(attrib_list, attrib_base, JNI_ABORT);
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (success) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0 ; i<num ; i++) {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jobject obj = _env->NewObject(gConfig_class, gConfig_ctorID, (jint)nativeConfigs[i]);
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            _env->SetObjectArrayElement(configs, i, obj);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return success;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint jni_eglCreateContext(JNIEnv *_env, jobject _this, jobject display,
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobject config, jobject share_context, jintArray attrib_list) {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLConfig  cnf = getConfig(_env, config);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext shr = getContext(_env, share_context);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* base = 0;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrib_list) {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // XXX: if array is malformed, we should return an NPE instead of segfault
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        base = (jint *)_env->GetPrimitiveArrayCritical(attrib_list, (jboolean *)0);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext ctx = eglCreateContext(dpy, cnf, shr, base);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrib_list) {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _env->ReleasePrimitiveArrayCritical(attrib_list, base, JNI_ABORT);
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)ctx;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint jni_eglCreatePbufferSurface(JNIEnv *_env, jobject _this, jobject display,
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobject config, jintArray attrib_list) {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLConfig  cnf = getConfig(_env, config);
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* base = 0;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrib_list) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // XXX: if array is malformed, we should return an NPE instead of segfault
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        base = (jint *)_env->GetPrimitiveArrayCritical(attrib_list, (jboolean *)0);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurface sur = eglCreatePbufferSurface(dpy, cnf, base);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrib_list) {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _env->ReleasePrimitiveArrayCritical(attrib_list, base, JNI_ABORT);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)sur;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic PixelFormat convertPixelFormat(SkBitmap::Config format)
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (format) {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case SkBitmap::kARGB_8888_Config:   return PIXEL_FORMAT_RGBA_8888;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case SkBitmap::kARGB_4444_Config:   return PIXEL_FORMAT_RGBA_4444;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case SkBitmap::kRGB_565_Config:     return PIXEL_FORMAT_RGB_565;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case SkBitmap::kA8_Config:          return PIXEL_FORMAT_A_8;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:                            return PIXEL_FORMAT_NONE;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid jni_eglCreatePixmapSurface(JNIEnv *_env, jobject _this, jobject out_sur,
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobject display, jobject config, jobject native_pixmap,
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jintArray attrib_list)
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLConfig  cnf = getConfig(_env, config);
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* base = 0;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkBitmap const * nativeBitmap =
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (SkBitmap const *)_env->GetIntField(native_pixmap,
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    gBitmap_NativeBitmapFieldID);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkPixelRef* ref = nativeBitmap ? nativeBitmap->pixelRef() : 0;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ref == NULL) {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        doThrow(_env, "java/lang/NullPointerException", "Bitmap has no PixelRef");
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ref->safeRef();
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ref->lockPixels();
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_native_pixmap_t pixmap;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pixmap.version = sizeof(pixmap);
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pixmap.width  = nativeBitmap->width();
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pixmap.height = nativeBitmap->height();
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pixmap.stride = nativeBitmap->rowBytes() / nativeBitmap->bytesPerPixel();
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pixmap.format = convertPixelFormat(nativeBitmap->config());
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pixmap.data   = (uint8_t*)ref->pixels();
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrib_list) {
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // XXX: if array is malformed, we should return an NPE instead of segfault
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        base = (jint *)_env->GetPrimitiveArrayCritical(attrib_list, (jboolean *)0);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurface sur = eglCreatePixmapSurface(dpy, cnf, &pixmap, base);
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrib_list) {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _env->ReleasePrimitiveArrayCritical(attrib_list, base, JNI_ABORT);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sur != EGL_NO_SURFACE) {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _env->SetIntField(out_sur, gSurface_EGLSurfaceFieldID, (int)sur);
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _env->SetIntField(out_sur, gSurface_NativePixelRefFieldID, (int)ref);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ref->unlockPixels();
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ref->safeUnref();
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint jni_eglCreateWindowSurface(JNIEnv *_env, jobject _this, jobject display,
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobject config, jobject native_window, jintArray attrib_list) {
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext cnf = getConfig(_env, config);
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Surface* window = 0;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (native_window == NULL) {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnot_valid_surface:
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        doThrow(_env, "java/lang/NullPointerException",
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Make sure the SurfaceView or associated SurfaceHolder has a valid Surface");
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    window = (Surface*)_env->GetIntField(native_window, gSurface_SurfaceFieldID);
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (window == NULL)
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto not_valid_surface;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* base = 0;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrib_list) {
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // XXX: if array is malformed, we should return an NPE instead of segfault
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        base = (jint *)_env->GetPrimitiveArrayCritical(attrib_list, (jboolean *)0);
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurface sur = eglCreateWindowSurface(dpy, cnf, new EGLNativeWindowSurface(window), base);
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrib_list) {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _env->ReleasePrimitiveArrayCritical(attrib_list, base, JNI_ABORT);
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)sur;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean jni_eglGetConfigAttrib(JNIEnv *_env, jobject _this, jobject display,
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobject config, jint attribute, jintArray value) {
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext cnf = getConfig(_env, config);
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (value == NULL) {
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        doThrow(_env, "java/lang/NullPointerException");
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jboolean success = JNI_FALSE;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int len = _env->GetArrayLength(value);
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (len) {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jint* base = (jint *)_env->GetPrimitiveArrayCritical(value, (jboolean *)0);
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        success = eglGetConfigAttrib(dpy, cnf, attribute, base);
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _env->ReleasePrimitiveArrayCritical(value, base, JNI_ABORT);
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return success;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean jni_eglGetConfigs(JNIEnv *_env, jobject _this, jobject display,
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobjectArray configs, jint config_size, jintArray num_config) {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jboolean success = JNI_FALSE;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (num_config == NULL) {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        doThrow(_env, "java/lang/NullPointerException");
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* num_base = (jint *)_env->GetPrimitiveArrayCritical(num_config, (jboolean *)0);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLConfig nativeConfigs[config_size];
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    success = eglGetConfigs(dpy, configs ? nativeConfigs : 0, config_size, num_base);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int num = num_base[0];
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _env->ReleasePrimitiveArrayCritical(num_config, num_base, JNI_ABORT);
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (success && configs) {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0 ; i<num ; i++) {
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jobject obj = _env->NewObject(gConfig_class, gConfig_ctorID, (jint)nativeConfigs[i]);
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            _env->SetObjectArrayElement(configs, i, obj);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return success;
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint jni_eglGetError(JNIEnv *_env, jobject _this) {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint error = eglGetError();
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return error;
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint jni_eglGetCurrentContext(JNIEnv *_env, jobject _this) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)eglGetCurrentContext();
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint jni_eglGetCurrentDisplay(JNIEnv *_env, jobject _this) {
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)eglGetCurrentDisplay();
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint jni_eglGetCurrentSurface(JNIEnv *_env, jobject _this, jint readdraw) {
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)eglGetCurrentSurface(readdraw);
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean jni_eglDestroyContext(JNIEnv *_env, jobject _this, jobject display, jobject context) {
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext ctx = getContext(_env, context);
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return eglDestroyContext(dpy, ctx);
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean jni_eglDestroySurface(JNIEnv *_env, jobject _this, jobject display, jobject surface) {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurface sur = getSurface(_env, surface);
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sur) {
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkPixelRef* ref = (SkPixelRef*)(_env->GetIntField(surface,
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                gSurface_NativePixelRefFieldID));
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ref) {
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ref->unlockPixels();
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ref->safeUnref();
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return eglDestroySurface(dpy, sur);
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint jni_eglGetDisplay(JNIEnv *_env, jobject _this, jobject native_display) {
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)eglGetDisplay(EGL_DEFAULT_DISPLAY);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean jni_eglMakeCurrent(JNIEnv *_env, jobject _this, jobject display, jobject draw, jobject read, jobject context) {
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurface sdr = getSurface(_env, draw);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurface srd = getSurface(_env, read);
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext ctx = getContext(_env, context);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return eglMakeCurrent(dpy, sdr, srd, ctx);
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjstring jni_eglQueryString(JNIEnv *_env, jobject _this, jobject display, jint name) {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* chars = eglQueryString(dpy, name);
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return _env->NewStringUTF(chars);
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean jni_eglSwapBuffers(JNIEnv *_env, jobject _this, jobject display, jobject surface) {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurface sur = getSurface(_env, surface);
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return eglSwapBuffers(dpy, sur);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean jni_eglTerminate(JNIEnv *_env, jobject _this, jobject display) {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay dpy = getDisplay(_env, display);
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return eglTerminate(dpy);
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean jni_eglCopyBuffers(JNIEnv *_env, jobject _this, jobject display,
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobject surface, jobject native_pixmap) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: implement me
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return JNI_FALSE;
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean jni_eglWaitGL(JNIEnv *_env, jobject _this) {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return eglWaitGL();
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjboolean jni_eglWaitNative(JNIEnv *_env, jobject _this, jint engine, jobject bindTarget) {
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return eglWaitNative(engine);
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char *classPathName = "com/google/android/gles_jni/EGLImpl";
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define DISPLAY "Ljavax/microedition/khronos/egl/EGLDisplay;"
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define CONTEXT "Ljavax/microedition/khronos/egl/EGLContext;"
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define CONFIG  "Ljavax/microedition/khronos/egl/EGLConfig;"
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define SURFACE "Ljavax/microedition/khronos/egl/EGLSurface;"
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define OBJECT  "Ljava/lang/Object;"
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define STRING  "Ljava/lang/String;"
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod methods[] = {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"_nativeClassInit","()V", (void*)nativeClassInit },
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglWaitGL",       "()Z", (void*)jni_eglWaitGL },
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglInitialize",   "(" DISPLAY "[I)Z", (void*)jni_eglInitialize },
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglQueryContext", "(" DISPLAY CONTEXT "I[I)Z", (void*)jni_eglQueryContext },
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglQuerySurface", "(" DISPLAY SURFACE "I[I)Z", (void*)jni_eglQuerySurface },
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglChooseConfig", "(" DISPLAY "[I[" CONFIG "I[I)Z", (void*)jni_eglChooseConfig },
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"_eglCreateContext","(" DISPLAY CONFIG CONTEXT "[I)I", (void*)jni_eglCreateContext },
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglGetConfigs",   "(" DISPLAY "[" CONFIG "I[I)Z", (void*)jni_eglGetConfigs },
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglTerminate",    "(" DISPLAY ")Z", (void*)jni_eglTerminate },
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglCopyBuffers",  "(" DISPLAY SURFACE OBJECT ")Z", (void*)jni_eglCopyBuffers },
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglWaitNative",   "(I" OBJECT ")Z", (void*)jni_eglWaitNative },
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglGetError",     "()I", (void*)jni_eglGetError },
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglGetConfigAttrib", "(" DISPLAY CONFIG "I[I)Z", (void*)jni_eglGetConfigAttrib },
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"_eglGetDisplay",   "(" OBJECT ")I", (void*)jni_eglGetDisplay },
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"_eglGetCurrentContext",  "()I", (void*)jni_eglGetCurrentContext },
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"_eglGetCurrentDisplay",  "()I", (void*)jni_eglGetCurrentDisplay },
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"_eglGetCurrentSurface",  "(I)I", (void*)jni_eglGetCurrentSurface },
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"_eglCreatePbufferSurface","(" DISPLAY CONFIG "[I)I", (void*)jni_eglCreatePbufferSurface },
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"_eglCreatePixmapSurface", "(" SURFACE DISPLAY CONFIG OBJECT "[I)V", (void*)jni_eglCreatePixmapSurface },
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"_eglCreateWindowSurface", "(" DISPLAY CONFIG OBJECT "[I)I", (void*)jni_eglCreateWindowSurface },
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglDestroyContext",      "(" DISPLAY CONTEXT ")Z", (void*)jni_eglDestroyContext },
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglDestroySurface",      "(" DISPLAY SURFACE ")Z", (void*)jni_eglDestroySurface },
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglMakeCurrent",         "(" DISPLAY SURFACE SURFACE CONTEXT")Z", (void*)jni_eglMakeCurrent },
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglQueryString",         "(" DISPLAY "I)" STRING, (void*)jni_eglQueryString },
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{"eglSwapBuffers",         "(" DISPLAY SURFACE ")Z", (void*)jni_eglSwapBuffers },
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // namespace android
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_com_google_android_gles_jni_EGLImpl(JNIEnv *_env)
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int err;
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    err = android::AndroidRuntime::registerNativeMethods(_env,
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            android::classPathName, android::methods, NELEM(android::methods));
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return err;
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
471