diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/classes/share/javax/media/j3d/Canvas3D.java | 47 | ||||
-rw-r--r-- | src/classes/share/javax/media/j3d/J3dMessage.java | 7 | ||||
-rw-r--r-- | src/classes/share/javax/media/j3d/MasterControl.java | 28 | ||||
-rw-r--r-- | src/classes/share/javax/media/j3d/Renderer.java | 27 | ||||
-rw-r--r-- | src/classes/share/javax/media/j3d/SoundStructure.java | 7 | ||||
-rw-r--r-- | src/native/ogl/Canvas3D.c | 30 |
6 files changed, 103 insertions, 43 deletions
diff --git a/src/classes/share/javax/media/j3d/Canvas3D.java b/src/classes/share/javax/media/j3d/Canvas3D.java index c79b3c2..6fbdcac 100644 --- a/src/classes/share/javax/media/j3d/Canvas3D.java +++ b/src/classes/share/javax/media/j3d/Canvas3D.java @@ -1895,10 +1895,9 @@ public class Canvas3D extends Canvas { (offScreenCanvasSize.height != height)) { if (window != 0) { - removeCtx(); - // Fix for Issue 18. + // Fix for Issue 18 and Issue 175 // Will do destroyOffScreenBuffer in the Renderer thread. - sendDestroyOffScreenBuffer(); + sendDestroyCtxAndOffScreenBuffer(); window = 0; } @@ -1909,11 +1908,10 @@ public class Canvas3D extends Canvas { if (width > 0 && height > 0) { sendCreateOffScreenBuffer(); } - ctx = 0; } else if (ctx != 0) { - removeCtx(); + removeCtx(); } offScreenBuffer = buffer; @@ -2470,7 +2468,7 @@ public class Canvas3D extends Canvas { // The native method that sets this ctx to be the current one - static native void useCtx(long ctx, long display, int window); + static native boolean useCtx(long ctx, long display, int window); native void clear(long ctx, float r, float g, float b, int winWidth, int winHeight, ImageComponent2DRetained image, int imageScaleMode, byte[] imageYdown); @@ -4363,12 +4361,7 @@ public class Canvas3D extends Canvas { // Send a destroyOffScreenBuffer message to Renderer (via // MasterControl) and wait for it to be done - private void sendDestroyOffScreenBuffer() { - // Nothing to do unless screen.renderer is non-null - if ((screen == null) || (screen.renderer == null)) { - return; - } - + private void sendDestroyCtxAndOffScreenBuffer() { // Wait for the buffer to be destroyed unless called from // a Behavior or from a Rendering thread Thread currentThread = Thread.currentThread(); @@ -4378,32 +4371,27 @@ public class Canvas3D extends Canvas { offScreenBufferPending = true; } - // Fix for Issue 18 - // Send message to Renderer thread to perform destroyOffScreenBuffer. - VirtualUniverse.mc.postRequest(MasterControl.FREE_CONTEXT, - new Object[]{this, - new Long(screen.display), - new Integer(window), - new Long(0), - Boolean.TRUE}); + // Fix for Issue 18 and Issue 175 + // Send message to Renderer thread to perform remove Ctx and destroyOffScreenBuffer. + + VirtualUniverse.mc.sendDestroyCtxAndOffScreenBuffer(this); - // Wait for off-screen buffer to be destroyed + // Wait for ctx and off-screen buffer to be destroyed while (offScreenBufferPending) { MasterControl.threadYield(); } } private void removeCtx() { + if ((screen != null) && (screen.renderer != null) && (ctx != 0)) { - VirtualUniverse.mc.postRequest(MasterControl.FREE_CONTEXT, - new Object[]{this, - new Long(screen.display), - new Integer(window), - new Long(ctx), - Boolean.FALSE}); - + VirtualUniverse.mc.postRequest(MasterControl.FREE_CONTEXT, + new Object[]{this, + new Long(screen.display), + new Integer(window), + new Long(ctx)}); // Fix for Issue 19 // Wait for the context to be freed unless called from // a Behavior or from a Rendering thread @@ -4413,7 +4401,8 @@ public class Canvas3D extends Canvas { while (ctxTimeStamp != 0) { MasterControl.threadYield(); } - } + + } ctx = 0; } } diff --git a/src/classes/share/javax/media/j3d/J3dMessage.java b/src/classes/share/javax/media/j3d/J3dMessage.java index d2d073d..c717388 100644 --- a/src/classes/share/javax/media/j3d/J3dMessage.java +++ b/src/classes/share/javax/media/j3d/J3dMessage.java @@ -84,9 +84,10 @@ class J3dMessage extends Object { static final int ORDERED_GROUP_TABLE_CHANGED = 59; static final int BEHAVIOR_REEVALUATE = 60; static final int CREATE_OFFSCREENBUFFER = 61; - static final int SHADER_ATTRIBUTE_CHANGED = 62; - static final int SHADER_ATTRIBUTE_SET_CHANGED = 63; - static final int SHADER_APPEARANCE_CHANGED = 64; + static final int DESTROY_CTX_AND_OFFSCREENBUFFER = 62; + static final int SHADER_ATTRIBUTE_CHANGED = 63; + static final int SHADER_ATTRIBUTE_SET_CHANGED = 64; + static final int SHADER_APPEARANCE_CHANGED = 65; /** * This is the time snapshot at which this change occured diff --git a/src/classes/share/javax/media/j3d/MasterControl.java b/src/classes/share/javax/media/j3d/MasterControl.java index c5ba916..e1ead5e 100644 --- a/src/classes/share/javax/media/j3d/MasterControl.java +++ b/src/classes/share/javax/media/j3d/MasterControl.java @@ -3000,6 +3000,31 @@ class MasterControl { setWorkForRequestRenderer(); } + // Issue for Issue 175 + // Pass DestroyCtxAndOffScreenBuffer to the Renderer thread for execution. + void sendDestroyCtxAndOffScreenBuffer(Canvas3D c) { + // Assertion check. Look for comment in sendCreateOffScreenBuffer. + GraphicsDevice gd = c.graphicsConfiguration.getDevice(); + J3dDebug.doAssert((Screen3D.deviceRendererMap.get(gd) != null), + "Screen3D.deviceRendererMap.get(gd) != null"); + synchronized (mcThreadLock) { + // Assert the master control thread is created. + J3dDebug.doAssert((mcThread != null), "mcThread != null"); + Renderer rdr = createRenderer(c.graphicsConfiguration); + J3dMessage createMessage = VirtualUniverse.mc.getMessage(); + createMessage.threads = J3dThread.RENDER_THREAD; + createMessage.type = J3dMessage.DESTROY_CTX_AND_OFFSCREENBUFFER; + createMessage.universe = null; + createMessage.view = null; + createMessage.args[0] = c; + rdr.rendererStructure.addMessage(createMessage); + synchronized (requestObjList) { + setWorkForRequestRenderer(); + pendingRequest = true; + } + } + } + // Fix for Issue 18 // Pass CreateOffScreenBuffer to the Renderer thread for execution. void sendCreateOffScreenBuffer(Canvas3D c) { @@ -3046,7 +3071,7 @@ class MasterControl { */ void doWork() { runMonitor(CHECK_FOR_WORK, null, null, null, null); - + synchronized (timeLock) { synchronized (requestObjList) { if (pendingRequest) { @@ -3366,7 +3391,6 @@ class MasterControl { } } - while (!done) { // First try a RenderThread while (!renderWaiting && diff --git a/src/classes/share/javax/media/j3d/Renderer.java b/src/classes/share/javax/media/j3d/Renderer.java index 8abfe00..e3237ae 100644 --- a/src/classes/share/javax/media/j3d/Renderer.java +++ b/src/classes/share/javax/media/j3d/Renderer.java @@ -342,8 +342,7 @@ class Renderer extends J3dThread { ((Integer) obj[2]).intValue(), ((Long) obj[3]).longValue(), false, !c.offScreen, - ((Boolean)obj[4]).booleanValue()); - + false); } return; } else { // RENDER || REQUESTRENDER @@ -473,6 +472,21 @@ class Renderer extends J3dThread { m[nmesg++].decRefcount(); continue; } + else if (renderType == J3dMessage.DESTROY_CTX_AND_OFFSCREENBUFFER) { + // Fix for issue 175. + // destroy ctx. + // Should be able to collaspe both call into one. Will do this in 1.5, + // it is a little risky for 1.4 beta3. + removeCtx(canvas, canvas.screen.display, canvas.window, canvas.ctx, + false, !canvas.offScreen, false); + // destroy offScreenBuffer. + removeCtx(canvas, canvas.screen.display, canvas.window, 0, + false, !canvas.offScreen, true); + + canvas.offScreenBufferPending = false; + m[nmesg++].decRefcount(); + continue; + } if ((canvas.view == null) || !canvas.firstPaintCalled) { // This happen when the canvas just remove from the View @@ -642,7 +656,6 @@ class Renderer extends J3dThread { ImageComponent2DRetained offBufRetained = null; if (renderType == J3dMessage.RENDER_OFFSCREEN) { - if (canvas.window == 0 || !canvas.active) { canvas.offScreenRendering = false; continue; @@ -1449,7 +1462,13 @@ class Renderer extends J3dThread { // with drawingSurface already lock final void makeCtxCurrent(long sharedCtx, long display, int window) { if (sharedCtx != currentCtx) { - Canvas3D.useCtx(sharedCtx, display, window); + Canvas3D.useCtx(sharedCtx, display, window); + /* + if(!Canvas3D.useCtx(sharedCtx, display, window)) { + Thread.dumpStack(); + System.err.println("useCtx Fail"); + } + */ currentCtx = sharedCtx; } } diff --git a/src/classes/share/javax/media/j3d/SoundStructure.java b/src/classes/share/javax/media/j3d/SoundStructure.java index e2407b6..dd18252 100644 --- a/src/classes/share/javax/media/j3d/SoundStructure.java +++ b/src/classes/share/javax/media/j3d/SoundStructure.java @@ -106,7 +106,8 @@ class SoundStructure extends J3dStructure { transformMsg = true; break; case J3dMessage.SWITCH_CHANGED: - processSwitchChanged(m); + // This method isn't implemented yet. + // processSwitchChanged(m); // may need to process dirty switched-on transform if (universe.transformStructure.getLazyUpdate()) { transformMsg = true; @@ -442,7 +443,9 @@ class SoundStructure extends J3dStructure { } } + // Implementation be needed. void processSwitchChanged(J3dMessage m) { + /* SoundRetained sound; LeafRetained leaf; UnorderList arrList; @@ -468,6 +471,7 @@ class SoundStructure extends J3dStructure { } } } + */ } // How can active flag (based on View orientataion) be set here for all Views?!? @@ -718,4 +722,5 @@ class SoundStructure extends J3dStructure { } void cleanup() {} + } diff --git a/src/native/ogl/Canvas3D.c b/src/native/ogl/Canvas3D.c index f653e84..f18d817 100644 --- a/src/native/ogl/Canvas3D.c +++ b/src/native/ogl/Canvas3D.c @@ -1309,7 +1309,7 @@ jlong JNICALL Java_javax_media_j3d_Canvas3D_createNewContext( JNIEXPORT -void JNICALL Java_javax_media_j3d_Canvas3D_useCtx( +jboolean JNICALL Java_javax_media_j3d_Canvas3D_useCtx( JNIEnv *env, jclass cl, jlong ctxInfo, @@ -1318,13 +1318,36 @@ void JNICALL Java_javax_media_j3d_Canvas3D_useCtx( { GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; jlong ctx = ctxProperties->context; + int result; #if defined(UNIX) - glXMakeCurrent((Display *)display, (GLXDrawable)window, (GLXContext)ctx); + + result = glXMakeCurrent((Display *)display, (GLXDrawable)window, (GLXContext)ctx); + if (result != GL_TRUE) { + fprintf(stderr, "Java 3D ERROR : In Canvas3D.useCtx() glXMakeCurrent fails\n"); + return JNI_FALSE; + } + #endif #ifdef WIN32 - wglMakeCurrent((HDC) window, (HGLRC) ctx); + DWORD err; + LPTSTR errString; + + result = wglMakeCurrent((HDC) window, (HGLRC) ctx); + /* fprintf(stderr, "useCtx : wglMakeCurrent : window %d, ctx %d, result = %d\n", + window, (int) ctx, result); */ + + if (result != GL_TRUE) { + err = GetLastError(); + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, err, 0, (LPTSTR)&errString, 0, NULL); + fprintf(stderr, "wglMakeCurrent Failed: %s\n", errString); + return JNI_FALSE; + } + #endif + return JNI_TRUE; } JNIEXPORT @@ -2741,7 +2764,6 @@ jint JNICALL Java_javax_media_j3d_Canvas3D_createOffScreenBuffer( hpbuf = pFormatInfoPtr->wglCreatePbufferARB( hdc, pFormatInfoPtr->offScreenPFormat, width, height, piAttrs); - if(hpbuf == NULL) { printErrorMessage("In Canvas3D : wglCreatePbufferARB FAIL."); ReleaseDC(hwnd, hdc); |