JetBrains / compose-multiplatform

Compose Multiplatform, a modern UI framework for Kotlin that makes building performant and beautiful user interfaces easy and enjoyable.
https://jetbrains.com/lp/compose-multiplatform
Apache License 2.0
15.96k stars 1.16k forks source link

Fatal error when creating undecorated and transparent window on Windows 11 #3757

Closed franmatesic closed 2 months ago

franmatesic commented 11 months ago

Describe the bug Getting a fatal error when trying to create a undecorated and transparent window on Windows 11:

A fatal error has been detected by the Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff974f07061, pid=5700, tid=6040

JRE version: OpenJDK Runtime Environment (20.0.2+9) (build 20.0.2+9-78)
Java VM: OpenJDK 64-Bit Server VM (20.0.2+9-78, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64)
Problematic frame:
V  [jvm.dll+0x437061]

Affected platforms

Versions

To Reproduce

fun main() = application {
    Window(
        onCloseRequest = ::exitApplication,
        undecorated = true,
        transparent = true,
        ) {
        Box(Modifier.size(64.dp, 64.dp)) {
            Text("Hello World!")
        }
    }
}

Expected behavior Program should create a transparent window.

Additional context Started project on Windows 10 with described versions, but on x86 OS architecture and everything worked fine. Opened project on Windows 11 and got this error.

eymar commented 11 months ago

There should be a file named like hs_err_pid123123.log added in the root folder of your project. Could you please post its content here? Attach the file?


I tried to reproduce on my Windows 11 with the same versions:

JRE version: OpenJDK Runtime Environment (20.0.2+9) (build 20.0.2+9-78)
# Java VM: OpenJDK 64-Bit Server VM (20.0.2+9-78, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64)

But it doesn't crash in my case. I tried with differents JDK version and vendors - worked fine.

Also in my case I see org.jetbrains.skiko.RenderException: Failed to create DirectX12 device. in the logs. It happens only when I have transparent = true. I guess it fall backs to software rendering in my case. And it can be the reason why I can't reproduce. Do you see this line in the logs?

Do you have the crash when transparent = false? Can you please try different JDKs too?

franmatesic commented 11 months ago

I also get org.jetbrains.skiko.RenderException: Failed to create DirectX12 device. on this machine and on the previous where it worked so I don't think that is part of the problem. It works as expected when setting transparent = false. It's failing when setting undecorated = true and transparent = true. I also tried this with JDKs 19 and 21, getting the same error on 19, but Unsupported Java on 21.

Here's the error file: hs_err_pid5700.log

eymar commented 11 months ago

@franmatesic Could you please try just in case with Compose 1.5.10-beta02 (it has a newer skiko) and kotlin 1.9.20-Beta2?

eymar commented 11 months ago

@igordmn Igor, do you have any ideas about how we can reproduce this on our side?

It crashes in [skiko-windows-x64.dll+0x598fc]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  org.jetbrains.skiko.redrawer.WindowsOpenGLRedrawerKt.getDevice(J)J+0
j  org.jetbrains.skiko.redrawer.WindowsOpenGLRedrawerKt.access$getDevice(J)J+1
j  org.jetbrains.skiko.redrawer.WindowsOpenGLRedrawer$device$1.invoke(J)Ljava/lang/Long;+1
private external fun getDevice(platformInfo: Long): Long

...
JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_redrawer_WindowsOpenGLRedrawerKt_getDevice(JNIEnv *env, jobject redrawer, jlong platformInfoPtr)

Maybe platformInfo: Long is 0L.

Should we check that val platformInfo: Long get() = getPlatformInfo(ptr) is not 0L like it's done for ptr? https://github.com/JetBrains/skiko/blob/ed693b579e993cd8fe995b466c55c2fd7d285f88/skiko/src/awtMain/kotlin/org/jetbrains/skiko/AWT.kt#L65 It won't solve the issue, but can provide a better message.

franmatesic commented 11 months ago

@franmatesic Could you please try just in case with Compose 1.5.10-beta02 (it has a newer skiko) and kotlin 1.9.20-Beta2?

Still doesn't work. Error report is slightly different though: on line 661 Internal exceptions (16 events): instead of 15 events previously

hs_err_pid15388.log

eymar commented 11 months ago

@franmatesic We still can't reproduce, but maybe knowing if it's a regression can help us understand what's going on.

Could you please try to run using older Compose versions? Compose 1.5.0 and Compose 1.4.3 (Kotlin 1.9.0), and then Compose 1.4.0 + kotlin 1.8.20

eymar commented 11 months ago

We added some extra logs to skiko (0.0.0.7.81-dev41023) - https://maven.pkg.jetbrains.space/public/p/compose/dev/org/jetbrains/skiko/skiko-awt-runtime-windows-x64/0.0.0.7.81-dev41023/

If you don't mind to try it out, so we can better understand what happens.

To try it you would need to force gradle to use this version. It can be done like this:

// in root build.gradle.kts

allprojects {
    configurations.all {
         resolutionStrategy.eachDependency {
             if(requested.module.group.startsWith("org.jetbrains.skiko")) {
                  useVersion("0.0.0.7.81-dev41023")
             }
         }
    }
}

