1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.android.gles_jni;
18 
19 import android.compat.annotation.UnsupportedAppUsage;
20 import android.graphics.SurfaceTexture;
21 import android.view.Surface;
22 import android.view.SurfaceHolder;
23 import android.view.SurfaceView;
24 
25 import javax.microedition.khronos.egl.EGL10;
26 import javax.microedition.khronos.egl.EGLConfig;
27 import javax.microedition.khronos.egl.EGLContext;
28 import javax.microedition.khronos.egl.EGLDisplay;
29 import javax.microedition.khronos.egl.EGLSurface;
30 
31 public class EGLImpl implements EGL10 {
32     private EGLContextImpl mContext = new EGLContextImpl(-1);
33     private EGLDisplayImpl mDisplay = new EGLDisplayImpl(-1);
34     private EGLSurfaceImpl mSurface = new EGLSurfaceImpl(-1);
35 
eglInitialize(EGLDisplay display, int[] major_minor)36     public native boolean     eglInitialize(EGLDisplay display, int[] major_minor);
eglQueryContext(EGLDisplay display, EGLContext context, int attribute, int[] value)37     public native boolean     eglQueryContext(EGLDisplay display, EGLContext context, int attribute, int[] value);
eglQuerySurface(EGLDisplay display, EGLSurface surface, int attribute, int[] value)38     public native boolean     eglQuerySurface(EGLDisplay display, EGLSurface surface, int attribute, int[] value);
39     /** @hide **/
eglReleaseThread()40     public native boolean     eglReleaseThread();
eglChooseConfig(EGLDisplay display, int[] attrib_list, EGLConfig[] configs, int config_size, int[] num_config)41     public native boolean     eglChooseConfig(EGLDisplay display, int[] attrib_list, EGLConfig[] configs, int config_size, int[] num_config);
eglGetConfigAttrib(EGLDisplay display, EGLConfig config, int attribute, int[] value)42     public native boolean     eglGetConfigAttrib(EGLDisplay display, EGLConfig config, int attribute, int[] value);
eglGetConfigs(EGLDisplay display, EGLConfig[] configs, int config_size, int[] num_config)43     public native boolean     eglGetConfigs(EGLDisplay display, EGLConfig[] configs, int config_size, int[] num_config);
eglGetError()44     public native int         eglGetError();
eglDestroyContext(EGLDisplay display, EGLContext context)45     public native boolean     eglDestroyContext(EGLDisplay display, EGLContext context);
eglDestroySurface(EGLDisplay display, EGLSurface surface)46     public native boolean     eglDestroySurface(EGLDisplay display, EGLSurface surface);
eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context)47     public native boolean     eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context);
eglQueryString(EGLDisplay display, int name)48     public native String      eglQueryString(EGLDisplay display, int name);
eglSwapBuffers(EGLDisplay display, EGLSurface surface)49     public native boolean     eglSwapBuffers(EGLDisplay display, EGLSurface surface);
eglTerminate(EGLDisplay display)50     public native boolean     eglTerminate(EGLDisplay display);
eglCopyBuffers(EGLDisplay display, EGLSurface surface, Object native_pixmap)51     public native boolean     eglCopyBuffers(EGLDisplay display, EGLSurface surface, Object native_pixmap);
eglWaitGL()52     public native boolean     eglWaitGL();
eglWaitNative(int engine, Object bindTarget)53     public native boolean     eglWaitNative(int engine, Object bindTarget);
54 
55     /** @hide **/
getInitCount(EGLDisplay display)56     public static native int  getInitCount(EGLDisplay display);
57 
58     @UnsupportedAppUsage
EGLImpl()59     public EGLImpl() {
60     }
61 
eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list)62     public EGLContext eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list) {
63         long eglContextId = _eglCreateContext(display, config, share_context, attrib_list);
64         if (eglContextId == 0) {
65             return EGL10.EGL_NO_CONTEXT;
66         }
67         return new EGLContextImpl( eglContextId );
68     }
69 
eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list)70     public EGLSurface eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list) {
71         long eglSurfaceId = _eglCreatePbufferSurface(display, config, attrib_list);
72         if (eglSurfaceId == 0) {
73             return EGL10.EGL_NO_SURFACE;
74         }
75         return new EGLSurfaceImpl( eglSurfaceId );
76     }
77 
eglCreatePixmapSurface(EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list)78     public EGLSurface eglCreatePixmapSurface(EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list) {
79         EGLSurfaceImpl sur = new EGLSurfaceImpl();
80         _eglCreatePixmapSurface(sur, display, config, native_pixmap, attrib_list);
81         if (sur.mEGLSurface == 0) {
82             return EGL10.EGL_NO_SURFACE;
83         }
84         return sur;
85     }
86 
eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list)87     public EGLSurface eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list) {
88         Surface sur = null;
89         if (native_window instanceof SurfaceView) {
90             SurfaceView surfaceView = (SurfaceView)native_window;
91             sur = surfaceView.getHolder().getSurface();
92         } else if (native_window instanceof SurfaceHolder) {
93             SurfaceHolder holder = (SurfaceHolder)native_window;
94             sur = holder.getSurface();
95         } else if (native_window instanceof Surface) {
96             sur = (Surface) native_window;
97         }
98 
99         long eglSurfaceId;
100         if (sur != null) {
101             eglSurfaceId = _eglCreateWindowSurface(display, config, sur, attrib_list);
102         } else if (native_window instanceof SurfaceTexture) {
103             eglSurfaceId = _eglCreateWindowSurfaceTexture(display, config,
104                     native_window, attrib_list);
105         } else {
106             throw new java.lang.UnsupportedOperationException(
107                 "eglCreateWindowSurface() can only be called with an instance of " +
108                 "Surface, SurfaceView, SurfaceHolder or SurfaceTexture at the moment.");
109         }
110 
111         if (eglSurfaceId == 0) {
112             return EGL10.EGL_NO_SURFACE;
113         }
114         return new EGLSurfaceImpl( eglSurfaceId );
115     }
116 
eglGetDisplay(Object native_display)117     public synchronized EGLDisplay eglGetDisplay(Object native_display) {
118         long value = _eglGetDisplay(native_display);
119         if (value == 0) {
120             return EGL10.EGL_NO_DISPLAY;
121         }
122         if (mDisplay.mEGLDisplay != value)
123             mDisplay = new EGLDisplayImpl(value);
124         return mDisplay;
125     }
126 
eglGetCurrentContext()127     public synchronized EGLContext eglGetCurrentContext() {
128         long value = _eglGetCurrentContext();
129         if (value == 0) {
130             return EGL10.EGL_NO_CONTEXT;
131         }
132         if (mContext.mEGLContext != value)
133             mContext = new EGLContextImpl(value);
134         return mContext;
135     }
136 
eglGetCurrentDisplay()137     public synchronized EGLDisplay eglGetCurrentDisplay() {
138         long value = _eglGetCurrentDisplay();
139         if (value == 0) {
140             return EGL10.EGL_NO_DISPLAY;
141         }
142         if (mDisplay.mEGLDisplay != value)
143             mDisplay = new EGLDisplayImpl(value);
144         return mDisplay;
145     }
146 
eglGetCurrentSurface(int readdraw)147     public synchronized EGLSurface eglGetCurrentSurface(int readdraw) {
148         long value = _eglGetCurrentSurface(readdraw);
149         if (value == 0) {
150             return EGL10.EGL_NO_SURFACE;
151         }
152         if (mSurface.mEGLSurface != value)
153             mSurface = new EGLSurfaceImpl(value);
154         return mSurface;
155     }
156 
_eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list)157     private native long _eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list);
_eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list)158     private native long _eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list);
_eglCreatePixmapSurface(EGLSurface sur, EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list)159     private native void _eglCreatePixmapSurface(EGLSurface sur, EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list);
_eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list)160     private native long _eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list);
_eglCreateWindowSurfaceTexture(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list)161     private native long _eglCreateWindowSurfaceTexture(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list);
_eglGetDisplay(Object native_display)162     private native long _eglGetDisplay(Object native_display);
_eglGetCurrentContext()163     private native long _eglGetCurrentContext();
_eglGetCurrentDisplay()164     private native long _eglGetCurrentDisplay();
_eglGetCurrentSurface(int readdraw)165     private native long _eglGetCurrentSurface(int readdraw);
166 
_nativeClassInit()167     native private static void _nativeClassInit();
_nativeClassInit()168     static { _nativeClassInit(); }
169 }
170