diff options
author | Julien Gouesse <[email protected]> | 2015-11-28 15:11:48 +0100 |
---|---|---|
committer | Julien Gouesse <[email protected]> | 2015-11-28 15:11:48 +0100 |
commit | dbc98deea1884e44da2c74d6ea807253cdefa693 (patch) | |
tree | 29c3ee7dea82d7dd773d81f33f645dde67e43a17 /src/javax/media/j3d/Renderer.java | |
parent | 2c99f1329dc55bd496bce91b9aba956ecba3c67e (diff) |
Relocate package prefix to org.jogamp.java3d
Diffstat (limited to 'src/javax/media/j3d/Renderer.java')
-rw-r--r-- | src/javax/media/j3d/Renderer.java | 1751 |
1 files changed, 0 insertions, 1751 deletions
diff --git a/src/javax/media/j3d/Renderer.java b/src/javax/media/j3d/Renderer.java deleted file mode 100644 index 6362672..0000000 --- a/src/javax/media/j3d/Renderer.java +++ /dev/null @@ -1,1751 +0,0 @@ -/* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - * - */ - -/* - * Portions of this code were derived from work done by the Blackdown - * group (www.blackdown.org), who did the initial Linux implementation - * of the Java 3D API. - */ - -package javax.media.j3d; - -import java.awt.GraphicsConfiguration; -import java.awt.Point; -import java.awt.image.BufferedImage; -import java.awt.image.ImageObserver; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.logging.Level; - - -class Renderer extends J3dThread { - - // This action causes this thread to wait - static final int WAIT = 0; - - // This action causes this thread to notify the view, and then wait. - static final int NOTIFY_AND_WAIT = 1; - - // This action causes this thread to be notified - static final int NOTIFY = 2; - - // The following are DecalGroup rendering states - static final int DECAL_NONE = 0; - static final int DECAL_1ST_CHILD = 1; - static final int DECAL_NTH_CHILD = 2; - - // stuff for scene antialiasing - static final int NUM_ACCUMULATION_SAMPLES = 8; - - static final float ACCUM_SAMPLES_X[] = - { -0.54818f, 0.56438f, 0.39462f, -0.54498f, - -0.83790f, -0.39263f, 0.32254f, 0.84216f}; - - static final float ACCUM_SAMPLES_Y[] = - { 0.55331f, -0.53495f, 0.41540f, -0.52829f, - 0.82102f, -0.27383f, 0.09133f, -0.84399f}; - - static final float accumValue = 1.0f / NUM_ACCUMULATION_SAMPLES; - - // The following are Render arguments - static final int RENDER = 0; - static final int SWAP = 1; - static final int REQUESTRENDER = 2; - static final int REQUESTCLEANUP = 3; - - // Renderer Structure used for the messaging to the renderer - RendererStructure rendererStructure = new RendererStructure(); - - - // vworldtoVpc matrix for background geometry - Transform3D bgVworldToVpc = new Transform3D(); - - private static int numInstances = 0; - private int instanceNum = -1; - - // Local copy of sharedStereZBuffer flag - boolean sharedStereoZBuffer; - - // This is the id for the underlying sharable graphics context - Context sharedCtx = null; - - // since the sharedCtx id can be the same as the previous one, - // we need to keep a time stamp to differentiate the contexts with the - // same id - long sharedCtxTimeStamp = 0; - - // display and drawable, used to free shared context - private Drawable sharedCtxDrawable = null; - - /** - * This is the id of the current rendering context - */ - Context currentCtx = null; - - /** - * This is the id of the current rendering drawable - */ - Drawable currentDrawable = null; - - // an unique bit to identify this renderer - int rendererBit = 0; - // an unique number to identify this renderer : ( rendererBit = 1 << rendererId) - int rendererId = 0; - -// List of renderMolecules that are dirty due to additions -// or removal of renderAtoms from their display list set -// of renderAtoms -ArrayList<RenderMolecule> dirtyRenderMoleculeList = new ArrayList<RenderMolecule>(); - -// List of individual dlists that need to be rebuilt -ArrayList<RenderAtomListInfo> dirtyRenderAtomList = new ArrayList<RenderAtomListInfo>(); - -// List of (Rm, rInfo) pair of individual dlists that need to be rebuilt -ArrayList<Object[]> dirtyDlistPerRinfoList = new ArrayList<Object[]>(); - -// Texture and display list that should be freed -ArrayList<Integer> textureIdResourceFreeList = new ArrayList<Integer>(); -ArrayList<Integer> displayListResourceFreeList = new ArrayList<Integer>(); - -// Texture that should be reload -ArrayList<TextureRetained> textureReloadList = new ArrayList<TextureRetained>(); - - J3dMessage[] renderMessage; - - // The screen for this Renderer. Note that this renderer may share - // by both on screen and off screen. When view unregister, we need - // to set both reference to null. - Screen3D onScreen; - Screen3D offScreen; - - // full screen anti-aliasing projection matrices - Transform3D accumLeftProj = new Transform3D(); - Transform3D accumRightProj = new Transform3D(); - Transform3D accumInfLeftProj = new Transform3D(); - Transform3D accumInfRightProj = new Transform3D(); - - // rendering messages - J3dMessage m[]; - int nmesg = 0; - - // List of contexts created - ArrayList<Context> listOfCtxs = new ArrayList<Context>(); - - // Parallel list of canvases - ArrayList<Canvas3D> listOfCanvases = new ArrayList<Canvas3D>(); - - boolean needToRebuildDisplayList = false; - - // True when either one of dirtyRenderMoleculeList, - // dirtyDlistPerRinfoList, dirtyRenderAtomList size > 0 - boolean dirtyDisplayList = false; - -// Remember OGL context resources to free -// before context is destroy. -// It is used when sharedCtx = true; -ArrayList<TextureRetained> textureIDResourceTable = new ArrayList<TextureRetained>(5); - - // Instrumentation of Java 3D renderer - private long lastSwapTime = System.nanoTime(); - - private synchronized int newInstanceNum() { - return (++numInstances); - } - - @Override - int getInstanceNum() { - if (instanceNum == -1) - instanceNum = newInstanceNum(); - return instanceNum; - } - - /** - * Constructs a new Renderer - */ - Renderer(ThreadGroup t) { - super(t); - setName("J3D-Renderer-" + getInstanceNum()); - - type = J3dThread.RENDER_THREAD; - rendererId = VirtualUniverse.mc.getRendererId(); - rendererBit = (1 << rendererId); - renderMessage = new J3dMessage[1]; - } - - - /** - * The main loop for the renderer. - */ - @Override - void doWork(long referenceTime) { - RenderBin renderBin = null; - Canvas3D cv, canvas=null; - Object firstArg; - View view = null; - int stereo_mode; - int num_stereo_passes, num_accum_passes = 1; - int pass, apass, i, j; - boolean doAccum = false; - double accumDx = 0.0f, accumDy = 0.0f; - double accumDxFactor = 1.0f, accumDyFactor = 1.0f; - - double accumLeftX = 0.0, accumLeftY = 0.0, - accumRightX = 0.0, accumRightY = 0.0, - accumInfLeftX = 0.0, accumInfLeftY = 0.0, - accumInfRightX = 0.0, accumInfRightY = 0.0; - int opArg; - Transform3D t3d = null; - - opArg = ((Integer)args[0]).intValue(); - - try { - if (opArg == SWAP) { - - Object [] swapArray = (Object[])args[2]; - - view = (View)args[3]; - - for (i=0; i<swapArray.length; i++) { - cv = (Canvas3D) swapArray[i]; - if (!cv.isRunning) { - continue; - } - - doneSwap: try { - - if (!cv.validCanvas) { - continue; - } - - if (cv.active && (cv.ctx != null) && - (cv.view != null) && (cv.imageReady)) { - // don't swap double buffered AuoOffScreenCanvas3D/JCanvas3D - // manual offscreen rendering doesn't pass this code (opArg == SWAP) - if (cv.useDoubleBuffer && !cv.offScreen) { - synchronized (cv.drawingSurfaceObject) { - if (cv.validCtx) { - if (VirtualUniverse.mc.doDsiRenderLock) { - // Set doDsiLock flag for rendering based on system - // property, If we force DSI lock for swap - // buffer, we lose most of the parallelism that having - // multiple renderers gives us. - - if (!cv.drawingSurfaceObject.renderLock()) { - break doneSwap; - } - cv.makeCtxCurrent(); - cv.syncRender(cv.ctx, true); - cv.swapBuffers(cv.ctx, cv.drawable); - cv.drawingSurfaceObject.unLock(); - } else { - cv.makeCtxCurrent(); - cv.syncRender(cv.ctx, true); - cv.swapBuffers(cv.ctx, cv.drawable); - } - } - } - } - cv.view.inCanvasCallback = true; - try { - cv.postSwap(); - } catch (RuntimeException e) { - System.err.println("Exception occurred during Canvas3D callback:"); - e.printStackTrace(); - } catch (Error e) { - // Issue 264 - catch Error so Renderer doesn't die - System.err.println("Error occurred during Canvas3D callback:"); - e.printStackTrace(); - } - // reset flag - cv.imageReady = false; - cv.view.inCanvasCallback = false; - // Clear canvasDirty bit ONLY when postSwap() success - - if (MasterControl.isStatsLoggable(Level.INFO)) { - // Instrumentation of Java 3D renderer - long currSwapTime = System.nanoTime(); - long deltaTime = currSwapTime - lastSwapTime; - lastSwapTime = currSwapTime; - VirtualUniverse.mc.recordTime(MasterControl.TimeType.TOTAL_FRAME, deltaTime); - } - - // Set all dirty bits except environment set and lightbin - // they are only set dirty if the last used light bin or - // environment set values for this canvas change between - // one frame and other - - if (!cv.ctxChanged) { - cv.canvasDirty = (0xffff & ~(Canvas3D.LIGHTBIN_DIRTY | - Canvas3D.LIGHTENABLES_DIRTY | - Canvas3D.AMBIENTLIGHT_DIRTY | - Canvas3D.MODELCLIP_DIRTY | - Canvas3D.VIEW_MATRIX_DIRTY | - Canvas3D.FOG_DIRTY)); - // Force reload of transform next frame - cv.modelMatrix = null; - - // Force the cached renderAtom to null - cv.ra = null; - } else { - cv.ctxChanged = false; - } - } - } catch (NullPointerException ne) { - // Ignore NPE - if (VirtualUniverse.mc.doDsiRenderLock) { - cv.drawingSurfaceObject.unLock(); - } - } catch (RuntimeException ex) { - ex.printStackTrace(); - - if (VirtualUniverse.mc.doDsiRenderLock) { - cv.drawingSurfaceObject.unLock(); - } - - // Issue 260 : indicate fatal error and notify error listeners - cv.setFatalError(); - RenderingError err = - new RenderingError(RenderingError.UNEXPECTED_RENDERING_ERROR, - J3dI18N.getString("Renderer0")); - err.setCanvas3D(cv); - err.setGraphicsDevice(cv.graphicsConfiguration.getDevice()); - notifyErrorListeners(err); - } - - cv.releaseCtx(); - } - - if (view != null) { // STOP_TIMER - // incElapsedFrames() is delay until MC:updateMirroObject - if (view.viewCache.getDoHeadTracking()) { - VirtualUniverse.mc.sendRunMessage(view, - J3dThread.RENDER_THREAD); - } - } - - } else if (opArg == REQUESTCLEANUP) { - Integer mtype = (Integer) args[2]; - - if (mtype == MasterControl.REMOVEALLCTXS_CLEANUP) { - // from MasterControl when View is last views - removeAllCtxs(); - } else if (mtype == MasterControl.FREECONTEXT_CLEANUP) { - // from MasterControl freeContext(View v) - cv = (Canvas3D) args[1]; - removeCtx(cv, cv.drawable, cv.ctx, - true, true, false); - } else if (mtype == MasterControl.RESETCANVAS_CLEANUP) { - // from MasterControl RESET_CANVAS postRequest - cv = (Canvas3D) args[1]; - if (cv.ctx != null) { - cv.makeCtxCurrent(); - } - cv.freeContextResources(cv.screen.renderer, true, cv.ctx); - } else if (mtype == MasterControl.REMOVECTX_CLEANUP) { - // from Canvas3D removeCtx() postRequest - Object[] obj = (Object []) args[1]; - Canvas3D c = (Canvas3D) obj[0]; - removeCtx(c, - (Drawable) obj[2], - (Context) obj[3], - false, !c.offScreen, - false); - } - return; - } else { // RENDER || REQUESTRENDER - - int renderType; - nmesg = 0; - int totalMessages = 0; - if (opArg == RENDER) { - m = renderMessage; - m[0] = new J3dMessage(); - // Issue 131: Set appropriate message type - if (((Canvas3D)args[1]).offScreen) { - m[0].type = J3dMessage.RENDER_OFFSCREEN; - } - else { - m[0].type = J3dMessage.RENDER_RETAINED; - } - m[0].incRefcount(); - m[0].args[0] = args[1]; - totalMessages = 1; - } else { // REQUESTRENDER - m = rendererStructure.getMessages(); - totalMessages = rendererStructure.getNumMessage(); - if (totalMessages <= 0) { - return; - } - } - - - doneRender: while (nmesg < totalMessages) { - - firstArg = m[nmesg].args[0]; - - if (firstArg == null) { - Object secondArg = m[nmesg].args[1]; - if (secondArg instanceof Canvas3D) { - // message from Canvas3Ds to destroy Context - Integer reqType = (Integer) m[nmesg].args[2]; - Canvas3D c = (Canvas3D) secondArg; - if (reqType == MasterControl.SET_GRAPHICSCONFIG_FEATURES) { - try { - if (c.offScreen) { - // NEW : offscreen supports double buffering - c.doubleBufferAvailable = c.hasDoubleBuffer(); // was : false - // offScreen canvas doesn't supports stereo - c.stereoAvailable = false; - } else { - c.doubleBufferAvailable = c.hasDoubleBuffer(); - c.stereoAvailable = c.hasStereo(); - } - - // Setup stencil related variables. - c.actualStencilSize = c.getStencilSize(); - boolean userOwnsStencil = c.requestedStencilSize > 0; - - c.userStencilAvailable = - (userOwnsStencil && (c.actualStencilSize > 0)); - c.systemStencilAvailable = - (!userOwnsStencil && (c.actualStencilSize > 0)); - - c.sceneAntialiasingMultiSamplesAvailable = - c.hasSceneAntialiasingMultisample(); - - if (c.sceneAntialiasingMultiSamplesAvailable) { - c.sceneAntialiasingAvailable = true; - } else { - c.sceneAntialiasingAvailable = - c.hasSceneAntialiasingAccum(); - } - } catch (RuntimeException ex) { - ex.printStackTrace(); - - // Issue 260 : indicate fatal error and notify error listeners - c.setFatalError(); - RenderingError err = - new RenderingError(RenderingError.GRAPHICS_CONFIG_ERROR, - J3dI18N.getString("Renderer1")); - err.setCanvas3D(c); - err.setGraphicsDevice(c.graphicsConfiguration.getDevice()); - notifyErrorListeners(err); - } - GraphicsConfigTemplate3D.runMonitor(J3dThread.NOTIFY); - } else if (reqType == MasterControl.SET_QUERYPROPERTIES){ - try { - c.createQueryContext(); - } catch (RuntimeException ex) { - ex.printStackTrace(); - - // Issue 260 : indicate fatal error and notify error listeners - c.setFatalError(); - RenderingError err = - new RenderingError(RenderingError.CONTEXT_CREATION_ERROR, - J3dI18N.getString("Renderer2")); - err.setCanvas3D(c); - err.setGraphicsDevice(c.graphicsConfiguration.getDevice()); - notifyErrorListeners(err); - } - // currentCtx change after we create a new context - GraphicsConfigTemplate3D.runMonitor(J3dThread.NOTIFY); - currentCtx = null; - currentDrawable = null; - } - } else if (secondArg instanceof Integer) { - // Issue 121 - This was formerly used as a message from - // the now-nonexistant TextureRetained finalize() method - // to free the texture id - throw new AssertionError(); - } else if (secondArg instanceof GeometryArrayRetained) { - // message from GeometryArrayRetained - // clearLive() to free D3D array - //((GeometryArrayRetained) secondArg).freeD3DArray(false); - } else if (secondArg instanceof GraphicsConfigTemplate3D) { - GraphicsConfigTemplate3D gct = - (GraphicsConfigTemplate3D) secondArg; - Integer reqType = (Integer) m[nmesg].args[2]; - if (reqType == MasterControl.GETBESTCONFIG) { - GraphicsConfiguration gcfg = null; - GraphicsConfiguration [] gcList = (GraphicsConfiguration []) gct.testCfg; - try { - gcfg = Pipeline.getPipeline().getBestConfiguration(gct, gcList); - } catch (NullPointerException npe) { - npe.printStackTrace(); - } catch (RuntimeException ex) { - ex.printStackTrace(); - - // Issue 260 : notify error listeners - RenderingError err = - new RenderingError(RenderingError.GRAPHICS_CONFIG_ERROR, - J3dI18N.getString("Renderer3")); - err.setGraphicsDevice(gcList[0].getDevice()); - notifyErrorListeners(err); - } - - gct.testCfg = gcfg; - } else if (reqType == MasterControl.ISCONFIGSUPPORT) { - boolean rval = false; - GraphicsConfiguration gc = (GraphicsConfiguration) gct.testCfg; - try { - if (Pipeline.getPipeline().isGraphicsConfigSupported(gct, gc)) { - rval = true; - } - } catch (NullPointerException npe) { - npe.printStackTrace(); - } catch (RuntimeException ex) { - ex.printStackTrace(); - - // Issue 260 : notify error listeners - RenderingError err = - new RenderingError(RenderingError.GRAPHICS_CONFIG_ERROR, - J3dI18N.getString("Renderer4")); - err.setGraphicsDevice(gc.getDevice()); - notifyErrorListeners(err); - } - - gct.testCfg = Boolean.valueOf(rval); - } - GraphicsConfigTemplate3D.runMonitor(J3dThread.NOTIFY); - } - - m[nmesg++].decRefcount(); - continue; - } - - canvas = (Canvas3D) firstArg; - - renderType = m[nmesg].type; - - if (renderType == J3dMessage.CREATE_OFFSCREENBUFFER) { - // Fix for issue 18. - // Fix for issue 20. - - canvas.drawable = null; - try { - // Issue 396. Pass in a null ctx for 2 reasons : - // 1) We should not use ctx field directly without buffering in a msg. - // 2) canvas.ctx should be null. - canvas.drawable = - canvas.createOffScreenBuffer(null, - canvas.offScreenCanvasSize.width, - canvas.offScreenCanvasSize.height); - } catch (RuntimeException ex) { - ex.printStackTrace(); - } - - if (canvas.drawable == null) { - // Issue 260 : indicate fatal error and notify error listeners - canvas.setFatalError(); - RenderingError err = - new RenderingError(RenderingError.OFF_SCREEN_BUFFER_ERROR, - J3dI18N.getString("Renderer5")); - err.setCanvas3D(canvas); - err.setGraphicsDevice(canvas.graphicsConfiguration.getDevice()); - notifyErrorListeners(err); - } - - canvas.offScreenBufferPending = false; - m[nmesg++].decRefcount(); - continue; - } - else if (renderType == J3dMessage.DESTROY_CTX_AND_OFFSCREENBUFFER) { - Object[] obj = m[nmesg].args; - - // Fix for issue 175: destroy ctx & off-screen buffer - // Fix for issue 340: get display, drawable & ctx from msg - removeCtx(canvas, - (Drawable) obj[2], - (Context) obj[3], - false, !canvas.offScreen, true); - - canvas.offScreenBufferPending = false; - m[nmesg++].decRefcount(); - continue; - } else if (renderType == J3dMessage.ALLOCATE_CANVASID) { - canvas.allocateCanvasId(); - } else if (renderType == J3dMessage.FREE_CANVASID) { - canvas.freeCanvasId(); - } - - if ((canvas.view == null) || !canvas.firstPaintCalled) { - // This happen when the canvas just remove from the View - if (renderType == J3dMessage.RENDER_OFFSCREEN) { - canvas.offScreenRendering = false; - } - m[nmesg++].decRefcount(); - continue; - } - - if (!canvas.validCanvas && - (renderType != J3dMessage.RENDER_OFFSCREEN)) { - m[nmesg++].decRefcount(); - continue; - } - - if (renderType == J3dMessage.RESIZE_CANVAS) { - // render the image again after resize - VirtualUniverse.mc.sendRunMessage(canvas.view, J3dThread.RENDER_THREAD); - m[nmesg++].decRefcount(); - } else if (renderType == J3dMessage.TOGGLE_CANVAS) { - VirtualUniverse.mc.sendRunMessage(canvas.view, J3dThread.RENDER_THREAD); - m[nmesg++].decRefcount(); - } else if (renderType == J3dMessage.RENDER_IMMEDIATE) { - int command = ((Integer)m[nmesg].args[1]).intValue(); - //System.err.println("command= " + command); - if (canvas.isFatalError()) { - continue; - } - - try { - - switch (command) { - case GraphicsContext3D.CLEAR: - canvas.graphicsContext3D.doClear(); - break; - case GraphicsContext3D.DRAW: - canvas.graphicsContext3D.doDraw( - (Geometry)m[nmesg].args[2]); - break; - case GraphicsContext3D.SWAP: - canvas.doSwap(); - break; - case GraphicsContext3D.READ_RASTER: - canvas.graphicsContext3D.doReadRaster( - (Raster)m[nmesg].args[2]); - break; - case GraphicsContext3D.SET_APPEARANCE: - canvas.graphicsContext3D.doSetAppearance( - (Appearance)m[nmesg].args[2]); - break; - case GraphicsContext3D.SET_BACKGROUND: - canvas.graphicsContext3D.doSetBackground( - (Background)m[nmesg].args[2]); - break; - case GraphicsContext3D.SET_FOG: - canvas.graphicsContext3D.doSetFog( - (Fog)m[nmesg].args[2]); - break; - case GraphicsContext3D.SET_LIGHT: - canvas.graphicsContext3D.doSetLight( - (Light)m[nmesg].args[2], - ((Integer)m[nmesg].args[3]).intValue()); - break; - case GraphicsContext3D.INSERT_LIGHT: - canvas.graphicsContext3D.doInsertLight( - (Light)m[nmesg].args[2], - ((Integer)m[nmesg].args[3]).intValue()); - break; - case GraphicsContext3D.REMOVE_LIGHT: - canvas.graphicsContext3D.doRemoveLight( - ((Integer)m[nmesg].args[2]).intValue()); - break; - case GraphicsContext3D.ADD_LIGHT: - canvas.graphicsContext3D.doAddLight( - (Light)m[nmesg].args[2]); - break; - case GraphicsContext3D.SET_HI_RES: - canvas.graphicsContext3D.doSetHiRes( - (HiResCoord)m[nmesg].args[2]); - break; - case GraphicsContext3D.SET_MODEL_TRANSFORM: - t3d = (Transform3D)m[nmesg].args[2]; - canvas.graphicsContext3D.doSetModelTransform(t3d); - break; - case GraphicsContext3D.MULTIPLY_MODEL_TRANSFORM: - t3d = (Transform3D)m[nmesg].args[2]; - canvas.graphicsContext3D.doMultiplyModelTransform(t3d); - break; - case GraphicsContext3D.SET_SOUND: - canvas.graphicsContext3D.doSetSound( - (Sound)m[nmesg].args[2], - ((Integer)m[nmesg].args[3]).intValue()); - break; - case GraphicsContext3D.INSERT_SOUND: - canvas.graphicsContext3D.doInsertSound( - (Sound)m[nmesg].args[2], - ((Integer)m[nmesg].args[3]).intValue()); - break; - case GraphicsContext3D.REMOVE_SOUND: - canvas.graphicsContext3D.doRemoveSound( - ((Integer)m[nmesg].args[2]).intValue()); - break; - case GraphicsContext3D.ADD_SOUND: - canvas.graphicsContext3D.doAddSound( - (Sound)m[nmesg].args[2]); - break; - case GraphicsContext3D.SET_AURAL_ATTRIBUTES: - canvas.graphicsContext3D.doSetAuralAttributes( - (AuralAttributes)m[nmesg].args[2]); - break; - case GraphicsContext3D.SET_BUFFER_OVERRIDE: - canvas.graphicsContext3D.doSetBufferOverride( - ((Boolean)m[nmesg].args[2]).booleanValue()); - break; - case GraphicsContext3D.SET_FRONT_BUFFER_RENDERING: - canvas.graphicsContext3D.doSetFrontBufferRendering( - ((Boolean)m[nmesg].args[2]).booleanValue()); - break; - case GraphicsContext3D.SET_STEREO_MODE: - canvas.graphicsContext3D.doSetStereoMode( - ((Integer)m[nmesg].args[2]).intValue()); - break; - case GraphicsContext3D.FLUSH: - canvas.graphicsContext3D.doFlush( - ((Boolean)m[nmesg].args[2]).booleanValue()); - break; - case GraphicsContext3D.FLUSH2D: - canvas.graphics2D.doFlush(); - break; - case GraphicsContext3D.DRAWANDFLUSH2D: - Object ar[] = m[nmesg].args; - canvas.graphics2D.doDrawAndFlushImage( - (BufferedImage) ar[2], - ((Point) ar[3]).x, - ((Point) ar[3]).y, - (ImageObserver) ar[4]); - break; - case GraphicsContext3D.DISPOSE2D: - // Issue 583 - the graphics2D field may be null here - if (canvas.graphics2D != null) { - canvas.graphics2D.doDispose(); - } - break; - case GraphicsContext3D.SET_MODELCLIP: - canvas.graphicsContext3D.doSetModelClip( - (ModelClip)m[nmesg].args[2]); - break; - default: - break; - } - - } catch (RuntimeException ex) { - ex.printStackTrace(); - - // Issue 260 : indicate fatal error and notify error listeners - canvas.setFatalError(); - RenderingError err = - new RenderingError(RenderingError.CONTEXT_CREATION_ERROR, - J3dI18N.getString("Renderer6")); - err.setCanvas3D(canvas); - err.setGraphicsDevice(canvas.graphicsConfiguration.getDevice()); - notifyErrorListeners(err); - } - - m[nmesg++].decRefcount(); - } else { // retained mode rendering - long startRenderTime = 0L; - if (MasterControl.isStatsLoggable(Level.INFO)) { - // Instrumentation of Java 3D renderer - startRenderTime = System.nanoTime(); - } - - m[nmesg++].decRefcount(); - - if (canvas.isFatalError()) { - continue; - } - - ImageComponent2DRetained offBufRetained = null; - - if (renderType == J3dMessage.RENDER_OFFSCREEN) { - // Issue 131: set offScreenRendering flag here, since it - // otherwise won't be set for auto-off-screen rendering - // (which doesn't use renderOffScreenBuffer) - canvas.offScreenRendering = true; - if (canvas.drawable == null || !canvas.active) { - canvas.offScreenRendering = false; - continue; - } else { - offBufRetained = (ImageComponent2DRetained) - canvas.offScreenBuffer.retained; - - if (offBufRetained.isByReference()) { - offBufRetained.geomLock.getLock(); - } - - offBufRetained.evaluateExtensions(canvas); - - } - - } else if (!canvas.active) { - continue; - } - - // Issue 78 - need to get the drawingSurface info every - // frame; this is necessary since the HDC (window ID) - // on Windows can become invalidated without our - // being notified! - if (!canvas.offScreen) { - canvas.drawingSurfaceObject.getDrawingSurfaceObjectInfo(); - } - - renderBin = canvas.view.renderBin; - - // setup rendering context - - // We need to catch NullPointerException when the dsi - // gets yanked from us during a remove. - - if (canvas.useSharedCtx) { - - if (sharedCtx == null) { - sharedCtxDrawable = canvas.drawable; - - // Always lock for context create - if (!canvas.drawingSurfaceObject.renderLock()) { - if ((offBufRetained != null) && - offBufRetained.isByReference()) { - offBufRetained.geomLock.unLock(); - } - canvas.offScreenRendering = false; - break doneRender; - } - - synchronized (VirtualUniverse.mc.contextCreationLock) { - sharedCtx = null; - try { - sharedCtx = canvas.createNewContext(null, true); - } catch (RuntimeException ex) { - ex.printStackTrace(); - } - - if (sharedCtx == null) { - canvas.drawingSurfaceObject.unLock(); - if ((offBufRetained != null) && - offBufRetained.isByReference()) { - offBufRetained.geomLock.unLock(); - } - canvas.offScreenRendering = false; - - // 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; - } - sharedCtxTimeStamp = - VirtualUniverse.mc.getContextTimeStamp(); - - needToRebuildDisplayList = true; - } - - canvas.drawingSurfaceObject.unLock(); - } - } - - if (canvas.ctx == null) { - - // Always lock for context create - if (!canvas.drawingSurfaceObject.renderLock()) { - if ((offBufRetained != null) && - offBufRetained.isByReference()) { - offBufRetained.geomLock.unLock(); - } - canvas.offScreenRendering = false; - break doneRender; - } - - synchronized (VirtualUniverse.mc.contextCreationLock) { - canvas.ctx = null; - try { - canvas.ctx = canvas.createNewContext(sharedCtx, false); - } catch (RuntimeException ex) { - ex.printStackTrace(); - } - - if (canvas.ctx == null) { - canvas.drawingSurfaceObject.unLock(); - if ((offBufRetained != null) && - offBufRetained.isByReference()) { - offBufRetained.geomLock.unLock(); - } - canvas.offScreenRendering = false; - - // 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; - } - - if (canvas.graphics2D != null) { - canvas.graphics2D.init(); - } - - canvas.ctxTimeStamp = - VirtualUniverse.mc.getContextTimeStamp(); - listOfCtxs.add(canvas.ctx); - listOfCanvases.add(canvas); - - if (renderBin.nodeComponentList.size() > 0) { - for (i = 0; i < renderBin.nodeComponentList.size(); i++) { - NodeComponentRetained nc = (NodeComponentRetained)renderBin.nodeComponentList.get(i); - if(nc instanceof ImageComponentRetained) { - ((ImageComponentRetained)nc).evaluateExtensions(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.resetImmediateRendering(); - canvas.drawingSurfaceObject.contextValidated(); - - if (!canvas.useSharedCtx) { - canvas.needToRebuildDisplayList = true; - } - canvas.drawingSurfaceObject.unLock(); - } else { - - if (canvas.isRunning) { - canvas.makeCtxCurrent(); - } - } - - - if (renderBin != null) { - if ((VirtualUniverse.mc.doDsiRenderLock) && - (!canvas.drawingSurfaceObject.renderLock())) { - if ((offBufRetained != null) && - offBufRetained.isByReference()) { - offBufRetained.geomLock.unLock(); - } - canvas.offScreenRendering = false; - break doneRender; - } - - // handle free resource - if (canvas.useSharedCtx) { - freeResourcesInFreeList(canvas); - } else { - canvas.freeResourcesInFreeList(canvas.ctx); - } - - if (VirtualUniverse.mc.doDsiRenderLock) { - canvas.drawingSurfaceObject.unLock(); - } - - // Issue 109 : removed copyOfCvCache now that we have - // a separate canvasViewCache for computing view frustum - CanvasViewCache cvCache = canvas.canvasViewCache; - - // Deadlock if we include updateViewCache in - // drawingSurfaceObject sync. - canvas.updateViewCache(false, null, null, - renderBin.geometryBackground != null); - - if ((VirtualUniverse.mc.doDsiRenderLock) && - (!canvas.drawingSurfaceObject.renderLock())) { - if ((offBufRetained != null) && - offBufRetained.isByReference()) { - offBufRetained.geomLock.unLock(); - } - canvas.offScreenRendering = false; - break doneRender; - } - - int cvWidth = cvCache.getCanvasWidth(); - int cvHeight = cvCache.getCanvasHeight(); - // setup viewport - canvas.setViewport(canvas.ctx, 0, 0, cvWidth, cvHeight); - - // rebuild the display list of all dirty renderMolecules. - if (canvas.useSharedCtx) { - if (needToRebuildDisplayList) { - renderBin.updateAllRenderMolecule( - this, canvas); - needToRebuildDisplayList = false; - } - - if (dirtyDisplayList) { - renderBin.updateDirtyDisplayLists(canvas, - dirtyRenderMoleculeList, - dirtyDlistPerRinfoList, - dirtyRenderAtomList,true); - dirtyDisplayList = false; - } - - // for shared context, download textures upfront - // to minimize the context switching overhead - int sz = textureReloadList.size(); - - if (sz > 0) { - for (j = sz-1; j>=0; j--) { - textureReloadList.get(j).reloadTextureSharedContext(canvas); - } - textureReloadList.clear(); - } - - } else { - // update each canvas - if (canvas.needToRebuildDisplayList) { - renderBin.updateAllRenderMolecule(canvas); - canvas.needToRebuildDisplayList = false; - } - if (canvas.dirtyDisplayList) { - renderBin.updateDirtyDisplayLists(canvas, - canvas.dirtyRenderMoleculeList, - canvas.dirtyDlistPerRinfoList, - canvas.dirtyRenderAtomList, false); - canvas.dirtyDisplayList = false; - } - } - - // lighting setup - if (canvas.view.localEyeLightingEnable != - canvas.ctxEyeLightingEnable) { - canvas.ctxUpdateEyeLightingEnable(canvas.ctx, - canvas.view.localEyeLightingEnable); - canvas.ctxEyeLightingEnable = - canvas.view.localEyeLightingEnable; - } - - - // stereo setup - boolean useStereo = cvCache.getUseStereo(); - if (useStereo) { - num_stereo_passes = 2; - stereo_mode = Canvas3D.FIELD_LEFT; - - sharedStereoZBuffer = - VirtualUniverse.mc.sharedStereoZBuffer; - } else { - num_stereo_passes = 1; - stereo_mode = Canvas3D.FIELD_ALL; - - // just in case user set flag - - // disable since we are not in stereo - sharedStereoZBuffer = false; - } - - // full screen anti-aliasing setup - if (canvas.view.getSceneAntialiasingEnable() && - canvas.sceneAntialiasingAvailable) { - - if (((canvas.extensionsSupported & Canvas3D.MULTISAMPLE) == 0) || - !canvas.sceneAntialiasingMultiSamplesAvailable) { - doAccum = true; - num_accum_passes = NUM_ACCUMULATION_SAMPLES; - - System.arraycopy( - cvCache.getLeftProjection().mat, - 0, accumLeftProj.mat, 0, 16); - - - accumDxFactor = ( - canvas.canvasViewCache.getPhysicalWindowWidth() / - canvas.canvasViewCache.getCanvasWidth())*canvas.view.fieldOfView; - - accumDyFactor = ( - canvas.canvasViewCache.getPhysicalWindowHeight() / - canvas.canvasViewCache.getCanvasHeight())*canvas.view.fieldOfView; - - - accumLeftX = accumLeftProj.mat[3]; - accumLeftY = accumLeftProj.mat[7]; - - if (useStereo) { - System.arraycopy( - cvCache.getRightProjection().mat, - 0, accumRightProj.mat, 0, 16); - accumRightX = accumRightProj.mat[3]; - accumRightY = accumRightProj.mat[7]; - } - - if (renderBin.geometryBackground != null) { - System.arraycopy( - cvCache.getInfLeftProjection().mat, - 0, accumInfLeftProj.mat, 0, 16); - accumInfLeftX = accumInfLeftProj.mat[3]; - accumInfLeftY = accumInfLeftProj.mat[7]; - if (useStereo) { - System.arraycopy( - cvCache.getInfRightProjection().mat, - 0, accumInfRightProj.mat, 0, 16); - accumInfRightX = accumInfRightProj.mat[3]; - accumInfRightY = accumInfRightProj.mat[7]; - } - } - } else { - - if (!canvas.isAntialiasingSet()) { - // System.err.println("Renderer : Enable FullSceneAntialiasing"); - - canvas.setFullSceneAntialiasing(canvas.ctx, true); - } - } - } else { - - if (canvas.isAntialiasingSet()) { - // System.err.println("Renderer : Disable SceneAntialiasing"); - canvas.setFullSceneAntialiasing(canvas.ctx, false); - } - } - - // background geometry setup - if (renderBin.geometryBackground != null) { - renderBin.updateInfVworldToVpc(); - } - - // setup default render mode - render to both eyes - canvas.setRenderMode(canvas.ctx, - Canvas3D.FIELD_ALL, - canvas.useDoubleBuffer); - - // clear background if not full screen antialiasing - // and not in stereo mode - if (!doAccum && !sharedStereoZBuffer) { - BackgroundRetained bg = renderBin.background; - - canvas.clear(bg, cvWidth, cvHeight); - - } - - // handle preRender callback - if (VirtualUniverse.mc.doDsiRenderLock) { - canvas.drawingSurfaceObject.unLock(); - } - canvas.view.inCanvasCallback = true; - - try { - canvas.preRender(); - } catch (RuntimeException e) { - System.err.println("Exception occurred during Canvas3D callback:"); - e.printStackTrace(); - } catch (Error e) { - // Issue 264 - catch Error so Renderer doesn't die - System.err.println("Error occurred during Canvas3D callback:"); - e.printStackTrace(); - } - canvas.view.inCanvasCallback = false; - - if ((VirtualUniverse.mc.doDsiRenderLock) && - (!canvas.drawingSurfaceObject.renderLock())) { - if ((offBufRetained != null) && - offBufRetained.isByReference()) { - offBufRetained.geomLock.unLock(); - } - canvas.offScreenRendering = false; - break doneRender; - } - - // render loop - for (pass = 0; pass < num_stereo_passes; pass++) { - if (doAccum) { - canvas.clearAccum(canvas.ctx); - } - canvas.setRenderMode(canvas.ctx, stereo_mode, - canvas.useDoubleBuffer); - - - - for (apass = 0; apass < num_accum_passes; apass++) { - - // jitter projection matrix and clear background - // for full screen anti-aliasing rendering - if (doAccum) { - accumDx = ACCUM_SAMPLES_X[apass] * - accumDxFactor; - accumDy = ACCUM_SAMPLES_Y[apass] * - accumDyFactor; - - accumLeftProj.mat[3] = accumLeftX + - accumLeftProj.mat[0] * accumDx + - accumLeftProj.mat[1] * accumDy; - - accumLeftProj.mat[7] = accumLeftY + - accumLeftProj.mat[4] * accumDx + - accumLeftProj.mat[5] * accumDy; - - if (useStereo) { - accumRightProj.mat[3] = accumRightX + - accumRightProj.mat[0] * accumDx + - accumRightProj.mat[1] * accumDy; - - accumRightProj.mat[7] = accumRightY + - accumRightProj.mat[4] * accumDx + - accumRightProj.mat[5] * accumDy; - } - - if (renderBin.geometryBackground != null) { - accumInfLeftProj.mat[3] = accumInfLeftX + - accumInfLeftProj.mat[0] * accumDx + - accumInfLeftProj.mat[1] * accumDy; - - accumInfLeftProj.mat[7] = accumInfLeftY + - accumInfLeftProj.mat[4] * accumDx + - accumInfLeftProj.mat[5] * accumDy; - - if (useStereo) { - accumInfRightProj.mat[3] = - accumInfRightX + - accumInfRightProj.mat[0] * accumDx + - accumInfRightProj.mat[1] * accumDy; - - accumInfRightProj.mat[7] = - accumInfRightY + - accumInfRightProj.mat[4] * accumDx + - accumInfRightProj.mat[5] * accumDy; - } - } - } - - // clear background for stereo and - // accumulation buffer cases - if (doAccum || sharedStereoZBuffer) { - BackgroundRetained bg = renderBin.background; - - canvas.clear(bg, cvWidth, cvHeight); - - } - - // render background geometry - if (renderBin.geometryBackground != null) { - - // setup rendering matrices - if (pass == 0) { - canvas.vpcToEc = - cvCache.getInfLeftVpcToEc(); - if (doAccum) { - canvas.setProjectionMatrix( - canvas.ctx, accumInfLeftProj); - } else { - canvas.setProjectionMatrix( - canvas.ctx, - cvCache.getInfLeftProjection()); - } - } else { - canvas.vpcToEc = - cvCache.getInfRightVpcToEc(); - if (doAccum) { - canvas.setProjectionMatrix( - canvas.ctx, accumInfRightProj); - } else { - canvas.setProjectionMatrix( - canvas.ctx, - cvCache.getInfRightProjection()); - } - } - canvas.vworldToEc.mul(canvas.vpcToEc, - cvCache.getInfVworldToVpc()); - - // render background geometry - renderBin.renderBackground(canvas); - } - - // setup rendering matrices - if (pass == 0) { - canvas.vpcToEc = cvCache.getLeftVpcToEc(); - if (doAccum) { - canvas.setProjectionMatrix(canvas.ctx, accumLeftProj); - } else { - canvas.setProjectionMatrix(canvas.ctx, - cvCache.getLeftProjection()); - } - } else { - canvas.vpcToEc = cvCache.getRightVpcToEc(); - if (doAccum) { - canvas.setProjectionMatrix( - canvas.ctx, accumRightProj); - } else { - canvas.setProjectionMatrix(canvas.ctx, - cvCache.getRightProjection()); - } - } - canvas.vworldToEc.mul(canvas.vpcToEc, - cvCache.getVworldToVpc()); - - - synchronized (cvCache) { - if (pass == 0) { - canvas.setFrustumPlanes(cvCache.getLeftFrustumPlanesInVworld()); - } else { - canvas.setFrustumPlanes(cvCache.getRightFrustumPlanesInVworld()); - } - } - - // Force view matrix dirty for each eye. - if (useStereo) { - canvas.canvasDirty |= Canvas3D.VIEW_MATRIX_DIRTY; - } - - // render opaque geometry - renderBin.renderOpaque(canvas); - - // render ordered geometry - renderBin.renderOrdered(canvas); - - // handle renderField callback - if (VirtualUniverse.mc.doDsiRenderLock) { - canvas.drawingSurfaceObject.unLock(); - } - canvas.view.inCanvasCallback = true; - try { - canvas.renderField(stereo_mode); - } catch (RuntimeException e) { - System.err.println("Exception occurred during Canvas3D callback:"); - e.printStackTrace(); - } catch (Error e) { - // Issue 264 - catch Error so Renderer doesn't die - System.err.println("Error occurred during Canvas3D callback:"); - e.printStackTrace(); - } - canvas.view.inCanvasCallback = false; - if ((VirtualUniverse.mc.doDsiRenderLock) && - (!canvas.drawingSurfaceObject.renderLock())) { - if ((offBufRetained != null) && - offBufRetained.isByReference()) { - offBufRetained.geomLock.unLock(); - } - canvas.offScreenRendering = false; - break doneRender; - } - - // render transparent geometry - renderBin.renderTransparent(canvas); - - if (doAccum) - canvas.accum(canvas.ctx, accumValue); - } - - if (doAccum) - canvas.accumReturn(canvas.ctx); - if (useStereo) { - stereo_mode = Canvas3D.FIELD_RIGHT; - canvas.rightStereoPass = true; - } - } - canvas.imageReady = true; - canvas.rightStereoPass = false; - - // reset renderMode - canvas.setRenderMode(canvas.ctx, - Canvas3D.FIELD_ALL, - canvas.useDoubleBuffer); - - // handle postRender callback - if (VirtualUniverse.mc.doDsiRenderLock) { - canvas.drawingSurfaceObject.unLock(); - } - canvas.view.inCanvasCallback = true; - - try { - canvas.postRender(); - } catch (RuntimeException e) { - System.err.println("Exception occurred during Canvas3D callback:"); - e.printStackTrace(); - } catch (Error e) { - // Issue 264 - catch Error so Renderer doesn't die - System.err.println("Error occurred during Canvas3D callback:"); - e.printStackTrace(); - } - canvas.view.inCanvasCallback = false; - - // end offscreen rendering - if (canvas.offScreenRendering) { - - canvas.syncRender(canvas.ctx, true); - canvas.endOffScreenRendering(); - canvas.offScreenRendering = false; - - // Issue 489 - don't call postSwap here for auto-offscreen, - // since it will be called later by the SWAP operation - if (canvas.manualRendering) { - // do the postSwap for offscreen here - canvas.view.inCanvasCallback = true; - try { - canvas.postSwap(); - } catch (RuntimeException e) { - System.err.println("Exception occurred during Canvas 3D callback:"); - e.printStackTrace(); - } catch (Error e) { - // Issue 264 - catch Error so Renderer doesn't die - System.err.println("Error occurred during Canvas3D callback:"); - e.printStackTrace(); - } - - if (offBufRetained.isByReference()) { - offBufRetained.geomLock.unLock(); - } - - canvas.view.inCanvasCallback = false; - - canvas.releaseCtx(); - } - } - - if (MasterControl.isStatsLoggable(Level.INFO)) { - // Instrumentation of Java 3D renderer - long deltaTime = System.nanoTime() - startRenderTime; - VirtualUniverse.mc.recordTime(MasterControl.TimeType.RENDER, deltaTime); - } - - } else { // if (renderBin != null) - if ((offBufRetained != null) && - offBufRetained.isByReference()) { - offBufRetained.geomLock.unLock(); - } - } - } - } - - // clear array to prevent memory leaks - if (opArg == RENDER) { - m[0] = null; - } else { - Arrays.fill(m, 0, totalMessages, null); - } - } - } catch (NullPointerException ne) { - // Print NPE, but otherwise ignore it - ne.printStackTrace(); - if (canvas != null) { - // drawingSurfaceObject will safely ignore - // this request if this is not lock before - canvas.drawingSurfaceObject.unLock(); - - } - } catch (RuntimeException ex) { - ex.printStackTrace(); - - if (canvas != null) { - // drawingSurfaceObject will safely ignore - // this request if this is not lock before - canvas.drawingSurfaceObject.unLock(); - } - - // Issue 260 : indicate fatal error and notify error listeners - canvas.setFatalError(); - RenderingError err = - new RenderingError(RenderingError.UNEXPECTED_RENDERING_ERROR, - J3dI18N.getString("Renderer8")); - err.setCanvas3D(canvas); - err.setGraphicsDevice(canvas.graphicsConfiguration.getDevice()); - notifyErrorListeners(err); - } - } - -// resource clean up -@Override -void shutdown() { - removeAllCtxs(); -} - - @Override - void cleanup() { - super.cleanup(); - renderMessage = new J3dMessage[1]; - rendererStructure = new RendererStructure(); - bgVworldToVpc = new Transform3D(); - sharedCtx = null; - sharedCtxTimeStamp = 0; - sharedCtxDrawable = null; - dirtyRenderMoleculeList.clear(); - dirtyRenderAtomList.clear(); - dirtyDlistPerRinfoList.clear(); - textureIdResourceFreeList.clear(); - displayListResourceFreeList.clear(); - onScreen = null; - offScreen = null; - m = null; - nmesg = 0; - } - - - // This is only invoked from removeCtx()/removeAllCtxs() - // with drawingSurface already lock - final void makeCtxCurrent(Context sharedCtx, Drawable drawable) { - if (sharedCtx != currentCtx || drawable != currentDrawable) { - Canvas3D.useCtx(sharedCtx, drawable); - /* - if(!Canvas3D.useCtx(sharedCtx, display, drawable)) { - Thread.dumpStack(); - System.err.println("useCtx Fail"); - } - */ - currentCtx = sharedCtx; - currentDrawable = drawable; - } - } - - // No need to free graphics2d and background if it is from - // Canvas3D postRequest() offScreen rendering since the - // user thread will not wait for it. Also we can just - // reuse it as Canvas3D did not destroy. - private void removeCtx(Canvas3D cv, Drawable drawable, Context ctx, - boolean resetCtx, boolean freeBackground, - boolean destroyOffScreenBuffer) { - - synchronized (VirtualUniverse.mc.contextCreationLock) { - if (ctx != null) { - int idx = listOfCtxs.indexOf(ctx); - if (idx >= 0) { - listOfCtxs.remove(idx); - listOfCanvases.remove(idx); - // Issue 326 : don't check display variable here - if ((drawable != null) && cv.added) { - // cv.ctx may reset to -1 here so we - // always use the ctx pass in. - if (cv.drawingSurfaceObject.renderLock()) { - // if it is the last one, free shared resources - if (sharedCtx != null) { - if (listOfCtxs.isEmpty()) { - makeCtxCurrent(sharedCtx, sharedCtxDrawable); - freeResourcesInFreeList(null); - freeContextResources(); - Canvas3D.destroyContext(sharedCtxDrawable, sharedCtx); - currentCtx = null; - currentDrawable = null; - } else { - freeResourcesInFreeList(cv); - } - cv.makeCtxCurrent(ctx, drawable); - } else { - cv.makeCtxCurrent(ctx, drawable); - cv.freeResourcesInFreeList(ctx); - } - cv.freeContextResources(this, freeBackground, ctx); - Canvas3D.destroyContext(drawable, ctx); - currentCtx = null; - currentDrawable = null; - cv.drawingSurfaceObject.unLock(); - } - } - } - - if (resetCtx) { - cv.ctx = null; - } - - if ((sharedCtx != null) && listOfCtxs.isEmpty()) { - sharedCtx = null; - sharedCtxTimeStamp = 0; - } - cv.ctxTimeStamp = 0; - } - - // Fix for issue 18. - // Since we are now the renderer thread, - // we can safely execute destroyOffScreenBuffer. - if(destroyOffScreenBuffer) { - cv.destroyOffScreenBuffer(ctx, drawable); - cv.offScreenBufferPending = false; - } - } - } - - void removeAllCtxs() { - Canvas3D cv; - - synchronized (VirtualUniverse.mc.contextCreationLock) { - - for (int i=listOfCanvases.size()-1; i >=0; i--) { - cv = listOfCanvases.get(i); - - if ((cv.screen != null) && (cv.ctx != null)) { - // Issue 326 : don't check display variable here - if ((cv.drawable != null) && cv.added) { - if (cv.drawingSurfaceObject.renderLock()) { - // We need to free sharedCtx resource - // first before last non-sharedCtx to - // workaround Nvidia driver bug under Linux - // that crash on freeTexture ID:4685156 - if ((i == 0) && (sharedCtx != null)) { - makeCtxCurrent(sharedCtx, sharedCtxDrawable); - freeResourcesInFreeList(null); - freeContextResources(); - Canvas3D.destroyContext(sharedCtxDrawable, sharedCtx); - currentCtx = null; - currentDrawable = null; - } - cv.makeCtxCurrent(); - cv.freeResourcesInFreeList(cv.ctx); - cv.freeContextResources(this, true, cv.ctx); - Canvas3D.destroyContext(cv.drawable, cv.ctx); - currentCtx = null; - currentDrawable = null; - cv.drawingSurfaceObject.unLock(); - } - } - } - - cv.ctx = null; - cv.ctxTimeStamp = 0; - } - - if (sharedCtx != null) { - sharedCtx = null; - sharedCtxTimeStamp = 0; - } - listOfCanvases.clear(); - listOfCtxs.clear(); - } - } - - // handle free resource in the FreeList - void freeResourcesInFreeList(Canvas3D cv) { - Iterator<Integer> it; - boolean isFreeTex = (textureIdResourceFreeList.size() > 0); - boolean isFreeDL = (displayListResourceFreeList.size() > 0); - int val; - - if (isFreeTex || isFreeDL) { - if (cv != null) { - cv.makeCtxCurrent(sharedCtx); - } - - if (isFreeDL) { - for (it = displayListResourceFreeList.iterator(); it.hasNext();) { - val = it.next().intValue(); - if (val <= 0) { - continue; - } - Canvas3D.freeDisplayList(sharedCtx, val); - } - displayListResourceFreeList.clear(); - } - if (isFreeTex) { - for (it = textureIdResourceFreeList.iterator(); it.hasNext();) { - val = it.next().intValue(); - if (val <= 0) { - continue; - } - if (val >= textureIDResourceTable.size()) { - MasterControl.getCoreLogger().severe( - "Error in freeResourcesInFreeList : ResourceIDTableSize = " + - textureIDResourceTable.size() + - " val = " + val); - } else { - TextureRetained tex = textureIDResourceTable.get(val); - if (tex != null) { - synchronized (tex.resourceLock) { - tex.resourceCreationMask &= ~rendererBit; - if (tex.resourceCreationMask == 0) { - tex.freeTextureId(val); - } - } - } - - textureIDResourceTable.set(val, null); - } - Canvas3D.freeTexture(sharedCtx, val); - } - textureIdResourceFreeList.clear(); - } - if (cv != null) { - cv.makeCtxCurrent(cv.ctx); - } - } - } - -final void addTextureResource(int id, TextureRetained obj) { - if (textureIDResourceTable.size() <= id) { - for (int i=textureIDResourceTable.size(); - i < id; i++) { - textureIDResourceTable.add(null); - } - textureIDResourceTable.add(obj); - } else { - textureIDResourceTable.set(id, obj); - } - } - - void freeContextResources() { - TextureRetained tex; - - for (int id = textureIDResourceTable.size()-1; id >= 0; id--) { - tex = textureIDResourceTable.get(id); - if (tex == null) { - continue; - } - Canvas3D.freeTexture(sharedCtx, id); - synchronized (tex.resourceLock) { - tex.resourceCreationMask &= ~rendererBit; - if (tex.resourceCreationMask == 0) { - tex.freeTextureId(id); - } - } - } - textureIDResourceTable.clear(); - - // displayList is free in Canvas.freeContextResources() - } - - /** - * Send a message to the notification thread, which will call the - * shader error listeners. - */ - static void notifyErrorListeners(RenderingError err) { - J3dNotification notification = new J3dNotification(); - notification.type = J3dNotification.RENDERING_ERROR; - notification.universe = null;//cv.view.universe; - notification.args[0] = err; - VirtualUniverse.mc.sendNotification(notification); - } - - - // Default rendering error listener class - private static RenderingErrorListener defaultErrorListener = null; - - synchronized static RenderingErrorListener getDefaultErrorListener() { - if (defaultErrorListener == null) { - defaultErrorListener = new DefaultErrorListener(); - } - - return defaultErrorListener; - } - - static class DefaultErrorListener implements RenderingErrorListener { - @Override - public void errorOccurred(RenderingError error) { - System.err.println(); - System.err.println("DefaultRenderingErrorListener.errorOccurred:"); - error.printVerbose(); - System.exit(1); - } - } - -} |