Please make sure you have maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev") added to the repositories, that's where dev skiko artifacts are hosted. If you give it a try, please post the logs/stacktraces here.

franmatesic commented 11 months ago

I tried running older compose and kotlin versions, but no luck.

Here's the log when using newer version and skiko (0.0.0.7.81-dev41023):

hs_err_pid11864.log

AnmLobby commented 7 months ago

I have the same problem as you, has it been solved?

kisa002 commented 5 months ago

I have the same problem as you, has it been solved?

I have a similar problem when using undecorated=true and transparent=true. And, I solved that with the change to compose multiplatform version 1.6.0-alpha01 to 1.6.0.

[SKIKO] warn: Fallback to next API
org.jetbrains.skiko.RenderException: Failed to create DirectX12 device.
Exception in thread "main" java.lang.UnsatisfiedLinkError: 'void org.jetbrains.skiko.OpenGLLibrary_jvmKt.loadOpenGLLibraryWindows()'
    at org.jetbrains.skiko.OpenGLLibrary_jvmKt.loadOpenGLLibraryWindows(Native Method)
    at org.jetbrains.skiko.OpenGLLibrary_jvmKt.loadOpenGLLibrary(OpenGLLibrary.jvm.kt:16)
    at org.jetbrains.skiko.redrawer.WindowsOpenGLRedrawer.<init>(WindowsOpenGLRedrawer.kt:13)
    at org.jetbrains.skiko.Actuals_awtKt$makeDefaultRenderFactory$1.createRedrawer(Actuals.awt.kt:33)
    at org.jetbrains.skiko.SkiaLayer$redrawerManager$1.invoke(SkiaLayer.awt.kt:304)
    at org.jetbrains.skiko.SkiaLayer$redrawerManager$1.invoke(SkiaLayer.awt.kt:302)
    at org.jetbrains.skiko.redrawer.RedrawerManager.findNextWorkingRenderApi(RedrawerManager.kt:31)
    at org.jetbrains.skiko.SkiaLayer.init(SkiaLayer.awt.kt:334)
    at org.jetbrains.skiko.SkiaLayer.addNotify(SkiaLayer.awt.kt:161)
    at java.desktop/java.awt.Container.addNotify(Container.java:2804)
    at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4846)
    at androidx.compose.ui.awt.ComposeWindowPanel.addNotify(ComposeWindowPanel.desktop.kt:147)
    at java.desktop/java.awt.Container.addNotify(Container.java:2804)
    at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4846)
    at java.desktop/java.awt.Container.addNotify(Container.java:2804)
    at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4846)
    at java.desktop/java.awt.Container.addNotify(Container.java:2804)
    at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4846)
    at java.desktop/javax.swing.JRootPane.addNotify(JRootPane.java:721)
    at java.desktop/java.awt.Container.addNotify(Container.java:2804)
    at java.desktop/java.awt.Window.addNotify(Window.java:791)
    at java.desktop/java.awt.Frame.addNotify(Frame.java:495)
    at java.desktop/java.awt.Window.pack(Window.java:829)
    at androidx.compose.ui.util.Windows_desktopKt.setSizeImpl-6HolHcs(Windows.desktop.kt:116)
    at androidx.compose.ui.util.Windows_desktopKt.setSizeSafely-hQcJfNw(Windows.desktop.kt:55)
    at androidx.compose.ui.window.Window_desktopKt$Window$5.invoke(Window.desktop.kt:239)
    at androidx.compose.ui.window.Window_desktopKt$Window$5.invoke(Window.desktop.kt:176)
    at androidx.compose.ui.window.Window_desktopKt$Window$12$1.invoke(Window.desktop.kt:426)
    at androidx.compose.ui.window.Window_desktopKt$Window$12$1.invoke(Window.desktop.kt:419)
    at androidx.compose.ui.window.AwtWindow_desktopKt$AwtWindow$3.invoke(AwtWindow.desktop.kt:78)
    at androidx.compose.ui.window.AwtWindow_desktopKt$AwtWindow$3.invoke(AwtWindow.desktop.kt:76)
    at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2$performUpdate$1.invoke(UpdateEffect.desktop.kt:59)
    at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2$performUpdate$1.invoke(UpdateEffect.desktop.kt:55)
    at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2304)
    at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:504)
    at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:260)
    at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2.invoke$performUpdate(UpdateEffect.desktop.kt:55)
    at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2.invoke(UpdateEffect.desktop.kt:64)
    at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2.invoke(UpdateEffect.desktop.kt:47)
    at androidx.compose.runtime.DisposableEffectImpl.onRemembered(Effects.kt:82)
    at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1295)
    at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:984)
    at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1005)
    at androidx.compose.runtime.Recomposer.composeInitial$runtime(Recomposer.kt:1099)
    at androidx.compose.runtime.CompositionImpl.composeInitial(Composition.kt:633)
    at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:619)
    at androidx.compose.ui.window.Application_desktopKt$awaitApplication$2$1$2.invokeSuspend(Application.desktop.kt:219)
    at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt:42)
    at androidx.compose.ui.window.Application_desktopKt$awaitApplication$2.invokeSuspend(Application.desktop.kt:199)
    at androidx.compose.ui.window.Application_desktopKt$application$1.invokeSuspend(Application.desktop.kt:114)
