From 54d37207423e46ea80975651910478baa8dd8421 Mon Sep 17 00:00:00 2001 From: phil Date: Sun, 9 Jun 2019 20:21:20 +1200 Subject: [PATCH 1/2] 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) --- src/javax/media/j3d/GraphicsContext3D.java | 3 ++ src/javax/media/j3d/Renderer.java | 58 ++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/src/javax/media/j3d/GraphicsContext3D.java b/src/javax/media/j3d/GraphicsContext3D.java index 75b2d1db..b6eb1c59 100644 --- a/src/javax/media/j3d/GraphicsContext3D.java +++ b/src/javax/media/j3d/GraphicsContext3D.java @@ -1731,6 +1731,9 @@ void doClear() { 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/javax/media/j3d/Renderer.java b/src/javax/media/j3d/Renderer.java index 63626722..71168420 100644 --- a/src/javax/media/j3d/Renderer.java +++ b/src/javax/media/j3d/Renderer.java @@ -620,6 +620,63 @@ else if (renderType == J3dMessage.DESTROY_CTX_AND_OFFSCREENBUFFER) { 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 Date: Thu, 29 Aug 2019 14:44:09 -0600 Subject: [PATCH 2/2] Fixed error that happened in multi-screen environments --- src/javax/media/j3d/JoglPipeline.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/javax/media/j3d/JoglPipeline.java b/src/javax/media/j3d/JoglPipeline.java index c45fd619..430fd3e6 100644 --- a/src/javax/media/j3d/JoglPipeline.java +++ b/src/javax/media/j3d/JoglPipeline.java @@ -6540,14 +6540,6 @@ void createQueryContext(Canvas3D cv, Drawable drawable, glDrawable.setRealized(false); } else { - - // TODO can't find an implementation which avoids the use of QueryCanvas - // JOGL requires a visible Frame for an onscreen context - - Frame f = new Frame(); - f.setUndecorated(true); - f.setLayout(new BorderLayout()); - ContextQuerier querier = new ContextQuerier(cv); AWTGraphicsConfiguration awtConfig = @@ -6555,6 +6547,13 @@ void createQueryContext(Canvas3D cv, Drawable drawable, QueryCanvas canvas = new QueryCanvas(awtConfig, querier); + // TODO can't find an implementation which avoids the use of QueryCanvas + // JOGL requires a visible Frame for an onscreen context + + Frame f = new Frame(canvas.getGraphicsConfiguration()); + f.setUndecorated(true); + f.setLayout(new BorderLayout()); + f.add(canvas, BorderLayout.CENTER); f.setSize(MIN_FRAME_SIZE, MIN_FRAME_SIZE); f.setVisible(true);