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 Projectpackage com.google.android.gles_jni;
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport javax.microedition.khronos.egl.*;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Surface;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceView;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceHolder;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class EGLImpl implements EGL10 {
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private EGLContextImpl mContext = new EGLContextImpl(-1);
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private EGLDisplayImpl mDisplay = new EGLDisplayImpl(-1);
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private EGLSurfaceImpl mSurface = new EGLSurfaceImpl(-1);
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglInitialize(EGLDisplay display, int[] major_minor);
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglQueryContext(EGLDisplay display, EGLContext context, int attribute, int[] value);
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglQuerySurface(EGLDisplay display, EGLSurface surface, int attribute, int[] value);
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglChooseConfig(EGLDisplay display, int[] attrib_list, EGLConfig[] configs, int config_size, int[] num_config);
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglGetConfigAttrib(EGLDisplay display, EGLConfig config, int attribute, int[] value);
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglGetConfigs(EGLDisplay display, EGLConfig[] configs, int config_size, int[] num_config);
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native int         eglGetError();
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglDestroyContext(EGLDisplay display, EGLContext context);
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglDestroySurface(EGLDisplay display, EGLSurface surface);
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context);
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native String      eglQueryString(EGLDisplay display, int name);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglSwapBuffers(EGLDisplay display, EGLSurface surface);
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglTerminate(EGLDisplay display);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglCopyBuffers(EGLDisplay display, EGLSurface surface, Object native_pixmap);
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglWaitGL();
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglWaitNative(int engine, Object bindTarget);
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public EGLContext eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list) {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new EGLContextImpl( _eglCreateContext(display, config, share_context, attrib_list) );
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public EGLSurface eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list) {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new EGLSurfaceImpl( _eglCreatePbufferSurface(display, config, attrib_list) );
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public EGLSurface eglCreatePixmapSurface(EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list) {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLSurfaceImpl sur = new EGLSurfaceImpl();
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _eglCreatePixmapSurface(sur, display, config, native_pixmap, attrib_list);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sur;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public EGLSurface eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list) {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface sur;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (native_window instanceof SurfaceView) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SurfaceView surfaceView = (SurfaceView)native_window;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sur = surfaceView.getHolder().getSurface();
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (native_window instanceof SurfaceHolder) {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SurfaceHolder holder = (SurfaceHolder)native_window;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sur = holder.getSurface();
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new java.lang.UnsupportedOperationException(
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "eglCreateWindowSurface() can only be called with an instance of " +
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SurfaceView or SurfaceHolder at the moment, this will be fixed later.");
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new EGLSurfaceImpl( _eglCreateWindowSurface(display, config, sur, attrib_list) );
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public synchronized EGLDisplay eglGetDisplay(Object native_display) {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int value = _eglGetDisplay(native_display);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDisplay.mEGLDisplay != value)
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDisplay = new EGLDisplayImpl(value);
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDisplay;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public synchronized EGLContext eglGetCurrentContext() {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int value = _eglGetCurrentContext();
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mContext.mEGLContext != value)
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext = new EGLContextImpl(value);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContext;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public synchronized EGLDisplay eglGetCurrentDisplay() {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int value = _eglGetCurrentDisplay();
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDisplay.mEGLDisplay != value)
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDisplay = new EGLDisplayImpl(value);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDisplay;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public synchronized EGLSurface eglGetCurrentSurface(int readdraw) {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int value = _eglGetCurrentSurface(readdraw);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSurface.mEGLSurface != value)
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurface = new EGLSurfaceImpl(value);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSurface;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native int _eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native int _eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list);
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void _eglCreatePixmapSurface(EGLSurface sur, EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list);
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native int _eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native int _eglGetDisplay(Object native_display);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native int _eglGetCurrentContext();
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native int _eglGetCurrentDisplay();
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native int _eglGetCurrentSurface(int readdraw);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native private static void _nativeClassInit();
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static { _nativeClassInit(); }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
119