I was testing the new Graphics API (Vulkan) on my device and decided to test OpenGL too by switching it and quickly exiting the world and game. This leads to the game crashing because of LWJGL and watchdog with description Client shutdown from post-main and with log:
java.lang.IllegalStateException: Rendersystem called from wrong thread
at com.mojang.blaze3d.systems.RenderSystem.constructThreadException(RenderSystem.java:111)
at com.mojang.blaze3d.systems.RenderSystem.assertOnRenderThread(RenderSystem.java:106)
at com.mojang.blaze3d.platform.Window.defaultErrorCallback(Window.java:242)
at org.lwjgl.system.JNI.invokeI(JNI.java:1350)
at org.lwjgl.glfw.GLFW.glfwGetPlatform(GLFW.java:690)
at com.mojang.blaze3d.platform.Window.getPlatform(Window.java:157)
at net.minecraft.SystemReport.setDetail(SystemReport.java:92)
at net.minecraft.client.Minecraft.fillSystemReport(Minecraft.java:2444)
at net.minecraft.client.Minecraft.fillReport(Minecraft.java:2394)
at com.mojang.blaze3d.platform.ClientShutdownWatchdog.lambda$startShutdownWatchdog$0(ClientShutdownWatchdog.java:31)
at java.base/java.lang.Thread.run(Thread.java:1474)How to reproduce the issue
Open any Minecraft World with any Graphics API selected.
Go into the graphics settings menu within the world and change the Graphics API from “Prefer Vulkan” to “Prefer OpenGL”.
Exit the world.
Exit the game.
Expected result
Game exits within a few seconds with no issues.
Actual result
Game exit sequence hangs for a while, then crash.
Full Log
[LWJGL] Unhandled exception in callback:
java.lang.IllegalStateException: Rendersystem called from wrong thread
at com.mojang.blaze3d.systems.RenderSystem.constructThreadException(RenderSystem.java:111)
at com.mojang.blaze3d.systems.RenderSystem.assertOnRenderThread(RenderSystem.java:106)
at com.mojang.blaze3d.platform.Window.defaultErrorCallback(Window.java:242)
at org.lwjgl.system.JNI.invokeI(JNI.java:1350)
at org.lwjgl.glfw.GLFW.glfwGetPlatform(GLFW.java:690)
at com.mojang.blaze3d.platform.Window.getPlatform(Window.java:157)
at net.minecraft.SystemReport.setDetail(SystemReport.java:92)
at net.minecraft.client.Minecraft.fillSystemReport(Minecraft.java:2444)
at net.minecraft.client.Minecraft.fillReport(Minecraft.java:2394)
at com.mojang.blaze3d.platform.ClientShutdownWatchdog.lambda$startShutdownWatchdog$0(ClientShutdownWatchdog.java:31)
at java.base/java.lang.Thread.run(Thread.java:1474)
---- Minecraft Crash Report ----
// Why did you do that?
Time: 2026-04-09 15:23:15
Description: Client shutdown from post-main
java.lang.Error: Watchdog
at net.minecraft.server.dedicated.ServerWatchdog.createWatchdogCrashReport(ServerWatchdog.java:78)
at com.mojang.blaze3d.platform.ClientShutdownWatchdog.lambda$startShutdownWatchdog$0(ClientShutdownWatchdog.java:27)
at java.base/java.lang.Thread.run(Thread.java:1474)
A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------
-- Head --
Thread: Client shutdown watchdog
Stacktrace:
at net.minecraft.server.dedicated.ServerWatchdog.createWatchdogCrashReport(ServerWatchdog.java:78)
-- Thread Dump --
Details:
Threads: "Reference Handler" daemon prio=10 Id=11 RUNNABLE
at java.base@25.0.1/java.lang.ref.Reference.waitForReferencePendingList(Native Method)
at java.base@25.0.1/java.lang.ref.Reference.processPendingReferences(Reference.java:246)
at java.base@25.0.1/java.lang.ref.Reference$ReferenceHandler.run(Reference.java:208)
"Finalizer" daemon prio=8 Id=12 WAITING on java.lang.ref.ReferenceQueue$Lock@7c823026
at java.base@25.0.1/java.lang.Object.wait0(Native Method)
- waiting on java.lang.ref.ReferenceQueue$Lock@7c823026
at java.base@25.0.1/java.lang.Object.wait(Object.java:389)
at java.base@25.0.1/java.lang.Object.wait(Object.java:351)
at java.base@25.0.1/java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:137)
at java.base@25.0.1/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:215)
at java.base@25.0.1/java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:165)
"Signal Dispatcher" daemon prio=9 Id=13 RUNNABLE
"Attach Listener" daemon prio=5 Id=14 RUNNABLE
"Notification Thread" daemon prio=9 Id=20 RUNNABLE
"Common-Cleaner" daemon prio=8 Id=21 TIMED_WAITING on java.lang.ref.ReferenceQueue$Lock@536ae83c
at java.base@25.0.1/java.lang.Object.wait0(Native Method)
- waiting on java.lang.ref.ReferenceQueue$Lock@536ae83c
at java.base@25.0.1/java.lang.Object.wait(Object.java:389)
at java.base@25.0.1/java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:123)
at java.base@25.0.1/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:201)
at java.base@25.0.1/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:146)
at java.base@25.0.1/java.lang.Thread.runWith(Thread.java:1487)
at java.base@25.0.1/java.lang.Thread.run(Thread.java:1474)
at java.base@25.0.1/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:148)
"JNA Cleaner" daemon prio=5 Id=29 TIMED_WAITING on java.lang.ref.ReferenceQueue$Lock@223c6c03
at java.base@25.0.1/java.lang.Object.wait0(Native Method)
- waiting on java.lang.ref.ReferenceQueue$Lock@223c6c03
at java.base@25.0.1/java.lang.Object.wait(Object.java:389)
at java.base@25.0.1/java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:123)
at java.base@25.0.1/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:201)
at app//com.sun.jna.internal.Cleaner$CleanerThread.run(Cleaner.java:154)
"Timer hack thread" daemon prio=5 Id=30 TIMED_WAITING
at java.base@25.0.1/java.lang.Thread.sleepNanos0(Native Method)
at java.base@25.0.1/java.lang.Thread.sleepNanos(Thread.java:509)
at java.base@25.0.1/java.lang.Thread.sleep(Thread.java:540)
at app//net.minecraft.util.Util$9.run(Util.java:996)
"Yggdrasil Key Fetcher" daemon prio=5 Id=32 TIMED_WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@6cf6e265
at java.base@25.0.1/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@6cf6e265
at java.base@25.0.1/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:271)
at java.base@25.0.1/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1803)
at java.base@25.0.1/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1166)
at java.base@25.0.1/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:883)
at java.base@25.0.1/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1016)
at java.base@25.0.1/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.base@25.0.1/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
...
"Netty Local IO #0" daemon prio=5 Id=55 TIMED_WAITING on io.netty.channel.local.LocalIoHandler@5b7dfca
at java.base@25.0.1/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on io.netty.channel.local.LocalIoHandler@5b7dfca
at java.base@25.0.1/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:271)
at app//io.netty.channel.local.LocalIoHandler.run(LocalIoHandler.java:63)
at app//io.netty.channel.SingleThreadIoEventLoop.runIo(SingleThreadIoEventLoop.java:225)
at app//io.netty.channel.SingleThreadIoEventLoop.run(SingleThreadIoEventLoop.java:196)
at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:1193)
at app//io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at java.base@25.0.1/java.lang.Thread.runWith(Thread.java:1487)
...
Number of locked synchronizers = 1
- java.util.concurrent.locks.ReentrantLock$NonfairSync@118ecdd
"Netty Local IO #1" daemon prio=5 Id=56 TIMED_WAITING on io.netty.channel.local.LocalIoHandler@1f14c021
at java.base@25.0.1/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on io.netty.channel.local.LocalIoHandler@1f14c021
at java.base@25.0.1/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:271)
at app//io.netty.channel.local.LocalIoHandler.run(LocalIoHandler.java:63)
at app//io.netty.channel.SingleThreadIoEventLoop.runIo(SingleThreadIoEventLoop.java:225)
at app//io.netty.channel.SingleThreadIoEventLoop.run(SingleThreadIoEventLoop.java:196)
at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:1193)
at app//io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at java.base@25.0.1/java.lang.Thread.runWith(Thread.java:1487)
...
Number of locked synchronizers = 1
- java.util.concurrent.locks.ReentrantLock$NonfairSync@442af70b
"Netty Local IO #2" daemon prio=5 Id=57 TIMED_WAITING on io.netty.channel.local.LocalIoHandler@62de747a
at java.base@25.0.1/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on io.netty.channel.local.LocalIoHandler@62de747a
at java.base@25.0.1/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:271)
at app//io.netty.channel.local.LocalIoHandler.run(LocalIoHandler.java:63)
at app//io.netty.channel.SingleThreadIoEventLoop.runIo(SingleThreadIoEventLoop.java:225)
at app//io.netty.channel.SingleThreadIoEventLoop.run(SingleThreadIoEventLoop.java:196)
at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:1193)
at app//io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at java.base@25.0.1/java.lang.Thread.runWith(Thread.java:1487)
...
Number of locked synchronizers = 1
- java.util.concurrent.locks.ReentrantLock$NonfairSync@592cb91a
"Telemetry-Sender-#1" prio=5 Id=59 WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@71df5585
at java.base@25.0.1/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@71df5585
at java.base@25.0.1/java.util.concurrent.locks.LockSupport.park(LockSupport.java:369)
at java.base@25.0.1/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:520)
at java.base@25.0.1/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:4364)
at java.base@25.0.1/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:4310)
at java.base@25.0.1/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1752)
at java.base@25.0.1/java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435)
at java.base@25.0.1/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1016)
...
"Download-3" daemon prio=5 Id=62 TIMED_WAITING on java.util.concurrent.SynchronousQueue$Transferer@48738657
at java.base@25.0.1/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.SynchronousQueue$Transferer@48738657
at java.base@25.0.1/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:408)
at java.base@25.0.1/java.util.concurrent.LinkedTransferQueue$DualNode.await(LinkedTransferQueue.java:452)
at java.base@25.0.1/java.util.concurrent.SynchronousQueue$Transferer.xferLifo(SynchronousQueue.java:194)
at java.base@25.0.1/java.util.concurrent.SynchronousQueue.xfer(SynchronousQueue.java:235)
at java.base@25.0.1/java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:338)
at java.base@25.0.1/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1015)
at java.base@25.0.1/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
...
"Download-4" daemon prio=5 Id=63 TIMED_WAITING on java.util.concurrent.SynchronousQueue$Transferer@48738657
at java.base@25.0.1/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.SynchronousQueue$Transferer@48738657
at java.base@25.0.1/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:408)
at java.base@25.0.1/java.util.concurrent.LinkedTransferQueue$DualNode.await(LinkedTransferQueue.java:452)
at java.base@25.0.1/java.util.concurrent.SynchronousQueue$Transferer.xferLifo(SynchronousQueue.java:194)
at java.base@25.0.1/java.util.concurrent.SynchronousQueue.xfer(SynchronousQueue.java:235)
at java.base@25.0.1/java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:338)
at java.base@25.0.1/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1015)
at java.base@25.0.1/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
...
"Download-5" daemon prio=5 Id=64 TIMED_WAITING on java.util.concurrent.SynchronousQueue$Transferer@48738657
at java.base@25.0.1/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.SynchronousQueue$Transferer@48738657
at java.base@25.0.1/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:408)
at java.base@25.0.1/java.util.concurrent.LinkedTransferQueue$DualNode.await(LinkedTransferQueue.java:452)
at java.base@25.0.1/java.util.concurrent.SynchronousQueue$Transferer.xferLifo(SynchronousQueue.java:194)
at java.base@25.0.1/java.util.concurrent.SynchronousQueue.xfer(SynchronousQueue.java:235)
at java.base@25.0.1/java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:338)
at java.base@25.0.1/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1015)
at java.base@25.0.1/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
...
"Download-6" daemon prio=5 Id=65 TIMED_WAITING on java.util.concurrent.SynchronousQueue$Transferer@48738657
at java.base@25.0.1/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.SynchronousQueue$Transferer@48738657
at java.base@25.0.1/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:408)
at java.base@25.0.1/java.util.concurrent.LinkedTransferQueue$DualNode.await(LinkedTransferQueue.java:452)
at java.base@25.0.1/java.util.concurrent.SynchronousQueue$Transferer.xferLifo(SynchronousQueue.java:194)
at java.base@25.0.1/java.util.concurrent.SynchronousQueue.xfer(SynchronousQueue.java:235)
at java.base@25.0.1/java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:338)
at java.base@25.0.1/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1015)
at java.base@25.0.1/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
...
"Sound engine" daemon prio=5 Id=78 WAITING on java.lang.String@74ab122a
at java.base@25.0.1/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on java.lang.String@74ab122a
at java.base@25.0.1/java.util.concurrent.locks.LockSupport.park(LockSupport.java:223)
at app//net.minecraft.client.sounds.SoundEngineExecutor.waitForTasks(SoundEngineExecutor.java:59)
at app//net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:158)
at app//net.minecraft.client.sounds.SoundEngineExecutor.run(SoundEngineExecutor.java:52)
at app//net.minecraft.client.sounds.SoundEngineExecutor$$Lambda/0x0000000032d6b1a8.run(Unknown Source)
at java.base@25.0.1/java.lang.Thread.runWith(Thread.java:1487)
at java.base@25.0.1/java.lang.Thread.run(Thread.java:1474)
"Client shutdown watchdog" daemon prio=5 Id=79 RUNNABLE
at java.management@25.0.1/sun.management.ThreadImpl.dumpThreads0(Native Method)
at java.management@25.0.1/sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:505)
at java.management@25.0.1/sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:493)
at app//net.minecraft.server.dedicated.ServerWatchdog.createWatchdogCrashReport(ServerWatchdog.java:75)
at app//com.mojang.blaze3d.platform.ClientShutdownWatchdog.lambda$startShutdownWatchdog$0(ClientShutdownWatchdog.java:27)
at app//com.mojang.blaze3d.platform.ClientShutdownWatchdog$$Lambda/0x000000003351b108.run(Unknown Source)
at java.base@25.0.1/java.lang.Thread.runWith(Thread.java:1487)
at java.base@25.0.1/java.lang.Thread.run(Thread.java:1474)
"DestroyJavaVM" prio=5 Id=81 RUNNABLE
Stacktrace:
at net.minecraft.server.dedicated.ServerWatchdog.createWatchdogCrashReport(ServerWatchdog.java:78)
at com.mojang.blaze3d.platform.ClientShutdownWatchdog.lambda$startShutdownWatchdog$0(ClientShutdownWatchdog.java:27)
at java.base/java.lang.Thread.run(Thread.java:1474)
-- System Details --
Details:
Minecraft Version: 26.2-snapshot-1
Minecraft Version ID: 26.2-snapshot-1
Operating System: Windows 10 (amd64) version 10.0
Java Version: 25.0.1, Microsoft
Java VM Version: OpenJDK 64-Bit Server VM (mixed mode), Microsoft
Memory: 416284672 bytes (397 MiB) / 1656750080 bytes (1580 MiB) up to 4294967296 bytes (4096 MiB)
Memory (heap): init: 512MiB, used: 1179MiB, committed: 1580MiB, max: 4096MiB
Memory (non-head): init: 007MiB, used: 200MiB, committed: 223MiB, max: 000MiB
CPUs: 4
Processor Vendor: GenuineIntel
Processor Name: Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
Identifier: Intel64 Family 6 Model 94 Stepping 3
Microarchitecture: Skylake (Client)
Frequency (GHz): 3.19
Number of physical packages: 1
Number of physical CPUs: 4
Number of logical CPUs: 4
Graphics card #0 name: Intel(R) HD Graphics 530
Graphics card #0 vendor: Intel Corporation
Graphics card #0 VRAM (MiB): 1024.00
Graphics card #0 deviceId: VideoController1
Graphics card #0 versionInfo: 31.0.101.2111
Memory slot #0 capacity (MiB): 8192.00
Memory slot #0 clockSpeed (GHz): 2.67
Memory slot #0 type: DDR4
Memory slot #1 capacity (MiB): 8192.00
Memory slot #1 clockSpeed (GHz): 2.67
Memory slot #1 type: DDR4
Virtual memory max (MiB): 17602.75
Virtual memory used (MiB): 7922.66
Swap memory total (MiB): 2304.00
Swap memory used (MiB): 67.30
Space in storage for jna.tmpdir (MiB): <path not set>
Space in storage for org.lwjgl.system.SharedLibraryExtractPath (MiB): <path not set>
Space in storage for io.netty.native.workdir (MiB): <path not set>
Space in storage for java.io.tmpdir (MiB): available: 41105.29, total: 410540.13
Space in storage for workdir (MiB): available: 41105.29, total: 410540.13
JVM Flags: 3 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -Xms512m -Xmx4096m
Debug Flags: 0 total;
Launched Version: 26.2-snapshot-1
Launcher name: PrismLauncher
Backend library: LWJGL version 3.4.1+2
Window size: <not initialized>
Surface Info: <no surface>
GFLW Platform: <error>
Graphics Device: Intel(R) HD Graphics 530
Graphics Backend: OpenGL
Graphics Vendor: Intel
Graphics Drivers: 3.3.0 - Build 31.0.101.2111
Graphics Device Extensions: GL_ARB_buffer_storage, GL_KHR_debug, GL_ARB_clip_control, GL_ARB_vertex_attrib_binding, GL_ARB_direct_state_access, GL_EXT_texture_filter_anisotropic
GL debug messages:
Is Modded: Probably not. Client jar signature and brand is untouched
Universe: 404
Type: Client
Locale: en_IT
System encoding: Cp1252
File encoding: UTF-8
CPU: 4x Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
#@!@# Game crashed! Crash report saved to: #@!@# C:\Users\Utente\AppData\Roaming\PrismLauncher\instances\26.2-snapshot-1\minecraft\crash-reports\crash-2026-04-09_15.23.15-client.txt
Thank you for your report!
We are tracking this issue in MC-307286, so this ticket is being resolved and linked as a duplicate.
That ticket has already been resolved as Fixed. Please check the Fix Version/s field of that ticket to see in which version this behavior was or will be fixed.
Additionally, you are using a third-party launcher. Please only report issues that you have verified to be present in a vanilla environment, and make use of the search feature to see whether an issue has already been reported.
Quick Links:
📓 Bug Tracker Guidelines – 💬 Community Support – 📧 Mojang Support (Technical Issues) – 📧 Microsoft Support (Account Issues)
📓 Project Summary – ✍️ Feedback and Suggestions – 📖 Game Wiki