diff options
author | phil <[email protected]> | 2019-06-09 19:36:49 +1200 |
---|---|---|
committer | phil <[email protected]> | 2019-06-09 19:36:49 +1200 |
commit | a04ae3226dd5432f31f272aba07fd846e4ef9447 (patch) | |
tree | 65e93cbf0cd188f109e0ec47fad2e3f35b65526c | |
parent | 9f3299c6890c2c0329f7d38d445ee912e1e89458 (diff) |
Pure Immediate Context usage fix
The Renderer now wraps a use/release context call pair around any of the
Pure Immediate mode operations in the main doWork loop.
The renderer also now lazily creates a context on the first Pure
Immediate mode call.
GarphicsContext3D calls makeCxtCurrent in doClear in the case where a
context had to be created (that creation call should in fact now be
redundant but it is left in)
-rw-r--r-- | src/main/java/org/jogamp/java3d/GraphicsContext3D.java | 4 | ||||
-rw-r--r-- | src/main/java/org/jogamp/java3d/Renderer.java | 56 |
2 files changed, 59 insertions, 1 deletions
diff --git a/src/main/java/org/jogamp/java3d/GraphicsContext3D.java b/src/main/java/org/jogamp/java3d/GraphicsContext3D.java index 2595d8c..c2c43f9 100644 --- a/src/main/java/org/jogamp/java3d/GraphicsContext3D.java +++ b/src/main/java/org/jogamp/java3d/GraphicsContext3D.java @@ -1730,7 +1730,9 @@ public int numSounds() { canvas3d.drawingSurfaceObject.unLock(); return; } - + // createNewContext finishes with a release, re-make current so the init calls below work + canvas3d.makeCtxCurrent(); + canvas3d.ctxTimeStamp = VirtualUniverse.mc.getContextTimeStamp(); canvas3d.screen.renderer.listOfCtxs.add(canvas3d.ctx); diff --git a/src/main/java/org/jogamp/java3d/Renderer.java b/src/main/java/org/jogamp/java3d/Renderer.java index 2899318..01958e3 100644 --- a/src/main/java/org/jogamp/java3d/Renderer.java +++ b/src/main/java/org/jogamp/java3d/Renderer.java @@ -620,7 +620,62 @@ ArrayList<TextureRetained> textureIDResourceTable = new ArrayList<TextureRetaine if (canvas.isFatalError()) { continue; } + if (canvas.ctx == null) { + synchronized (VirtualUniverse.mc.contextCreationLock) { + canvas.ctx = canvas.createNewContext(null, false); + + if (canvas.ctx == null) { + canvas.drawingSurfaceObject.unLock(); + // Issue 260 : indicate fatal error and notify error listeners + canvas.setFatalError(); + RenderingError err = + new RenderingError(RenderingError.CONTEXT_CREATION_ERROR, + J3dI18N.getString("Renderer7")); + err.setCanvas3D(canvas); + err.setGraphicsDevice(canvas.graphicsConfiguration.getDevice()); + notifyErrorListeners(err); + + break doneRender; + } + // createNewContext finishes with a release, re-make current so the init calls below work + canvas.makeCtxCurrent(); + + if (canvas.graphics2D != null) { + canvas.graphics2D.init(); + } + + canvas.ctxTimeStamp = VirtualUniverse.mc.getContextTimeStamp(); + canvas.screen.renderer.listOfCtxs.add(canvas.ctx); + canvas.screen.renderer.listOfCanvases.add(canvas); + + // enable separate specular color + canvas.enableSeparateSpecularColor(); + } + + // create the cache texture state in canvas + // for state download checking purpose + if (canvas.texUnitState == null) { + canvas.createTexUnitState(); + } + canvas.drawingSurfaceObject.contextValidated(); + canvas.screen.renderer.currentCtx = canvas.ctx; + canvas.screen.renderer.currentDrawable = canvas.drawable; + canvas.graphicsContext3D.initializeState(); + canvas.ctxChanged = true; + canvas.canvasDirty = 0xffff; + // Update Appearance + canvas.graphicsContext3D.updateState(canvas.view.renderBin, RenderMolecule.SURFACE); + + + canvas.currentLights = new LightRetained[canvas.getNumCtxLights(canvas.ctx)]; + + for (j=0; j<canvas.currentLights.length; j++) { + canvas.currentLights[j] = null; + } + } + + canvas.makeCtxCurrent(); try { switch (command) { @@ -757,6 +812,7 @@ ArrayList<TextureRetained> textureIDResourceTable = new ArrayList<TextureRetaine } m[nmesg++].decRefcount(); + canvas.releaseCtx(); } else { // retained mode rendering long startRenderTime = 0L; if (MasterControl.isStatsLoggable(Level.INFO)) { |