I have a huge Java Application which contains one frame using JOGL to display some open gl graphics. On Windows XP the application runs fine. Due to migration to windows 7 the application needs to be ported to windows 7. When running the application within the Eclipse IDE it works fine. There are no problems concering the JOGL part. After that I deployed the application using the same routines that worked for Windows XP (IzPack Installer). Now the problems begin: Case 1: Eclipse IDE is open: The deployed application runs fine Case 2: Eclipse IDE never opened. Assuming fresh boot of the system and starting the application: The deployed application crashes as soon as the JOGL frame is created. For me, this is a really strange behaviour I cannot comprehend. I have created a small test project which is a copy of the original application, but contains only the JOGL part. Its nearly the same architecture (MDI, but MVC Pattern is not realised) and took the original classes but reduced the code to a minimum. So this small application runs fine when it is deployed. My System: Windows 7 x64 Enterprise JOGL2 RC5 Nvidia Quadro FX 360M. Driver: 266.58 Java: 1.6U29 / 1.6U30 / 1.7U2 With this bug report i attach three things: 1) Debug Log File Deployed Application 2) Debug Log File in Eclipse 3) A sample error report of VM crash Perhaps you have an idea an idea where this error is hidden. BR
Created attachment 312 [details] Debug Log Deployed
Created attachment 313 [details] Debug Log Eclipse
Created attachment 314 [details] Error Report
Additionel Information: http://forum.jogamp.org/JOGL-Application-crashes-on-Windows-7-but-runs-fine-in-Eclipse-td3600585.html
I don't know whether it is important but I have noticed this difference between both files, this appears only before JOGL crashes: "createContextARB: mappedVersionsAvailableSet(decon): false" not when it works: "createContextARB: SET mappedVersionsAvailableSet Windows_decon_0"
Interesting .. I read your attachments. You mentioned to have a small standalone test case, could you attach it here ? Just for curiosity, can you try w/ latest sources/builds and define property 'jogl.windows.useWGLVersionOf5WGLGDIFuncSet' ? http://jogamp.org/git/?p=jogl.git;a=commit;h=c49d29784986b1945343b9a90b5e0c9f3d95d937 You have run the JOGL app with (1) eclipse and (2) special deployment variant (I don't know) Can you add another one with (3) standalone / commandline w/ only std method, eg. JAR / classes .. etc ? However, if I would have your standalone project and your special deployment tool (2) maybe I can help.
re: comment 5, you don't see the 'SET' in the crashed version, since it hasn't reached the point where all GL versions are queried. IE the app crashed within our initialization sequence, hence no user code is involved. But I guess this special deployment thingy (which I don't know) must have something to do with it ..
@Sven: The "special deployment variant" is just a way to deploy the application to a computer. There is nothing special. I use the IzPack installer to pack the jar-file of the tool and all necessary libraries and .dlls in one single jar file. This jar file behaves like an installer and just copies the content to a user defined folder. So I could copy everything manually, it would be the same but not that comfortable. Thats the special deployment variant. I attach the small test project. This is structured like the deployment variant. Also I attache the Eclipse project. But this works fine. To be sure: The property I define like the debug properties as jvm property so: jogl.windows.useWGLVersionOf5WGLGDIFuncSet = true , right? One thing I discovered was, that there were different GL Profiles used. When it crashes: AWT-EventQueue-0-SharedResourceRunner - WindowWGLContext.createContextARBImpl: 4.2 (compatibility profile, any, new) - @creation, handle 0x77010e a4, share 0x0, direct true, wglCreateContextAttribsARB: 0x69c5a660 When it works: AWT-EventQueue-0-SharedResourceRunner - WindowWGLContext.createContextARBImpl: 3.0 (compatibility profile, any, new) - @creation, handle 0xd012c65, share 0x0, direct true, wglCreateContextAttribsARB: 0x69c5a660 java.lang.Exception: Stack trace
Created attachment 315 [details] Sourcecode of test application
Created attachment 316 [details] Jar File of test application and start command
Finally I managed the application to start with the parameter and latest builds JOGL: Build 620 Gluegen: Build 474 I tried the application to run within Eclipse and received following exceptions: USE_WGLVersion_Of_5WGLGDIFuncSet: true javax.media.opengl.GLException: WindowsWGLDrawableFactory - Could not initialize shared resources for decon at jogamp.opengl.windows.wgl.WindowsWGLDrawableFactory$SharedResourceImplementation.createSharedResource(WindowsWGLDrawableFactory.java:340) at jogamp.opengl.SharedResourceRunner.run(SharedResourceRunner.java:261) at java.lang.Thread.run(Thread.java:662) Caused by: javax.media.opengl.GLException: Unable to create temp OpenGL context for device context 0x1001124b at jogamp.opengl.windows.wgl.WindowsWGLContext.createImpl(WindowsWGLContext.java:294) at jogamp.opengl.GLContextImpl.makeCurrentWithinLock(GLContextImpl.java:505) at jogamp.opengl.GLContextImpl.makeCurrent(GLContextImpl.java:424) at jogamp.opengl.windows.wgl.WindowsWGLDrawableFactory$SharedResourceImplementation.createSharedResource(WindowsWGLDrawableFactory.java:315) ... 2 more Exception occurred during event dispatching: java.lang.ExceptionInInitializerError at gui.frames.openGLFrame.openGLModeFrame.initComponents(openGLModeFrame.java:139) at gui.frames.openGLFrame.openGLModeFrame.<init>(openGLModeFrame.java:104) at gui.frames.dataObjectFrameSelectorDialog$addButtonListener.actionPerformed(dataObjectFrameSelectorDialog.java:267) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6288) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6053) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4651) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4481) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4481) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643) at java.awt.EventQueue.access$000(EventQueue.java:84) at java.awt.EventQueue$1.run(EventQueue.java:602) at java.awt.EventQueue$1.run(EventQueue.java:600) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) at java.awt.EventQueue$2.run(EventQueue.java:616) at java.awt.EventQueue$2.run(EventQueue.java:614) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.awt.EventQueue.dispatchEvent(EventQueue.java:613) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178) at java.awt.Dialog$1.run(Dialog.java:1046) at java.awt.Dialog$3.run(Dialog.java:1098) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Dialog.show(Dialog.java:1096) at java.awt.Component.show(Component.java:1584) at java.awt.Component.setVisible(Component.java:1536) at java.awt.Window.setVisible(Window.java:842) at java.awt.Dialog.setVisible(Dialog.java:986) at gui.frames.mainWindow.mainWindowMenuBar$addWidgetActionListener.actionPerformed(mainWindowMenuBar.java:165) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.AbstractButton.doClick(AbstractButton.java:357) at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:809) at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:850) at java.awt.Component.processMouseEvent(Component.java:6288) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6053) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4651) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4481) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4481) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643) at java.awt.EventQueue.access$000(EventQueue.java:84) at java.awt.EventQueue$1.run(EventQueue.java:602) at java.awt.EventQueue$1.run(EventQueue.java:600) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) at java.awt.EventQueue$2.run(EventQueue.java:616) at java.awt.EventQueue$2.run(EventQueue.java:614) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.awt.EventQueue.dispatchEvent(EventQueue.java:613) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) Caused by: javax.media.opengl.GLException: Profile GL2 is not available on null, but: [] at javax.media.opengl.GLProfile.get(GLProfile.java:655) at javax.media.opengl.GLProfile.get(GLProfile.java:668) at gui.widgets.openGlPlot.openGLModePanel.<clinit>(openGLModePanel.java:85) ... 83 more The same happens when running outside of Eclipse. BR
Update: I tried some additional and sometimes desperate things to get it to work: Since the small testcase worked I reduced the JOGL related classes in the complete application the same way they are reduced in the testcase. Did not work So I thought there might be some incompatibilities with some other libraries I use but could not verify that. Starting the complete application just with jogl,logging and mysql-jar did not work either. Also I tried to use a Java7U2 VM again but did not work. In the meantime I got one JavaVM Error Report which says that the failing module was opengl32.dll. One last thing was, that I copied the necessary .jar's, the logging configuration and the application jar manually to a folder and created the start-command (no installer used) - did not work either. Overview of used libraries: JAMA JMatIO JFreechart log4j MigLayout GroupLayout MySQL Java Connector POI VTK (But JOGL and VTK frames are not opened at the same time!) BR
Hi Maybe one of your dependencies try to load OpenGL native libraries before JOGL (maybe VTK as it uses OpenGL for its rendering).
Hi Julien, I think this can be excluded. Actually I have tested this in the small application. I have referenced the vtk library without any code that uses VTK and it works. Additionaly, I have referenced JFreeChart, too. The test application worked. In the original application this is also the same. When opening the jogl frame there is no code active that loads the vtk libraries. this is another frame which does not exist at the moment. To verify this I took the original application and deleted everything in the code which is not necesseray for the open gl frame. Unfortunately this very very reduced original application crashes at all and there is no vtk active code. For me this is a very strange behaviour. The new bottom-up build test application works with jogl but when I take the top-down reduced application (at least the 3 jogl classes contain exactly the same code) jogl does not work?! @Sven: Have you discovered s.th.? I guess I will prepare s.th. to attach these both applications to the bug report.. BR
Good news! I guess I could localize the concrete problem and fix it. In the initialization of the application there is a check for the graphic environment. This method causes the problem on windows 7. Since I don't see a important reason to use this check I disabled the call to the function and the OpenGL works fine. Here is the source code of the method that performs the check and seems to do s.th. that JOGL does not like when running outside of eclipse. public class graphicsEnvironment { static Logger logger = Logger.getLogger(graphicsEnvironment.class.getName()); public static void checkGraphicsEnvironment() { Rectangle virtualBounds = new Rectangle(); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); //write graphics devices to log logger.info("number of graphics devices " + gs.length); for(int i =0 ; i < gs.length; i++) { logger.info(gs[i].toString()); } //check for bounds for (int j = 0; j < gs.length; j++) { GraphicsDevice gd = gs[j]; GraphicsConfiguration[] gc = gd.getConfigurations(); for (int i=0; i < gc.length; i++) { logger.info("graphics configuration for device " + j + " is: " + gc[i].getBounds()); virtualBounds = virtualBounds.union(gc[i].getBounds()); } } } } Perhaps you got an idea why this function fails on windows 7 and works fine on windows xp with JOGL. BR
Additional Information: The code is part of the official java documentation http://docs.oracle.com/javase/6/docs/api/java/awt/GraphicsConfiguration.html
What happens if you use -Dsun.java2d.opengl=false?
Using this start command: "C:\Program Files\Java\jdk1.6.0_29\bin\javaw.exe" -Dsun.java2d.noddraw=true -Dsun.java2d.d3d=false -Dsun.java2d.ddoffscreen=false -Dsun.java2d.gdiblit=false -Dsun.java2d.opengl=false -Xms512m -Xmx1024m -jar "C:\Program Files\Correlation Tool\JOGL2TestB620v12\corr_tool_x64_jogl2b620.jar" and the checkGraphicsEnvironment mentioned above it crashes again. IIRC the -Dsun.java2d.opengl=false also causes trouble on windows xp. BR
Using this start command: "C:\Program Files\Java\jdk1.6.0_29\bin\javaw.exe" -Dsun.java2d.noddraw=true -Dsun.java2d.d3d=false -Dsun.java2d.ddoffscreen=false -Dsun.java2d.gdiblit=false -Dsun.java2d.opengl=false -Xms512m -Xmx1024m -jar "C:\Program Files\Correlation Tool\JOGL2TestB620v12\corr_tool_x64_jogl2b620.jar" and the checkGraphicsEnvironment method mentioned above it crashes again. IIRC the -Dsun.java2d.opengl=false parameter causes trouble on windows xp, too. BR
Sounds great - thank you Ralf for identifying this issue and creating a work around. Validated your findings: http://jogamp.org/git/?p=jogl.git;a=commit;h=05dfc0ca320d6578cd596cc3384a3bbc6fc4e36f +++ Turns out, that the culprit (at least on my Win7 NVidia machine) is the runtime property "-Dsun.java2d.opengl=false". When _not_ setting this prop. the test runs fine. +++ Since it seems this issue is not related or cause by our code, but internals to AWT and/or the OS/driver, I close it with 'INVALID'. Please reopen this bug when you see fit.