This patch adds a function setGlDebugLevel() to libEGL, and exposes it to the Java layer at android.opengl.GLUtils.enableTracing(). Change-Id: Ia5abb130bc32fcfe3ab25b0a0a5283a54c54f357
290 lines
10 KiB
Java
290 lines
10 KiB
Java
/*
|
|
* Copyright (C) 2006 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 android.graphics.Bitmap;
|
|
|
|
import javax.microedition.khronos.egl.EGL10;
|
|
import javax.microedition.khronos.egl.EGL11;
|
|
|
|
/**
|
|
*
|
|
* Utility class to help bridging OpenGL ES and Android APIs.
|
|
*
|
|
*/
|
|
|
|
public final class GLUtils {
|
|
|
|
/*
|
|
* We use a class initializer to allow the native code to cache some
|
|
* field offsets.
|
|
*/
|
|
static {
|
|
nativeClassInit();
|
|
}
|
|
|
|
private GLUtils() {
|
|
}
|
|
|
|
/**
|
|
* return the internal format as defined by OpenGL ES of the supplied bitmap.
|
|
* @param bitmap
|
|
* @return the internal format of the bitmap.
|
|
*/
|
|
public static int getInternalFormat(Bitmap bitmap) {
|
|
if (bitmap == null) {
|
|
throw new NullPointerException("getInternalFormat can't be used with a null Bitmap");
|
|
}
|
|
if (bitmap.isRecycled()) {
|
|
throw new IllegalArgumentException("bitmap is recycled");
|
|
}
|
|
int result = native_getInternalFormat(bitmap);
|
|
if (result < 0) {
|
|
throw new IllegalArgumentException("Unknown internalformat");
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Return the type as defined by OpenGL ES of the supplied bitmap, if there
|
|
* is one. If the bitmap is stored in a compressed format, it may not have
|
|
* a valid OpenGL ES type.
|
|
* @throws IllegalArgumentException if the bitmap does not have a type.
|
|
* @param bitmap
|
|
* @return the OpenGL ES type of the bitmap.
|
|
*/
|
|
public static int getType(Bitmap bitmap) {
|
|
if (bitmap == null) {
|
|
throw new NullPointerException("getType can't be used with a null Bitmap");
|
|
}
|
|
if (bitmap.isRecycled()) {
|
|
throw new IllegalArgumentException("bitmap is recycled");
|
|
}
|
|
int result = native_getType(bitmap);
|
|
if (result < 0) {
|
|
throw new IllegalArgumentException("Unknown type");
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Calls glTexImage2D() on the current OpenGL context. If no context is
|
|
* current the behavior is the same as calling glTexImage2D() with no
|
|
* current context, that is, eglGetError() will return the appropriate
|
|
* error.
|
|
* Unlike glTexImage2D() bitmap cannot be null and will raise an exception
|
|
* in that case.
|
|
* All other parameters are identical to those used for glTexImage2D().
|
|
*
|
|
* NOTE: this method doesn't change GL_UNPACK_ALIGNMENT, you must make
|
|
* sure to set it properly according to the supplied bitmap.
|
|
*
|
|
* Whether or not bitmap can have non power of two dimensions depends on
|
|
* the current OpenGL context. Always check glGetError() some time
|
|
* after calling this method, just like when using OpenGL directly.
|
|
*
|
|
* @param target
|
|
* @param level
|
|
* @param internalformat
|
|
* @param bitmap
|
|
* @param border
|
|
*/
|
|
public static void texImage2D(int target, int level, int internalformat,
|
|
Bitmap bitmap, int border) {
|
|
if (bitmap == null) {
|
|
throw new NullPointerException("texImage2D can't be used with a null Bitmap");
|
|
}
|
|
if (bitmap.isRecycled()) {
|
|
throw new IllegalArgumentException("bitmap is recycled");
|
|
}
|
|
if (native_texImage2D(target, level, internalformat, bitmap, -1, border)!=0) {
|
|
throw new IllegalArgumentException("invalid Bitmap format");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A version of texImage2D() that takes an explicit type parameter
|
|
* as defined by the OpenGL ES specification. The actual type and
|
|
* internalformat of the bitmap must be compatible with the specified
|
|
* type and internalformat parameters.
|
|
*
|
|
* @param target
|
|
* @param level
|
|
* @param internalformat
|
|
* @param bitmap
|
|
* @param type
|
|
* @param border
|
|
*/
|
|
public static void texImage2D(int target, int level, int internalformat,
|
|
Bitmap bitmap, int type, int border) {
|
|
if (bitmap == null) {
|
|
throw new NullPointerException("texImage2D can't be used with a null Bitmap");
|
|
}
|
|
if (bitmap.isRecycled()) {
|
|
throw new IllegalArgumentException("bitmap is recycled");
|
|
}
|
|
if (native_texImage2D(target, level, internalformat, bitmap, type, border)!=0) {
|
|
throw new IllegalArgumentException("invalid Bitmap format");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A version of texImage2D that determines the internalFormat and type
|
|
* automatically.
|
|
*
|
|
* @param target
|
|
* @param level
|
|
* @param bitmap
|
|
* @param border
|
|
*/
|
|
public static void texImage2D(int target, int level, Bitmap bitmap,
|
|
int border) {
|
|
if (bitmap == null) {
|
|
throw new NullPointerException("texImage2D can't be used with a null Bitmap");
|
|
}
|
|
if (bitmap.isRecycled()) {
|
|
throw new IllegalArgumentException("bitmap is recycled");
|
|
}
|
|
if (native_texImage2D(target, level, -1, bitmap, -1, border)!=0) {
|
|
throw new IllegalArgumentException("invalid Bitmap format");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Calls glTexSubImage2D() on the current OpenGL context. If no context is
|
|
* current the behavior is the same as calling glTexSubImage2D() with no
|
|
* current context, that is, eglGetError() will return the appropriate
|
|
* error.
|
|
* Unlike glTexSubImage2D() bitmap cannot be null and will raise an exception
|
|
* in that case.
|
|
* All other parameters are identical to those used for glTexSubImage2D().
|
|
*
|
|
* NOTE: this method doesn't change GL_UNPACK_ALIGNMENT, you must make
|
|
* sure to set it properly according to the supplied bitmap.
|
|
*
|
|
* Whether or not bitmap can have non power of two dimensions depends on
|
|
* the current OpenGL context. Always check glGetError() some time
|
|
* after calling this method, just like when using OpenGL directly.
|
|
*
|
|
* @param target
|
|
* @param level
|
|
* @param xoffset
|
|
* @param yoffset
|
|
* @param bitmap
|
|
*/
|
|
public static void texSubImage2D(int target, int level, int xoffset, int yoffset,
|
|
Bitmap bitmap) {
|
|
if (bitmap == null) {
|
|
throw new NullPointerException("texSubImage2D can't be used with a null Bitmap");
|
|
}
|
|
if (bitmap.isRecycled()) {
|
|
throw new IllegalArgumentException("bitmap is recycled");
|
|
}
|
|
int type = getType(bitmap);
|
|
if (native_texSubImage2D(target, level, xoffset, yoffset, bitmap, -1, type)!=0) {
|
|
throw new IllegalArgumentException("invalid Bitmap format");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A version of texSubImage2D() that takes an explicit type parameter
|
|
* as defined by the OpenGL ES specification.
|
|
*
|
|
* @param target
|
|
* @param level
|
|
* @param xoffset
|
|
* @param yoffset
|
|
* @param bitmap
|
|
* @param type
|
|
*/
|
|
public static void texSubImage2D(int target, int level, int xoffset, int yoffset,
|
|
Bitmap bitmap, int format, int type) {
|
|
if (bitmap == null) {
|
|
throw new NullPointerException("texSubImage2D can't be used with a null Bitmap");
|
|
}
|
|
if (bitmap.isRecycled()) {
|
|
throw new IllegalArgumentException("bitmap is recycled");
|
|
}
|
|
if (native_texSubImage2D(target, level, xoffset, yoffset, bitmap, format, type)!=0) {
|
|
throw new IllegalArgumentException("invalid Bitmap format");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return a string for the EGL error code, or the hex representation
|
|
* if the error is unknown.
|
|
*
|
|
* @param error The EGL error to convert into a String.
|
|
*
|
|
* @return An error string corresponding to the EGL error code.
|
|
*/
|
|
public static String getEGLErrorString(int error) {
|
|
switch (error) {
|
|
case EGL10.EGL_SUCCESS:
|
|
return "EGL_SUCCESS";
|
|
case EGL10.EGL_NOT_INITIALIZED:
|
|
return "EGL_NOT_INITIALIZED";
|
|
case EGL10.EGL_BAD_ACCESS:
|
|
return "EGL_BAD_ACCESS";
|
|
case EGL10.EGL_BAD_ALLOC:
|
|
return "EGL_BAD_ALLOC";
|
|
case EGL10.EGL_BAD_ATTRIBUTE:
|
|
return "EGL_BAD_ATTRIBUTE";
|
|
case EGL10.EGL_BAD_CONFIG:
|
|
return "EGL_BAD_CONFIG";
|
|
case EGL10.EGL_BAD_CONTEXT:
|
|
return "EGL_BAD_CONTEXT";
|
|
case EGL10.EGL_BAD_CURRENT_SURFACE:
|
|
return "EGL_BAD_CURRENT_SURFACE";
|
|
case EGL10.EGL_BAD_DISPLAY:
|
|
return "EGL_BAD_DISPLAY";
|
|
case EGL10.EGL_BAD_MATCH:
|
|
return "EGL_BAD_MATCH";
|
|
case EGL10.EGL_BAD_NATIVE_PIXMAP:
|
|
return "EGL_BAD_NATIVE_PIXMAP";
|
|
case EGL10.EGL_BAD_NATIVE_WINDOW:
|
|
return "EGL_BAD_NATIVE_WINDOW";
|
|
case EGL10.EGL_BAD_PARAMETER:
|
|
return "EGL_BAD_PARAMETER";
|
|
case EGL10.EGL_BAD_SURFACE:
|
|
return "EGL_BAD_SURFACE";
|
|
case EGL11.EGL_CONTEXT_LOST:
|
|
return "EGL_CONTEXT_LOST";
|
|
default:
|
|
return "0x" + Integer.toHexString(error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Enable tracing of OpenGL functions for this application.
|
|
* @hide
|
|
*/
|
|
public static void enableTracing() {
|
|
native_enableTracing();
|
|
}
|
|
|
|
native private static void nativeClassInit();
|
|
|
|
native private static int native_getInternalFormat(Bitmap bitmap);
|
|
native private static int native_getType(Bitmap bitmap);
|
|
native private static int native_texImage2D(int target, int level, int internalformat,
|
|
Bitmap bitmap, int type, int border);
|
|
native private static int native_texSubImage2D(int target, int level, int xoffset, int yoffset,
|
|
Bitmap bitmap, int format, int type);
|
|
native private static void native_enableTracing();
|
|
}
|