aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorphil <[email protected]>2019-06-09 19:36:49 +1200
committerphil <[email protected]>2019-06-09 19:36:49 +1200
commita04ae3226dd5432f31f272aba07fd846e4ef9447 (patch)
tree65e93cbf0cd188f109e0ec47fad2e3f35b65526c
parent9f3299c6890c2c0329f7d38d445ee912e1e89458 (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.java4
-rw-r--r--src/main/java/org/jogamp/java3d/Renderer.java56
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)) {