19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
2c086ca1fa7cebc3e9a51abd4be4688346225c2e4Dan Bornstein * Copyright (C) 2006 The Android Open Source Project
3c086ca1fa7cebc3e9a51abd4be4688346225c2e4Dan Bornstein *
4c086ca1fa7cebc3e9a51abd4be4688346225c2e4Dan Bornstein * Licensed under the Apache License, Version 2.0 (the "License");
5c086ca1fa7cebc3e9a51abd4be4688346225c2e4Dan Bornstein * you may not use this file except in compliance with the License.
6c086ca1fa7cebc3e9a51abd4be4688346225c2e4Dan Bornstein * You may obtain a copy of the License at
7c086ca1fa7cebc3e9a51abd4be4688346225c2e4Dan Bornstein *
8c086ca1fa7cebc3e9a51abd4be4688346225c2e4Dan Bornstein *      http://www.apache.org/licenses/LICENSE-2.0
9c086ca1fa7cebc3e9a51abd4be4688346225c2e4Dan Bornstein *
10c086ca1fa7cebc3e9a51abd4be4688346225c2e4Dan Bornstein * Unless required by applicable law or agreed to in writing, software
11c086ca1fa7cebc3e9a51abd4be4688346225c2e4Dan Bornstein * distributed under the License is distributed on an "AS IS" BASIS,
12c086ca1fa7cebc3e9a51abd4be4688346225c2e4Dan Bornstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c086ca1fa7cebc3e9a51abd4be4688346225c2e4Dan Bornstein * See the License for the specific language governing permissions and
14c086ca1fa7cebc3e9a51abd4be4688346225c2e4Dan Bornstein * limitations under the License.
15c086ca1fa7cebc3e9a51abd4be4688346225c2e4Dan Bornstein */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.google.android.gles_jni;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport javax.microedition.khronos.egl.*;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
218f0095cd33558e9cc8a440047908e53b68906f5fRomain Guyimport android.graphics.SurfaceTexture;
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 Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class EGLImpl implements EGL10 {
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private EGLContextImpl mContext = new EGLContextImpl(-1);
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private EGLDisplayImpl mDisplay = new EGLDisplayImpl(-1);
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private EGLSurfaceImpl mSurface = new EGLSurfaceImpl(-1);
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglInitialize(EGLDisplay display, int[] major_minor);
32d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich    public native boolean     eglQueryContext(EGLDisplay display, EGLContext context, int attribute, int[] value);
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglQuerySurface(EGLDisplay display, EGLSurface surface, int attribute, int[] value);
348ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    /** @hide **/
358ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    public native boolean     eglReleaseThread();
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglChooseConfig(EGLDisplay display, int[] attrib_list, EGLConfig[] configs, int config_size, int[] num_config);
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglGetConfigAttrib(EGLDisplay display, EGLConfig config, int attribute, int[] value);
38d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich    public native boolean     eglGetConfigs(EGLDisplay display, EGLConfig[] configs, int config_size, int[] num_config);
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native int         eglGetError();
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglDestroyContext(EGLDisplay display, EGLContext context);
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglDestroySurface(EGLDisplay display, EGLSurface surface);
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native String      eglQueryString(EGLDisplay display, int name);
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglSwapBuffers(EGLDisplay display, EGLSurface surface);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglTerminate(EGLDisplay display);
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglCopyBuffers(EGLDisplay display, EGLSurface surface, Object native_pixmap);
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglWaitGL();
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean     eglWaitNative(int engine, Object bindTarget);
498ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
508ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    /** @hide **/
518ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    public static native int  getInitCount(EGLDisplay display);
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public EGLContext eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list) {
54d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        int eglContextId = _eglCreateContext(display, config, share_context, attrib_list);
55d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        if (eglContextId == 0) {
56d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich            return EGL10.EGL_NO_CONTEXT;
57d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        }
58d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        return new EGLContextImpl( eglContextId );
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public EGLSurface eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list) {
62d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        int eglSurfaceId = _eglCreatePbufferSurface(display, config, attrib_list);
63d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        if (eglSurfaceId == 0) {
64d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich            return EGL10.EGL_NO_SURFACE;
65d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        }
66d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        return new EGLSurfaceImpl( eglSurfaceId );
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
68d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public EGLSurface eglCreatePixmapSurface(EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list) {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLSurfaceImpl sur = new EGLSurfaceImpl();
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _eglCreatePixmapSurface(sur, display, config, native_pixmap, attrib_list);
72d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        if (sur.mEGLSurface == 0) {
73d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich            return EGL10.EGL_NO_SURFACE;
74d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sur;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public EGLSurface eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list) {
798f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy        Surface sur = null;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (native_window instanceof SurfaceView) {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SurfaceView surfaceView = (SurfaceView)native_window;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sur = surfaceView.getHolder().getSurface();
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (native_window instanceof SurfaceHolder) {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SurfaceHolder holder = (SurfaceHolder)native_window;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sur = holder.getSurface();
86786fc93d71b833ab6b02b0c7ea5e30f25cceeedfRomain Guy        } else if (native_window instanceof Surface) {
87786fc93d71b833ab6b02b0c7ea5e30f25cceeedfRomain Guy            sur = (Surface) native_window;
888f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy        }
898f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy
908f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy        int eglSurfaceId;
918f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy        if (sur != null) {
928f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy            eglSurfaceId = _eglCreateWindowSurface(display, config, sur, attrib_list);
938f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy        } else if (native_window instanceof SurfaceTexture) {
948f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy            eglSurfaceId = _eglCreateWindowSurfaceTexture(display, config,
958ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy                    native_window, attrib_list);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new java.lang.UnsupportedOperationException(
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "eglCreateWindowSurface() can only be called with an instance of " +
99786fc93d71b833ab6b02b0c7ea5e30f25cceeedfRomain Guy                "Surface, SurfaceView, SurfaceHolder or SurfaceTexture at the moment.");
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1018f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy
102d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        if (eglSurfaceId == 0) {
103d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich            return EGL10.EGL_NO_SURFACE;
104d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        }
105d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        return new EGLSurfaceImpl( eglSurfaceId );
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
107d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public synchronized EGLDisplay eglGetDisplay(Object native_display) {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int value = _eglGetDisplay(native_display);
110d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        if (value == 0) {
111d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich            return EGL10.EGL_NO_DISPLAY;
112d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDisplay.mEGLDisplay != value)
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDisplay = new EGLDisplayImpl(value);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDisplay;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public synchronized EGLContext eglGetCurrentContext() {
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int value = _eglGetCurrentContext();
120d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        if (value == 0) {
121d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich            return EGL10.EGL_NO_CONTEXT;
122d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mContext.mEGLContext != value)
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext = new EGLContextImpl(value);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContext;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
127d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public synchronized EGLDisplay eglGetCurrentDisplay() {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int value = _eglGetCurrentDisplay();
130d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        if (value == 0) {
131d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich            return EGL10.EGL_NO_DISPLAY;
132d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        }
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDisplay.mEGLDisplay != value)
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDisplay = new EGLDisplayImpl(value);
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDisplay;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public synchronized EGLSurface eglGetCurrentSurface(int readdraw) {
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int value = _eglGetCurrentSurface(readdraw);
140d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        if (value == 0) {
141d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich            return EGL10.EGL_NO_SURFACE;
142d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich        }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSurface.mEGLSurface != value)
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSurface = new EGLSurfaceImpl(value);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSurface;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native int _eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native int _eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void _eglCreatePixmapSurface(EGLSurface sur, EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list);
151d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich    private native int _eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list);
152e5e0c50f7dfaccc220725c5595080e921ffda1e4Romain Guy    private native int _eglCreateWindowSurfaceTexture(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native int _eglGetDisplay(Object native_display);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native int _eglGetCurrentContext();
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native int _eglGetCurrentDisplay();
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native int _eglGetCurrentSurface(int readdraw);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native private static void _nativeClassInit();
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static { _nativeClassInit(); }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
161