I'm getting exceptions when I try to use an interleaved buffer in OpenGL with android.opengl.GLLogWrapper. Has anyone else run into this?
Everything works fine if I disable GLLogWrapper by removing this line: mGLSurfaceView.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR | GLSurfaceView.DEBUG_LOG_GL_CALLS); Replacing that line with this also works fine: mGLSurfaceView.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR); What I'm doing seems fine to OpenGL, just not GLLogWrapper. Using position() on Buffer to specify an offset is outlined here: http://java.sun.com/javame/reference/apis/jsr239/ Same results on my Android 1.6 G1 and the emulator running an Android 2.0.1 AVD. Stack trace from 2.0.1: V/GLSurfaceView( 226): glClear(GL_COLOR_BUFFER_BIT); I/ARMAssembler( 54): generated scanline__00000077:03010104_00000004_00000000 [ 22 ipp] (41 ins) at [0x504b80:0x504c24] in 679333 ns W/dalvikvm( 226): threadid=15: thread exiting with uncaught exception (group=0x4001b188) E/AndroidRuntime( 226): Uncaught handler: thread GLThread 8 exiting due to uncaught exception E/AndroidRuntime( 226): java.lang.IndexOutOfBoundsException E/AndroidRuntime( 226): at java.nio.IntToByteBufferAdapter.get (IntToByteBufferAdapter.java:155) E/AndroidRuntime( 226): at android.opengl.GLLogWrapper.doArrayElement (GLLogWrapper.java:1105) E/AndroidRuntime( 226): at android.opengl.GLLogWrapper.doElement (GLLogWrapper.java:1126) E/AndroidRuntime( 226): at android.opengl.GLLogWrapper.glDrawArrays (GLLogWrapper.java:1520) E/AndroidRuntime( 226): at name.nanek.test.interleavedbuffer.TestInterleavedBuffer$1.onDrawFrame (TestInterleavedBuffer.java:75) E/AndroidRuntime( 226): at android.opengl.GLSurfaceView $GLThread.guardedRun(GLSurfaceView.java:1112) E/AndroidRuntime( 226): at android.opengl.GLSurfaceView$GLThread.run (GLSurfaceView.java:971) I/Process ( 54): Sending signal. PID: 226 SIG: 3 I/dalvikvm( 226): threadid=7: reacting to signal 3 I can also get a slightly different exception if I modify the code to slice the buffer at zero and position the slice: V/GLSurfaceView(26498): glClear(GL_COLOR_BUFFER_BIT); W/dalvikvm(26498): threadid=15: thread exiting with uncaught exception (group=0x4001da28) E/AndroidRuntime(26498): Uncaught handler: thread GLThread exiting due to uncaught exception E/AndroidRuntime(26498): java.nio.BufferUnderflowException E/AndroidRuntime(26498): at java.nio.IntToByteBufferAdapter.get (IntToByteBufferAdapter.java:148) E/AndroidRuntime(26498): at android.opengl.GLLogWrapper.toByteBuffer (GLLogWrapper.java:977) E/AndroidRuntime(26498): at android.opengl.GLLogWrapper.access$000 (GLLogWrapper.java:38) E/AndroidRuntime(26498): at android.opengl.GLLogWrapper $PointerInfo.bindByteBuffer(GLLogWrapper.java:3042) E/AndroidRuntime(26498): at android.opengl.GLLogWrapper.bindArrays (GLLogWrapper.java:1147) E/AndroidRuntime(26498): at android.opengl.GLLogWrapper.startLogIndices(GLLogWrapper.java:1166) E/AndroidRuntime(26498): at android.opengl.GLLogWrapper.glDrawArrays (GLLogWrapper.java:1518) E/AndroidRuntime(26498): at name.nanek.test.interleavedbuffer.TestInterleavedBuffer$1.onDrawFrame (TestInterleavedBuffer.java:75) E/AndroidRuntime(26498): at android.opengl.GLSurfaceView $GLThread.guardedRun(GLSurfaceView.java:955) E/AndroidRuntime(26498): at android.opengl.GLSurfaceView$GLThread.run (GLSurfaceView.java:887) I/Process ( 76): Sending signal. PID: 26498 SIG: 3 I/dalvikvm(26498): threadid=7: reacting to signal 3 Here's some minimal sample code for the first case that uses robot.png from the API Demos. Paste bin version: http://pastebin.com/f3eb6b1d3 Inline version: package name.nanek.test.interleavedbuffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.IntBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLSurfaceView; import android.opengl.GLUtils; import android.opengl.GLSurfaceView.Renderer; import android.os.Bundle; public class TestInterleavedBuffer extends Activity { private static final boolean LOG = true; private static final boolean AUTOSLICE = false; //One in fixed point. private static final int F1 = 1 << 16; //Number of vertexes needed for a square made using a triangle strip. private static final int VERTEX_COUNT = 4; //3 position values and 2 texture values per vertex. private static final int INTS_PER_VERTEX = 5; //Byte distance between vertexes. private static final int STRIDE = INTS_PER_VERTEX * Integer.SIZE / Byte.SIZE; //Total number of bytes. private static final int BUFFER_BYTES = VERTEX_COUNT * STRIDE; private final IntBuffer buffer = ByteBuffer .allocateDirect(BUFFER_BYTES) .order(ByteOrder.nativeOrder()) .asIntBuffer(); { buffer.put(new int[] { 0, F1, 0, 0, 0,//Top left. 0, 0, 0, 0, F1,//Bottom left. F1, F1, 0, F1, 0,//Top right. F1, 0, 0, F1, F1//Bottom right. }); buffer.rewind(); } private GLSurfaceView mGLSurfaceView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGLSurfaceView = new GLSurfaceView(this); setContentView(mGLSurfaceView); if ( LOG ) { //Enabling this causes an exception. mGLSurfaceView.setDebugFlags (GLSurfaceView.DEBUG_CHECK_GL_ERROR | GLSurfaceView.DEBUG_LOG_GL_CALLS); } else { //This works fine. mGLSurfaceView.setDebugFlags (GLSurfaceView.DEBUG_CHECK_GL_ERROR); } mGLSurfaceView.setRenderer(new Renderer() { @Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, VERTEX_COUNT); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glOrthox(0, F1, 0, F1, 0, F1); gl.glMatrixMode(GL10.GL_MODELVIEW); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glColor4x(F1, F1, F1, F1); gl.glClearColorx(F1, F1, F1, F1); gl.glEnable(GL10.GL_TEXTURE_2D); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL10.GL_FIXED, STRIDE, buffer); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); //Skip first 3 position values to get to texture coordinates. buffer.position(3); //Both options here cause an exception in GLLogWrapper. if ( AUTOSLICE ) { gl.glTexCoordPointer(2, GL10.GL_FIXED, STRIDE, buffer); } else { gl.glTexCoordPointer(2, GL10.GL_FIXED, STRIDE, buffer.slice ()); } buffer.rewind(); int[] textures = new int[1]; gl.glGenTextures(1, textures, 0); gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.robot); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); bitmap.recycle(); } }); } @Override protected void onResume() { super.onResume(); mGLSurfaceView.onResume(); } @Override protected void onPause() { super.onPause(); mGLSurfaceView.onPause(); } }
-- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

