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

Popular posts from this blog

javascript - Google App Script ContentService downloadAsFile not working -

javascript - Function overwritting -

php - Find a regex to take part of Email -