|  | /* | 
|  | * Copyright (C) 2008 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | package android.opengl; | 
|  |  | 
|  | import java.io.IOException; | 
|  | import java.io.Writer; | 
|  |  | 
|  | import javax.microedition.khronos.egl.EGL; | 
|  | import javax.microedition.khronos.egl.EGL10; | 
|  | import javax.microedition.khronos.egl.EGL11; | 
|  | import javax.microedition.khronos.egl.EGLConfig; | 
|  | import javax.microedition.khronos.egl.EGLContext; | 
|  | import javax.microedition.khronos.egl.EGLDisplay; | 
|  | import javax.microedition.khronos.egl.EGLSurface; | 
|  |  | 
|  | class EGLLogWrapper implements EGL11 { | 
|  | private EGL10 mEgl10; | 
|  | Writer mLog; | 
|  | boolean mLogArgumentNames; | 
|  | boolean mCheckError; | 
|  | private int mArgCount; | 
|  |  | 
|  |  | 
|  | public EGLLogWrapper(EGL egl, int configFlags, Writer log) { | 
|  | mEgl10 = (EGL10) egl; | 
|  | mLog = log; | 
|  | mLogArgumentNames = | 
|  | (GLDebugHelper.CONFIG_LOG_ARGUMENT_NAMES & configFlags) != 0; | 
|  | mCheckError = | 
|  | (GLDebugHelper.CONFIG_CHECK_GL_ERROR & configFlags) != 0; | 
|  | } | 
|  |  | 
|  | public boolean eglChooseConfig(EGLDisplay display, int[] attrib_list, | 
|  | EGLConfig[] configs, int config_size, int[] num_config) { | 
|  | begin("eglChooseConfig"); | 
|  | arg("display", display); | 
|  | arg("attrib_list", attrib_list); | 
|  | arg("config_size", config_size); | 
|  | end(); | 
|  |  | 
|  | boolean result = mEgl10.eglChooseConfig(display, attrib_list, configs, | 
|  | config_size, num_config); | 
|  | arg("configs", configs); | 
|  | arg("num_config", num_config); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public boolean eglCopyBuffers(EGLDisplay display, EGLSurface surface, | 
|  | Object native_pixmap) { | 
|  | begin("eglCopyBuffers"); | 
|  | arg("display", display); | 
|  | arg("surface", surface); | 
|  | arg("native_pixmap", native_pixmap); | 
|  | end(); | 
|  |  | 
|  | boolean result = mEgl10.eglCopyBuffers(display, surface, native_pixmap); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public EGLContext eglCreateContext(EGLDisplay display, EGLConfig config, | 
|  | EGLContext share_context, int[] attrib_list) { | 
|  | begin("eglCreateContext"); | 
|  | arg("display", display); | 
|  | arg("config", config); | 
|  | arg("share_context", share_context); | 
|  | arg("attrib_list", attrib_list); | 
|  | end(); | 
|  |  | 
|  | EGLContext result = mEgl10.eglCreateContext(display, config, | 
|  | share_context, attrib_list); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public EGLSurface eglCreatePbufferSurface(EGLDisplay display, | 
|  | EGLConfig config, int[] attrib_list) { | 
|  | begin("eglCreatePbufferSurface"); | 
|  | arg("display", display); | 
|  | arg("config", config); | 
|  | arg("attrib_list", attrib_list); | 
|  | end(); | 
|  |  | 
|  | EGLSurface result = mEgl10.eglCreatePbufferSurface(display, config, | 
|  | attrib_list); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public EGLSurface eglCreatePixmapSurface(EGLDisplay display, | 
|  | EGLConfig config, Object native_pixmap, int[] attrib_list) { | 
|  | begin("eglCreatePixmapSurface"); | 
|  | arg("display", display); | 
|  | arg("config", config); | 
|  | arg("native_pixmap", native_pixmap); | 
|  | arg("attrib_list", attrib_list); | 
|  | end(); | 
|  |  | 
|  | EGLSurface result = mEgl10.eglCreatePixmapSurface(display, config, | 
|  | native_pixmap, attrib_list); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public EGLSurface eglCreateWindowSurface(EGLDisplay display, | 
|  | EGLConfig config, Object native_window, int[] attrib_list) { | 
|  | begin("eglCreateWindowSurface"); | 
|  | arg("display", display); | 
|  | arg("config", config); | 
|  | arg("native_window", native_window); | 
|  | arg("attrib_list", attrib_list); | 
|  | end(); | 
|  |  | 
|  | EGLSurface result = mEgl10.eglCreateWindowSurface(display, config, | 
|  | native_window, attrib_list); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public boolean eglDestroyContext(EGLDisplay display, EGLContext context) { | 
|  | begin("eglDestroyContext"); | 
|  | arg("display", display); | 
|  | arg("context", context); | 
|  | end(); | 
|  |  | 
|  | boolean result = mEgl10.eglDestroyContext(display, context); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public boolean eglDestroySurface(EGLDisplay display, EGLSurface surface) { | 
|  | begin("eglDestroySurface"); | 
|  | arg("display", display); | 
|  | arg("surface", surface); | 
|  | end(); | 
|  |  | 
|  | boolean result = mEgl10.eglDestroySurface(display, surface); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public boolean eglGetConfigAttrib(EGLDisplay display, EGLConfig config, | 
|  | int attribute, int[] value) { | 
|  | begin("eglGetConfigAttrib"); | 
|  | arg("display", display); | 
|  | arg("config", config); | 
|  | arg("attribute", attribute); | 
|  | end(); | 
|  | boolean result = mEgl10.eglGetConfigAttrib(display, config, attribute, | 
|  | value); | 
|  | arg("value", value); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return false; | 
|  | } | 
|  |  | 
|  | public boolean eglGetConfigs(EGLDisplay display, EGLConfig[] configs, | 
|  | int config_size, int[] num_config) { | 
|  | begin("eglGetConfigs"); | 
|  | arg("display", display); | 
|  | arg("config_size", config_size); | 
|  | end(); | 
|  |  | 
|  | boolean result = mEgl10.eglGetConfigs(display, configs, config_size, | 
|  | num_config); | 
|  | arg("configs", configs); | 
|  | arg("num_config", num_config); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public EGLContext eglGetCurrentContext() { | 
|  | begin("eglGetCurrentContext"); | 
|  | end(); | 
|  |  | 
|  | EGLContext result = mEgl10.eglGetCurrentContext(); | 
|  | returns(result); | 
|  |  | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public EGLDisplay eglGetCurrentDisplay() { | 
|  | begin("eglGetCurrentDisplay"); | 
|  | end(); | 
|  |  | 
|  | EGLDisplay result = mEgl10.eglGetCurrentDisplay(); | 
|  | returns(result); | 
|  |  | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public EGLSurface eglGetCurrentSurface(int readdraw) { | 
|  | begin("eglGetCurrentSurface"); | 
|  | arg("readdraw", readdraw); | 
|  | end(); | 
|  |  | 
|  | EGLSurface result = mEgl10.eglGetCurrentSurface(readdraw); | 
|  | returns(result); | 
|  |  | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public EGLDisplay eglGetDisplay(Object native_display) { | 
|  | begin("eglGetDisplay"); | 
|  | arg("native_display", native_display); | 
|  | end(); | 
|  |  | 
|  | EGLDisplay result = mEgl10.eglGetDisplay(native_display); | 
|  | returns(result); | 
|  |  | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public int eglGetError() { | 
|  | begin("eglGetError"); | 
|  | end(); | 
|  |  | 
|  | int result = mEgl10.eglGetError(); | 
|  | returns(getErrorString(result)); | 
|  |  | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public boolean eglInitialize(EGLDisplay display, int[] major_minor) { | 
|  | begin("eglInitialize"); | 
|  | arg("display", display); | 
|  | end(); | 
|  | boolean result = mEgl10.eglInitialize(display, major_minor); | 
|  | returns(result); | 
|  | arg("major_minor", major_minor); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public boolean eglMakeCurrent(EGLDisplay display, EGLSurface draw, | 
|  | EGLSurface read, EGLContext context) { | 
|  | begin("eglMakeCurrent"); | 
|  | arg("display", display); | 
|  | arg("draw", draw); | 
|  | arg("read", read); | 
|  | arg("context", context); | 
|  | end(); | 
|  | boolean result = mEgl10.eglMakeCurrent(display, draw, read, context); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public boolean eglQueryContext(EGLDisplay display, EGLContext context, | 
|  | int attribute, int[] value) { | 
|  | begin("eglQueryContext"); | 
|  | arg("display", display); | 
|  | arg("context", context); | 
|  | arg("attribute", attribute); | 
|  | end(); | 
|  | boolean result = mEgl10.eglQueryContext(display, context, attribute, | 
|  | value); | 
|  | returns(value[0]); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public String eglQueryString(EGLDisplay display, int name) { | 
|  | begin("eglQueryString"); | 
|  | arg("display", display); | 
|  | arg("name", name); | 
|  | end(); | 
|  | String result = mEgl10.eglQueryString(display, name); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public boolean eglQuerySurface(EGLDisplay display, EGLSurface surface, | 
|  | int attribute, int[] value) { | 
|  | begin("eglQuerySurface"); | 
|  | arg("display", display); | 
|  | arg("surface", surface); | 
|  | arg("attribute", attribute); | 
|  | end(); | 
|  | boolean result = mEgl10.eglQuerySurface(display, surface, attribute, | 
|  | value); | 
|  | returns(value[0]); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | /** @hide **/ | 
|  | public boolean eglReleaseThread() { | 
|  | begin("eglReleaseThread"); | 
|  | end(); | 
|  | boolean result = mEgl10.eglReleaseThread(); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public boolean eglSwapBuffers(EGLDisplay display, EGLSurface surface) { | 
|  | begin("eglSwapBuffers"); | 
|  | arg("display", display); | 
|  | arg("surface", surface); | 
|  | end(); | 
|  | boolean result = mEgl10.eglSwapBuffers(display, surface); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public boolean eglTerminate(EGLDisplay display) { | 
|  | begin("eglTerminate"); | 
|  | arg("display", display); | 
|  | end(); | 
|  | boolean result = mEgl10.eglTerminate(display); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public boolean eglWaitGL() { | 
|  | begin("eglWaitGL"); | 
|  | end(); | 
|  | boolean result = mEgl10.eglWaitGL(); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public boolean eglWaitNative(int engine, Object bindTarget) { | 
|  | begin("eglWaitNative"); | 
|  | arg("engine", engine); | 
|  | arg("bindTarget", bindTarget); | 
|  | end(); | 
|  | boolean result = mEgl10.eglWaitNative(engine, bindTarget); | 
|  | returns(result); | 
|  | checkError(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | private void checkError() { | 
|  | int eglError; | 
|  | if ((eglError = mEgl10.eglGetError()) != EGL_SUCCESS) { | 
|  | String errorMessage = "eglError: " + getErrorString(eglError); | 
|  | logLine(errorMessage); | 
|  | if (mCheckError) { | 
|  | throw new GLException(eglError, errorMessage); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | private void logLine(String message) { | 
|  | log(message + '\n'); | 
|  | } | 
|  |  | 
|  | private void log(String message) { | 
|  | try { | 
|  | mLog.write(message); | 
|  | } catch (IOException e) { | 
|  | // Ignore exception, keep on trying | 
|  | } | 
|  | } | 
|  |  | 
|  | private void begin(String name) { | 
|  | log(name + '('); | 
|  | mArgCount = 0; | 
|  | } | 
|  |  | 
|  | private void arg(String name, String value) { | 
|  | if (mArgCount++ > 0) { | 
|  | log(", "); | 
|  | } | 
|  | if (mLogArgumentNames) { | 
|  | log(name + "="); | 
|  | } | 
|  | log(value); | 
|  | } | 
|  |  | 
|  | private void end() { | 
|  | log(");\n"); | 
|  | flush(); | 
|  | } | 
|  |  | 
|  | private void flush() { | 
|  | try { | 
|  | mLog.flush(); | 
|  | } catch (IOException e) { | 
|  | mLog = null; | 
|  | } | 
|  | } | 
|  |  | 
|  | private void arg(String name, int value) { | 
|  | arg(name, Integer.toString(value)); | 
|  | } | 
|  |  | 
|  | private void arg(String name, Object object) { | 
|  | arg(name, toString(object)); | 
|  | } | 
|  |  | 
|  | private void arg(String name, EGLDisplay object) { | 
|  | if (object == EGL10.EGL_DEFAULT_DISPLAY) { | 
|  | arg(name, "EGL10.EGL_DEFAULT_DISPLAY"); | 
|  | } else if (object == EGL_NO_DISPLAY) { | 
|  | arg(name, "EGL10.EGL_NO_DISPLAY"); | 
|  | } else { | 
|  | arg(name, toString(object)); | 
|  | } | 
|  | } | 
|  |  | 
|  | private void arg(String name, EGLContext object) { | 
|  | if (object == EGL10.EGL_NO_CONTEXT) { | 
|  | arg(name, "EGL10.EGL_NO_CONTEXT"); | 
|  | } else { | 
|  | arg(name, toString(object)); | 
|  | } | 
|  | } | 
|  |  | 
|  | private void arg(String name, EGLSurface object) { | 
|  | if (object == EGL10.EGL_NO_SURFACE) { | 
|  | arg(name, "EGL10.EGL_NO_SURFACE"); | 
|  | } else { | 
|  | arg(name, toString(object)); | 
|  | } | 
|  | } | 
|  |  | 
|  | private void returns(String result) { | 
|  | log(" returns " + result + ";\n"); | 
|  | flush(); | 
|  | } | 
|  |  | 
|  | private void returns(int result) { | 
|  | returns(Integer.toString(result)); | 
|  | } | 
|  |  | 
|  | private void returns(boolean result) { | 
|  | returns(Boolean.toString(result)); | 
|  | } | 
|  |  | 
|  | private void returns(Object result) { | 
|  | returns(toString(result)); | 
|  | } | 
|  |  | 
|  | private String toString(Object obj) { | 
|  | if (obj == null) { | 
|  | return "null"; | 
|  | } else { | 
|  | return obj.toString(); | 
|  | } | 
|  | } | 
|  |  | 
|  | private void arg(String name, int[] arr) { | 
|  | if (arr == null) { | 
|  | arg(name, "null"); | 
|  | } else { | 
|  | arg(name, toString(arr.length, arr, 0)); | 
|  | } | 
|  | } | 
|  |  | 
|  | private void arg(String name, Object[] arr) { | 
|  | if (arr == null) { | 
|  | arg(name, "null"); | 
|  | } else { | 
|  | arg(name, toString(arr.length, arr, 0)); | 
|  | } | 
|  | } | 
|  |  | 
|  | private String toString(int n, int[] arr, int offset) { | 
|  | StringBuilder buf = new StringBuilder(); | 
|  | buf.append("{\n"); | 
|  | int arrLen = arr.length; | 
|  | for (int i = 0; i < n; i++) { | 
|  | int index = offset + i; | 
|  | buf.append(" [" + index + "] = "); | 
|  | if (index < 0 || index >= arrLen) { | 
|  | buf.append("out of bounds"); | 
|  | } else { | 
|  | buf.append(arr[index]); | 
|  | } | 
|  | buf.append('\n'); | 
|  | } | 
|  | buf.append("}"); | 
|  | return buf.toString(); | 
|  | } | 
|  |  | 
|  | private String toString(int n, Object[] arr, int offset) { | 
|  | StringBuilder buf = new StringBuilder(); | 
|  | buf.append("{\n"); | 
|  | int arrLen = arr.length; | 
|  | for (int i = 0; i < n; i++) { | 
|  | int index = offset + i; | 
|  | buf.append(" [" + index + "] = "); | 
|  | if (index < 0 || index >= arrLen) { | 
|  | buf.append("out of bounds"); | 
|  | } else { | 
|  | buf.append(arr[index]); | 
|  | } | 
|  | buf.append('\n'); | 
|  | } | 
|  | buf.append("}"); | 
|  | return buf.toString(); | 
|  | } | 
|  |  | 
|  | private static String getHex(int value) { | 
|  | return "0x" + Integer.toHexString(value); | 
|  | } | 
|  |  | 
|  | public static String getErrorString(int error) { | 
|  | switch (error) { | 
|  | case EGL_SUCCESS: | 
|  | return "EGL_SUCCESS"; | 
|  | case EGL_NOT_INITIALIZED: | 
|  | return "EGL_NOT_INITIALIZED"; | 
|  | case EGL_BAD_ACCESS: | 
|  | return "EGL_BAD_ACCESS"; | 
|  | case EGL_BAD_ALLOC: | 
|  | return "EGL_BAD_ALLOC"; | 
|  | case EGL_BAD_ATTRIBUTE: | 
|  | return "EGL_BAD_ATTRIBUTE"; | 
|  | case EGL_BAD_CONFIG: | 
|  | return "EGL_BAD_CONFIG"; | 
|  | case EGL_BAD_CONTEXT: | 
|  | return "EGL_BAD_CONTEXT"; | 
|  | case EGL_BAD_CURRENT_SURFACE: | 
|  | return "EGL_BAD_CURRENT_SURFACE"; | 
|  | case EGL_BAD_DISPLAY: | 
|  | return "EGL_BAD_DISPLAY"; | 
|  | case EGL_BAD_MATCH: | 
|  | return "EGL_BAD_MATCH"; | 
|  | case EGL_BAD_NATIVE_PIXMAP: | 
|  | return "EGL_BAD_NATIVE_PIXMAP"; | 
|  | case EGL_BAD_NATIVE_WINDOW: | 
|  | return "EGL_BAD_NATIVE_WINDOW"; | 
|  | case EGL_BAD_PARAMETER: | 
|  | return "EGL_BAD_PARAMETER"; | 
|  | case EGL_BAD_SURFACE: | 
|  | return "EGL_BAD_SURFACE"; | 
|  | case EGL11.EGL_CONTEXT_LOST: | 
|  | return "EGL_CONTEXT_LOST"; | 
|  | default: | 
|  | return getHex(error); | 
|  | } | 
|  | } | 
|  | } |