Administrator
|
Hi
Someone contacted me because he gave a try to the experimental SWT GLCanvas of JOGL 2.0 and the same snippet working on Windows 64 bits crashes on Ubuntu Linux 32 bits : import javax.media.opengl.GL; import javax.media.opengl.GL2; import javax.media.opengl.GL2ES1; import javax.media.opengl.GL2GL3; import javax.media.opengl.GLProfile; import javax.media.opengl.fixedfunc.GLMatrixFunc; import javax.media.opengl.glu.GLU; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; /** * * @author Pierre ****** * @since 29 sept. 2011 */ class Snippet209 { static { GLProfile.initSingleton(false); } /** * @param gl * @param r * @param R * @param nsides * @param rings */ static void drawTorus(GL2 gl, float r, float R, int nsides, int rings) { float ringDelta = 2.0f * (float) Math.PI / rings; float sideDelta = 2.0f * (float) Math.PI / nsides; float theta = 0.0f, cosTheta = 1.0f, sinTheta = 0.0f; for (int i = rings - 1; i >= 0; i--) { float theta1 = theta + ringDelta; float cosTheta1 = (float) Math.cos(theta1); float sinTheta1 = (float) Math.sin(theta1); gl.glBegin(GL2.GL_QUAD_STRIP); float phi = 0.0f; for (int j = nsides; j >= 0; j--) { phi += sideDelta; float cosPhi = (float) Math.cos(phi); float sinPhi = (float) Math.sin(phi); float dist = R + r * cosPhi; gl.glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi); gl.glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi); gl.glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi); gl.glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi); } gl.glEnd(); theta = theta1; cosTheta = cosTheta1; sinTheta = sinTheta1; } } /** * @param args */ public static void main(String[] args) { final Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); Composite comp = new Composite(shell, SWT.NONE); comp.setLayout(new FillLayout()); // final SWTGLCanvas canvas = new SWTGLCanvas(comp, SWT.NONE, // GLProfile.get(GLProfile.GL2)); final SWTGLCanvas canvas = new SWTGLCanvas(comp, SWT.NONE, GLProfile.getDefault()); canvas.makeCurrent(); canvas.addListener(SWT.Resize, new Listener() { @Override public void handleEvent(Event event) { Rectangle bounds = canvas.getBounds(); float fAspect = (float) bounds.width / (float) bounds.height; canvas.makeCurrent(); GL2 gl = canvas.getContext().getGL().getGL2(); gl.glViewport(0, 0, bounds.width, bounds.height); gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION); gl.glLoadIdentity(); GLU glu = new GLU(); glu.gluPerspective(45.0f, fAspect, 0.5f, 400.0f); gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); gl.glLoadIdentity(); canvas.releaseContext(); } }); canvas.makeCurrent(); GL2 gl = canvas.getContext().getGL().getGL2(); gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); gl.glColor3f(1.0f, 0.0f, 0.0f); gl.glHint(GL2ES1.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); gl.glClearDepth(1.0); gl.glLineWidth(2); gl.glEnable(GL.GL_DEPTH_TEST); canvas.releaseContext(); shell.setText("SWT/JOGL Example"); shell.setSize(640, 480); shell.open(); display.asyncExec(new Runnable() { int rot = 0; @Override public void run() { if (!canvas.isDisposed()) { canvas.makeCurrent(); GL2 gl = canvas.getContext().getGL().getGL2(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glClearColor(.3f, .5f, .8f, 1.0f); gl.glLoadIdentity(); gl.glTranslatef(0.0f, 0.0f, -10.0f); float frot = rot; gl.glRotatef(0.15f * rot, 2.0f * frot, 10.0f * frot, 1.0f); gl.glRotatef(0.3f * rot, 3.0f * frot, 1.0f * frot, 1.0f); rot++; gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL2GL3.GL_LINE); gl.glColor3f(0.9f, 0.9f, 0.9f); drawTorus(gl, 1, 1.9f + ((float) Math.sin((0.004f * frot))), 15, 15); canvas.swapBuffers(); canvas.releaseContext(); display.asyncExec(this); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } } }); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } } He gets this each time: Info: XInitThreads() called for concurrent Thread support Exception in thread "main" javax.media.opengl.GLException: Error making temp context(1) current: display 0xffffffff90791278, context 0xffffffff9073ce30, drawable jogamp.opengl.x11.glx.X11OnscreenGLXDrawable[Realized true, Factory jogamp.opengl.x11.glx.X11GLXDrawableFactory@1041876, handle 0x3e0002d, Window WrappedSurface[config X11GLXGraphicsConfiguration[X11GraphicsScreen[X11GraphicsDevice[type X11, connection :0.0, unitID 0, handle 0xffffffff90791278], idx 0], visualID 0x58, fbConfigID 0x58, requested GLCaps[on-scr, rgba 0x8/8/8/1, opaque, accum-rgba 0/0/0/0, dp/st/ms: 16/0/2, dbl, mono , hw, GLProfile[GL2/GL2]], chosen GLCaps[0x58 0x58: on-scr, rgba 0x8/8/8/8, trans-rgba 0xff/ff/ff/ff, accum-rgba 0/0/0/0, dp/st/ms: 16/0/0, dbl, mono , hw, GLProfile[GL2/GL2]]], displayHandle 0xffffffff90791278, surfaceHandle 0x3e0002d, size 640x480]] at jogamp.opengl.x11.glx.X11GLXContext.createImplRaw(X11GLXContext.java:356) at jogamp.opengl.x11.glx.X11GLXContext.createImpl(X11GLXContext.java:285) at jogamp.opengl.GLContextImpl.makeCurrentLocking(GLContextImpl.java:451) at jogamp.opengl.GLContextImpl.makeCurrent(GLContextImpl.java:388) at fr.volutes.ui.editors.SWTGLCanvas.makeCurrent(SWTGLCanvas.java:96) at fr.volutes.ui.editors.Snippet209.main(Snippet209.java:87) When he uses the AWT GLCanvas on the same machine with Ubuntu Linux, it works but when he tries to reopen another GLCanvas, he gets this: (please find enclosed the logs) awtcanvas_hs_err_pid4681.log Can someone help us? I suspect a driver bug in the last case.
Julien Gouesse | Personal blog | Website
|
Free forum by Nabble | Edit this page |