You're probably pointing something to some bad memory location
somewhere. I know you didn't post all of your real code so I can't
really say for sure but it looks to me like you may be doing something
wrong with your buffers. Here's how I do it:
-- Load --
GL11 gl11 = (GL11) gl;
if (modelData.normals != null) {
int[] vboIds = new int[5];
gl11.glGenBuffers(5, vboIds, 0);
vertexVBOId = vboIds[0];
texVBOId = vboIds[1];
normalVBOId = vboIds[2];
indexVBOId = vboIds[3];
lightmapVBOId = vboIds[4];
} else {
int[] vboIds = new int[4];
gl11.glGenBuffers(4, vboIds, 0);
vertexVBOId = vboIds[0];
texVBOId = vboIds[1];
indexVBOId = vboIds[2];
lightmapVBOId = vboIds[3];
}
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexVBOId);
gl11.glBufferData(GL11.GL_ARRAY_BUFFER,
modelData.vertices.length *
4, BufferUtil.createDirectIntBuffer(modelData.vertices),
GL11.GL_STATIC_DRAW);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, texVBOId);
gl11.glBufferData(GL11.GL_ARRAY_BUFFER,
modelData.tex.length * 4,
BufferUtil.createDirectIntBuffer(modelData.tex), GL11.GL_STATIC_DRAW);
if (modelData.normals != null) {
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER,
normalVBOId);
gl11.glBufferData(GL11.GL_ARRAY_BUFFER,
modelData.normals.length *
4, BufferUtil.createDirectIntBuffer(modelData.normals),
GL11.GL_STATIC_DRAW);
}
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER,
indexVBOId);
gl11.glBufferData(GL11.GL_ELEMENT_ARRAY_BUFFER,
modelData.indices.length * 2,
BufferUtil.createDirectShortBuffer(modelData.indices),
GL11.GL_STATIC_DRAW);
if (hasLightMap) {
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER,
lightmapVBOId);
gl11.glBufferData(GL11.GL_ARRAY_BUFFER,
lightMapModelData.tex.length * 4,
BufferUtil.createDirectIntBuffer(lightMapModelData.tex),
GL11.GL_STATIC_DRAW);
}
BaseRenderer.checkErrors(gl11);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, 0);
-- Draw --
// use VBOs
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexVBOId);
gl11.glVertexPointer(3, GL10.GL_FIXED, 0, 0);
if (modelData.normals != null) {
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER,
normalVBOId);
gl11.glNormalPointer(GL10.GL_FIXED, 0, 0);
}
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER,
texVBOId);
gl11.glTexCoordPointer(2, GL10.GL_FIXED, 0, 0);
//gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER,
indexVBOId);
// the main draw call
gl11.glDrawArrays(GL11.GL_TRIANGLES, 0, vertexCount);
//gl11.glDrawElements(GL10.GL_TRIANGLES, vertexCount,
GL10.GL_UNSIGNED_SHORT, 0);
// clean up
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);
//gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, 0);
This code draws without indices but the commented code for indices is
there.
I use fixed point coordinates for verts, normals and UVs. You'd want
to change that to floats for what you're doing.
On Feb 16, 1:42 pm, Viktor Linder <[email protected]> wrote:
> I am having trouble with implementing VBOs for my game.
> I get crashes at random when calling glDrawElements() directly after
> glGenBuffers() / glBufferData().
> The crashes disappear when I add printouts which leads me to believe
> it might be a race condition between glBufferData() and
> glDrawElements() of some sort.
> Or I am doing something else that breaks it, but I can't see what.
>
> Here's what I do:
>
> ...
> gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
> gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
> ...
> if(geometry not in cache) {
> gl11.glGenBuffers(1, _temp_handle, 0);
> _geo_id = _temp_handle[0];
>
> // produce text geometry to scratch buffer (allocated with
> ByteBuffer.allocateDirect())
> int off = DynamicBuffer.allocate(_buf_size_floats);
> TextProducer.create_geometry(_font, _text, DynamicBuffer._buffer,
> off);
>
> // upload geometry
> gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, _geo_id);
>
> DynamicBuffer._buffer.position(off);
> gl11.glBufferData(GL11.GL_ARRAY_BUFFER, _buf_size_bytes,
> DynamicBuffer._buffer, GL11.GL_STATIC_DRAW);
>
> DynamicBuffer.deallocate_last(_buf_size_floats);
>
> // set vertex pointer
> gl11.glVertexPointer(3, GL10.GL_FLOAT, 0, 0);
> gl11.glTexCoordPointer(2, GL10.GL_FLOAT, 0, _pos_size_bytes);
>
> insert_in_cache();} else {
>
> ... bind + set vertex pointer using existing VBO ...
>
> }
>
> ...
> gl.glDrawElements(); // <--- sometimes this call crashes, always after
> buffer was just allocated/produced (ie the geometry-not-in-cache code
> path)
> ...
>
> gl.glDisableClientState(VERTEX...);
> gl.glDisableClientState(TEXCOORD...);
>
> Sometimes the call to glDrawElements() crashes. The crash only happens
> when glDrawElements() is called right after the buffer has been
> allocated and written (ie "geometry not in cache" is true).
> The crash seems more common if the produced buffer is a few kb or more
> in size.
> If I insert a Log.d() call in between glVertexPointer3f() and
> glDrawElements() the crash goes away.
>
> I have double checked that the GL calls are not setting the error
> flag, and I am not writing past any buffer limit or feeding incorrect
> sizes etc to glBufferData(). Note that everything renders correctly
> without artifacts up to the crash. The crash does not happen for the
> same geometry all the time, a piece of geometry can be produced and
> rendered correctly, then be re-produced and crash.
>
> Before I make a minimal reproducible example, I thought I would ask
> this group if anyone else
> have experienced the same trouble when using a VBO right after call to
> glBufferData()?
>
> All answers appreciated!
> /Viktor
>
> PS.
> This is the crash dump:
> 02-16 20:23:00.979: INFO/DEBUG(14143): *** *** *** *** *** *** *** ***
> *** *** *** *** *** *** *** ***
> 02-16 20:23:00.979: INFO/DEBUG(14143): Build fingerprint: 'android-
> devphone1/dream_devphone/dream/trout:1.6/DRC83/14721:user/gfh,test-
> keys'
> 02-16 20:23:00.979: INFO/DEBUG(14143): pid: 17564, tid: 17580 >>>
> com.mygame.mygame <<<
> 02-16 20:23:00.979: INFO/DEBUG(14143): signal 11 (SIGSEGV), fault addr
> 002df000
> 02-16 20:23:00.979: INFO/DEBUG(14143): r0 001b9c28 r1 002deff0 r2
> 00000003 r3 001be178
> 02-16 20:23:00.979: INFO/DEBUG(14143): r4 002deff4 r5 001be17c r6
> 00000044 r7 000003ff
> 02-16 20:23:00.979: INFO/DEBUG(14143): r8 00000000 r9 001be170 10
> 00000003 fp 001b9c14
> 02-16 20:23:00.979: INFO/DEBUG(14143): ip 00000002 sp 44944d00 lr
> 8042b8dc pc 8043fdf8 cpsr 20000010
> 02-16 20:23:02.669: INFO/DEBUG(14143): #00 pc 0003fdf8 /
> system/lib/libhgl.so
> 02-16 20:23:02.669: INFO/DEBUG(14143): #01 lr 8042b8dc /
> system/lib/libhgl.so
> 02-16 20:23:02.669: INFO/DEBUG(14143): stack:
> 02-16 20:23:02.679: INFO/DEBUG(14143): 44944cc0 0000000c
> 02-16 20:23:02.679: INFO/DEBUG(14143): 44944cc4 001b53d4 [heap]
> 02-16 20:23:02.679: INFO/DEBUG(14143): 44944cc8 001b39b0 [heap]
> 02-16 20:23:02.679: INFO/DEBUG(14143): 44944ccc 001b49b0 [heap]
> 02-16 20:23:02.679: INFO/DEBUG(14143): 44944cd0 00000000
> 02-16 20:23:02.679: INFO/DEBUG(14143): 44944cd4 00000000
> 02-16 20:23:02.679: INFO/DEBUG(14143): 44944cd8 001b3db0 [heap]
> 02-16 20:23:02.679: INFO/DEBUG(14143): 44944cdc 8043c1c0 /system/
> lib/libhgl.so
> 02-16 20:23:02.679: INFO/DEBUG(14143): 44944ce0 001c3e78 [heap]
> 02-16 20:23:02.689: INFO/DEBUG(14143): 44944ce4 009c8330
> 02-16 20:23:02.689: INFO/DEBUG(14143): 44944ce8 001b9c08 [heap]
> 02-16 20:23:02.689: INFO/DEBUG(14143): 44944cec 001b39b0 [heap]
> 02-16 20:23:02.689: INFO/DEBUG(14143): 44944cf0 001b44ac [heap]
> 02-16 20:23:02.689: INFO/DEBUG(14143): 44944cf4 00000005
> 02-16 20:23:02.689: INFO/DEBUG(14143): 44944cf8 df002777
> 02-16 20:23:02.689: INFO/DEBUG(14143): 44944cfc e3a070ad
> 02-16 20:23:02.689: INFO/DEBUG(14143): #00 44944d00 00000400
> 02-16 20:23:02.689: INFO/DEBUG(14143): 44944d04 001c3e78 [heap]
> 02-16 20:23:02.699: INFO/DEBUG(14143): 44944d08 009cd330
> 02-16 20:23:02.699: INFO/DEBUG(14143): 44944d0c 001b9c08 [heap]
> 02-16 20:23:02.699: INFO/DEBUG(14143): 44944d10 001b39b0 [heap]
> 02-16 20:23:02.699: INFO/DEBUG(14143): 44944d14 001b44ac [heap]
> 02-16 20:23:02.699: INFO/DEBUG(14143): 44944d18 00000000
> 02-16 20:23:02.699: INFO/DEBUG(14143): 44944d1c 00000800
> 02-16 20:23:02.699: INFO/DEBUG(14143): 44944d20 00000008
> 02-16 20:23:02.699: INFO/DEBUG(14143): 44944d24 00000000
> 02-16 20:23:02.699: INFO/DEBUG(14143): 44944d28 00000ec4
> 02-16 20:23:02.699: INFO/DEBUG(14143): 44944d2c 002c3dd0 [heap]
> 02-16 20:23:02.709: INFO/DEBUG(14143): 44944d30 001b39b0 [heap]
> 02-16 20:23:02.709: INFO/DEBUG(14143): 44944d34 001b49b0 [heap]
> 02-16 20:23:02.709: INFO/DEBUG(14143): 44944d38 001b3db0 [heap]
> 02-16 20:23:02.709: INFO/DEBUG(14143): 44944d3c 001c3e78 [heap]
> 02-16 20:23:02.709: INFO/DEBUG(14143): 44944d40 00000001
> 02-16 20:23:02.709: INFO/DEBUG(14143): 44944d44 8041fc14 /system/
> lib/libhgl.so
--
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