From 84c0adb0ee430796dc72675ff3fbf6e47fb7b034 Mon Sep 17 00:00:00 2001 From: wil Date: Fri, 8 May 2026 18:27:38 -0600 Subject: [PATCH 1/3] fix: solve the problem of the locked canvas with 'waitFor'. --- .../main/java/com/jme3/system/lwjgl/LwjglCanvas.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java index 955b82f18c..97b180faec 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java @@ -492,6 +492,13 @@ public void run() { } LOGGER.log(Level.FINE, "Using LWJGL {0}", Version.getVersion()); + + // HACK: If you use waitFor(), unlock it beforehand to initialize the + // context on the fly. + synchronized (createdLock) { + created.set(true); + createdLock.notifyAll(); + } while (true) { if (needResize.getAndSet(false)) { @@ -552,7 +559,7 @@ public void run() { // All this does is call swapBuffers(). // If the canvas is not active, there's no need to waste time // doing that. - if (renderable.get() && canvas.hasContext()) { + if (renderable.get() && canvas.hasContext() && canvas.isValid()) { try { if (allowSwapBuffers && autoFlush) { // calls swap buffers | lock, etc. @@ -715,6 +722,7 @@ protected void createContext(AppSettings settings) { canvas.createContext(); canvas.makeCurrent(); + canvas.validate(); // This will activate the "effective data" scrubber. if (settings.getBoolean("GLDataEffectiveDebug")) { From bcc8fc2627dca673c5fe4a25db567ba6a608d8e1 Mon Sep 17 00:00:00 2001 From: wil Date: Fri, 8 May 2026 18:59:08 -0600 Subject: [PATCH 2/3] fix: EDT canvas --- .../src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java index 97b180faec..71984b892b 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java @@ -722,7 +722,10 @@ protected void createContext(AppSettings settings) { canvas.createContext(); canvas.makeCurrent(); - canvas.validate(); + + SwingUtilities.invokeLater(() -> { + canvas.validate(); + }); // This will activate the "effective data" scrubber. if (settings.getBoolean("GLDataEffectiveDebug")) { From feb5c1fb1c2a77e5c360b14f7de1978d928d37e4 Mon Sep 17 00:00:00 2001 From: wil Date: Fri, 8 May 2026 19:14:05 -0600 Subject: [PATCH 3/3] fix: waitFor not supported --- .../com/jme3/system/lwjgl/LwjglCanvas.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java index 71984b892b..f58fd7b720 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java @@ -492,13 +492,6 @@ public void run() { } LOGGER.log(Level.FINE, "Using LWJGL {0}", Version.getVersion()); - - // HACK: If you use waitFor(), unlock it beforehand to initialize the - // context on the fly. - synchronized (createdLock) { - created.set(true); - createdLock.notifyAll(); - } while (true) { if (needResize.getAndSet(false)) { @@ -653,6 +646,18 @@ public void create(boolean waitFor) { this.contextFlag.set(true); } + /**(non-Javadoc) + * @param createdVal boolean + */ + @Override + protected void waitFor(boolean createdVal) { + // AWT together with LWJGLX cannot handle waitFor() in the best way, + // since the context is created on the fly. + if (createdVal) { + LOGGER.log(Level.WARNING, "create(true) is not supported for AWT!"); + } + } + /** * (non-Javadoc) * @see com.jme3.system.lwjgl.LwjglWindow#destroyContext()