Android 5.1 crash -- glDrawArrays GL_POINTS -- Fatal signal 7 (SIGBUS), code 2 -
a couple months ago, after update nexus 4 android 5.1 (now 5.1.1 -- both stock factory images google), 1 of games started crashing while drawing particles using gldrawarrays gl_points. i've simplified, reimplemented code in java, , replicated crash.
the crash fatal signal 7 (sigbus), code 2 in seems opengl driver code.
in test, me, 118 drawpoint() calls in for-loop, seems run ok, crashes (the next frame) if try 119 drawpoint() calls. number of calls drawpoint(), more 119, crashes.
this java code runs ok on nexus 4 virtual device. original c code runs on pc, ios, , other android devices without problems.
this seems nexus 4 driver problem. ideas?
logcat:
--------- beginning of crash a/libc﹕ fatal signal 7 (sigbus), code 2, fault addr 0xa2876000 in tid 17998 (glthread 14477) i/debug﹕ *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** i/debug﹕ build fingerprint: 'google/occam/mako:5.1.1/lmy47v/1836172:user/release-keys' i/debug﹕ revision: '11' i/debug﹕ abi: 'arm' i/debug﹕ pid: 17822, tid: 17998, name: glthread 14477 >>> com.joeco.pointsprites <<< i/debug﹕ signal 7 (sigbus), code 2 (bus_adrerr), fault addr 0xa2876000 i/debug﹕ r0 c0004600 r1 a2876000 r2 04000000 r3 a2876000 i/debug﹕ r4 b7755818 r5 00000000 r6 b776d550 r7 00000018 i/debug﹕ r8 b776d550 r9 04000000 sl 00008000 fp 00000000 i/debug﹕ ip fc000000 sp a4601850 lr abad3c91 pc abac38e6 cpsr 60030030 i/debug﹕ backtrace: i/debug﹕ #00 pc 000ab8e6 /system/vendor/lib/egl/libglesv2_adreno.so (oxili_write_event_write+41) i/debug﹕ #01 pc 000bbc8d /system/vendor/lib/egl/libglesv2_adreno.so (oxili_wa_predraw+234) i/debug﹕ #02 pc 000bbef1 /system/vendor/lib/egl/libglesv2_adreno.so (oxili_wa_point_sprite_dummy_draw+204) i/debug﹕ #03 pc 000ba47b /system/vendor/lib/egl/libglesv2_adreno.so (oxili_primitive_drawarrays+318) i/debug﹕ #04 pc 000825cf /system/vendor/lib/egl/libglesv2_adreno.so (rb_primitive_drawarrays+298) i/debug﹕ #05 pc 0005a4f7 /system/vendor/lib/egl/libglesv2_adreno.so (core_gldrawarraysinstancedxxx+294) i/debug﹕ #06 pc 0005a877 /system/vendor/lib/egl/libglesv2_adreno.so (core_gldrawarrays+6) i/debug﹕ #07 pc 00049acb /system/vendor/lib/egl/libglesv2_adreno.so (gldrawarrays+24) i/debug﹕ #08 pc 00a5befb /data/dalvik-cache/arm/system@framework@boot.oat the code mainactivity.java:
// mainactivity.java -- pointsprite crash -- joe linhoff 6/15/2015 package com.joeco.pointsprites; import android.app.activity; import android.content.context; import android.opengl.gles20; import android.opengl.glsurfaceview; import android.opengl.matrix; import android.os.bundle; import android.os.systemclock; import java.nio.byteorder; import java.nio.floatbuffer; import java.nio.bytebuffer; import javax.microedition.khronos.opengles.gl10; // starting point: http://developer.android.com/training/graphics/opengl/index.html public class mainactivity extends activity { public glsurfaceview mglview; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); mglview = new myglsurfaceview(this); setcontentview(mglview); } // oncreate() class myglsurfaceview extends glsurfaceview { private final myglrenderer mrenderer; public myglsurfaceview(context context) { super(context); seteglcontextclientversion(2); // create opengl es 2.0 context mrenderer = new myglrenderer(); setrenderer(mrenderer); setrendermode(glsurfaceview.rendermode_continuously); } // myglsurfaceview() } // class myglsurvaceview public class pointgeo { floatbuffer vertexbuffer; static final int floatspervertex = 3; float pointcoords[] = { 0.1f, 0.0f, 0.0f }; // xyz final int vertexcount = pointcoords.length / floatspervertex; final int vertexstride = floatspervertex * 4; // 4 bytes per float public pointgeo() { bytebuffer bb = bytebuffer.allocatedirect(pointcoords.length * 4); // each 4 bytes bb.order(byteorder.nativeorder()); // device's native byte order vertexbuffer = bb.asfloatbuffer(); // create floating point buffer vertexbuffer.put(pointcoords); // copy coordinates buffer vertexbuffer.position(0); // set first item } // pointgeo() } // class pointgeo public class myglrenderer implements glsurfaceview.renderer { private boolean msetup = false; private pointgeo mpoint; private int mtriangleshaderprogram; private int mtriangleshaderloc_umvpmat; private int mtriangleshaderloc_vpos; private float[] mviewmat = new float[16]; private float[] mmodelmat = new float[16]; private float[] mprojmat = new float[16]; private float[] mmvpmat = new float[16]; public void ondrawframe(gl10 unused) { if(!msetup) lazysetup(); gles20.glclearcolor(0.0f, 0.0f, 1.0f, 1.0f); gles20.glclear(gles20.gl_color_buffer_bit); // build model matrix -- rotate int time = (int)systemclock.uptimemillis() & 8191; float angleindegrees = (360.0f / 8191.0f) * time; matrix.setidentitym(mmodelmat, 0); matrix.rotatem(mmodelmat, 0, angleindegrees, 0.0f, 0.0f, 1.0f); // draw -- 118:ok 119:crash on next frame for(int i=0;i<119;i++) drawpoint(); } // ondrawframe() void drawpoint() { // setup gles20.gluseprogram(mtriangleshaderprogram); gles20.glenablevertexattribarray(mtriangleshaderloc_vpos); gles20.glvertexattribpointer(mtriangleshaderloc_vpos, mpoint.floatspervertex, gles20.gl_float, false, mpoint.vertexstride, mpoint.vertexbuffer); // build mvp matrix matrix.multiplymm(mmvpmat,0,mviewmat,0,mmodelmat,0); matrix.multiplymm(mmvpmat, 0, mprojmat, 0, mmvpmat, 0); gles20.gluniformmatrix4fv(mtriangleshaderloc_umvpmat, 1, false, mmvpmat, 0); // draw gles20.gldrawarrays(gles20.gl_points, 0, mpoint.vertexcount); // finish gles20.gldisablevertexattribarray(mtriangleshaderloc_vpos); gles20.gluseprogram(0); } // drawpoint() @override public void onsurfacecreated(gl10 gl10, javax.microedition.khronos.egl.eglconfig eglconfig) { } // onsurfacecreated() public void onsurfacechanged(gl10 unused, int width, int height) { gles20.glviewport(0, 0, width, height); // create projection matrix final float ratio = (float) width / height; final float left = -ratio; final float right = ratio; final float bottom = -1.0f; final float top = 1.0f; final float near = 1.0f; final float far = 10.0f; matrix.frustumm(mprojmat, 0, left, right, bottom, top, near, far); } // onsurfacechanged() public int loadshader(int type, string shadercode) { int shader = gles20.glcreateshader(type); // create shader gles20.glshadersource(shader, shadercode); // add source gles20.glcompileshader(shader); // compile return shader; } // loadshader() private final string vertexshadercode = "attribute vec4 vpos;" + "uniform mat4 umvpmat;" + "void main() {" + " gl_position = vpos*umvpmat;" + " gl_pointsize = 40.0f; " + "}"; private final string fragmentshadercode = "void main() {" + " gl_fragcolor = vec4(0.5f,0.7f,0.5f,1.f);" + "}"; void lazysetup() { msetup=true; mpoint = new pointgeo(); int vshader = loadshader(gles20.gl_vertex_shader,vertexshadercode); int fshader = loadshader(gles20.gl_fragment_shader,fragmentshadercode); mtriangleshaderprogram = gles20.glcreateprogram(); gles20.glattachshader(mtriangleshaderprogram, vshader); gles20.glattachshader(mtriangleshaderprogram, fshader); gles20.gllinkprogram(mtriangleshaderprogram); int err = gles20.glgeterror(); mtriangleshaderloc_umvpmat = gles20.glgetuniformlocation(mtriangleshaderprogram, "umvpmat"); mtriangleshaderloc_vpos = gles20.glgetattriblocation(mtriangleshaderprogram, "vpos"); setviewmat(); matrix.setidentitym(mmodelmat,0); } // lazysetup() void setviewmat() { final float eyex = 0.0f; final float eyey = 0.0f; final float eyez = 5.0f; final float lookx = 0.0f; final float looky = 0.0f; final float lookz = -1.0f; final float upx = 0.0f; final float upy = 1.0f; final float upz = 0.0f; matrix.setlookatm(mviewmat, 0, eyex, eyey, eyez, lookx, looky, lookz, upx, upy, upz); } // setviewmat() } // class myglrenderer } // class mainactivity
you have attribute vec4 vpos; in vs, 4 floats, upload 3 floats per vertex... change vertex shader this:
attribute vec4 vpos; --> attribute vec3 vpos;
also
gl_position = vpos * umvpmat; --> gl_position = vec4(vpos, 1.0) * umvpmat;
Comments
Post a Comment