EGLImpl.java revision 8f0095cd33558e9cc8a440047908e53b68906f5f
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); 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean eglChooseConfig(EGLDisplay display, int[] attrib_list, EGLConfig[] configs, int config_size, int[] num_config); 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean eglGetConfigAttrib(EGLDisplay display, EGLConfig config, int attribute, int[] value); 36d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich public native boolean eglGetConfigs(EGLDisplay display, EGLConfig[] configs, int config_size, int[] num_config); 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native int eglGetError(); 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean eglDestroyContext(EGLDisplay display, EGLContext context); 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean eglDestroySurface(EGLDisplay display, EGLSurface surface); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context); 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native String eglQueryString(EGLDisplay display, int name); 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean eglSwapBuffers(EGLDisplay display, EGLSurface surface); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean eglTerminate(EGLDisplay display); 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean eglCopyBuffers(EGLDisplay display, EGLSurface surface, Object native_pixmap); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean eglWaitGL(); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean eglWaitNative(int engine, Object bindTarget); 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public EGLContext eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list) { 49d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich int eglContextId = _eglCreateContext(display, config, share_context, attrib_list); 50d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich if (eglContextId == 0) { 51d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich return EGL10.EGL_NO_CONTEXT; 52d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich } 53d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich return new EGLContextImpl( eglContextId ); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public EGLSurface eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list) { 57d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich int eglSurfaceId = _eglCreatePbufferSurface(display, config, attrib_list); 58d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich if (eglSurfaceId == 0) { 59d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich return EGL10.EGL_NO_SURFACE; 60d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich } 61d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich return new EGLSurfaceImpl( eglSurfaceId ); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public EGLSurface eglCreatePixmapSurface(EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list) { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EGLSurfaceImpl sur = new EGLSurfaceImpl(); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project _eglCreatePixmapSurface(sur, display, config, native_pixmap, attrib_list); 67d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich if (sur.mEGLSurface == 0) { 68d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich return EGL10.EGL_NO_SURFACE; 69d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sur; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public EGLSurface eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list) { 748f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy Surface sur = null; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (native_window instanceof SurfaceView) { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceView surfaceView = (SurfaceView)native_window; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sur = surfaceView.getHolder().getSurface(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (native_window instanceof SurfaceHolder) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceHolder holder = (SurfaceHolder)native_window; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sur = holder.getSurface(); 818f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy } 828f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy 838f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy int eglSurfaceId; 848f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy if (sur != null) { 858f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy eglSurfaceId = _eglCreateWindowSurface(display, config, sur, attrib_list); 868f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy } else if (native_window instanceof SurfaceTexture) { 878f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy eglSurfaceId = _eglCreateWindowSurfaceTexture(display, config, 888f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy ((SurfaceTexture) native_window).mSurfaceTexture, attrib_list); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new java.lang.UnsupportedOperationException( 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "eglCreateWindowSurface() can only be called with an instance of " + 928f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy "SurfaceView, SurfaceHolder or SurfaceTexture at the moment, " + 938f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy "this will be fixed later."); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 958f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy 96d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich if (eglSurfaceId == 0) { 97d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich return EGL10.EGL_NO_SURFACE; 98d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich } 99d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich return new EGLSurfaceImpl( eglSurfaceId ); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 101d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized EGLDisplay eglGetDisplay(Object native_display) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int value = _eglGetDisplay(native_display); 104d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich if (value == 0) { 105d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich return EGL10.EGL_NO_DISPLAY; 106d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplay.mEGLDisplay != value) 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplay = new EGLDisplayImpl(value); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDisplay; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized EGLContext eglGetCurrentContext() { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int value = _eglGetCurrentContext(); 114d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich if (value == 0) { 115d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich return EGL10.EGL_NO_CONTEXT; 116d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.mEGLContext != value) 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = new EGLContextImpl(value); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContext; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 121d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized EGLDisplay eglGetCurrentDisplay() { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int value = _eglGetCurrentDisplay(); 124d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich if (value == 0) { 125d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich return EGL10.EGL_NO_DISPLAY; 126d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplay.mEGLDisplay != value) 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplay = new EGLDisplayImpl(value); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDisplay; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized EGLSurface eglGetCurrentSurface(int readdraw) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int value = _eglGetCurrentSurface(readdraw); 134d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich if (value == 0) { 135d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich return EGL10.EGL_NO_SURFACE; 136d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSurface.mEGLSurface != value) 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurface = new EGLSurfaceImpl(value); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSurface; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int _eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int _eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void _eglCreatePixmapSurface(EGLSurface sur, EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list); 145d682ab72c5b7781109b0f30ac16202441fb925d6Jack Palevich private native int _eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list); 1468f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy private native int _eglCreateWindowSurfaceTexture(EGLDisplay display, EGLConfig config, int native_window, int[] attrib_list); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int _eglGetDisplay(Object native_display); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int _eglGetCurrentContext(); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int _eglGetCurrentDisplay(); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native int _eglGetCurrentSurface(int readdraw); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native private static void _nativeClassInit(); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static { _nativeClassInit(); } 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 155