Caused by: java.lang.UnsatisfiedLinkError: 'void org.jetbrains.skiko.OpenGLLibrary_jvmKt.loadOpenGLLibraryWindows()'
    at org.jetbrains.skiko.OpenGLLibrary_jvmKt.loadOpenGLLibraryWindows(Native Method)
    at org.jetbrains.skiko.OpenGLLibrary_jvmKt.loadOpenGLLibrary(OpenGLLibrary.jvm.kt:16)
    at org.jetbrains.skiko.redrawer.WindowsOpenGLRedrawer.<init>(WindowsOpenGLRedrawer.kt:13)
    at org.jetbrains.skiko.Actuals_awtKt$makeDefaultRenderFactory$1.createRedrawer(Actuals.awt.kt:33)
Caused by: java.lang.UnsatisfiedLinkError: 'void org.jetbrains.skiko.OpenGLLibrary_jvmKt.loadOpenGLLibraryWindows()'

    at org.jetbrains.skiko.SkiaLayer$redrawerManager$1.invoke(SkiaLayer.awt.kt:304)
    at org.jetbrains.skiko.SkiaLayer$redrawerManager$1.invoke(SkiaLayer.awt.kt:302)
    at org.jetbrains.skiko.redrawer.RedrawerManager.findNextWorkingRenderApi(RedrawerManager.kt:31)
    at org.jetbrains.skiko.SkiaLayer.init(SkiaLayer.awt.kt:334)
    at org.jetbrains.skiko.SkiaLayer.addNotify(SkiaLayer.awt.kt:161)
    at java.desktop/java.awt.Container.addNotify(Container.java:2804)
    at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4846)
    at androidx.compose.ui.awt.ComposeWindowPanel.addNotify(ComposeWindowPanel.desktop.kt:147)
    at java.desktop/java.awt.Container.addNotify(Container.java:2804)
    at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4846)
    at java.desktop/java.awt.Container.addNotify(Container.java:2804)
    at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4846)
    at java.desktop/java.awt.Container.addNotify(Container.java:2804)
    at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4846)
    at java.desktop/javax.swing.JRootPane.addNotify(JRootPane.java:721)
    at java.desktop/java.awt.Container.addNotify(Container.java:2804)
    at java.desktop/java.awt.Window.addNotify(Window.java:791)
    at java.desktop/java.awt.Frame.addNotify(Frame.java:495)
    at java.desktop/java.awt.Window.pack(Window.java:829)
    at androidx.compose.ui.util.Windows_desktopKt.setSizeImpl-6HolHcs(Windows.desktop.kt:116)
    at androidx.compose.ui.util.Windows_desktopKt.setSizeSafely-hQcJfNw(Windows.desktop.kt:55)
    at androidx.compose.ui.window.Window_desktopKt$Window$5.invoke(Window.desktop.kt:239)
    at androidx.compose.ui.window.Window_desktopKt$Window$5.invoke(Window.desktop.kt:176)
    at androidx.compose.ui.window.Window_desktopKt$Window$12$1.invoke(Window.desktop.kt:426)
    at androidx.compose.ui.window.Window_desktopKt$Window$12$1.invoke(Window.desktop.kt:419)
    at androidx.compose.ui.window.AwtWindow_desktopKt$AwtWindow$3.invoke(AwtWindow.desktop.kt:78)
    at androidx.compose.ui.window.AwtWindow_desktopKt$AwtWindow$3.invoke(AwtWindow.desktop.kt:76)
    at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2$performUpdate$1.invoke(UpdateEffect.desktop.kt:59)
    at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2$performUpdate$1.invoke(UpdateEffect.desktop.kt:55)
    at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2304)
    at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:504)
    at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:260)
    at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2.invoke$performUpdate(UpdateEffect.desktop.kt:55)
    at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2.invoke(UpdateEffect.desktop.kt:64)
    at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2.invoke(UpdateEffect.desktop.kt:47)
    at androidx.compose.runtime.DisposableEffectImpl.onRemembered(Effects.kt:82)
    at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1295)
    at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:984)
    at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1005)
    at androidx.compose.runtime.Recomposer.composeInitial$runtime(Recomposer.kt:1099)
    at androidx.compose.runtime.CompositionImpl.composeInitial(Composition.kt:633)
    at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:619)
    at androidx.compose.ui.window.Application_desktopKt$awaitApplication$2$1$2.invokeSuspend(Application.desktop.kt:219)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

> Task :composeApp:run FAILED
okushnikov commented 2 months ago

Please check the following ticket on YouTrack for follow-ups to this issue. GitHub issues will be closed in the coming weeks.

franmatesic commented 2 months ago

Tried bumping up the versions for Kotlin and Compose and now it works.

#gradle.properties

kotlin.version=1.9.23
compose.version=1.6.11